iOS推送小结(证书的生成、客户端的开发、服务端的开发)

1.推送过程简介php

     (1)App启动过程当中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通讯,发出注册远程推送的申请。若注册成功,回调函数application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 会被触发,App能够获得deviceToken,该token就是一个与设备相关的字符串.
     (2)App获取到DeviceToken后,将DeviceToken发送给本身的服务端。
     (3)服务端拿到DeviceToken之后,使用证书文件,向苹果的APNS服务器发起一个SSL链接。链接成功以后,发送一段JSON串,该JSON串包含推送消息的类型及内容。
    (4)苹果的APNS服务器获得JSON串之后,向App发送通知消息,使得App的回调函数application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo被调用,App从userInfo中便可获得推送消息的内容。
java

 

2. 用到的证书文件及生成过程linux

   (1)certSigningRequest文件,该文件在MAC系统中生成,用于在Apple网站上申请推送证书文件。
         生成过程:
         打开应用程序中的“钥匙串访问”软件,从菜单中选择 “钥匙串访问”-》“证书助理”-》“从证书颁发机构请求证书”,邮箱和名称随便填写,而后选择保存到磁盘,就能够在本地生成一个CertificateSigningRequest.certSigningRequest文件。
git

   (2)注册一个支持push的app id,后面会用到。
        生成过程:
       进入developer.apple.com,选择member center - Certificates, Identifiers & Profiles  -  Identifiers- App Ids,而后选择注册app id,设置appid名称,同时,app id suffix一栏必须选择explicit app id,而后设置bundle id,最后勾选 App Services中的 Push Notifications,这样就能够注册一个支持push的aphid。
github

    
  (3) 推送证书cer文件,该文件在developer.apple.com中生成,用于生成服务端须要的文件。
        生成过程:
        进入developer.apple.com,选择member center - Certificates, Identifiers & Profiles  -  Certificates,而后选择建立certificate,类型分为Development和Product。这里以Development为例,选择Apple Push Notification service SSL (Sandbox) ,而后下一步,选择以前生成的支持push的AppId,而后下一步,提交以前建立的CSR文件,再下一步就能够生成cer文件,而后保存到本地。
json

  (4)生成服务端使用的证书文件。若是是使用网上的mac 版PushMeBaby工具,在mac机器上进行推送消息的发送,那么有上面的cer文件就够了。若是是使用PHP、java/c#开发本身的服务端,那么还须要将上面的cer文件作一个转换,生成pem文件或者p12文件。c#

       生成php用的pem文件过程为
        首先双击前面保存的cer文件,此时会打开“钥匙串访问”软件,里面会出现一个Apple Development  IOS push services证书,一个公用密钥和一个专用秘钥,秘钥的名称与证书助理中填写的名称一致。
      选中证书,导出为 apns-dev-cert.p12 文件
      选中专有秘钥,导出为apns-dev-key.p12文件
      经过终端命令将这些文件转换为PEM格式:
      openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
      openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
      最后, 须要将两个pem文件合并成一个apns-dev.pem文件,此文件在链接到APNS时须要使用:
      cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem

       生成java/c#用的p12文件过程为xcode

       openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
       openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
       openssl pkcs12 -export -in apns-dev-cert.pem -inkey apns-dev-key.pem -certfile CertificateSigningRequest.certSigningRequest -name "push" -out push.p12      
浏览器

      
  (5)生成XCODE使用的provisioning文件,该文件用于真机调试。
         生成过程:
         进入developer.apple.com,选择member center - Certificates, Identifiers & Profiles  -  Provisioning Profiles,而后选择建立Provisioning  file,接着选择iOS App Development ,下一步选择AppId,选中以前创建的支持push的appid,接着下一步选择支持push的certificate,下一步勾选须要支持的device id,最后一步设置provisioning文件的文件名,这样provisioning文件就生成了。

服务器

    3. 服务端的开发
     (1)若是只是但愿在mac电脑上测试一下消息的推送,可使用PushMeBaby工具,使用起来比较简单。该工具是开源的,能够从https://github.com/stefanhafeneger/PushMeBaby 下载,代码的执行过程实际上就是设置一下SSL证书,而后链接APNS,接着发送JSON数据。因为要处理SSL逻辑,所以代码稍微多点。在使用工具时,将工程资源中的cer文件替换成本身的cer文件,而后将代码中的deviceToken替换成本身设备的deviceToken便可。


     (2)使用php开发服务端
       因为php已经内置了ssl模块,所以使用php链接APNS服务器来发送json的过程其实是很简单的,代码以下:

该文件能够放到服务器中经过浏览器来访问,也能够经过命令行的方式来解释执行,代码为:$ php -f Pusher.php

     

<?php
$deviceToken= ‘本身的deviceToken'; //没有空格
$body = array("aps" => array("alert" => 'message',"badge" => 2,"sound"=>'default')); //推送方式,包含内容和声音$$ctx = stream_context_create();

//若是在Windows的服务器上,寻找pem路径会有问题,路径修改为这样的方法:
//$pem = dirname(__FILE__) . '/' . 'apns-dev.pem';
//linux 的服务器直接写pem的路径便可
stream_context_set_option($ctx,"ssl","local_cert","apns-dev.pem");
$pass = "xxxxxx";stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);//
//此处有两个服务器须要选择,若是是开发测试用,选择第二名sandbox的服务器并使用Dev的pem证书,若是是正式发布,使用Product的pem并选用正式的服务器
$fp = stream_socket_client("ssl://gateway.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
$fp = stream_socket_client("ssl://gateway.sandbox.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp)
{echo "Failed to connect $err $errstrn";return;}
print "Connection OK\n";
$payload = json_encode($body);$msg = chr(0) . pack("n",32) . pack("H*", str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
echo "sending message :" . $payload ."\n";
fwrite($fp, $msg); fclose($fp);
?>

    4. 客户端的开发
     (1)下载前面创建的cer文件和provisioning文件,双击,导入到xcode中,在build setting中code signing一栏里选择这两个文件的名称,这样就能够将支持push的app部署到真机中。
     

     (2)处理推送消息
           客户端对推送消息的处理分两种状况:
          一. 在App没有运行的状况下,系统收到推送消息,用户点击推送消息,启动App。此时,不会执行前面提到的          didReceiveRemoteNotification函数,而是在App的applicationDidFinishLaunching函数中处理推送,经过如下代码能够获取推送消息中的数据: NSDictionary *userInfo =[launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];


          二 . 当APP处于前台时,系统收到推送消息,此时系统不会弹出消息提示,会直接触发application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo函数,推送数据在userInfo字典中。

           当App处于后台时,若是系统收到推送消息,当用户点击推送消息时,会执行application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo函数,          此时AppDelegate中函数执行的顺序为:          applicationWillEnterForeground           application:didReceiveRemoteNotification          applicationDidBecomeActive

相关文章
相关标签/搜索