ガイド

iOSのビルドがリジェクトされたら:Macなしで直して、もう一度アップロードする

Appleからメールが届いた、またはアップロードが失敗した。でもMacがない。まず、その修正にそもそも新しいビルドが必要かを確認してください。必要ないものもあります。必要なものについては、このページで修正の方法と、1日でアーカイブ、書き出し、再アップロードをするためのコマンドを紹介します。

新しいビルドが必要か

問題がすべて再ビルドにつながるわけではありません。次の修正は、App Store Connectで、どのブラウザからでもできます。

  • スクリーンショット、説明文、そのほかのプロダクトページの文章。
  • Missing Complianceと表示されたビルドの、輸出コンプライアンスの回答。
  • App Store ConnectでのApp Privacyの回答。

ほかの修正には新しいビルドが必要なので、MacのXcodeが必要です。古いXcodeやSDK、プライバシーマニフェスト、Info.plistの文字列、コードやSDKの変更がこれにあたります。新しくアップロードするたびに、ビルド番号も上げる必要があります。

1. 古すぎるXcodeでビルドした

2026年4月28日から、Appleが受け付けるのは、Xcode 26以降で、iOS 26のSDKを使ってビルドしたものだけです。Xcode 16のビルドは、このルールに引っかかります。アーカイブを何がビルドしたかを確かめるには、そのアプリから2つのキーを読みます。

/usr/libexec/PlistBuddy -c 'Print :DTSDKName' -c 'Print :DTXcode' \
  MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist

GitHubのmacos-26 runnerでは、iphoneos26.5と2660が表示されました。これはXcode 26.6という意味です。MacRunのMacは、標準がXcode 27.1で、Xcode 26.6も入っています。どちらもこのルールを満たします。

注意点が1つあります。Appleによると、iOS 27.1のSDKを使うアプリには、2027年4月からiPhone Duoのスクリーンショットが必要になります。撮り方はiPhone Duoのガイドで紹介しています。

2. プライバシーマニフェストと、理由が必要なAPI

UserDefaultsやファイルのタイムスタンプなど、使う理由を書く必要があるAPIがあります。理由はPrivacyInfo.xcprivacyという名前のファイルに書きます。2024年5月1日から、App Store Connectはこれを省いたアプリを受け付けません。Appleは、想定外のキーを含むマニフェストもリジェクトします。そのメールには、問題のあるファイルごとにパスが書かれています。

以下は、自分のUserDefaultsを読むアプリのための最小限のマニフェストです。CA92.1は、その用途に対するAppleの理由コードです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>NSPrivacyTracking</key>
  <false/>
  <key>NSPrivacyTrackingDomains</key>
  <array/>
  <key>NSPrivacyCollectedDataTypes</key>
  <array/>
  <key>NSPrivacyAccessedAPITypes</key>
  <array>
    <dict>
      <key>NSPrivacyAccessedAPIType</key>
      <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
      <key>NSPrivacyAccessedAPITypeReasons</key>
      <array>
        <string>CA92.1</string>
      </array>
    </dict>
  </array>
</dict>
</plist>

これをアプリのターゲットに追加します。次に、正しい形式かを確認します。当社は、正しいファイルと壊れたファイルで次のコマンドを実行しました。

$ plutil -lint MyApp/PrivacyInfo.xcprivacy
MyApp/PrivacyInfo.xcprivacy: OK
$ plutil -lint bad.xcprivacy
bad.xcprivacy: (Value missing for key inside <dict> at line 1)

アーカイブのあと、このファイルは.appの一番上の階層にあるはずです。当社の場合はそうなっていました。メールにサードパーティのSDKの名前があれば、そのSDKを更新してください。SDK自身のAPIの使用は、SDK自身のマニフェストでカバーする必要があります。

3. 利用目的の文字列がない

アプリがカメラ、写真、位置情報を使うなら、Info.plistにその利用目的の文字列が必要です。Appleによると、これがないとアクセスに失敗し、アプリがクラッシュすることもあります。App Reviewのガイドライン5.1.1(ii)も、その文字列でデータの使い方をはっきり説明するよう求めています。

<key>NSCameraUsageDescription</key>
<string>Scan receipts to add them to your expenses.</string>

ソースのファイルだけでなく、ビルドしたアプリも確認してください。

plutil -extract NSCameraUsageDescription raw \
  MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist

4. 輸出コンプライアンス

暗号化についての回答がないビルドは、TestFlightでMissing Complianceと表示されます。これには再ビルドは要りません。App Store Connectでビルドを開き、Manageをクリックして、質問に答えます。次回から質問を省くには、Info.plistに次のキーを追加します。falseにするのは、普通のHTTPSのように、暗号化が対象外の場合だけです。

<key>ITSAppUsesNonExemptEncryption</key>
<false/>

5. スクリーンショットの間違いや不足

スクリーンショットに再ビルドは要りませんが、正しいサイズが必要です。Appleは、Dynamic Islandのある中サイズのiPhoneのスクリーンショットを、少なくとも1枚求めています。縦向きで1179 x 2556か1206 x 2622ピクセルです。手元にiPhoneがなくても、シミュレータで作れます。

