

iOSのプッシュ通知entitlementsをdevelopment/productionで分ける
この記事は、構成と文章の整理に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 Profileproduction.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の種類で決まる。