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
| 阅读:19501
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
| 阅读:15792
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
| 阅读:20767
Submitted by gouki on 2012, April 16, 1:24 PM
freetds连接sqlserver是没问题,在连接的时候dsn用的是dblib,而不是mssql。
连接和普通的查询都没有问题,但一旦涉及到大字段,你就会发现问题多多了。比如你的字段类型是nvarchar(max),你在处理的时候你会发现,返回结果都是空。
我晶啊。看来php连接sqlserver还是用windows自己的方案吧:sqlsrv这个组件,但它只能在windows下面使用。
太纠结了
Tags: freetds, sqlserver, 大字段
PHP | 评论:1
| 阅读:16273
Submitted by gouki on 2012, April 16, 8:54 AM
1、yii在linux下面连接mssql时,connectString一般是dblib:xxxxx,而不是mssql,这是因为用freetds的原因
2、用gii生成mssql的数据表结构时,如果表的字段是类似"Post Time"(即,字段中间有空格),则直接会报错
3、当生成好Model时,使用xxx::model()->findAll()时,如果最初的表结构里有允许某个字段为空,即允许isnull的话,在数据库中,该字段无值时是NULL,findAll就会报错:
XML/HTML代码
- CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error: 4004 General SQL Server error: Check messages from the SQL Server [4004] (severity 16) [(null)]. The SQL statement executed was: SELECT TOP 1 * FROM [dbo].[DatabaseLog] [t]
4、无论是mysql还是sqlserver,当在components中设置columnCase值的时候,都会报错,这是因为在 MysqlSchema中都是采用了大小写敏感的方式(如$column['IsIdenfy'])之类的,当大小写敏感后,如果在attributes 中设置了PDO的ATTR_CASE,都会报错
Tags: yii, mssql
PHP Framework | 评论:0
| 阅读:19296