【转载】APNS流程及PHP实现

【转载】APNS流程及PHP实现

消息大小限制

  payload限制为256字节,包括了消息主体以及其他属。也就是整个payload的长度

设备令牌 device token
  每条推送消息都必须针对某特定设备发送。

  在iPhone程序中由APNS产生的唯一deviceToken(设备令牌),是推送的用户标识。

  一旦获取了此令牌,你需要将其存储于服务器而不是你的iPhone程序内。它看上去像这样(64个字符):
  c9d4c07c fbbc26d6 ef87a44d 53e16983 1096a5d5 fd825475 56659ddd f715defc

反馈服务 feedback

  Apple 还提供了一个 反馈服务 ,应该定期查询。

  feedback提供了一个以前使用过但不再有效的(例如用户卸载了你的iPhone程序)设备令牌列表。

  应该从数据库中删除这些设备令牌,节约资源

许可证 pem文件

  要进行推送服务的第一件事就是获取推送许可证。产品服务端通过SSL与APNS通讯进行连接,使用pem许可证进行识别。
  在Mac上生成 Apple推送通知SSL许可证的步骤:
  1、登录到 iPhone Developer Connection Portal 并点击 App IDs
  2、创建一个不使用通配符的 App ID 。通配符 ID 不能用于推送通知服务。例如,我们的iPhone程序ID像这样: AB123346CD.com.serverdensity.iphone
  3、点击App ID旁的“Configure”,然后按下按钮生产 推送通知许可证。

  根据“向导”指导的步骤生成一个签名并上传,最后下载生成的许可证。

  此步骤在 Apple文档中 也有谈到。
  4、通过双击.cer文件将你的 aps_developer_identity.cer 引入Keychain中。
  5、在Mac上启动 Keychain助手,然后在login keychain中选择 Certificates分类。你将看到一个可扩展选项“Apple Development Push Services”
  扩展此选项然后右击“Apple Development Push Services” > Export “Apple Development Push Services ID123”。保存为 apns-dev-cert.p12 文件。
  扩展“Apple Development Push Services” 对“Private Key”做同样操作,保存为 apns-dev-key.p12 文件。
  6、需要通过终端命令将这些文件转换为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
  7、如果你想要移除密码,要么在导出/转换时不要设定或者执行:
  openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem
  8、最后,你需要将键和许可文件合成为apns-dev.pem文件,此文件在连接到APNS时需要使用:
  cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem
  将此文件保存为一个易记的名字,你有可能以后会用到它。

  上述步骤同样适合于生成产品许可证。
  

消息内容(payload)格式
  载荷 格式化为遵循 RFC 4627标准的JSON格式。

它由以下几部分组成:
  alert – 显示于设备上的文本串
  badge – 设备屏幕中程序图标上显示的整数
  sound – 显示消息在设备的同时发出的声音的文本名字
  可以发送简单提示文本串,但也可以发送包括诸如显示自定义按钮等在内的各种选项的字典集。
创建payload
  $payload['aps'] = array('alert' => 'This is the alert text', 'badge' => 1, 'sound' => 'default');
  $payload = json_encode($payload);
  显示 $payload 的内容可以看到传送到APNS 的 JSON字符串:
  {
  "aps" : { "alert" : "This is the alert text", "badge" : 1, "sound" : "default" }
  }
  这将使消息显示于设备上,触发提升声音并将“1”置于程序图标上。

  默认按钮“Close”和“View”同时会显示于弹出窗口上。


  对于 Server Density iPhone程序而言,让用户按下“View”直接进入产生此提示的服务器是很重要的

  所以我们增加了额外的自定义值
  $payload['aps'] = array('alert' => 'This is the alert text', 'badge' => 1, 'sound' => 'default');
  $payload['server'] = array('serverId' => $serverId, 'name' => $name);
  $output = json_encode($payload);
  当用户按下“View”后,自定义server值将被传递到设备中的程序。JSON 值如下:
  {
  "aps" : { "alert" : "This is the alert text", "badge" : 1, "sound" : "default" },
  "server" : { "serverId" : 1, "name" : "Server name")
  }
  256字节的限制适用于整个payload,包括自定义字典集。


  原生接口
  在Server Density中,一旦产生了一条提示,将建立一个payload并插入队列中。因此有必要时我们可以同时发送多个payload。
  Apple推荐使用这种方法,因为如果你在发送各payload时频繁连接和断开,APNS有可能会封锁你的IP
  如Apple 描述:
  原生接口使用原生socket,具有二进制内容,采用数据流技术,不产生回馈。

【转载】APNS流程及PHP实现_第1张图片


  打开连接
  打开连接的 PHP 5代码如下:
  $apnsHost = 'gateway.sandbox.push.apple.com';
  $apnsPort = 2195;
  $apnsCert = 'apns-dev.pem';
  $streamContext = stream_context_create();
  stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
  $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2,
  STREAM_CLIENT_CONNECT, $streamContext);
  如果发送错误,你可以参考$errorString。它也包括了SSL许可证不正确时的详细信息。
  许可证文件处于执行的PHP代码的当前工作目录下,如果需要你可指定其绝对路径。
  注意测试时应该使用开发许可证及sandbox。生产环境主机名为 gateway.push.apple.com ,而且你必须使用不同的产品许可证。
  发送payload
  在此,我们循环整个payload队列进行发送。构建发送到APNS的二进制内容简单示例如下:
  $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) .
  chr(strlen($payload)) . $payload;
  fwrite($apns, $apnsMessage);
  注意 $deviceToken 是从数据库中提取并去除空格得到的。我们还应该检查是否$payload超过256个字节。
  $apnsMessage 包括了正确的二进制payload,而fwrite 将payload写入当前活动的数据流连接中。
  完成后,应关闭连接:
  socket_close($apns);
  fclose($apns);


  可以使用自定义cron系统,几秒钟运行一次

你可能感兴趣的:(【转载】APNS流程及PHP实现)