zoukankan      html  css  js  c++  java
  • 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次才成功的。


  • 相关阅读:
    LintCode 27. 拓扑排序 DFS实现
    LintCode 155. 二叉树的最小深度
    LintCode 90. k数和 II
    LintCode 33. N皇后问题
    Oracle分组后取某列最大值的行数据
    Oracle日期范围
    Mongo可视化工具基本操作
    修改winform安装包写日志文件权限
    Winform安装包出现无法访问网络位置
    ComboBox的真实值和显示值
  • 原文地址:https://www.cnblogs.com/destino74/p/4070366.html
Copyright © 2011-2022 走看看