アプリ(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メッセージを受け取ります(メッセージは正常に送信されました)
誰かがここでPushkitを使用してvoipプッシュ通知をテストすることに興味がある場合に備えて、私が成功した小さな手順を残しました。
1-まだ持っていない場合は、キーチェーンアクセスで[〜#〜] csr [〜#〜]を作成し、CSRをローカルに保存します。
2-Apple Developerにアクセスして、証明書、識別子、およびプロファイルにアクセスします。会員センターで。
ダウンロードしたら、voip_services.cerをダブルクリックして、キーチェーンアクセスアプリケーションを開き、生成された証明書の秘密鍵をエクスポートします。右ボタンエクスポートcertificate.p12ファイル。
voip_services.cerおよびcertificate.p12ファイルを順番に保存するサーバープッシュ通知ジェネレーターを作成するには
最後にApple開発者のWebサイトに再度アクセスし、Provisioning Profiles-> Distribution内に新しいAd-Hoc配布プロファイルを作成します) VoIPプッシュのテストに使用するすべてのデバイスUDIDこのプロファイルをダウンロードし、アプリケーションで使用するためにXcodeにドラッグアンドドロップします。
次に、VoIPプッシュ通知を受信するiOSアプリを作成します。
コードをアプリに追加してみましょう 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つのファイルを配置したフォルダーに戻ります。
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);
スクリプトで変更する必要があります。
それでおしまい。 phpスクリプトを実行します。
#php simplePushScript.php
voIPプッシュ通知を受信する必要があります(アプリログ: "didReceiveIncomingPushWithPayload"が表示されます)
そのテストの後、pushkitフレームワークを介して標準のプッシュ通知をどのように受信できるのか疑問に思いましたが、残念ながらPushタイプを登録するときにPKPushType以外のPKPushTypeVoIPを見つけることができなかったので答えがありません...
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
それで全部です!読んでくれてありがとう!
今日、私はこれを詳細に調査しました。私も、Appleが本番VoIPプッシュ証明書の生成のみを許可する場合、開発ビルドで生成されたプッシュトークンを使用する方法を知りたいと思っていました。
サーバー上で、gateway.Push.Apple.com
に本番プッシュを送信し、gateway.sandbox.Push.Apple.com
に開発/サンドボックスプッシュを送信する必要があります。 gateway.sandbox.Push.Apple.com
の本番VoIP証明書を使用して、アプリの開発ビルドでVoIPプッシュを生成および受信できました。私はまだ試していませんが、アドホックまたはプロダクションビルドで動作し、gateway.Push.Apple.com
を使用すると仮定します。
また、プッシュ通知はシミュレーターではまったく機能しないことに注意してください。
リモート通知を使用しない場合でも、リモート通知も有効にする必要があります。
これを行うと、デバッグとリリースの両方でデリゲートコールバックを受け取ります。