iOS远程推送流程

一、远程消息推送的信息流

1. 信息流程图如下所示:

iOS远程推送流程_第1张图片
  • Provider 为消息发送的服务器端
  • APNs为苹果的服务器

流程大致为:服务器端将消息先发送到苹果的服务器,然后由苹果的服务器将消息推送到客户的设备端,最后由iOS系统将接收到的消息传递给相应的App。

二、推送实现流程

1. 创建App ID

填写Name


iOS远程推送流程_第2张图片

填写Bundle ID


iOS远程推送流程_第3张图片

勾选推送选项
iOS远程推送流程_第4张图片

最后点击Registe和Done按钮完成App ID的创建
如果是已经创建的 App ID 也可以通过设置开启 Push Notification 功能。

2. 创建Push证书

新建一个证书


iOS远程推送流程_第5张图片

选择证书类型

iOS远程推送流程_第6张图片

选择对应App ID

iOS远程推送流程_第7张图片

上传CSR证书

iOS远程推送流程_第8张图片

请求CSR证书

iOS远程推送流程_第9张图片

证书保存到本地

iOS远程推送流程_第10张图片

下载证书

iOS远程推送流程_第11张图片

下载的证书直接拖到钥匙串的登录栏目下

iOS远程推送流程_第12张图片

右击导出证书为.p12文件

iOS远程推送流程_第13张图片
iOS远程推送流程_第14张图片

密码为空


iOS远程推送流程_第15张图片

还需要导出key的.p12文件

iOS远程推送流程_第16张图片

3. 创建描述文件Provisioning Profiles

创建开发环境下的描述文件

iOS远程推送流程_第17张图片

选择描述文件的适用环境(这里演示选择的是开发环境)

iOS远程推送流程_第18张图片

选择对应App ID

iOS远程推送流程_第19张图片

选择开发环境证书

iOS远程推送流程_第20张图片

选择测试设备

iOS远程推送流程_第21张图片

填写描述文件名字

iOS远程推送流程_第22张图片

下载描述文件

iOS远程推送流程_第23张图片

4. 新建一个测试工程,在AppDelegate.m输入以下代码,详细请看代码中注释

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    /*
    // 初始化信鸽push
    [XGPush startApp:2200186379 appKey:@"I92H75AIJ4ME"];
    */
    
    // 注册远程推送通知
    [[UIApplication sharedApplication] registerForRemoteNotifications];
    
    // 设置消息的功能
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
    
    // 注册消息设置功能
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
  
    return YES;
}

// 接收注册成功之后返回的token
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(nonnull NSData *)deviceToken
{
    NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
    NSLog(@"token = %@", token);
    
    token = [token stringByReplacingOccurrencesOfString:@"<" withString:@""];
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
    token = [token stringByReplacingOccurrencesOfString:@">" withString:@""];
    NSLog(@"token = %@", token);
}

// 注册失败之后返回的错误信息
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(nonnull NSError *)error
{
    NSLog(@"error = %@", error);
}

// 处理接收到的消息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"userInfo = %@", userInfo);
}

接下来配置工程文件
点击工程,选择General选项,填写Bundle Identifier


iOS远程推送流程_第24张图片

点击工程,选择Info选项,填写Bundle Identifier


iOS远程推送流程_第25张图片

点击工程,选择General选项,设置Build Settings
iOS远程推送流程_第26张图片

接下来连接真机测试

成功之后,控制台会打印如下Token信息,成功获得Token信息, 说明APNs服务器和客户端已具备接收推送过来的消息的条件

5. 配置服务器端

首先分别把之前制作的推送证书.p12文件和key的.p12文件转换为.pem格式,打开终端,cd到放置.p12文件的文件夹
in cert.p12 为需要转换的文件(cert需修改为自己所保存的文件名)
out cert.pem 为转换后所需的文件(cert文件名可自定义)

转换终端命令如下
$ openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12   
$ openssl pkcs12 -nocerts -out key.pem -in key.p12

在转换key.p12文件时,第一次输入的密码为导出证书时,设置的密码(这里为空,直接回车), 由于转换key时需要设置密码,所以回车输入密码例如123456,再回车验证密码123456,回车转换成功,见下图:

iOS远程推送流程_第27张图片

如果需要去掉刚刚设置的密码,在终端输入如下指令

$ openssl rsa -in key.pem -out key.unencrypted.em

最后,合并两个.pem文件,得到的ck.pem就是服务端需要的证书了。

$ cat cert.pem key.unencrypted.pem > ck.pem

6. 创建服务器,发送消息

服务器文件拷贝到刚才ck.pem所在文件夹

  • $deviceToken 为之前连接真机测试时,控制台所打印的token字符串
  • $message 为所要推送的消息
  • $badge 为App角标
  #!/usr/bin/php
 $message);
if ($badge)
$body['aps']['badge'] = $badge;
if ($sound)
$body['aps']['sound'] = $sound;

/* End of Configurable Items */
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
// assume the private key passphase was removed.
// stream_context_set_option($ctx, 'ssl', 'passphrase', $pass); 发布:ssl://gateway.push.apple.com 2195
$fp = stream_socket_client('tls://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
print "Failed to connect $err $errstrn";
return;
}
else {
print "Connection OK\n";
}
$payload = json_encode($body);
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
print "sending message :" . $payload . "\n";
fwrite($fp, $msg);
fclose($fp);
?>

最后在终端输入如下命令, 即可推送消息

$ php send.php

你可能感兴趣的:(iOS远程推送流程)