コンテンツへスキップ

AppStoreからリリースしたアプリで、デバイストークンの取得ができずプッシュ通知ができない、、、

2011年9月21日

テストではばっちりOK、自信を持ってリリースしたのに、いざリリースしてみたらAPNsができなくてがっかり・・・という目に会いました。

App Storeからインストールしたアプリの挙動を見る限りでは、デバイストークンの取得ができていない様子でした。

もっと具体的な情報を拾えないとどうにもならないので、デバイスをMacに繋いでxcodeのオーガナイザのコンソールを横目で見つつアプリを動かしてみると、下記の怪しげなログが目につきました。

Sep 21 09:16:15 xxx-no-iPad SpringBoard[28] <Warning>:
No valid ‘aps-environment’ entitlement string found for application ‘<バンドル表示名>’:
(null). Notifications will not be delivered.

Sep 21 09:16:15 xxx-no-iPad <バンドル名>[1644] <Warning>:
Error:Error Domain=NSCocoaErrorDomain Code=3000
“アプリケーションの有効な“aps-environment”エンタイトルメント文字列が見つかりません” UserInfo=0x399420
{NSLocalizedDescription=アプリケーションの有効な“aps-environment”エンタイトルメント文字列が見つかりません}

検索しながら調査していると、下記ドキュメントに行き当たりました。

http://developer.apple.com/library/ios/#technotes/tn2265/_index.html
Technical Note TN2265
Troubleshooting Push Notifications
Registering for Push Notifications の Error Delegate Callback のところ

You can check your app’s code signing entitlements with the codesign tool. The value of the aps-environment or com.apple.developer.aps-environment entitlement should be either development or production. Run this command in Terminal pointing at your App Store distribution build:

$ codesign -d --entitlements - <YourAppName>.app

Check if there is an aps-environment or com.apple.developer.aps-environment code signing entitlement listed under Internal requirements. It would normally appear after the application-identifier (iOS) or com.apple.application-identifier (Mac OS X) entitlement.

NOTE: This is a useful test to perform on your distribution builds before submitting them to the App Store. The Application Loader or Xcode do not check if the push entitlement is missing.

If the aps-environment or com.apple.developer.aps-environment entitlement is missing, you probably created your distribution provisioning profile before you configured your App ID for push notifications using the iOS Provisioning Portal or the Mac Developer Certificate Utility. If your App ID has already been configured for push notifications, go into the Portal or the Developer Certificate Utility and download a new provisioning profile. It most likely will have the desired code signing entitlements in place. You can look at the profile with a text editor like TextEdit and search for Entitlements.

私の場合は下記手順となりました。

1.ターミナル でcodesignコマンドを.appに対して実行してみてaps-environmentのエントリーがあるかどうかを調べる。→ 有りませんでした(-_-) これが無いとダメなようなんです。

<dict>
<key>application-identifier</key>
<string>[App ID]</string>
<key>get-task-allow</key>
<false/>
<key>keychain-access-groups</key>
<array>
<string>[App ID]</string>
</array>
</dict>

念のため、テストに使ってた.appをcodesignコマンドで見てみると、しっかりとありました。

<dict>
<key>application-identifier</key>
<string>[App ID]</string>
<key>aps-environment</key>
<string>development</string>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>[App ID]</string>
</array>
</dict>

iTunes Connect提出用と開発用では、コード署名用のプロビジョニングプロファイルが違うのですが、提出用のAppは実機でテストできないため、今回の憂き目に会いました。
(提出用はプロビジョニングポータルの[Provisioning]-[Distribution]で、開発用は[Development]で発行したプロファイルを使用してビルドします。)

さて、どうすれば提出用のにもaps-environmentを登場させられるかというと、

  1. プロビジョニングポータルの[App IDs]で、該当のアプリのApple Push Notification service が “Enabled for Production”になっているのを確認。
  2. [Provisioning]-[Distribution]で、既にあるプロファイルの[Actions]で[Edit]-[Duplicate]とポイントし、コピーを作る。★この新たに作られたコピーがPush通知対応してるっぽい!
  3. ダウンロードし、そのファイルをxcodeのオーガナイザのProvisioningへDrag & Drop。古いのは消してOK。
  4. xcodeでクリーンしてからビルド!

出来上がった.appをcodesignコマンドで確認してみると、

<dict>
<key>application-identifier</key>
<string>[App ID]</string>
<key>aps-environment</key>
<string>production</string>
<key>get-task-allow</key>
<false/>
<key>keychain-access-groups</key>
<array>
<string>[App ID]</string>
</array>
</dict>

どうやらOKそうですね。

この.appをiTunes Connectへアップしてみます。

きっとPush通知できるようになるはず!

From → Apple

2件のコメント
  1. まだ解決していないのですが、かなり参考になりました。ありがとうございます。

Trackbacks & Pingbacks

  1. iOS の Push Notification について : hiiro の log

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。