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

关于APNS的一些小问题

此段内容其实有很多都知道,只是这里把问题相对集中的显示出来,也容易找到问题.所以我就转载了一下...

内容来自

http://blog.latermoon.com/?p=878
  1. 以下是大杂烩:  
  2.   
  3.     1.不要用一个开源的叫javapns的lib来推送,这个项目代码臃肿混乱,过度设计,还内存溢出;可以使用notnoop.apns  
  4.     2.Push会延时,也会被丢弃,似乎网络情况,Push本身带有Expiry,超过该值APNS会丢掉Push  
  5.     3.Push有三个基本属性,alert、badge、sound,通过将一些置空,可以实现只修改App上的气泡不出现文本、出现文本但不提示声音,发出声音而不出现任何提示等等效果  
  6.     4.Push除了三个基本属性,还可以附带任意json数据,但总大小不能超过256字节  
  7.     5.要异步发送Push,可以将应用内的Push序列化到Redis队列再消费,并且增加队列监控  
  8.     6.和国外服务的连接速度比较慢,要建立多个连接,使用多线程发送  
  9.     7.APNS有提供feedback服务,用于查询一个Token是否有效  
  10.     8.一台iPhone上的一个App会有两种Token,一种是Developer的,一种是正式Product的,不能混用,在一个与APNS的SSL连接里,使用Developer Token向Product发送Push是无法送达的,同时在十几秒内即使用正确的Product Token发送也无法送达,效果就像直接丢弃  
  11.     9.iPhone上的App处于前台运行时,即使受到Push也不会在界面出现提示,此时App内的回调函数会收到  
  12.     10.高速地向一台设备发送大量Push,Apple会自动丢掉部分Push  

Tags: apns

情人节快乐

又是一年情人节了.恭祝大家情人节快乐

本来春节有很多话想说,但想想,其实说来说去就那些了.还不如情人节送上两句祝福的话比较好..

情人节虽好,但要注意安全哦.

Tags: 情人节

error while loading shared libraries: libaio.so.1

看到这个的时候,觉得不是特别爽:/usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

然后很纠结,于是想办法解决,其实很容易;

On Debian, if you get the error:

/usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

type the following

apt-get install libaio1 libaio-dev

On Redhat/Fedora/CentOS:

yum install libaio

APNS 推送

关于apns这玩意,以前也写过不少的博客来介绍它了,国内的文章都是基于同一套代码的.
而正因为对apns了解的少,所以写的代码,以及对它的扩展都是不够完善的.

不过google code上终于有一套相对比较完善的代码了.https://code.google.com/p/apns-php/,其实在最近他已经迁移到了github了(October 26, 2012, Project source code has moved to github. )
看了一下代码,确实不错.
如果是原先的代码,其实一直有一个问题:如果某个token失效了,那么在接下来的10s左右,fwrite的推送都会失败.
虽然苹果提供了feedback的返回,但其实你翻看国内的文章,介绍,都没有告诉你怎么查询feedback,所以我到现在也没有好好的对Feedback处理过那些无效的信息.

上面介绍的这套代码就好很多了.可以进行推送,在失败的话,还能够继续推,如果成功的推送是直接可以进入下一条,不会胡乱浪费资源,真心不错...
代码也很简单:

PHP代码
  1. $push = new ApnsPush(ApnsAbstract::ENVIRONMENT_SANDBOX, '/dev.pem');  
  2.         // Set the Root Certificate Autority to verify the Apple remote peer  
  3.  
  4.         //$push->setRootCertificationAuthority('entrust_root_certification_authority.pem');  
  5.         // Increase write interval to 100ms (default value is 10ms).  
  6.         // This is an example value, the 10ms default value is OK in most cases.  
  7.         // To speed up the sending operations, use Zero as parameter but  
  8.         // some messages may be lost.  
  9.         // $push->setWriteInterval(100 * 1000);  
  10.         // Connect to the Apple Push Notification Service  
  11.         $push->connect();  
  12.         foreach ($result as $data) {  
  13.             $token = $appCache->getAppTokenByUserId($data['receive_userid']);  
  14.             if(!$token){  
  15.                 continue ;  
  16.             }  
  17.             $token = str_replace(" ","",$token);  
  18.             // Instantiate a new Message with a single recipient  
  19.             $message = new ApnsMessage($token);  
  20.             // Set a custom identifier. To get back this identifier use the getCustomIdentifier() method  
  21.             // over a ApnsMessage object retrieved with the getErrors() message.  
  22.             //$message->setCustomIdentifier(sprintf("Message-Badge-%03d", $i));  
  23.             // Set badge icon to "3"  
  24.             $message->setBadge( intval($data['cnt']));  
  25.             // Add the message to the message queue  
  26.             $push->add($message);  
  27.         }  
  28.         // Send all messages in the message queue  
  29.         $push->send();  
  30.         // Disconnect from the Apple Push Notification Service  
  31.         $push->disconnect();  
  32.         // Examine the error message container  
  33.         $aErrorQueue = $push->getErrors();  
  34.         if (!empty($aErrorQueue)) {  
  35.             var_dump($aErrorQueue);  
  36.         }  

