分分钟搞定IOS远程消息推送(二)

简介: 分分钟搞定IOS远程消息推送

如果你的项目已经创建了APP id,则可以不用重新创建,但是你创建的APP id必须要支持远程推送。如果还没有创建,点击加号,创建一个:

image.png

之后的界面中APP ID有两种类型:Explicit和Wildcard,分别是特殊的和通配的,我们需要推送功能,这个ID不能是通配的,所以我们选择第一个。

image.png

这里需要填的的Bundle ID必须和我们App中的一致:

image.png

在APP ID的服务设置中,将Push Notification勾选上,点击continue。

image.png

之后点击submit,最后点击Done。这时我们的APP IDs列表中会出现我们刚才创建的APP ID。

(4)创建证书

点击我们刚才创建的APP ID,你会看到Push Notification一行为未设定的。我们点击Edit。

image.png

在Push Notifications设置里是如下界面,development是开发证书,Production是产品证书,我们现在需要测试,所以用Development证书,上线时要使用Production证书。点击Create Certificate。

image.png

接着点击continue,如下界面会让我们选择一个CSR文件,我们第一步创建的文件在这里派上用场了,选择那个文件,点击Generate。

image.png

将创建好的证书下载到电脑中:

image.png

至此,我们已经有了三个文件了,分别是CSR文件,.p12文件,.cer文件。要将这三个文件放在同一个目录下。.cer文件分为测试和产品两个,需要哪个自行选择。写了这么多,我们的准备工作可算是做完了,不要灰心,其实你的推送工作基本上也就做完了。只是申请过程麻烦了一些,但工程的代码,我们几乎不用怎么配置。

2、兵马未动、粮草先行——服务端进行信息推送的设置

(1)处理证书

打开终端cd到我们上面得到的三个文件所在的目录。

在终端执行如下命令:

$ openssl x509 -in aps_development.cer -inform der -out PushCert.pem

aps_development.cer是刚才生成的.cer文件的文件名。会在当前文件夹中生成一个pem文件,这是我们服务端对应的证书。

再执行如下命令:

$ openssl pkcs12 -nocerts -out PushKey.pem -in key.p12

key.p12是上面生成的.p12文件的文件名。这时终端会让输入密码,这里的密码就是上面我们设置的密钥的密码。输入密码后回车,如果密码正确,会让我们输入新密码(一定切记),输入两次后,终端会提示成功创建PushKey.pem文件。

最后一步,将我们生成的两个pem文件和成为一个:

$ cat PushCert.pem PushKey.pem > ck.pem

(2)测试证书是否可用

在终端执行下面的命令:

$ telnet gateway.sandbox.push.apple.com 2195

等一小会,如果终端显示下面的情形,则证书正常。

image.png

然后执行如下命令:

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushKey

输入密码后回车显示如下的结果则连接成功:

image.png

 

3、天涯海角、一步之遥——应用程序中的配置

在我们项目的AppDelegate中添加如下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
double version = [[UIDevice currentDevice].systemVersion doubleValue];//判定系统版本。
if(version>=8.0f){
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert) categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    }else{
        UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
    }
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ // 处理推送消息
    NSLog(@"userinfo:%@",userInfo);
    NSLog(@"收到推送消息:%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *) error {
    NSLog(@"Registfail%@",error);
}
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
    NSLog(@"%@",deviceToken);//这里的Token就是我们设备要告诉服务端的Token码

下面是网上搜的PHP服务端的代码:

<?php
//这里填写设备的Token码
$deviceToken = '74314cc9e8f747e2fa96c2c1585c830cdf994de6b453ce9fa1c09ba396b2f9e9';
//这里是密钥密码
$passphrase = 'abcabc';
//推送的消息
$message = '这是一条推送消息';
////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');//ck文件
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文件和我们的ck文件放在同一目录下。在终端的当前目录下,执行如下命令:

$php push.php

如果我们的设备王略正常,就可收到推送的消息了:

image.png

image.png

四、几点注意

1、如果终端发送信息时提示密钥不可访问之类的错误,请检查是否cd到了当前目录,如果还存在问题,将密钥部分从新生成一次。

2、注意PHP代码中的字符为英文字符。

目录
相关文章
|
iOS开发
iOS开发-聊天气泡的绘制和聊天消息列表
iOS开发-聊天气泡的绘制和聊天消息列表
256 0
iOS开发-聊天气泡的绘制和聊天消息列表
|
iOS开发
IOS消息推送
IOS消息推送
141 0
|
存储 缓存 开发者
iOS-底层原理 14:消息流程分析之 动态方法决议 & 消息转发
iOS-底层原理 14:消息流程分析之 动态方法决议 & 消息转发
332 0
iOS-底层原理 14:消息流程分析之 动态方法决议 & 消息转发
|
缓存 算法 C++
iOS-底层原理 13:消息流程分析之慢速查找
iOS-底层原理 13:消息流程分析之慢速查找
151 0
iOS-底层原理 13:消息流程分析之慢速查找
|
存储 缓存 自然语言处理
iOS-底层原理 12:消息流程分析之快速查找
iOS-底层原理 12:消息流程分析之快速查找
104 0
iOS-底层原理 12:消息流程分析之快速查找
|
搜索推荐 iOS开发
iOS小技能:消息推送扩展的使用
iOS小技能:消息推送扩展的使用
565 0
iOS小技能:消息推送扩展的使用
|
存储 Android开发 数据安全/隐私保护
分分钟搞定IOS远程消息推送(一)
分分钟搞定IOS远程消息推送
259 0
分分钟搞定IOS远程消息推送(一)
|
JSON 数据格式 iOS开发
APNS IOS 消息推送JSON格式介绍
在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送。下面积累了我在进行apns推送时候总结的 apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 aps 字典。
3480 0
|
Android开发 iOS开发
了解iOS消息推送一文就够:史上最全iOS Push技术详解
本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表。 1、引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ、微信等IM界面处于前台时,聊天消息和指令都会通过IM自建的网络长连接通道推送过来,这种Pu...
3462 0