技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> iOS开发 --> iOS push服务

iOS push服务

浏览:3695次  出处信息

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类型说明
alertstring 或者字典可以是字符串或者字典 看下面
badgenumberapplication icon上显示的数目
soundstringapplication 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;

   }

   }

建议继续学习:

  1. IOS安全–浅谈关于IOS加固的几种方法    (阅读:15225)
  2. 消息系统该Push/Pull模式分析    (阅读:5054)
  3. iOS内存暴增问题追查与使用陷阱    (阅读:4350)
  4. Push Or Pull?    (阅读:3857)
  5. 10个必需的iOS开发工具和资源    (阅读:3970)
  6. 在Visual Studio中使用MonoTouch开发iOS应用程序(上):环境配置    (阅读:3680)
  7. APP的推送是咋回事    (阅读:3430)
  8. iPhone 5/iOS 6前端开发指南    (阅读:3143)
  9. iOS到Android到底有多远    (阅读:3160)
  10. 在Visual Studio中使用MonoTouch开发iOS应用程序(下):开发体验    (阅读:3070)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1