Xcode8からはちゃんとAPNsのEntitlementを設定しましょうという問題


Xcode8でビルドして提出したところ、Appleから以下のようなメールが届きました。
Privacy周りと言い、諸々内部のAPIを自動検索してレビューの手間を簡略化しているようですね。

対応

APNsのAPIが含まれてるのに、Push NotificationのEntitlementが設定されてないよってことですね。
これに関しては、普通にCapabilitiesタブのPush NotificationsをONにしてやるだけで自動的にAppName.entitlementsファイルが作成されます。

そうすると、以下のような内容のファイルが作成されます。

appName.entitlements
<key>aps-environment</key>
<string>development</string>

問題

とはいえ作成したいのは本番向けアプリなので、以下のApple公式サイトにもあるようにprovisioning portalで作成したファイルに合わせてproductionにすると・・・

Push Notification Entitlement Keys

The entitlement key is different for iOS than it is for OS X. On either platform, however, the provisioning portal assigns a value of development or production to the key, depending only on which activity you are creating the provisioning profile for.

appName.entitlements
<key>aps-environment</key>
<string>production</string>

なぜかエラーが出てるからFix issueしろとか言われます。
※ちなみに、これを押すとproductionに書き換えた箇所がdevelopmentに戻ります。

GM版の問題かな? と思っていましたが、正式リリースしたXcode8でも依然起こっています。
とりあえずdevelopmentのままでもarchiveビルドしたものでdeviceTokenは普通に取れるようですが・・・
productionに書き換えても普通にdeviceTokenは取れるので申請してみましたが、Appleからエラーの返信メールは来ないようです。
もしかしたら現状は、ここの文字列をちゃんと見ていない可能性も。

対策

コメントで @sawat1203 さんに教えていただきました。
Code Signingと一致したentitlementsをBuild Settingsで設定してやれば警告が取れるようです。
どうも自動生成されたファイルは選択したファイルだけがTargetに設定されていて変更できなかったので新規作成します。

ファイル作成

適当にproperty Listを適当な名前で作ります。
私の作業環境、ターゲット多いんですよね・・・。

内容の変更

右クリックして Open AS > Source Codeを表示して、既存のものをコピペします。

development.entitlements
<?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>aps-environment</key>
        <string>development</string>
    </dict>
</plist>
production.entitlements
<?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>aps-environment</key>
        <string>production</string>
    </dict>
</plist>

ターゲットの変更

Build Settingsから Code Signing Entitlementsを検索し、対応したファイルにターゲットを切り替えます。
私の環境ではRelease / adHoc ではreleaseビルドを行うので、production.entitlementsを作成して設定しています。

エラーの確認

エラーがなくなりました。

※ 一応、Fix issueが出続ける場合でも1回ボタン押してやれば特に変更はされないのにエラーがでなくなります。