如果有人对使用Pushkit测试voip推送通知感兴趣,这里我留下了一个我成功遵循的小流程:
1 - 使用Keychain Access创建CSR(如果您还没有),并将CSR保存到本地。
2 - 转到Apple Developer并获取访问证书、标识符和配置文件。在会员中心。
- 在标识符->应用程序ID中创建一个新的应用程序ID
- 在设备->所有设备中添加您要用于测试voip推送的设备UDID
- 在证书->所有证书中创建一个新的生产证书:VoIP服务证书。为您的voip服务证书选择先前创建的应用程序ID。选择先前创建的CSR(证书签名请求),创建后下载您的新的voip_services.cer
下载后双击voip_services.cer以打开Keychain Access应用程序,并为生成的证书导出私钥:右键导出certificate.p12文件。
将voip_services.cer和certificate.p12文件保存在一个文件夹中,以创建您的服务器推送通知生成器。
最后再次进入苹果开发者网站,进入 Provisioning Profiles->Distribution 创建一个新的Ad-Hoc分发配置文件,在其中包括您想用于测试VoIP推送的所有设备UDID。下载此配置文件并将其拖放到您的Xcode中,以便在应用程序上使用它。
现在让我们创建iOS应用程序来接收VoIP推送通知:
- 从Xcode新项目菜单中创建一个新的Single View Application。
- 根据上一节中创建的应用程序ID填写其Bundle标识符。
- 在General->Linked Frameworks and Libraries中添加PushKit.framework。
- 在Capabilities中启用后台模式并选择Voice over IP选项。
- 在Build Settings -> Code Signing中选择之前下载的配置文件作为Code Signing Identity,并选择Distribution。
让我们在应用程序中添加Pasquale在他的问题中添加的代码:
在您的根视图控制器头文件(ViewController.h)中导入PushKit.framework:
添加委托以实现其功能:
@interface ViewController : UIViewController <PKPushRegistryDelegate>
在您的根视图控制器(ViewController.m)的viewDidLoad函数中添加push registration:
- (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进行此操作)。
执行它并从日志中获取PushCredentials,我们将用它来发送推送。
现在让我们进入服务器端(我遵循了
raywenderlich教程的指南):
返回到放置三个文件的文件夹:
- 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文件合并为一个:
为了发送推送,您可以使用
raywenderlich教程中的
Pusher或使用简单的PHP脚本:
<?php
$deviceToken = '0f744707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bbad78';
$passphrase = 'pushchat';
$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);
$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;
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);
$payload = json_encode($body);
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;
fclose($fp);
您需要在脚本中进行修改:
- 通过添加您的PushCredentials(从应用程序日志中获取),修改$deviceToken
- 通过添加在创建PushVoipKey.pem时步骤2中添加的密码,修改$passphrase
就这样。执行php脚本:
并且您应该会收到VoIP推送通知(您应该看到应用程序日志:“didReceiveIncomingPushWithPayload”)
在那个测试之后,我想知道如何通过PushKit框架接收标准的推送通知,但很遗憾,当我注册推送类型时,除了PKPushTypeVoIP之外,我找不到任何其他的PKPushType...
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP]
就这些了!谢谢阅读!