这段代码不要纠结,为什么与官方不一样,因为我在用yii框架的时候没有autoload成功它的 代码,花了5分钟将它全部改成基于namespace的了.

关于产品的设计

一个好的产品,必然是有灵魂的.
一个好的产品,即使是没有内容,也是能够被人喜欢的.
一个好的产品,就算没有内容,它本身也是内容

上面是我的乱谈,当然第一句话,我想,绝对没有说错:好的产品,是灌注着灵魂的.

下面的内容来自于:http://www.huxiu.com/article/9778/1.html
我这里只是摘要,如果你要看详细的,还是去看原文吧:

关于人性指导产品的一些看法——从神经系统到肉体反应
 
下面我再简单介绍下我对互联网产品设计的一些看法。
 
记 得以前看过有人介绍过2012年诺贝尔生物学奖,G蛋白偶联受体啥的。大概的意思是,人体细胞的表面到内核串联着一种蛋白胶G蛋白偶联受体。G蛋白偶联受 体可以接受人体分泌的类似荷尔蒙、肾上腺素等物质,产生反应后使得细胞收缩,产生肉体反应,然后再告知神经系统。神经系统通过之前的经验和环境的认知,来 做肉体反应做出喜怒哀乐的判断。
 
这个道理告诉我们,通过五官接触的声音、味道、图片、动画等,经过肉体的反应,远快于直接进入头脑的。前者相当于条件反射,这就让我们很好的理解为什么人的感性会大于理性了。而人的体验本质上,只有三个需求:性的需求,温饱的需求和安全的需求。
 
这个思想很有利于我们对体验设计的理解。当我们确定了产品满足的目标需求后,如何做出最符合人体条件反射的体验设计。比如:
 
一个按钮:如果只有一个按钮,人的条件反射就是要按它。即使是婴儿,也会非常自然的去按一个凸起或者凹进的按钮。
 
显著的反馈:每一次被理解的反馈(可用动画和声音模拟唤起用户记忆从而更加快速的理解)都是对条件发射的认可和强化。对比小孩,按钮以后有反馈,就会开心的笑。
 
节奏感:人体对节奏感会有本能的愉悦感。柔和的女声和沉着的男声,象征着性感。闪烁的特效,会让人引起安全警觉,从而努力去消除或者感受紧张。
 
安全感需求里面,衍生出一个需求:解决问题的需求。产品必须让用户第一时间理解他要解决的问题,并且用最直白的方法,告诉用户通过他自己的努力解决了这个问题。我们日常工作中的成就感,本质上是因为自己释放了对生存恐惧的压力而产生的。
 
下面讨论一个最复杂的问题:可选择过程中满足的解决问题,即安全需求。我们有很多产品,由于功能的需要不得不让用户有很多选择的操作。在这种情况下,就必须要引入教学机制,或者在刚需及无竞争情况下的让用户自学。
 
总结下来,要做一个好的产品思路,可以分下面三个步骤:
 
1.  解决什么需求,最好能一句话说清楚;
 
2.  解决需求的路径设计,最好能单线完成,过程中有反馈设计;
 
3.  选择指导:通过特效、亮点提醒和选择操作中的反馈,来完成用户对选择的理解。
 
思路明确以后,才是做产品的运营性功能设计,比如积分,信用体系等。
------EOF------
所以,在设计产品的时候,其实还是有很多地方需要想想的...

Tags: 打车

Records:171234