Submitted by gouki on 2012, April 17, 9:28 AM
如果供应商试图发送推送通知到一个应用程序,但应用程序已经不存在该设备中了,设备会报告一个信息给苹果推送通知服务器。这种情况经常发生,当用户卸载应用程序后。如果设备报告了尝试传递应用程序推送通知时的失败,APNS需要一些方法来通知供应商,以便它能够避免再次将通知发送到该设备。这样做可以降低不必要的消息开销和提高系统的整体性能。
为此苹果的推送通知服务器包括一个反馈服务,APNS不断更新每个应用程序的失效的设备令牌列表。该设备是识别设备令牌是否由二进制格式的编码的。供应商应定期查询反馈服务来获取他们的应用程序的设备令牌,以鉴别是否还存在(名单)。然后,验证应用程序是不是最近(被识别的设备)重新注册了,否者供应商应停止向这些设备发送通知。
反馈服务可以通过一个二进制接口来访问,和发送推送通知相类似。您可以通过feedback.push.apple.com端口2196访问反馈服务的结果; 您可以通过feedback.sandbox.push.apple.com端口2196访问沙盒的反馈服务的结果。至于二进制接口与推送通知一样,您必须使用TLS(或SSL)来建立一个安全的通信通道。这些连接所需的SSL证书是同一个是发送通知提供的。要建立一个值得信赖可以供应商的身份,你应该与APNS使用点对点的连接验证时提交此证书。
一旦连接,传输立即开始,你不需要发送任何命令到APN。开始读取反馈服务传输过来的数据流,直到没有数据流了。数据是具有以下格式的元组:
图5-4 反馈元组的二进制格式
Timestamp
A timestamp (as a four-byte time_t value) indicating when the APNs determined that the application no longer exists on the device. This value, which is in network order, represents the seconds since 1970, anchored to UTC.
You should use the timestamp to determine if the application on the device re-registered with your service since the moment the device token was recorded on the feedback service. If it hasn’t, you should cease sending push notifications to the device.
Token length
The length of the device token as a two-byte integer value in network order. 设备令牌的长度为两个字节的整数值的网络字节序。
Device token
The device token in binary format.
Tags: apple, 反馈
苹果相关 | 评论:0
| 阅读:20200
Submitted by gouki on 2012, April 17, 9:26 AM
来源: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才被添加的
|
注意:如果你想要iphone,ipad,ipod touch设备将一个通知作为消息文本来显示,那就的有关闭和显示两个按钮
Tags: 推送, budge, json
苹果相关 | 评论:0
| 阅读:19315
Submitted by gouki on 2012, April 17, 9:18 AM
昨天晚上在查资料的时候,发现这个博客,上面的四篇文章不错,我一一转过来先。
来源:http://hi.baidu.com/tangly888/blog/item/9c85cfaaae68e9e71f17a249.html
地址:翻译:tangly
http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW9
本地格式字符串
你可以用两种方式来显示本地提示信息,通知服务器的本地化文本;要做到这一点,它必须发现当前设备的语言偏好,或者客户端应用程序可以存储器绑定的提示消息字符串并支持将其翻译成本地化语言。供应商再通知负载的aps字典里面指定了loc-key和loc-args属性,当设备接收到通知(应用程序没有运行)
他使用这些APS字典的属性来查找和使用本地化字符串来格式化当前消息,然后再显示给用户
这里介绍第二种
一个IOS应用可以支持国际化资源,如图像,声音,文字的每一种语言的表示,国际通用化这些资源,然后将其分成两部分捆绑再一个子目录中:语言代码和.lproj后缀格式的扩展(如fr.lpor),编程显示本地化的字符串放在一个文件名为Localizable.strings的文件中,在这个文件中的每个条目有一个键和一个本地化的字符串值在这个文件中的每个条目有一个键和一个本地化的字符串值,
字符串值可以有格式说明符来进行替代。当一个应用程序要求一个特定资源,说一个本地化的字符串,它得到的是当前用户选择的语言本地化的资源
例如,首选语言是法语,相应的提升消息字符串值将到应用程序目录的fr.lproj中获取Localizable.strings(IOS通过NSLocalizedString的宏来实现这种要求)
注意:当action-loc-key属性是个字符串,一般都是如此,这个字符串是一个本地化目录Localizable.strings当前选定的语言的关键,ios使用这个键来获得提示消息按钮中右边按钮的标题(“action”按钮)
为了更清楚,我们来举个例子,供应商指定了以下指定了以下字典作为alert属性的值
"alert" : { "loc-key" : "GAME_PLAY_REQUEST_FORMAT", "loc-args" : [ "Jenna", "Frank"] }
当用户收到通知消息,它使用"GAME_PLAY_REQUEST_FORMAT"作为键在Localizable.strings文件的.lproj字典中查找相关的字符串值作为当前语言的值,
假设当前本地中有个Localizable.strings,如下:
"GAME_PLAY_REQUEST_FORMAT" = "%@ and %@ have invited you to play Monopoly";
设备会显示这样一条提示信息:“Jenna and Frank have inveited you to play Monopoly”
除了使用格式符号%@,你可以再字符变量值的位置用“%n$@"代替,n代表了loc-args的下标(从1开始)(这也可以用两个%%符号来表示一个百分号标记(%))
所有如果在localizable.strings条目如下:
"GAME_PLAY_REQUEST_FORMAT" = "%2$@ and %1$@ have invited you to play Monopoly";
设备就回显示这样一条提示信息:”Frank and Jenna have invited you to play monopoly“
对于通知消息负载使用的loc-key和loc-arg属性的完整列子,请看下一个列子“Examples of JSON payloads”,为了学习更多关于ios国际通用化的知识,请看““Build-Time Configuration Details”” in iOS Application Programming Guide,对于国际通用化的一般信息,请看 Internationalization Programming Topics
JSON例子
下面通知有效负载内容的例子说明了表3-1中的属性再实际应用中的使用
带有“acm”属性的键是用户自定的负载内容。这些例子包含了空格和换行来提高可读性,为了更好的执行,供应商应该删除这些空格和换行
例子自己看去
膘叔:骗子啊,最后一段哪有例子。。。
苹果相关 | 评论:0
| 阅读:15635
Submitted by gouki on 2012, April 17, 9:11 AM
关于苹果的推送服务,网上的相关资料非常多,最简单的就是组合成一个数组,类似:
XML/HTML代码
- $arr['aps'] = array(
- 'badge'=>1,
- 'sound'=>'',
- 'alert'=>'xxx'
- );
然后用json_encode处理一下之后,用ssl的方式发送给苹果:
XML/HTML代码
- 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代码
-
-
-
-
-
-
-
-
-
- class ApnsService {
- public $token;
- public $message;
- public $badge = 1;
- public $sound;
- public $ispad;
- public function __construct($token, $message, $badge = null, $sound = null, $ispad = 0) {
- $this->token = $token;
- $this->message = $message;
- $this->badge = $badge;
- $this->sound = $sound;
- $this->ispad = (int)$ispad;
- }
- public function send() {
- return $this->sendPushInfo();
- }
- public function sandboxSend() {
- return $this->sendPushInfo(true);
- }
- private function getPayload() {
- $body = array();
- if ($this->badge) {
- $body['aps']['badge'] = $this->badge;
- }
- if ($this->sound) {
- $body['aps']['sound'] = $this->sound;
- }
- $body['aps']['alert'] = $this->message;
- return $body;
- }
- private function getCertFile() {
- return Yii::getPathOfAlias("application") . ($this->ispad ? "/hdDis.pem" : "/iphoneDis.pem");
- }
- private function getSandboxCertFile() {
- return Yii::getPathOfAlias("application") . ($this->ispad ? "/hdDev.pem" : "/iphoneDev.pem");
- }
- private function getApplePushUrl($isSandbox = false) {
- return ($isSandbox == true ? "ssl://gateway.push.apple.com:2195" : "ssl://gateway.sandbox.push.apple.com:2195");
- }
- private function sendPushInfo($isSandbox = false) {
- $ctx = stream_context_create();
- stream_context_set_option($ctx, 'ssl', 'local_cert',
- ($isSandbox == true
- ? $this->getSandboxCertFile()
- : $this->getCertFile())
- );
-
- $fp = stream_socket_client($this->getApplePushUrl($isSandbox), $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
- if (!$fp) {
- print "Failed to connect $err $errstr\n";
- return false;
- } else {
-
- }
- $payload = json_encode($this->getPayload());
-
- $msg = chr(0) . pack("n", 32) . pack('H*', str_replace(' ', '', $this->token)) . pack("n", strlen($payload)) . $payload;
- fwrite($fp, $msg);
- fclose($fp);
- return true;
- }
- }
上面的代码非常简单只是作了一个简单的处理和封装。不过有部分路径是基于yii的,所以要改一下就OK了。
主要是自己的记录。
Tags: 推送, badge, json
苹果相关 | 评论:0
| 阅读:20566
Submitted by gouki on 2012, April 9, 10:27 PM
说起抄袭,让我想 起以前黄夏留教授的笑话系列中的一个:黄教授在监考,后期黄教授感慨,这次考试所见,全班同学几乎都在抄,不是你抄我就是我抄你,只有一个同学没抄,他的名字叫杨伟。
OK,再来说说互联网,互联网在国内抄的最成功的企业应该算是腾讯,把ICQ抄成了QQ,现在ICQ撑不下去了,但是QQ却越发红火;国内抄的最成功的项目应该算是新浪微博吧,不过也是占了一个小便宜,因为饭否被咔嚓了,机遇啊。
细算国内的一些项目,难道不都是在抄?有土豆和有土逼;微博和推特;开心、人人和非死不可;磨菇街和pintrest;等等等等
看到apple4.me上面的一段话:http://apple4.us/2012/04/why-we-should-be-sensitive-on-knockoff-software-products.html
- 抄袭和模仿是必经阶段。
- 太阳底下无新事,没有什么东西是完全原创的。
- 中国互联网公司都抄,但不是每家都能抄成功。抄不等于成功,我们不应该单纯因为一家公司抄袭就反对它。
- 美国也有抄袭。
好吧,其实每个人都在想,抄袭是成功的最简单的方法,毕竟抄袭之后,你已经不需要再考虑用户的需求,不是吗?你想着既然别人都成功了,证明他们确实是有这种需求的,所以在此基础上,又可以省下产品经理,省下创意人员,只需要设计人员就OK了。
-------
其实传统企业难道就没有抄袭了吗?也不见得。三株?总清楚的吧,脑黄金,也是吧;不过传统企业的抄袭不象互联网那样见效快。不知道以后会怎么样。。。
-------
不多谈了,交互设计师、创意,难道真的就是我们国家所缺的吗?交互的人这两天是越来越多了,大企业都在慢慢的重视这一块,只是,创意却还没有明显进步,哎:当然,我也没有什么创意,发牢骚总不犯法。
苹果相关 | 评论:0
| 阅读:12999