iOS的推送:
服务器-1->苹果推送服务器(APNS)-2->手机
其中1:
需要推送证书,BundleID,目标手机的token(deviceToken)
推送证书:是告知苹果服务器我是此app开发者或有开发者的推送授权(自己人,别开枪)。
deviceToken:告知苹果我要推到哪个设备上,我这边查的资料是同一个手机用不同的app获取的deviceToken是不同的。并且同一个手机同一个app有时获取的deviceToken也会改变(受卸载重装,升级系统等影响,不卸载直接xcode运行好像不会变)
BundleID:是告知苹果我要推的APP,(这里有个疑问,既然同一个手机用不同的app获取的deviceToken是不同的,为什么还需要包名呢,是不是不同的app获取的deviceToken可能会有相同的?)
2:苹果服务器通过deviceToken和BundleID推送到目标手机系统层,系统层会寻找已经安装的app。
推送证书怎么申请网上有很多教程了,下面这个是申请完成之后,在开发者中心的样子:
其中type为1是开发环境下的推送证书
type为2是生产环境下的证书
开发推送证书:适用于开发环境的app
生产推送证书:适用于开发环境和生产环境的app。
一个测试推送的程序:Easy APNs Provider:
可以直接在电脑上appstore上搜到,安装就可以了
1,选择证书:
这里只能选择.cer证书,所以在钥匙串找到推送证书右键导出时,选择证书格式为.cer格式。
2,连接至:
这里我的理解是,第一行是开发环境的APNs服务器,第二行是生产环境的APNs服务器,
如果选择开发证书,只能连接第一行的服务器。生产环境证书则两个服务器都可以连接上。
3,添加token:
token获取方法在:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
如果是测试开发环境下的推送证书,可以xcode直连手机,nslog或打断点取deviceToken。
如果想测试生产环境的推送证书,则必须通过安装包安装的方式才可以,因为xcode直连安装到手机后,获取的deviceToken并不能用于生产环境的推送。
我是通过打ad Hoc包,并且将deviceToken转为字符串后添加到了剪切板取的。
NSMutableString *deviceTokenString = [NSMutableString string];
const char *bytes = deviceToken.bytes;
NSInteger count = deviceToken.length;
for (int i = 0; i < count; i++) {
[deviceTokenString appendFormat:@"%02x", bytes[i]&0x000000FF];
}
UIPasteboard *pab = [UIPasteboard generalPasteboard];
[pab setString:deviceTokenString];
Easy APNs Provider:添加token:
注意如果是log出来的,需要去掉括号和空格。
添加完成后,回到第一个页面,
4,推送负载:
就是填你测试推送,要推送的内容,简单写写就好,当然也可以写一些复杂的,测试特殊需求。
做完这些直接点发送推送看手机有没有收到推送。(建议每次发送推送前或者更换证书后,点一下断开连接和连接至,重连一下)
我遇到的问题是,选择生产证书,手动添加的是xcode直连安装的app,nslog出来的token(应该是开发环境的)