FlutterアプリをTestFlightにアップロードするまで色々ハマったので記しておく

環境はMacOS Big sur、Xcode 12.5.1。
初のスマホアプリ開発で色々と奮闘中。
#XcodeからDistributeしようとするもApp Storeへの接続画面から先に進めず

まず、XcodeでProduct->Archiveを押すと以下のような画面が表示され、"Checking for App Store Connect access"と表示されたまま先に進まず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930440/c71f33a2-c732-404f-7baa-2c12c0a38332.png)

この問題をどうやって解決したのか覚えていない（うーん、困った）が、なんとかアーカイブが完了し"Distribute App"と"Validate App"の選択画面までたどり着くものの、いずれを選択しても途中で以下のような画面で延々と先に進まず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930440/16a762f8-9a29-bd42-e9c8-7c1b17cd6a5a.png)

#コマンドからaltoolで試みるもMissing Provisioning Profileエラーでハマる

Xcodeが何かおかしいのだろうと考え、altoolというコマンドでできることを発見しこちらの方法にかける。
やり方は以下のような感じ。

今回はステージング環境をビルドしたいのでmain_stg.dartを指定。
```
$ flutter build ios -t lib/main_stg.dart
```
無事にビルドが完了するとRunner.appが作成され、保存された場所を教えてくれる。
適当な場所にプロジェクト名のフォルダを作り、そこにRunner.appを入れる。
プロジェクト名のフォルダごとZip圧縮し、出来上がったプロジェクト名.zipをプロジェクト名.ipaに拡張子を変更する。
以下のコマンドでアップロード。
```
xcrun altool --upload-app -f ProjectName.ipa -t ios -u username -p password
```
ちなみに、ここのusernameは自分のApple IDのメールアドレスで、passwordはApple IDのパスワードではなく、別に作成するxxxx-xxxx-xxxx-xxxx形式のアプリのパスワードなので注意。[Appleアカウントの管理](https://appleid.apple.com/account/manage)のセキュリティの中のApp用パスワード「パスワードを生成」から作れる。
詳細は[ApplicationLoaderを使用せず、ipaファイルをAppStoreConnectにあげる方法](https://qiita.com/everl/items/2ccb1871ce76cc92cbf9)を参照。

xcrun altoolコマンドでうまくいくかと思いきや、今度は以下のエラーが発生。

```
*** Error: Error uploading 'ProjectName.ipa'.
*** Error: ERROR ITMS-90174: "Missing Provisioning Profile - Apps must contain a provisioning profile in a file named embedded.mobileprovision." (-18000)
```

[Stack overflow](https://stackoverflow.com/a/52444223/3213925)によるとXcodeのfile > workspace settingsのBuild Systemで"New Build System"から”Legacy Build System”にすると直るとあったので、やってみたものの症状は変わらず。

お手上げ状態になった時のStackoverflow頼みで質問すると、XcodeのSigning＆Capabilitiesでエラーが出てないか確認したほうがいいよと言われたので、改めて確認。

教えてくれた人のスクショ上で"Automatically manage signing"がチェックされてなかったので、それに倣ってチェックを外してみたところ"Sining Certificate"がNaneになっている上にStatusに"Provisioning profile doesn't include signing certificate"というエラーを発見。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930440/0a8f1b16-993c-b218-46b3-7b56e5373921.png)

#Provisioning profileの登録はどうやってするの？
ということで、今度はProvisioning profileの登録方法を探し始める。
ありがたいことに以下のページがとても参考になった。
[Provisioning profile "XXXXXX" doesn't include signing certificate YYYY って出る場合の対処法](https://qiita.com/warapuri/items/2a32cb2201ce75aa5f4b)
ただ、私の場合はApple Distributionを押すと"You already have a current distribution cretificate or a pending certificate request"と表示され、先に進めず。
上記のページの「3. Apple Developer Portal 設定」を先にやってみようと思い、進んだところ・・・あれ、Apple Distributionが制限一杯で作成できない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930440/166577fe-4911-c84c-7b84-526c4353ded0.png)
どうやらここには3つまでしか登録できないらしい。私の場合は企業配下のアカウントで、既に3つ登録されていたので使用されていないものを一つ無効にしてもらうことで解決。普通はここは問題なく進めるはず。

「5. Xcode でプロビジョニング設定」の作業をしようとしたところ、なぜかProvisioning Profileのところに作ったプロファイルが出てこない。仕方がないのでプロファイルをダウンロードし、Provisioning Profileの選択肢の下の方にあるImport Profileから手動でインポートしてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930440/bbf8ae32-e4d7-966c-8b7b-63da1a66340e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930440/e33598d2-bf48-cb79-c8ae-d253c3745721.png)

今度はうまくいき、Xcode上のStatusでもエラーが表示されなくなった。

#altoolで依然としてエラーになるもXcode GUIからアップロード成功
ここまで進んだらさすがに大丈夫だろうと思い、xcode altoolコマンドを改めて実行するも、なぜか同じエラー。
破れかぶれで最初に駄目だったXcodeのGUIから試してみることに。
Archiveが完了したところでValidae appを押してみると・・・あれ、なぜか先に進んだ。しかも通った笑
そのままDistribute appを押すと何事もなかったかのようにアップロード完了。
TestFlightのページでアップロードを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930440/e600c365-74ef-5ad1-90db-1ba62acb347d.png)
XcodeのGUIからアップロードする手順は以下のページのお世話になりました。
[FlutterアプリをiOSのTestFlightで配布する手順【前編】](https://qiita.com/kz23szk/items/d7c90bea1f6136218456)
[FlutterアプリをiOSのTestFlightで配布する手順【後編】](https://qiita.com/kz23szk/items/9d34f14ab08b830b5f1f)

いやー、長かった！TestFlightへのアップロード作業を始めてからほぼ2日間かかった！Androidのapkパッケージなんてあっという間にビルドして配布できたのにAppleは複雑すぎ！:frowning2: