手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:推送

被苹果推送服务吃药了

 苹果的推送服务让很多人觉得这是推广自己内容的手段,而且基于这个推送可以做很多事

1、纯内容
2、指定内容(点击后,可以打开指定文章等)
3、提醒用户,你该使用我们的APP了
4、后台下载(国内用这个功能的人很少。大部分都是电子杂志在用,其实,苹果的更新文件也是用的这个功能【听说】)
 
但我最近被它吃药了。
推送的时候,发现数字是1,3,2,4,10,8,5,6,7,9之类的顺序在跳动。
哦,这个数据是消息未读数,为什么会有这种情况呢?是我们推消息推的太频繁了。猜测苹果的推送明显是多线程的。推的过快的时候,他是多条就相当于在一起发,然后由于网络的关系,收到信息就有先后了。于是我们就看到提示的数字在不停的变大变小。。。
 
而且最主要的是,我们TMD还没办法改。。。苦逼

Tags: 推送

供应商与苹果推送信息服务器通信 翻译苹果文档

原文地址:http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW1

                        供应商与苹果推送通知服务器的沟通

                                                                                    翻译:tangly

供应商与苹果推送信息服务器通信

 

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW1

普通供应商的需求

作为一个供应商与苹果推送通知服务的通信。这个接口对于程序供应商是高速的、大容量的接口;它使用一个流TCP插座设计结合二进制的内容。二进制接口是异步的。

生产环境的二进制接口可以通过gateway.push.apple.com端口2195来连接;沙箱(发展)环境的二进制接口可以通过gateway.sandbox.push.apple.com端口2195来连接。您可能会建立多个并行连接到相同的网关或多个网关的实例。

对于每一个接口可以你应该使用TLS(或SSL),以建立一个安全通信通道。这些连接所需的SSL证书通过IOS服务器分配。 细节“配置和发展”。)要建立一个值得信赖可以供应商的身份,在连接的时候,你应该使用此证书点对点的验证连接APNS

 

注:建立一个TLSAPNS的会话,委托安全的CA根证书必须安装提供商的服务器上。如果服务器是运行Mac OS X,这根证书已经在钥匙串中了。在其他系统中,证书可能无法使用。你可以下载来自委托SSL证书的网站的证书。

 

你也应该保留与APNs连接的多个通知。APNs可能会考虑,迅速,并多次作为一个拒绝服务攻击可以建立和撕裂可以连接。错误时,APNS会关闭发生错误连接。

你作为一个供应商,应该以下几个方面的推送通知负责:

您必须构建有效的通知(见“有效通知”)。

必须负责提供标志(badge号在应用程序图标上显示(右上角)

您应该定期与反馈Web服务器连接,并获取目前那些已经多次报道过失败的传输的设备列表(清单)。然后,你应该停止向这些应用程序相关联的设备发送通知。更多信息可以见“反馈”服务。

 

如果您打算支持多种语言的通知消息,但不使用客户端获取的本地化提醒字符串APS有效载荷字典LOC键和LOC - ARGS属性,你需要本地化警报消息可以文本服务器端。要做到这一点,你需要找出目前的客户端应用程序的语言偏好。 调度,登记,处理通知”可以说明为获得这一信息的方法。 LOC键和LOC- args的属性信息可以请可以“通知有效载荷”。

二进制接口和通知格式

二进制接口采用的二进制内容的信息流在本质上是一个普通的TCP套接字。为了获得最佳性能,你应该在单一的传输接口通过分批传输多个通知,明示或使用一个TCP / IP Nagle算法

该接口支持两种格式的通知数据包,简单的格式和增强的格式,以解决一些简单的格式的问题:

通知的有效期:APNS有一个存储并转发的功能,它可以保证最近的通知发送到装有应用程序的设备上。如果该设备是在接收通知时掉线当该设备下次联网时,APNS会再次提供通知。简单的格式,不管通知是否是已经发送过针对性的通知。换句话说,该通知可以随着时间的推移变得“过时”。增强的格式包含着一个有限期值来表示通知有效期。当通知期限值到时,APNS丢弃存储和转发器里的通知。

错误的反馈回应:简单的格式,如果你发送一个通知数据包,在某种方面是畸形的,例如,发送的内容超过规定的限制, APNS会响应切断连接,而且不会拒绝通知的原因。增强的格式,让一个供应商用一个任意的标识符来标记通知。如果有一个错误,APNS会返回一个与该错误代码相关联的标示符。这种应答使供应商能够查找和纠正畸形的通知。

 

大多数供应商推荐使用增强的格式。

 

让我们研究简单的通知格式,首先是因为这种格式增强格式共享。图5-1说明了这种格式。

Figure 5-1  Simple notification format

 

5-1 简单通知格式

大小: 15.14 K
尺寸: 500 x 111
浏览: 1774 次
点击打开新窗口浏览全图

简单的格式中的第一个字节是0(零)的命令值。设备令牌和发送消息的长度必须在网络字节序(即大端法)。此外,您应该使用二进制格式设备令牌进行编码。发送的消息内容不得超过256字节,不得是null结尾的

清单5-1给出了一个函数使用简单的通知格式发送一个推送通知 到APNS上的二进制接口的例子。该示例假定SSL优先连接gateway.push.apple.com(或gateway.sandbox..push.apple.com)和对等交换认证。  请看官网代码

 

清单5-1使用简单格式发送通知到二进制接口

 

 

 

5-2描述了通知数据包的增强格式。这种格式,如果APNS上的遇到无法理解的命令,它会在断开连接之前返回一个错误应答。

5-2 增强通知格式

大小: 17.84 K
尺寸: 500 x 71
浏览: 1690 次
点击打开新窗口浏览全图

增强通知格式的第一个字节是为1的命令值。这种格式中的两个新字段是标识符和通知的有效期。(其它的都和简单的通知格式相同。)

标识符----一个任意值用来标识此通知。如果是APNS无法理解的通知,则返回一个错误应答包,包含此标示符。

有效期----一个固定的UNIX纪元日期(UTC)以秒为单位标识通知不再有效,并且可以被丢弃的时候。有效期值应该是网络顺序(大端法)。如果有效期值为正数,APNS至少试图提供一次通知。您可以指定零或一个小于零的值请求APNS不存储通知。

 

如果你发送的通知在APNS上发现通知格式不完整或其他无法解析的,它会在断开之前返回一个错误应答数据包。如果没有错误,APNS不返回任何内容。)

5-3给出了错误应答数据包的格式。

大小: 4.55 K
尺寸: 187 x 68
浏览: 1606 次
点击打开新窗口浏览全图

5-3 错误应答数据包格式

 

 

该数据包包含一个值为8的命令值,紧跟一个字节的状态代码,和一个供应商指定的通知相同的标示符。表5-1列出了可能的状态代码及其含义。

Invalid :无效的

 

5-1 错误应答的编码

状态代码

表示

0

No errors encountered

1

Processing error

2

Missing device token

3

Missing topic

4

Missing payload

5

Invalid token size

6

Invalid topic size

7

Invalid payload size

8

Invalid token

255

None (unknown)

 

清单5-2修改清单5-1的代码然后构成增强格式的推送通知将其发送到APNS。依然假定SSL优先连接gateway.push.apple.com(或gateway.sandbox..push.apple.com)和对等交换认证。

 

清单5-2使用增强格式发送通知到二进制接口

注意,生产环境的设备令牌和发展环境(沙箱)的设备令牌是不一样的值。

------

最后一句很重要啊。否则会出问题。

不过,我在苹果服务器反馈服务提到的只是普通的令牌而不是加强型的

上述原文:http://hi.baidu.com/tangly888/blog/item/183a0e88432eb7c8fc1f106b.html

Tags: 推送

推送通知消息负载内容和本地格式字符串

来源:http://hi.baidu.com/tangly888/blog/item/62948520121870559358074f.html

翻译苹果文档 地址:  翻译:tangly

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW9

推送通知消息负载内容

每个推送通知都带有内容负载,这个负载内容会被应用程序下载并提醒用户收到数据。负载内容最大允许为256个字节,苹果推送通知服务器拒绝任何超过最大负载字节的推送通知。记住,通知的提交是“尽力而为”,它并不能得到保证。

对于每一个通知,供应商组成一个JSON自动对象来严格遵守RFC 4627协议,这个字典必须通过aps键来包含另一个字典的标示,aps键包含一个或多个属性,指定以下操作:

1. 向用户显示一个提示消息

2. 应用程序图标上的一个徽章号码

3. 可播放的声音

警告: 警告你可以将提示消息,徽章图标号码,播放声音结合成一个单一的通知消息,你应该考虑到推送通知的人机界面问题,例如,用户可能受到频繁的提示消息和警告声音,这然人烦。

当通知到达时,如果这时候目标程序没有运行,这提示消息,声音,徽章号码会被播放或被显示;如果应用程序正在运行,ios将它作为一个NSDictionary对象提供给应用程序委托,这个字典收录了相应COcoa属性列表中的对象

供应商可以指定评估命名以外的消息内容,自定义消息负载内容,自定义值必须使用Json结构和基本类型:字典(对象),数组,字符串,数字,boolean。作为定制消息数据,你不应该包含用户的一些信息。相反,为设置上下文(用户界面)或内部指标为目的来使用它。例如,当供应商发送通知的时候,一个自定义通知消息可能会成为一个会话标示符被消息客户端应用或时间确认来使用。提示消息的任何行为都不应该具有破坏性,如删除客户设备上的数据

关键:由于传送不能够被保证,所以你不应该依赖远程通知设施提供有效负载消息内容给应用程序,不要再消息负载内容中带有敏感数据,你使用它仅是告诉用户此应用有新的数据可用了

3-1中列出了有关苹果服务器消息负载内容的键和预期值

Key

类型

Comment

alert

字符串或字典

如果包含这个这个属性 iOS 将会显示一个标准的提示你可用指定一个字符串作为提醒或作为字典的值如果你指定了一个字符串它会变成有两个按钮的警报消息关闭和显示如果用户点击查看应用程序将会启动

另外你可以指定一个字典来作为提示的内容对于这类字典,请查看表3-2

badge

数字

这个数字将作为应用程序的的徽章图标显示如果此属性不存在任何当前显示的徽章号码将会被删除

sound

字符串

它是捆绑再应用程序的声音文件名这个声音文件播放声音警报如果这个声音文件不存在或指定默认值,这时会播放预设的警报音它的音频必须是兼容的系统数据格式之一详细信息,请阅读“”准备定义提示音

 

 

 

3-1 alert属性的子属性

Key

Value type

Comment

body

string

The text of the alert message.

action-loc-key

字符串或空

如果字符串是指定的将显示带有两个按钮的警报其行为请看表3-1然而, ios 用字符串作为键来获得当前本地化的字符串,并将其用于右边按钮的标题,代替了view如果字符串值为null,系统将显示一个简单的“确定”按钮,当点击时,将会简单的消除按钮 Localized Formatted Strings 获得更多消息

loc-key

字符串

本地提示消息的一个字符串钥匙, 字符串钥匙可以格式化这样%@ and %n$ 在loc-args指定参数变量 Localized Formatted Strings 可以获得更多信息.

loc-args

字符串数组

变量的字符串值格式化再loc-key出现 Localized Formatted Strings 可以获得更多信息 .

launch-image

字符串

图形文件名在应用程序中已经绑定; 它可能包括扩展或省略.  当用户点击动作按钮或移动动作滑块,图片将会被显示出来. I如果这个属性没有指定系统会使用以前的图片,通过在应用程序的Info.plist键来使用图像识别或返回到默认的png文件

