iOSのプッシュ通知entitlementsをdevelopment/productionで分ける

  • iOS
  • APNs
  • Xcode

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

iOSでプッシュ通知(APNs)を使う際、entitlementsファイルのaps-environmentをdevelopmentとproductionで分けて管理する方法についてメモ。

entitlementsの中身

development用。

<?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用。

<?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>

aps-environmentの値がdevelopmentかproductionかだけの違い。これで接続するAPNsサーバーが変わる。

Build Configurationと紐付ける

ファイルを2つ用意しただけでは自動的に切り替わらない。Xcodeのビルド設定(Build Settings)でCODE_SIGN_ENTITLEMENTSをConfigurationごとに指定する必要がある。

  • Debug → development.entitlements
  • Release → production.entitlements

Automatic Signingを使っている場合、Xcode側がentitlementsを自動生成・上書きすることがあるらしい。手動で用意したファイルが実際に使われているか、Build Settings上で各Configurationに正しいパスが紐付いているかは確認したほうがよさそう(実機での動作は未確認)。

Provisioning Profileとの整合性

entitlementsのaps-environmentとProvisioning Profileの種類が対応していないとビルドエラーになるか、通ってもプッシュ通知が届かない不具合になる。

  • development.entitlements → Development Provisioning Profile
  • production.entitlements → Distribution Provisioning Profile(App Store/Ad Hoc/Enterprise)

ここで気になるのが、Ad HocやTestFlight配布時の扱い。Development ProfileでビルドしたものだけがDevelopment APNsサーバーに接続する形で、Ad Hoc/TestFlight/App StoreはすべてDistribution Profile経由なのでaps-environmentはproductionになるはず。つまり「テスト配布だからdevelopment」という発想は誤りで、配布方法ではなくProfileの種類で決まる。