web-dev-qa-db-ja.com

PushKitを実装し、開発動作でテストする

アプリ(Voipアプリ)内にPushKitサービスを実装したいのですが、次の疑問があります:本番用のvoip証明書のみを生成できます。開発デバイスでvoipプッシュ通知サービスをテストしようとすると動作しますか?

これは私の実装テストです:

この3行のコードを使用すると、サーバーに保存するために使用するdidUpdatePushCredentialsコールバックでプッシュトークンを取得できます。

PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
pushRegistry.delegate = self;
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];

サーバー側は、アラートテキストのみを含む「通常の」ペイロードプッシュ通知を生成し、サーバーに保存されたvoipトークンに送信しました。

デバッグログでコールバックを使用しますが、呼び出されることはありません!

- (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(NSString *)type {

          NSLog(@"didInvalidatePushTokenForType");

}

-(void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type {

          NSLog(@"didReceiveIncomingPushWithPayload: %@", payload.description);

}

-(void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type {
     if([credentials.token length] == 0) {
           NSLog(@"voip token NULL");

          return;
     }

      NSLog(@"didUpdatePushCredentials: %@ - Type: %@", credentials.token, type);

}

以前にアップロードしたデバイストークンをvoipするためにサーバーからプッシュ通知メッセージを生成しようとすると、didReceiveIncomingPushWithPayloadコールバックで通知されませんが、サーバーから200 okメッセージを受け取ります(メッセージは正常に送信されました)

21
pasqui86

誰かがここでPushkitを使用してvoipプッシュ通知をテストすることに興味がある場合に備えて、私が成功した小さな手順を残しました。

1-まだ持っていない場合は、キーチェーンアクセスで[〜#〜] csr [〜#〜]を作成し、CSRをローカルに保存します。

2-Apple Developerにアクセスして、証明書、識別子、およびプロファイルにアクセスします。会員センターで。

  • 内部識別子->アプリID新しいアプリIDを1つ作成します
  • 内部デバイス->すべてVoIPプッシュのテストに使用するデバイスUDIDを追加します
  • 内部証明書->すべて新しい運用証明書を作成します:VoIPサービス証明書。 VoIPサービス証明書用に以前に作成したアプリIDを選択します。以前に作成したCSR(証明書署名要求)を選択し、作成したら新しいvoip_services.cerをダウンロードします

ダウンロードしたら、voip_services.cerをダブルクリックして、キーチェーンアクセスアプリケーションを開き、生成された証明書の秘密鍵をエクスポートします。右ボタンエクスポートcertificate.p12ファイル。

voip_services.cerおよびcertificate.p12ファイルを順番に保存するサーバープッシュ通知ジェネレーターを作成するには

最後にApple開発者のWebサイトに再度アクセスし、Provisioning Profiles-> Distribution内に新しいAd-Hoc配布プロファイルを作成します) VoIPプッシュのテストに使用するすべてのデバイスUDIDこのプロファイルをダウンロードし、アプリケーションで使用するためにXcodeにドラッグアンドドロップします。

次に、VoIPプッシュ通知を受信するiOSアプリを作成します。

  • Xcodeの新しいプロジェクトメニューから新しいシングルビューアプリケーションを作成します。
  • 前のセクションで作成したアプリIDに従ってバンドル識別子を入力します。
  • [一般]-> [リンクされたフレームワークとライブラリ]にPushKit.frameworkを追加します。
  • 機能では、バックグラウンドモードを有効にし、Voice over IPオプションを選択します。
  • [ビルド設定]-> [コード署名]で、以前にダウンロードしたプロビジョニングプロファイルを選択し、[コード署名IDとして配布]を選択します。

コードをアプリに追加してみましょう Pasquale 彼の質問に追加しました:

ルートビューコントローラーヘッダー(ViewController.h)PushKit.frameworkのインポート:

#import <PushKit/PushKit.h>

その機能を実装するためにデリゲートを追加します。

@interface ViewController : UIViewController <PKPushRegistryDelegate>

ルートビューコントローラー(ViewController.m)のviewDidLoad関数を追加します。プッシュ登録:

- (void)viewDidLoad {
    [super viewDidLoad];

    PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
    pushRegistry.delegate = self;
    pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
}

必要なデリゲート関数を実装します。

- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type{
    if([credentials.token length] == 0) {
        NSLog(@"voip token NULL");
        return;
    }

    NSLog(@"PushCredentials: %@", credentials.token);
}

- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type
{
    NSLog(@"didReceiveIncomingPushWithPayload");
}

すべてがコンパイルされて問題がなければ、プロジェクトをアーカイブし、テストデバイスにインストールするためにipaファイルをエクスポートします(たとえば、Testflightを使用してジョブを実行できます)。

それを実行し、プッシュの送信に使用するPushCredentialをログから取得します。

サーバー側に行きましょう( raywenderlich tutorials のこの素晴らしいガイドに従いました):

3つのファイルを配置したフォルダーに戻ります。

  • voip_services.cer
  • certificate.p12

1-ターミナルを開き、証明書ファイルからpemファイルを作成します。

#openssl x509 -in voip_services.cer -inform der -out PushVoipCert.pem

2-エクスポートされた秘密キーファイルからpemファイルを作成します。

#openssl pkcs12 -nocerts -out PushVoipKey.pem -in certificate.p12

3-両方のpemファイルを1つに結合します。

#cat PushVoipCert.pem PushVoipKey.pem > ck.pem

プッシュを送信するには、 Pusher from raywenderlich tutorials tutorialまたはシンプルなphpスクリプトを使用します。

<?php

// Put your device token here (without spaces):
$deviceToken = '0f744707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bbad78';

// Put your private key's passphrase here:
$passphrase = 'pushchat';

// Put your alert message here:
$message = 'My first Push notification!';

////////////////////////////////////////////////////////////////////////////////

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
$fp = stream_socket_client(
'ssl://gateway.sandbox.Push.Apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)
    exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body['aps'] = array(
    'alert' => $message,
    'sound' => 'default'
    );

// Encode the payload as JSON
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
    echo 'Message not delivered' . PHP_EOL;
else
    echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);

スクリプトで変更する必要があります。

  • PushCredentialsを追加することによる$ deviceToken(アプリログから)
  • PushVoipKey.pemの作成時にステップ2で追加したパスフレーズによる$ passphrase

それでおしまい。 phpスクリプトを実行します。

#php simplePushScript.php

voIPプッシュ通知を受信する必要があります(アプリログ: "didReceiveIncomingPushWithPayload"が表示されます)

そのテストの後、pushkitフレームワークを介して標準のプッシュ通知をどのように受信できるのか疑問に思いましたが、残念ながらPushタイプを登録するときにPKPushType以外のPKPushTypeVoIPを見つけることができなかったので答えがありません...

pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];

それで全部です!読んでくれてありがとう!

64
M Penades

今日、私はこれを詳細に調査しました。私も、Appleが本番VoIPプッシュ証明書の生成のみを許可する場合、開発ビルドで生成されたプッシュトークンを使用する方法を知りたいと思っていました。

サーバー上で、gateway.Push.Apple.comに本番プッシュを送信し、gateway.sandbox.Push.Apple.comに開発/サンドボックスプッシュを送信する必要があります。 gateway.sandbox.Push.Apple.comの本番VoIP証明書を使用して、アプリの開発ビルドでVoIPプッシュを生成および受信できました。私はまだ試していませんが、アドホックまたはプロダクションビルドで動作し、gateway.Push.Apple.comを使用すると仮定します。

また、プッシュ通知はシミュレーターではまったく機能しないことに注意してください。

4
Troy

リモート通知を使用しない場合でも、リモート通知も有効にする必要があります。

  • 開発者ポータルのアプリID識別子内
  • 開発プロビジョニングプロファイルを再作成する
  • xCodeですべてをダウンロード->設定...->アカウント->アカウント
  • 機能->バックグラウンドモードでリモート通知を有効にする

これを行うと、デバッグとリリースの両方でデリゲートコールバックを受け取ります。

0
Shebuka