iOS push服务

Push的原理:

Push 的工作机制可以简单的概括为下图

图中,Provider是指某个iPhone软件的Push服务器,比如我们的应用程序的服务器。
APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。

上图可以分为三个阶段。

第一阶段:Provider把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知

 

 

从上面的图中我们可以看到。

1、 首先是应用程序注册消息推送。

2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。

3、 应用程序将deviceToken发送给Push服务端程序。

4、 服务端程序向APNS服务发送消息。

5、APNS服务将消息发送给iPhone应用程序。

 

如果我们的app用到了push服务,就是你新建app ID的时候设置了enable pushnotification那个属性,并且成功生成了ssl证书。

客户端就不说了,主要说下怎么把我们的证书等移到java,php,c/c++等服务端

 

假设我们现在有一下文件

*.certSigningRequest文件   //请求文件

SSL certificate文件             //分为开发和发布2个证书,发布你上传app的时候要用到的

*.p12文件                             //Apple Development IOS Push Services  密钥

 

假设我们这3个文件为

1、Push.certSigningRequest

2、aps_developer_identity.cer

3、PushKey.p12

我们怎么把这些文件应用到服务端呢?

1、将aps_developer_identity.cer转换成 aps_developer_identity.pem格式。

openssl x509 -in aps_developer_identity.cer -inform DER -out aps_developer_identity.pem -outform PEM

2、将p12格式的私钥转换成pem。

openssl pkcs12 -inPushKey.p12 -outPushKey.pem -nodes

3、用aps_developer_identity.pem和PushKey.pem,Push.certSigningRequest创建P12格式的文件。

openssl pkcs12 -export  -in aps_developer_identity.pem -inkey   PushKey.pem -certfile Push.certSigningRequest  -name “aps_developer_identity”  -out aps_developer_identity.p12

这样我们就得到了证书文件:aps_developer_identity.p12

 

关于证书

cer后缀的证书文件有两种编码:

DER二进制编码或者BASE64编码(也就是.pem)

 

p7b一般是证书链,里面包括1到多个证书

 

pfx是指以pkcs#12格式存储的证书和相应私钥。

 

在Security编程中,有几种典型的密码交换信息文件格式:
DER-encoded certificate:                                         .cer, .crt

PEM-encoded message:                                          .pem

PKCS#12 Personal Information Exchange:              .pfx, .p12

PKCS#10 Certification Request:                               .p10

PKCS#7 cert request response:                                .p7r

PKCS#7 binary message:                                         .p7b

.cer/.crt是用于存放证书,它是2进制形式存放的,不含私钥。

.pem跟crt/cer的区别是它以Ascii来表示。

.pfx/p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式

.p10是证书请求

.p7r是CA对证书请求的回复,只用于导入

.p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。

关于openssl

-in    :(目录名字)  指定输入文件名(路径)

-out  :(目录名字) 指定输出文件名(路径)

-outform:   指定输出文件格式

-inform   :   指定输入文件格式

 

-export: 表示创建pkcs12文件,而不是简单地解读一个pkcs12文件

-inkey: 私钥文件,可选

-certfile: 其他的证书文件,可选

-name: 这个名称只作显示用,导入此文件的软件会显示这个名字

-req: 创建csr

-new: 用于创建csr

-newkey: 创建csr和私钥

-nodes: 无需passphrase

-keyout: 生成私钥文件

-days: 证书有效期

-genrsa: 生成密钥对的算法

-des3: passphrase算法

继续上次的

在工程中

我们首先需要注册一下,得到一个token

-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
self.window.rootViewController=self.viewController;
[self.window makeKeyAndVisible];

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert)];

returnYES;
}

 

如果注册成功的话,我们需要得到这个token

-(void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSLog(@” token is: %@”, deviceToken);
}

如果失败的话
-(void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
NSLog(@”Failed ! error is: %@”, error);
}

如果收到消息通知的话

– (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

NSLog(@”userinfor is : %@”, userInfo);

 

关于The Notification Payload

这个payload啊,你可以这样理解:

1.每一个push notification都有一个payload,这个payload指明应该怎么提示用户,是只有声音,或者声音和badge一起等。

2.它不能超过256字节,这说明你需要传输简明信息。

3.它是一个json 字典,同时它必须包含 key 为 “aps” 的另一个字典,因为提示信息在这个字典中。

4.在 key为 “aps”的字典中我们可以 1) 发送一个alert message 2)显示 badge 数目 3)播放一个sound

key 类型 说明
alert string 或者字典 可以是字符串或者字典 看下面
badge number application icon上显示的数目
sound string application bundle中的声音名字

如果你的alert 设置的是字符串,你应该这样

 

