web-dev-qa-db-ja.com

apple本番環境でプッシュ通知が機能しない

私たちは完全に立ち往生しています、助けてください。

私と私のチームはiPhoneアプリケーションを作成しました。iOSを試すのはこれが初めてです。

アプリを送信してapp-storeで利用できるようになるまで、すべては問題ありません。プッシュ通知サービスは機能しません。ウェブを検索して、人々のアドバイスでアプリを再確認してみましたが、何が悪いのかわかりませんでした。この質問はここに投稿されます。

これらは私たちがしたことです:

  1. 「AppMaster」という名前のアプリケーションを作成します。

  2. IOSプロビジョニングポータルで「pushtest」というAppIdを作成しました。このIDにより、開発と本番の両方でプッシュ通知が有効になりました。

  3. 上記のappIdから「AppMasterPushTest」という名前の開発用プロビジョニングを作成しました。このプロビジョニングは内部テスト用であり、チームの全員がMacにインストールしました。

  4. サーバーはJavaによって実装され、テスト中にJava-apnパッケージを使用しました。開発中に認証ファイルをダウンロードし、.p12ファイルを書き出し、メッセージを "サンドボックス」サーバーをパッケージのapiを使用して-withSandboxDestination()with .p12 file。testで問題がなければ、通知が受信されます。

  5. 準備ができたと思ったので、「AppMaster」という別のAppIdを作成し、本番環境でのみプッシュ通知を有効にしました。このIDは、アプリのバンドルIDに書き込まれます。

  6. ステップ5で、AppIdから「appMaster」という名前のプロダクション用に別のプロビジョニングを行い、配布方法を「App Store」に設定しました。それをダウンロードしてアプリを再構築します。これはAppleに提出され、app-stroeで機能します。

  7. サーバー側、本番用の証明書をダウンロードし、.p12ファイルを再度書き出します。そして、api-withProductionDestination()を使用して、.p12を書き出すだけで、メッセージを実動サーバーにプッシュするプログラムを作成しました。

  8. App Storeからアプリをインストールしました。悲しいことに、通知は配信されませんでした。

逃したものはありますか?ところで、ステップ5で作成したIDは「XXX.com.company.appname」のように見えますが、アプリのバンドル識別子では、プレフィックスなしで「com.company.appname」部分を設定するだけです。これが問題になる可能性がありますか?

どんなアイデアも歓迎します。

節約してください。ありがとう。

24
Hetfield Joe

上記のコメントは正しくありません。アプリIDには、バンドルIDの前にプレフィックスがあります。

アプリケーションIDは、Appleによって生成された10文字のコードをプレフィックスとするアプリケーションのバンドルIDで構成されます。チーム管理者はバンドルIDを入力する必要があります。証明書の場合、特定のバンドルIDを組み込む必要があります。 「ワイルドカード」アプリケーションIDは使用できません。

プロビジョニングプロファイルをチェックして、正しいaps資格が含まれていることを確認する必要があります。

プロビジョニングプロファイルファイルの資格が正しいことを確認します。これを行うには、テキストエディターで.mobileprovisionファイルを開きます。ファイルの内容はXMLで構造化されています。資格辞書でaps-environmentキーを見つけます。開発プロビジョニングプロファイルの場合、このキーの文字列値はdevelopmentである必要があります。配布プロビジョニングプロファイルの場合、文字列値はproductionである必要があります。

本番APNSサーバーにプッシュ通知を送信するときに、本番デバイストークンを使用していることを確認する必要があります(サンドボックス環境で動作するデバイストークンは、本番環境では動作しません)。

アプリをアプリストアにリリースする前に、AdHocプロビジョニングプロファイルでアプリをテストしておく必要があります。 AdHocプロファイルは、本番プッシュ環境で機能します。

編集:

デバイストークンに関するいくつかの引用:

ローカルおよびプッシュ通知プログラミングガイド から:

実稼働環境のデバイストークンと開発(サンドボックス)環境のデバイストークンは同じ値ではないことに注意してください。

テクニカルノートTN2265 から:

不正な形式の通知の処理

プッシュサービスが何らかの形で誤った通知を受信した場合、単純なバイナリインターフェイスは接続をドロップします。プロバイダーは、通知の送信に応じてこれをEPIPEまたは破損したパイプエラーと見なす場合があります。一方、強化されたバイナリインターフェイスは、接続を切断する前に、通知の何が問題であったかについての詳細情報を含むエラー応答を送信します。プロバイダーがこれらの条件を適切にキャッチして処理するようにしてください。

最も一般的な問題は、無効なデバイストークンです。社内で開発ビルドをテストするときなど、サンドボックス環境からトークンが取得された場合、トークンを本番プッシュサービスに送信することはできません。各プッシュ環境は、同じデバイスまたはコンピューターに対して異なるトークンを発行します。デバイストークンを間違った環境に送信すると、プッシュサービスはそれを無効なトークンとして認識し、通知を破棄します。

最後に、 この記事 には、複数の通知をAppleに送信する方法の良い説明があります(Apple $ ===は、無効なデバイストークンである最も一般的な原因)、有効な通知の一部も同様に到着しません。

30
Eran