首先是一些解决问题时查阅过的参考资料,希望对大家有所帮助,减少花在这上面的时间。
(这是另外一个pyapns,需要用twised.我试过了,python运行无错误但推送没反应,查看twised.log发现是一个什么clean up的错误。查StackOverflow无果,就没再弄下去了,如果有人成功请留言告诉我谢谢)
1、申请证书
这部分网上资源挺多的,随便找一下就能找到。
实用工具->钥匙串访问
这两个名字随便取。最后保存成CertificateSigningRequest.certSigningRequest文件
在这找到刚刚申请的证书,导出成.p12文件
登录苹果开发者中心
网上旧版的教程会让你找右边菜单的一个选项,改版后已经找不到了。不过自己稍微看着找就行。
IOS开发者中心
我们要配置的地方都在这3个菜单内。
2、添加APP ID
在Identifiers菜单找到App IDs项,添加App ID
其它配置没什么,直接Continue
3、创建APNS SSL Certificates
建好ID后,在APP ID处查看你刚建立的这个ID,它处于未激活状态,我们来激活它
创建这个Development SSL Certificate
选择之前生前的这个XXXX名字很长的文件 ,双击生成的aps_development导入钥匙串访问中。
4、创建Profiles
Provisioning Profiles菜单下的+号添加Profiles,Configure页选iOS App Development,Continue
选中刚刚创建的APP ID
生成Profiles并下载,双击导入Xcode(后面获取设备Token用)。
先看看我们的代码TestApns.py
from apns import APNs, Payload apns = APNs(use_sandbox=True, cert_file='PushTest-cert.pem', key_file='PushTest-key-noec.pem') token_hex = 'c9abbb6b3b612e25426efe8364fac87a30e48ededc76d7147bd4cea98daef034' payload = Payload(alert="Hello Test3!", sound="default", badge=1) apns.gateway_server.send_notification(token_hex, payload)
需要一个设备的Toke和cert文件,key文件。
用这3个命令到相应路径,分别生成3个文件,最后一个是生成无加密的文件,这样就不用每推送一次都要输一次密码。
openssl pkcs12 -clcerts -nokeys -out PushTest-cert.pem -in PushTest.p12 openssl pkcs12 -nocerts -out PushTest-key.pem -in PushTest.p12 openssl rsa -in PushTest-key.pem -out PushTest-key-noec.pem
5、获取设备Token
到应用的info.plist找到这个Bundle ID,这里我们把后面那些全部去掉,改成之前申请APP ID时填的com.KPushTest
然后在Project和Target的code Signing设置自己的开发者账号,还有刚才生成的Profiles文件
以下代码放在AppDelegate.m里,应用启动时会询问是否允许推送消息,然后看输出,那段Token尖括号里的字符串就是我们要的东西了
- (void)applicationDidFinishLaunching:(UIApplication *)application { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor whiteColor]; ViewController *viewController = [[ViewController alloc] initWithNibName:nil bundle:nil]; [[UIApplication sharedApplication] setStatusBarHidden:YES]; self.window.rootViewController = viewController; [self.window makeKeyAndVisible]; NSLog(@"Registering for push notifications..."); [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; } - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken]; NSLog(@"%@",str); } - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { NSString *str = [NSString stringWithFormat: @"Error: %@", err]; NSLog(@"%@",str); } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { for (id key in userInfo) { NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]); } }
OK,2个文件和Token串都有了,把文件放到之前TestApns.py相应位置,运行它。一般情况你会听到推送悦耳的声音了。
补充说明:
配置中最容易出错的地方有3点
1.第二步中申请APP ID时,Bunndle ID跟应用内的不一致。
2.第三步中生成Profiles文件之前,忘记创建APNS SSL Certificates使App ID的Push Notifications服务处于Active状态
3.最后一步要,证书没有放对位置找不到文件。
前两步都是证书的问题,如果是Token字符串获得失败或者最后一步推送不成功,很有可能问题就出在前两步。
这时候不要慌,打开StackOverflow,查你出现的问题相关信息,肯定能找到相应的解决方案,笔者就是在这重复的过程中折腾了3、4次才成功的。