Publish IOS
===
[](https://hackmd.io/uN0Thyd_SEuEEnjEB4oQeA)
* [在 App Store Connect 查看您的App](#在-App-Store-Connect-查看您的App)
* [更改App資訊與提交審查](#更改App資訊與提交審查)
* [在Xcode打包上傳App](#在Xcode封裝上傳App)
* [[react native] ios app未正確linking packge](#react-native-ios-app未正確linking-packge)
* [TestFlight上做內部測試](#TestFlight上做內部測試)
* [Apple Store Connect 官方文件](https://help.apple.com/app-store-connect/#/)
# 在 App Store Connect 查看您的App
* 登入[App Store Connect](https://appstoreconnect.apple.com/)選取我的App,進入App選單,選擇您要發布的ios app

* 若還尚未建立App請點選App標題旁邊的+號新增『新的App』
建立App前請先至[apple developer](https://developer.apple.com/account/resources/identifiers)新增套件識別碼(Bundle ID)
可參考:[[官方文件]加入新的App](https://help.apple.com/app-store-connect/#/dev2cd126805)

```
注意:Bundle ID必須是唯一的,若有人使用過Bundle ID將不能新增!(像app的身分證字號)
在使用Xcode或是Firebase連接ios app時,都需要Bundle ID去配對
建立App的資訊,除了App名稱外,其他都不能在建立後修改。
```
* 您也可以透過Xcode Archive app時自動產生Bundle ID,自動產生的Bundle ID會出現在下拉選單中,在用此方法您必須先在mac電腦上生產private key和Certificates,並在[apple developer](https://developer.apple.com/account/resources/certificates)進行綁定,綁定過後的mac使用者才能在Xcode上下載iOS Distribution Certificate(記得搭配生產的private key,鑰匙和證書是一對的,沒有private key無法下載),進行Archive和upload app。
詳請可參考:[開發ios app前的手動設定](https://dotblogs.com.tw/jamestsai/2019/08/27/How-to-set-iOS-Development-Certificates-Identifiers-and-Profiles-by-using-Xamarin-Develop-iOS-App-I)、[Private Key生產的方法](https://medium.com/%E5%BD%BC%E5%BE%97%E6%BD%98%E7%9A%84-swift-ios-app-%E9%96%8B%E7%99%BC%E5%95%8F%E9%A1%8C%E8%A7%A3%E7%AD%94%E9%9B%86/%E8%BC%B8%E5%87%BA%E4%B8%8A%E6%9E%B6-ios-app-%E4%B8%8D%E8%83%BD%E6%B2%92%E6%9C%89%E7%9A%84-private-key-5d935ede10c8)
* 『App Store』中可查看和更改在app store上可看到的資訊欄

* 『功能』中有"促銷代碼"與"加密資訊"

* 『TestFlight』可供依版本做內部測試

* 『活動』中可查看所有從Xcode成功上傳的App

# 更改App資訊與提交審查
幾個比較重要的:
1. 更改App名稱
左側App資訊中可以更改App名稱,更改過後記得案右上角儲存,名稱不能跟現有的apple store上的app重複。

2. 刪除App
App資訊頁最下面有"移除App"
```
注意:移除app並不是真的移除,官方只是讓此app不能使用而已,以此命名的Bundle ID一樣不能再使用了!
雖然移除之後可以點選回復app,但短時間內不一定真的能回復(官方很多毛病),請三思再按下刪除!
```

3.填妥資訊
將左方"App資訊"、"定價與供應狀況"、"App隱私權"頁面填妥

## 填寫審查資訊:
在左側ios App下方選擇(版本號)準備提交填寫資訊
1. 提供各個裝置的 App 螢幕快照
可利用模擬器的拍照功能(command + s),但要記得先把模擬器縮放到最大(command + 1)再進行拍照,即可拍出符合上傳的尺寸大小。

2. 填寫行銷宣傳文字、關鍵字、支援 URL、行銷 URL、描述
3. 選擇建置版本(先在Xcode上傳App參照[下一章](#在Xcode封裝上傳App))
4. 填寫版本、版權、年齡分級等等
5. 填寫App 審查資訊
6. 設定版本發佈,可以設定手動發佈、審查完自動發佈、定時發佈
7. 按右上角藍色按紐"提交以供審查",若設定手動發佈等待官方審查完後會變成"發佈此版本"

詳請參考:[[官方文件]輸入App資訊](https://help.apple.com/app-store-connect/#/dev97865727c/)
# 在Xcode封裝上傳App
*以下功能可能會依Xcode改版頁面或名稱會不一樣,但通常都在同一頁*
1. 在Xcode上登入上架帳號(Apple ID)
到 App 的 General 頁面,在 Signing 區塊點選 Add Account登入,登入後將Team選擇為剛剛登入的帳號

2. 選擇與環境對應的Schema
* 在General裡可以看到設定App的重要參數

* 在這個專案裡,這裡的參數都不用手動修改,應由指令同步修改ios和android的version和build號碼,Display name和Bundle Identifier則綁定在環境參數上,只要選擇相對應的環境schema直接按Archive即可。若要修改Displayname請到Build settings頁面修改"App_display_name"。
* 有時候會出現已經選擇新的Schema,但Display name 或 Bundle Identifier 顯示的還是之前build時的參數之情形,這是Xcode的顯示bug,不要自己手動改參數,Xcode會以為你每一次都要自己手動改這個欄位,導致原本綁定"App_display_name"的Display name跳回預設值。
* 如果不幸回到預設值可以到Xcode專案左側目錄中尋找info.plist,將display_name改回${App_display_name}
* 在這裡選擇相對應環境的Schema

3. 將 App Build 的對象改為 Generic iOS Device。
如果不改成Generic iOS Device,Archive會是灰色的字(disable)不能按

4. 點擊 Product > Archive封裝App
Archive一次會花比較長的時間,若Archive跑完有紅色的驚嘆號,那就只能debug完重試,有時候也會發生run的時候不會有錯誤,但Archive完就會跳錯誤的情形。其中比較多會出現的錯誤訊息是『 ld: library not found for -l"packge name"』,代表鏈結package時出現問題,詳情請見:[[RN]ios app未正確linking packge](#react-native-ios-app未正確linking-packge)

5. 上傳完會出現這個視窗,案右邊的藍色按鈕(Distribute app)

6. 接下來的畫面,一般不需做任何調整,一直點選 Next 即可
選擇 ios App Store -> Upload -> App Store distribution options頁面(全部勾選)

->勾選 Automaticlly manage signing 表示 Xcode 會幫我們自動處理上架 App 需要的 profile,app ID 和 certifcate。

7. 最後會出現確認畫面,點選Upload上傳


8. 上傳完可能會出現錯誤訊息,依照錯誤訊息去Xcode加需要的設定

9. 順利上傳之後,可以到[apple store connect](https://appstoreconnect.apple.com/apps)『活動』中確認app是否正在上傳


10. 如果不幸的App上傳到一半消失了,請去信箱看一下apple官方寄的信,裡面會告訴你缺少了哪些apple store上的規範
```
不管上傳成功與否,只要是上傳過的app都會占用一個版號,下一次上傳的version號碼一定要不同於之前的號碼。
```
# [react native] ios app未正確linking packge
錯誤訊息:
```
react native ld: library not found for -l"packgeName"
```
有以下幾種可能:
1. 查一下該package文件,是否該加什麼在podfile文件裡。
例如[React Native Permissions](https://github.com/zoontek/react-native-permissions)中有提到新加入的permission需加在podfile裡,加入後開啟終端機至專案目錄ios資料夾,重新下pod install指令,然後在Xcode打開檔尾為"xcworkspace"的專案,下build clean指令"command+k",剛剛下載的pod file會重新編譯。
* 如果還是不行可以把專案目錄下的node_modules資料夾刪除,和ios目錄下的Podfile.lock、pod資料夾刪除,重新下指令,再去Xcode build看看。
```
npm install && cd ios && pod install && cd ..
```

2. 重新linking
請參考官方文件[Linking Libraries](https://reactnative.dev/docs/linking-libraries-ios)
3. 檢查Libary Search Paths
到Target->Build Settings->搜尋Libary Search Paths->檢查有沒有${inherited},沒有的話請加上去
* 或是要在這裡直接加上該libary路徑也可以(不推薦)

* 為什麼不推薦手動設定呢?因為React native和Xcode都不斷在新版本中嘗試自動鏈接,有越來越改善,雖然還是常常出現沒鏈結的情形(坑),如果google之後很多人推薦用手動鏈結修好bug的話再使用比較好
4. 更改Workspace Setting
到Files->Workspace Setting->Build system
通常是用"legacy build system"(傳統建構系統),ios系統升級或是加入新的套件之後也可能會改成"New Build System"(新構建系統)
5. 你可能開錯Xcode專案了
檔尾是"xcworkspace",不是"xcodeproj",在ios目錄下重新用Xcode開啟
6. 提供幾個Troubleshooting試試看
* Running Clean in Xcode. (command+shift+k)
* Deleting Xcode's derived data
到Xcode -> Preferences,切換到Locations分頁,點選Derived Data下方路徑旁指向右邊的箭頭,Finder視窗顯示Derived Data資料夾,把裡面的東西通通刪除(command+delete)
* Removing node_modules then reinstalling dependencies. (rm -rf node_modules && yarn)
* Clearing React Native's packager cache. (react-native start --reset-cache)
* Clearing React Native's iOS build folder. (rm -rf ios/build)
* Updating Pod repos. (cd ios && pod repo update)
* Reinstalling Pods. (cd ios && pod install)
# TestFlight上做內部測試
1. 確認App上傳成功(字不是灰色的)

2. 到TestFlight點選左邊的內部群組->Apple Store Connect使用者

3. 滑到下面的建置版本,在你要測試的版本狀態欄點選管理

4. 兩個視窗都點選"是",同意條款進行內部測試,黃色驚嘆號變成綠色勾勾表示該版本可以開始測試


5. 將要進行內部測試人員的email加入[使用者與存取權限](https://appstoreconnect.apple.com/access/users),對方必須到信箱收邀請信加入(有時限)

6. 角色建議設為"開發者"才不會一直收到apple寄的app更新信

7. 回來點選測試人員旁邊的加號,邀請人員加入測試

8. 被邀請者會在信箱收到TestFlight的的邀請碼,用iphone打開TestFlight App,兌換邀請碼,就可以下載內部測試App。(邀請信時效很短)