首先是一些解決問題時查閱過的參考資料,希望對大家有所幫助,減少花在這上面的時間。
(這是另外一個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次才成功的。