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

本地格式字符串

昨天晚上在查资料的时候,发现这个博客,上面的四篇文章不错,我一一转过来先。

来源: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-keyloc-args属性,当设备接收到通知(应用程序没有运行)

他使用这些APS字典的属性来查找和使用本地化字符串来格式化当前消息,然后再显示给用户

这里介绍第二种

一个IOS应用可以支持国际化资源,如图像,声音,文字的每一种语言的表示,国际通用化这些资源,然后将其分成两部分捆绑再一个子目录中:语言代码和.lproj后缀格式的扩展(如fr.lpor),编程显示本地化的字符串放在一个文件名为Localizable.strings的文件中,在这个文件中的每个条目有一个键和一个本地化的字符串值在这个文件中的每个条目有一个键和一个本地化的字符串值

字符串值可以有格式说明符来进行替代。当一个应用程序要求一个特定资源,说一个本地化的字符串,它得到的是当前用户选择的语言本地化的资源

例如,首选语言是法语,相应的提升消息字符串值将到应用程序目录的fr.lproj中获取Localizable.stringsIOS通过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-keyloc-arg属性的完整列子,请看下一个列子“Examples of JSON payloads,为了学习更多关于ios国际通用化的知识,请看Build-Time Configuration Details” in iOS Application Programming Guide,对于国际通用化的一般信息,请看 Internationalization Programming Topics

JSON例子

下面通知有效负载内容的例子说明了表3-1中的属性再实际应用中的使用

带有“acm”属性的键是用户自定的负载内容。这些例子包含了空格和换行来提高可读性,为了更好的执行,供应商应该删除这些空格和换行

例子自己看去

膘叔:骗子啊,最后一段哪有例子。。。

苹果推送注意事项

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

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

php freetds 处理sqlserver大字段的问题

freetds连接sqlserver是没问题,在连接的时候dsn用的是dblib,而不是mssql。
连接和普通的查询都没有问题,但一旦涉及到大字段,你就会发现问题多多了。比如你的字段类型是nvarchar(max),你在处理的时候你会发现,返回结果都是空。
我晶啊。看来php连接sqlserver还是用windows自己的方案吧:sqlsrv这个组件,但它只能在windows下面使用。

太纠结了

Tags: freetds, sqlserver, 大字段

yii 连接 mssql遇到的一些问题

1、yii在linux下面连接mssql时,connectString一般是dblib:xxxxx,而不是mssql,这是因为用freetds的原因
2、用gii生成mssql的数据表结构时,如果表的字段是类似"Post Time"(即,字段中间有空格),则直接会报错
3、当生成好Model时,使用xxx::model()->findAll()时,如果最初的表结构里有允许某个字段为空,即允许isnull的话,在数据库中,该字段无值时是NULL,findAll就会报错:

XML/HTML代码
  1. 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

随便说说

其实本不想说什么,但是觉得很意外,所以我还是说说了。
一两句而已:
经过某便利店买了瓶啤酒,在收银的时候,一个大妈笑着对我说,送你一个上网软件,扫了一下光盘上的字,立刻就明白了是什么样的软件(XX门,你懂的)。于是我说不需要,我也不想举报你啥的。大妈说,人总要听听外面的声音才是。
我震精了。
---------
现在某些一块、5块的纸币上面多了一些印刷体,委实让人痛苦,扔了吧,可惜,不扔吧,又要传播。TMD,这算是一个什么样的世道??或许你真的有理,但你这样做,就真的没理。

---------
牢骚发完了,继续折腾