这个属性再ios4.0才被添加的

注意:如果你想要iphoneipadipod touch设备将一个通知作为消息文本来显示,那就的有关闭和显示两个按钮

Tags: 推送, budge, json

苹果推送注意事项

关于苹果的推送服务,网上的相关资料非常多,最简单的就是组合成一个数组,类似:

XML/HTML代码
  1. $arr['aps'] = array(  
  2.     'badge'=>1,  
  3.     'sound'=>'',  
  4.     'alert'=>'xxx'      
  5. );  

然后用json_encode处理一下之后,用ssl的方式发送给苹果:

XML/HTML代码
  1. chr(0) . pack("n", 32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n", strlen($payload)) . $payload;  

$devideToken是设备的token,$payload就是上述的数组json_encode之后的数据。
测试的话是发给:ssl://gateway.sandbox.push.apple.com:2195,正式的话,将sandbox去掉即OK

于是这代码就好写了:

PHP代码
  1. /** 
  2.  * ApnsService.php 
  3.  * 
  4.  * @category 
  5.  * @package 
  6.  * @author   gouki <gouki.xiao@gmail.com> 
  7.  * @version 1.0 
  8.  * @created 2011-10-12-23:45 
  9.  */  
  10. class ApnsService {  
  11.     public $token;  
  12.     public $message;  
  13.     public $badge = 1;  
  14.     public $sound;  
  15.     public $ispad;  
  16.     public function __construct($token$message$badge = null, $sound = null, $ispad = 0) {  
  17.         $this->token = $token;  
  18.         $this->message = $message;  
  19.         $this->badge = $badge;  
  20.         $this->sound = $sound;  
  21.         $this->ispad = (int)$ispad;  
  22.     }  
  23.     public function send() {  
  24.         return $this->sendPushInfo();  
  25.     }  
  26.     public function sandboxSend() {  
  27.         return $this->sendPushInfo(true);  
  28.     }  
  29.     private function getPayload() {  
  30.         $body = array();  
  31.         if ($this->badge) {  
  32.             $body['aps']['badge'] = $this->badge;  
  33.         }  
  34.         if ($this->sound) {  
  35.             $body['aps']['sound'] = $this->sound;  
  36.         }  
  37.         $body['aps']['alert'] = $this->message;  
  38.         return $body;  
  39.     }  
  40.     private function getCertFile() {  
  41.         return Yii::getPathOfAlias("application") . ($this->ispad ? "/hdDis.pem" : "/iphoneDis.pem");  
  42.     }  
  43.     private function getSandboxCertFile() {  
  44.         return Yii::getPathOfAlias("application") . ($this->ispad ? "/hdDev.pem" : "/iphoneDev.pem");  
  45.     }  
  46.     private function getApplePushUrl($isSandbox = false) {  
  47.         return ($isSandbox == true ? "ssl://gateway.push.apple.com:2195" : "ssl://gateway.sandbox.push.apple.com:2195");  
  48.     }  
  49.     private function sendPushInfo($isSandbox = false) {  
  50.         $ctx = stream_context_create();  
  51.         stream_context_set_option($ctx'ssl''local_cert',  
  52.                                     ($isSandbox == true  
  53.                                             ? $this->getSandboxCertFile()  
  54.                                             : $this->getCertFile())  
  55.         );  
  56.         //stream_context_set_option($ctx, 'ssl', 'passphrase', '123456'); //如果设置了密码,这里就不能注释了  
  57.         $fp = stream_socket_client($this->getApplePushUrl($isSandbox), $err$errstr, 60, STREAM_CLIENT_CONNECT, $ctx);  
  58.         if (!$fp) {  
  59.             print "Failed to connect $err $errstr\n";  
  60.             return false;  
  61.         } else {  
  62.             //print "Connection OK\n";  
  63.         }  
  64.         $payload = json_encode($this->getPayload());  
  65.         //echo strlen($payload); //这里可以精心测试,最大不能超过256个字节即strlen超过256后苹果直接不予处理。  
  66.         $msg = chr(0) . pack("n", 32) . pack('H*'str_replace(' '''$this->token)) . pack("n"strlen($payload)) . $payload;  
  67.         fwrite($fp$msg);  
  68.         fclose($fp);  
  69.         return true;  
  70.     }  
  71. }  

上面的代码非常简单只是作了一个简单的处理和封装。不过有部分路径是基于yii的,所以要改一下就OK了。
主要是自己的记录。

Tags: 推送, badge, json

笔记1

这段时间在和IOS开发的同事们互相配合,本来是有笔记都会记录下来的。然而那段时间网站备案出点问题。然后就没有记录下来。于是现在开始就要把当时遇到的一些问题开始记录了。
比如这个。原本程序写的时候没有考虑推送,但是在进行了一阵后,发现还是需要推送才行,但当时创建的版本是是类似xxx.xxx.*,如果用推送的话就不能xxx.xxx.*,而是要用具体的版本(因为不是我写的啦,所以说不太清楚),后来找到了官方的介绍:
http://developer.apple.com/library/ios/#qa/qa1680/_index.html

可以从这里看:

Updating from a wildcard App ID to an explicit App ID

Q:  My application is currently signed with a Provisioning Profile that uses a wildcard App ID. How do I enable my App ID to support In App Purchase or Apple Push Notification service?

A: My application is currently signed with a Provisioning Profile that uses a wildcard App ID. How do I enable my App ID to support In App Purchase or Apple Push Notification service?

In App Purchase and Apple Push Notification service require that your application is signed with a Provisioning Profile, which uses an explicit App ID such as com.mycompany.myappname. So, if you have shipped an application signed with a Provisioning Profile that uses a wildcard App ID such as com.mycompany.*, you may wonder how to enable that App ID to handle these features. The answer is to keep your project's Bundle ID the same and create a new App ID in the iPhone Portal that matches the Bundle ID you are currently using in your project. Follow the steps below to enable an App ID that supports In App Purchase or Apple Push Notification service:

  1. Identify your application's current Bundle ID

    You can find your Bundle ID by looking in your project's Info.plist file, however it is best to check what iTunes Connect says it is. Log in to iTunes Connect, navigate to the Manage Your Applications module present in the home page, then select the App Details link for the application you are updating, and copy the bundle identifier displayed in the ensuing page.

  2. Create a new App ID

    Your Team Agent or Team Admin should log in to the iPhone Portal and navigate to its App ID section to create a new App ID. In the App ID section, click on the New App ID button to navigate to the Create App ID form, which contains a Description field, a Bundle Identifier field, a Bundle Seed ID pop-up menu, and a Submit button as shown in Figure 1. Fill out the Description field with a meaningful name such as Explicit App ID for MyAppName for your App ID, select Generate New from the Bundle Seed ID pop-up menu, and paste the previously copied bundle identifier into the Bundle Identifier field. Click Submit to save the new App ID.

Figure 1  Create App ID form

大小: 91.6 K
尺寸: 500 x 329
浏览: 1645 次
点击打开新窗口浏览全图

  1. Enable the newly created App ID for In App Purchase or Apple Push Notification service

    Find your App ID in the App ID section of the Program Portal, click the Configure link next to it, and follow the instructions to enable your App ID for either In App Purchase or Apple Push Notification service.

  2. Update or create, download, and install a Provisioning Profile that uses your App ID enabled for In App Purchase or Apple Push Notifications

    Edit an existing Provisioning Profile or create a new one, and then associate it with your newly created App ID. Download and install this Provisioning Profile on your machine and select it in the Code Signing Identity section of your Target's Build pane in Xcode. Update the version number of your binary, build it, test it, and upload it to iTunes Connect for review.

看最后的两点就知道怎么操作了啦。。这些资料还是需要找英文的,MD,中文里就找不到类似的资料 。。。真TMD狗屎

Tags: 推送