個人開発のiOSアプリをApp Storeに出そうとして、Archiveの直前でこのエラーに当たって小一時間溶かしました。同じところで止まっている人がすぐ抜けられるように、原因と直し方を残しておきます。
出たエラーはこれです。
Communication with Apple failed: Your team has no devices from
which to generate a provisioning profile. Connect a device to use
or manually add device IDs in Certificates, Identifiers & Profiles.
No profiles for 'com.example.App' were found: Xcode couldn't find
any iOS App Development provisioning profiles matching 'com.example.App'.
先に結論
チームに登録済みデバイスが1台もないのが原因です。実機をUDID登録すれば直ります。証明書やプロファイルの作り直しは要りません。
Communication with Apple failed という見出しに引っ張られると、「Appleの障害か」「サインインし直すのか」と無関係な方向に時間を溶かします(私がそうでした)。本当に効いているのは、その次の一文 ―― "Your team has no devices" のほうです。
急いでいる人向けに手順だけ:
- iPhoneをMacにUSB接続するか、デバイスのUDIDを控える
- Apple Developer のDevices で「+」からUDIDを登録
- もう一度Archive → 通る
以下、なぜそうなるのかと、ハマりやすいポイントを書きます。
なぜ「デバイス0台」で詰むのか
エラー文をよく読むと、探しているのは iOS App "Development" のプロビジョニングプロファイルです。ここがポイントで、
- Development プロファイルは、実機でデバッグ実行するためのもの。最低1台の登録デバイスが必要。
- Distribution(App Store)プロファイルは、配布用。デバイスは不要。
自動署名(Automatically manage signing)は、まず手元のチーム用にプロファイルを用意しようとします。ところがチームにデバイスが1台も無いと、その最初のプロファイル生成自体が失敗する。結果、Communication failed という曖昧な見出しでまとめて転んでくるわけです。Developer Programに登録したての、証明書もデバイスもまっさらな状態だと、ここに高確率でハマります。
原因の切り分け(コマンドでやると速い)
XcodeのGUIは「Communication failed」までしか教えてくれないので、コマンドで事実を並べたほうが早いです。
まずキーチェーンの証明書。ここで Apple Distribution が無く Apple Development しか出ないなら、配布用の証明書がまだ無い状態です(後述しますが、これは自動で作られるので今は気にしなくてOK)。
security find-identity -v -p codesigning
プロビジョニングプロファイルの実体。空っぽなら、そもそも何も生成できていません。
ls -la ~/Library/MobileDevice/Provisioning\ Profiles/
プロジェクト側の署名設定。自動署名で、Teamが正しく入っているかを確認します。
grep -E "CODE_SIGN_STYLE|DEVELOPMENT_TEAM" *.xcodeproj/project.pbxproj
# CODE_SIGN_STYLE = Automatic;
# DEVELOPMENT_TEAM = XXXXXXXXXX; ← 自分のTeam IDが入っていればOK
設定が正しいのにエラーが出るなら、残る容疑者は「デバイス0台」です。確証を得るために、GUIではなくコマンドラインでArchiveして、生のエラー文を取りに行きます。
xcodebuild -project YourApp.xcodeproj -scheme YourApp \
-destination 'generic/platform=iOS' \
-archivePath /tmp/YourApp.xcarchive \
-allowProvisioningUpdates archive
-allowProvisioningUpdates を付けても、ここで同じ Your team has no devices が出れば、原因はほぼ確定です。
解決:デバイスを1台登録する
直し方はシンプルで、チームにデバイスを1台登録するだけです。注意点が一つあって、私の環境では iPhoneをUSBで繋いだだけでは自動登録されませんでした(-allowProvisioningUpdates でも登録されず、同じエラーのまま)。確実なのは、ポータルでUDIDを手動登録する方法です。
接続中のデバイスのUDIDは、これで取れます。
xcrun xctrace list devices
# iPhone XXXX (26.5) (00008XXX-XXXXXXXXXXXXXXXX) ← 括弧内がUDID
このUDIDを Developer ポータルのDevices で「+」から登録します(Platform: iOS、Device Name: 任意、Device ID: 上のUDID)。
登録した直後にもう一度Archiveしたら、さっきまで頑として通らなかったのが、何事もなかったように成功しました。
** ARCHIVE SUCCEEDED **
実機テスト目的でなくApp Store配布が目的でも、自動署名はデバイス1台を要求してきます。理不尽に感じますが、後でTestFlightの実機確認にもどうせ要るので、繋いでおいて損はありません。
Archiveできたあと:アップロードまで
ひとつ補足。コマンドラインでArchiveしたとき、署名は Apple Development の証明書で行われています。App Storeに上げるには Apple Distribution での再署名が必要ですが、これは次の「Distribute App」工程でXcodeが自動でやってくれます。さっき Apple Distribution 証明書が無くても気にしなくていい、と書いたのはこのためです。
CLIでArchiveしたものはOrganizerに出てこないので、Organizerが見る場所(~/Library/Developer/Xcode/Archives/<日付>/)にコピーしてから、
- Xcode → Window → Organizer → 該当のArchiveを選択
- Distribute App → App Store Connect → Upload
- 署名は自動。ここで配布用の証明書とプロファイルが裏で作られる
で Upload Successful まで行けます。
ついでに、毎回出てくる輸出コンプライアンスの質問が煩わしければ、Info.plist に一行入れておくと次のビルドから聞かれなくなります(標準的なHTTPS通信しか使っていないアプリ向け)。
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
デバイスを使いたくない場合の別解
「テスト用に実機を登録したくない」「手元にデバイスが無い」という場合は、自動署名をやめて手動でApp Store用のプロファイルを使う手があります。App Store(Distribution)プロファイルはデバイス情報を含まないので、デバイス0台でも作れます。
手順としては、
- Apple Distribution 証明書を作る(Xcode → Settings → Accounts → Manage Certificates → +)
- ポータルでApp Store用のProvisioning Profileを作成(
com.example.App用) - Xcodeで「Automatically manage signing」を外し、手動でその証明書とプロファイルを指定
ひと手間多いですが、デバイス登録の縛りを完全に回避できます。私はTestFlightの実機確認にどうせデバイスが要ると分かっていたので、素直に1台登録する方を選びました。
まとめ
-
Communication with Apple failedは見出しのノイズ。本体は "Your team has no devices"。 - 自動署名は、チームにデバイスが1台も無いとプロファイルを生成できない。
- 直し方は UDIDを1台、ポータルに手動登録するだけ。USB接続だけでは登録されないことがある。
- 配布用のDistribution証明書/プロファイルは、Distribute Appのときに自動生成されるので事前準備は不要。
- デバイスを登録したくなければ、手動署名+App Store配布プロファイルで回避できる。
同じエラーで検索して辿り着いた人の、小一時間が浮けば幸いです。