xcrun simctl boot "iPhone 17 Pro"
xcrun simctl install "iPhone 17 Pro" MyApp.app
xcrun simctl launch "iPhone 17 Pro" com.example.myapp
xcrun simctl io "iPhone 17 Pro" screenshot shot.png
sips -g pixelWidth -g pixelHeight shot.png

当社のiPhone 17 Proのスクリーンショットは1206 x 2622で、必要なサイズでした。iPhone 17 Pro Maxでは1320 x 2868で、大きいサイズのセットに合います。何が入っているかは、xcrun simctl list devices availableで確認できます。

再ビルドしてアップロードする

ビルド番号を上げてから、アーカイブします。当社のテスト用のrunnerでは、小さなSwiftUIアプリで、この工程は12秒でした。

xcodebuild archive -project MyApp.xcodeproj -scheme MyApp \
  -destination 'generic/platform=iOS' \
  -archivePath build/MyApp.xcarchive \
  MARKETING_VERSION=1.0.1 CURRENT_PROJECT_VERSION=3

次に、署名した.ipaを書き出します。ExportOptions.plistに次の内容を入れ、Team IDは自分のものにします。キーはxcodebuild -helpによるものです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>method</key>
  <string>app-store-connect</string>
  <key>teamID</key>
  <string>ABCDE12345</string>
  <key>signingStyle</key>
  <string>automatic</string>
</dict>
</plist>
xcodebuild -exportArchive -archivePath build/MyApp.xcarchive \
  -exportOptionsPlist ExportOptions.plist -exportPath build/export \
  -allowProvisioningUpdates

先にApple AccountでXcodeにサインインしてください。当社の署名なしのテスト用アーカイブにはチームがなく、書き出しは"error: exportArchive No Team Found in Archive"で止まりました。

Appleのアップロードのページには、Xcode、Transporter、altoolが載っています。altoolを使うなら、アプリ用パスワードを一度キーチェーンに保存します。そのあと、検証してアップロードします。

xcrun altool --store-password-in-keychain-item altool -u you@example.com -p xxxx-xxxx-xxxx-xxxx
xcrun altool --validate-app -f build/export/MyApp.ipa -t ios -u you@example.com -p @keychain:altool
xcrun altool --upload-app -f build/export/MyApp.ipa -t ios -u you@example.com -p @keychain:altool

または、ExportOptions.plistでdestinationをuploadにします。すると-exportArchiveが、ビルドをApp Store Connectに直接送ります。APIキーとTestFlightについては、公開ガイドをご覧ください。

1日で直す

MacRunの1日パスは$15で、支払いは1回だけ、自動更新はありません。専用のM6 Mac miniで、5分以内に使えます。Xcode 27.1とXcode 26.6が入っていて、iOS 27.1のシミュレータもあります。TailscaleでSSHかVNCビューアを使って接続します。審査でまた差し戻されたときは、1週間なら$59です。期間が終わるとMacのデータは消去されるので、先にコードをpushしてください。

この用途でMacを借りるべきでない人

  • 修正がスクリーンショット、文章、輸出コンプライアンスの回答なら、ブラウザでApp Store Connectを使ってください。
  • Expoのアプリなら、ExpoのmacOSマシンで動くEAS Buildで再ビルドできます。WindowsでiOSアプリをビルドするをご覧ください。
  • すでにCodemagicやGitHub Actionsでビルドしているなら、修正をpushして、CIに再ビルドさせてください。

よくある質問

MacなしでApp Storeのリジェクトを直せますか?

+

場合によります。スクリーンショット、文章、輸出コンプライアンスの回答は、App Store Connectで、どのブラウザからでも直せます。新しいXcode、プライバシーマニフェスト、Info.plistの変更には新しいビルドが必要で、それにはmacOSが必要です。

2026年のApp Store Connectには、どのバージョンのXcodeが必要ですか?

+

2026年4月28日から、Appleは、Xcode 26以降で、iOS 26のSDKを使ってビルドしたものを求めています。MacRunのMacは、標準がXcode 27.1で、Xcode 26.6も入っています。

iOSアプリにプライバシーマニフェストを追加するには?

+

PrivacyInfo.xcprivacyという名前のファイルをアプリのターゲットに追加します。理由が必要なAPIのカテゴリごとに、Appleの理由コードを書きます。アプリ自身のUserDefaultsならCA92.1です。plutil -lintで確認してから、再ビルドします。

TestFlightのビルドにMissing Complianceと出ています。再ビルドが必要ですか?

+

必要ありません。App Store Connectでビルドを開き、Manageをクリックして、暗号化の質問に答えます。次のビルドでInfo.plistにITSAppUsesNonExemptEncryptionを追加すれば、質問を省けます。

App StoreがiPhoneに求めるスクリーンショットのサイズは?

+

Appleは、Dynamic Islandのある中サイズのiPhoneのスクリーンショットを、少なくとも1枚求めています。縦向きで1179 x 2556か1206 x 2622ピクセルです。当社のiPhone 17 Proのシミュレータでのスクリーンショットは1206 x 2622でした。

Xcodeのウインドウを使わずに、新しいビルドをアップロードするには?

+

xcodebuild -exportArchiveで.ipaを書き出し、xcrun altool --upload-appを実行します。Transporterも使えます。Appleはアップロードのページで両方を紹介しています。

関連ガイド