我先来说一下我对原理的理解:
移动设备一联网或者更换网络,都会把该网络的公网和路由的地址和端口,以及设备的信息请求到apns,这样苹果服务器apns就可以根据设备id找到ip地址。
那么,在以上的基础上,一旦我们自己的服务器向apns发送消息,该消息携带指向目标设备和目标app等信息,apns接收到新消息准备推送,他就可以跟据该消息指向的设备找到ip地址,给该地址推送消息。
手机接收到消息,会根据消息携带的信息判断是属于哪个app的,所以在点击推送消息的时候会启动相应的app
友盟推送:
开发测试时推送(必须在真机上),这里以下的操作,最好是在已经完成真机测试了,再进行以下操作:
1,在苹果开发者中心,添加app ids,然后添加APNS Development Cer,下载安装,并导出.p12;创建developmentProfiles,运行。
2,用.p12在 http://message.umeng.com/appList 中添加应用,复制appkey(后面会用到)
3,下载sdk http://dev.umeng.com/message/ios/sdk-download,导入sdk,在appDelegate.m中添加:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; token = [token stringByReplacingOccurrencesOfString:@" " withString:@""]; NSLog(@"%@",token); [UMessage registerDeviceToken:deviceToken]; } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { [UMessage didReceiveRemoteNotification:userInfo]; }
4,回到第2步,http://message.umeng.com/540aaa38fd98c5727c021ac9/device ,添加设备,把在控制台打印的deviceToken复制过去。然后差不多就可以了
以上有很多步骤省略了,大体意思应该能明白。
百度推送:
首先注意,百度推送是个坑,我建议使用友盟推送,但是为了统一,我才使用百度推送。
为什么是坑呢,因为百度有两种推送,有一种不是我们用的,但是却混淆在一起。
请在:http://developer.baidu.com/console#app/project 创建工程;并拿到key,
而且开发文档也有2套,注意是这一套:http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/guideios
另外:文档中要注意的是:
添加SDK到APP工程。
1. 将libBPush.a和BPush.h添加到Xcode工程
2. 添加JSONKit.m和JSONKit.h到Xcode工程,注意百度推送提供的JSONKit.m需要设置-fno-objc-arc,以兼容arc
3,添加CoreTelephony.framework到工程
草,现在还不能支持ios8,ios8都出来3个多月了
激光推送
也是个坑,总之有两个地方坑了我。
1,我是用pods导入的JPush库,会报错
原因,pods下好的一个libPushSDK-1.8.2.a库文件需要手动导入。
2,我是用的多个开发者账号同时开发,会报错
或者
did Fail To Register For Remote Notifications With Error: Error Domain=NSCocoaErrorDomain Code=
3000
"未找到应用程序的“aps-environment”的权利字符串"
UserInfo=
0x1c55e000
官网解释:http://docs.jpush.cn/pages/viewpage.action?pageId=7864782#iOS常见问题-为什么启动的时候出现DidFailToRegisterForRemoteNotificationsWithError的错误
很系统,但是漏掉了我这种情况。
还需要设置Code signing identity为你现在使用的开发者账号。