Python PyAPNs 实现消息推送

首先是一些解决问题时查阅过的参考资料,希望对大家有所帮助,减少花在这上面的时间。

苹果推送服务配置教程

IOS开发者中心

使用pyapns实现APNS推送

苹果信息推送服务

 (这是另外一个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次才成功的。


posted @ 2014-11-03 03:55  Destino74  阅读(4637)  评论(2编辑  收藏  举报