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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM