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

苹果推送服务配置教程

IOS开发者中心

使用pyapns实现APNS推送

苹果信息推送服务

 (这是另外一个pyapns,需要用twised.我试过了,python运行无错误但推送没反应,查看twised.log发现是一个什么clean up的错误。查StackOverflow无果,就没再弄下去了,如果有人成功请留言告诉我谢谢)

这部分网上资源挺多的,随便找一下就能找到。

实用工具->钥匙串访问

Python PyAPNs 实现消息推送

这两个名字随便取。最后保存成CertificateSigningRequest.certSigningRequest文件

Python PyAPNs 实现消息推送

在这找到刚刚申请的证书,导出成.p12文件 

 

登录苹果开发者中心
网上旧版的教程会让你找右边菜单的一个选项,改版后已经找不到了。不过自己稍微看着找就行。
IOS开发者中心

我们要配置的地方都在这3个菜单内。
Python PyAPNs 实现消息推送

2、添加APP ID

在Identifiers菜单找到App IDs项,添加App ID

Python PyAPNs 实现消息推送

 

Python PyAPNs 实现消息推送

其它配置没什么,直接Continue 

 

3、创建APNS SSL Certificates

建好ID后,在APP ID处查看你刚建立的这个ID,它处于未激活状态,我们来激活它
Python PyAPNs 实现消息推送

创建这个Development SSL Certificate
Python PyAPNs 实现消息推送
选择之前生前的这个XXXX名字很长的文件 ,双击生成的aps_development导入钥匙串访问中。

4、创建Profiles

Provisioning Profiles菜单下的+号添加Profiles,Configure页选iOS App Development,Continue

选中刚刚创建的APP ID

Python PyAPNs 实现消息推送 

生成Profiles并下载,双击导入Xcode(后面获取设备Token用)。

Python PyAPNs 实现消息推送


先看看我们的代码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

Python PyAPNs 实现消息推送

然后在Project和Target的code Signing设置自己的开发者账号,还有刚才生成的Profiles文件
Python PyAPNs 实现消息推送

以下代码放在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]);
    }
    
}

Python PyAPNs 实现消息推送

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次才成功的。


相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-31
  • 2021-11-27
猜你喜欢
  • 2022-12-23
  • 2021-06-15
  • 2021-11-27
  • 2021-11-27
  • 2021-12-16
  • 2021-04-05
  • 2022-01-01
相关资源
相似解决方案