“aps” : {

“alert” :“hello message”,

“badge” :2,

”sound“:”sound.aiff“

如果你的alert设置的是字典,你因该这样

“aps” : {

“alert” :{

“body”:“your message”,

“launch-image”:“img.png”

},

“badge” :2,

”sound“:”sound.aiff“

 

关于服务器

php                      看这里

java                     看这里

c                          看这里

objective-c        看这里

 

关于本地通知

第一步:创建本地推送
// 创建一个本地推送
UILocalNotification*notification = [[[UILocalNotificationalloc]init]autorelease];
//设置10秒之后
NSDate*pushDate = [NSDatedateWithTimeIntervalSinceNow:10];
if(notification != nil) {
// 设置推送时间
notification.fireDate= pushDate;
// 设置时区
notification.timeZone= [NSTimeZonedefaultTimeZone];
// 设置重复间隔
notification.repeatInterval= kCFCalendarUnitDay;
// 推送声音
notification.soundName= UILocalNotificationDefaultSoundName;
// 推送内容
notification.alertBody= @”推送内容”;
//显示在icon上的红色圈中的数子
notification.applicationIconBadgeNumber= 1;
//设置userinfo 方便在之后需要撤销的时候使用
NSDictionary*info = [NSDictionarydictionaryWithObject:@”name”forKey:@”key”];
notification.userInfo= info;
//添加推送到UIApplication
UIApplication*app = [UIApplicationsharedApplication];
[appscheduleLocalNotification:notification];

}

第二步:接收本地推送
– (void)application:(UIApplication*)application didReceiveLocalNotification:(UILocalNotification*)notification{
UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:@”iWeibo”message:notification.alertBodydelegate:nilcancelButtonTitle:@”确定”otherButtonTitles:nil];
[alertshow];
// 图标上的数字减1
application.applicationIconBadgeNumber-= 1;
}

第三步:解除本地推送
// 获得 UIApplication
UIApplication*app = [UIApplicationsharedApplication];
//获取本地推送数组
NSArray*localArray = [app scheduledLocalNotifications];
//声明本地通知对象
UILocalNotification*localNotification;
if(localArray) {
for(UILocalNotification*noti inlocalArray) {
NSDictionary*dict = noti.userInfo;
if(dict) {
NSString*inKey = [dict objectForKey:@”key”];
if([inKey isEqualToString:@”对应的key值”]) {
if(localNotification){
[localNotificationrelease];
localNotification = nil;
}
localNotification = [noti retain];
break;
}
}
}

//判断是否找到已经存在的相同key的推送
if(!localNotification) {
//不存在初始化
localNotification = [[UILocalNotificationalloc]init];
}

if(localNotification) {
//不推送 取消推送
[appcancelLocalNotification:localNotification];
[localNotificationrelease];
return;
}
}

剑指移动电子商务

记得创新工场的陶宁说过:“移动互联网+电子商务,是第三波机会。第一波是门户网站,如新浪、网易、搜狐;第二波是技术网站,百度、腾讯、盛大等科技公司从网络泡沫破裂中成长壮大 ;第三波是移动互联网+电子商务。我们预计,在2010年行业恢复,为爆炸性的第三波奠定基础。第三波由以下技术推动:电子商务,移动互联网,和云计算。 ”于是乎我加入了电子商务网站,选择了移动电子商务,一次全新的挑战,一个需要赢利,一个需要再次挑战自己的机会,我不想错过,我不想在2011移动互联网高速发展的一年错过机会,于是我选择了移动电子商务,选择了乐淘。

电子商务,易趣的完败,淘宝的独大,有啊的退出,拍拍的水深火热,以及最近盛大高调要抢占淘宝市场,似乎对于电子商务从没低潮过,而移动互联网的漫烧,让电子商务也开始逐渐加快了移动电子商务的步伐。淘宝最早有客户端,2011被称为淘宝的开放年,这一年将会有越来越多的手机应用出现。京东的iPhone、Android客户端同样给力,购物车的概念体现了手机购物的快捷与方便,条码购,让国美、苏宁等实体店汗颜的应用足够赚足用户的眼球。凡客,早在去年时我就知道它的客户端存在,只是听到它每个月有惊人的订单时才发现移动互联网的商机是真的很大。这个时代每天都有很多奇迹在诞生,不能落后,必须追赶,同时超越,这是我选择这样一个平台的理由,我有理由相信可以赶超。

电子商务的购物流程:
电子商务再也不是单一的个体,不再是简单的看完、比完价就完了,这是个水深火热的移动互联网大战中,电商都在视机而动,中国电子商务经过这十几年的发展,已经解决了三大问题:第一,支付问题已通过托管和COD得到解决;第二,物流现在是一个很大的挑战,物流本身也是一个很好的商机,会出现亿万级人民币的企业,第三,消费人群方面,年轻人非常乐于网上消费。套用陶宁的话:“B2C 公司需要工具和平台来建立网站和获取用户(帮助传统行业商家);更高利润的机会可能产生在: 社交/娱乐性购物、线上线下连接机会、新的互联网品牌;随着广告价值的增加,高粘性社区和其他不易复制网站也将赚钱 。”
移动电子商务面临的挑战:1、智能手机还是偏贵。2、上网偏贵。3、3G普及不够。4、用户群体较集中(低于30岁)。5、应用关注较集中(娱乐、游戏类)。
没有落后,只有愿意不愿意去超越,在这日益激烈的竞争中,落后了就得马上追赶,云计算,软件安装和更新由用户操作转向云端,商业模式由昂贵的升级更新转向广告赞助。这也是凭啥开放平台将成为移动互联网兴起的一个原由。
移动电子商务,新的挑战,我才刚上步呢,更多新的期待,更多新的希望,对于新版本的上线我是充满了期待,有很多不足和不满,接受批评和意见,并不怕被骂,只是要进步,提供更多更好的服务给用户。
Enhanced by Zemanta

移动互联网时代谁主沉浮

前面写过《SNS死在中国》,对于SNS很多用户的离开,而移动互联网时代的到来,对于SNS等来说或许迎来了新的机会,但对于中国的移动互联网市场谁是主角还是SNS赢来了移动互联网的新的“契机”?

SNS
SNS与移动互联网二者关系:1、传统SNS网站加速移动互联网渗透;2、移动互联网使SNS获得成功。
1、传统SNS网站加速移动互联网渗透
移动互联网分析:
用户场景:排队,等车,睡前,会议,课堂
用户群体:学生、上班族
用户需求:打发碎片化时间、轻量级交互、重娱乐、UI漂亮、省流量
SNS网站将移动互联网变成新的战场,Facebook、twitter、人人、开心等都加快了手机客户端的布署,传统的SNS网站正在走向移动化、信息化。
2、移动互联网使SNS获得成功
新产品的产生会带动其它产品的进步,苹果的成功,让年迈的诺基亚也加快了Meego的脚步,同时对于Android也加快引入Flash于手机平台。而移动互联网的到来,也让更多的产品变的更加的尽善尽美。而3G用户群体的不断增加,移动设备的不断增多,功能更强,让更多的互联网公司看到了无线“契机”的到来。
如果说移动互联网给SNS带来最大的收获,那将用三个字来概括:快、易、简。
快:SNS重的是关系,时时获取好友动态,快速查看更新提醒。
易:操作变的更容易,可以手机查看照片,发送心情。
简:轻量交互,简单的界面,简单的操作,一切从简开始。

门户
微博、社区、新闻、输入法成为门户争抢用户的主要战场,移动互联网给门户带来的机会显而易见,QQ还是一家独大,新浪的微博影响力越来越明显,网易的网易八方,而搜狐同样不甘落后,积力追赶。面对这样混杂的战争,用户对于产品越来越挑剔,门户又有什么动作,拭目以待吧。
淘宝,国内最大的C2C网站同样对于无线的布署加快。UC,多平台,便操作,捕获了众多的爱好者。3G门户,GO浏览器,阅读器一个也不放过。谁都想涉水移动互联网,都说下个10年是客户端的时代,手机客户端将会在新的10年唱主角。

APP
APP引发了新的移动互联网的战争,iPhone对于APP的贡献有目共睹,越来越多的开发应用者的介入,让移动互联网的应用越来越丰富,日本最大的移动互联网公司Gree认为,移动互联网的上一个杀手应用是社交游戏,下一个可能会在社交媒体领域,也就是用户用以沟通的方式,如Facebook和Twitter。面对等待开发的中国APP市场,中国APP时代刚刚到来,SNS中的游戏也都移植到手机上,农场偷菜,抢车位,朋友交易一个也不落下,而这一切仅仅是开始,LBS也刚刚起步。游戏、生活应用将成为APP新的突破口,这也是移动互联网新的“契机”。
移动的MM终没打动多少用户,而高额的收费成为很多用户望而却步。安卓的电子市场将免费进行到底,已有超过十万的应用。最大的莫过于苹果的app store,而面对中国的用户,苹果是否读懂中国用户,还需要时间去考验。hiapk、威锋等网站的掘起,APP时代终将到来。

“三商”
平台商:苹果ios、安卓、WP7、塞班、WM、Kjava……面对如此这么多的手机操作系统平台,谁最懂中国用户?目前领先的还是塞班(市场份额),但安卓的平民化,苹果粉的高潮不退,WP7犹抱琵琶半遮面,塞班的老迈,WM的死亡,Kjava游戏平台的优势,还有创新工厂的点心系统,让这场平台商的战火烧的越来越旺,鹿死谁手,现在言时过早。

终端商:中国的手机移动终端设备是个很复杂的体系,有诺基亚这样吸引着众多学生粉丝的大品牌,也有魅族“中国苹果”的新生代,当然还有山寨成群的一些杂牌(当然都是MTK的天下),是外来和尚好念经还是国内山寨横行天下,谁又知道呢?

运营商:移动、联通、电信。移动独大,联通3G用户,电信CDMA,市场还是移动的天下,当安卓、苹果这类平台慢慢的成为中国用户的一大部分时,是否还是移动的天下呢?用户要的速度,要的是省钱,面对挑剔的中国用户,哪家运营商才是最懂用户的?TD注定失败,WCDMA逐渐拉拢人心,CDMA不见发力,运营商还是移动一倾天下吗?

移动互联网在逐渐的改变用户的一些习惯,越来越多的用户通过手机来完成很多在PC上的操作,除了客户端就是WAP,但WAP终没打动多少用户的心。用户的碎片化时间占据多数,如何成功的赢得用户的碎片化时间,用你的产品去说话吧。