蘋果給iOS和Mac添加了消息推送的功能,使得我們可以通過后臺服務器給應用程序(APP)發送消息,不管APP是否正在使用,比如郵箱的來件提示功能。這項服務被稱為Apple Push Notification service(APNs)。里面一共涉及到四個角色:APP、設備、APNs和應用后臺服務器(PRovider),其中APP、后臺服務器和APNs之間使用deviceToken唯一的標識一個用戶。

推送服務的工作流程:
在使用推送功能的時候,需要在開發者中心創建支持Push Notification的證書,并且將證書和私鑰用于應用后臺服務器與APNs之間通信。
使用推送服務有一些必要條件:
為了使應用支持推送服務,需要配置Provisioning Profile使它支持Push,和普通的Provisioning Profile文件一樣分為Development和Production兩個版本。我們使用Development版進行測試。

接下來創建一個用于應用后臺服務器和APNs服務器通信時使用的SSL證書和私鑰。
1 .在鑰匙串訪問工具中獲取證書請求文件(CSR)。

2 .保存請求文件。

3 .從鑰匙串訪問工具中導出私鑰,將它保存為PushKey.p12,輸入密碼abcde。千萬別把密碼給忘了哈,等下要用的。

4 .登陸iOS Dev Center創建APP ID和*Provisioning Profile*。



5 .創建新的App ID時,要注意開啟Push Notification。

6 .最后App ID看起來是這樣的。

7 .到這一步,雖然已經開啟了推送服務,但是還需要進一步配置,點擊Setting按鈕進行設置。

8 .滾動到最下面,需要創建SSL證書(Create Certificate),測試環境使用Development SSL Certificate。
9 .查看證書創建步驟和說明,上傳第1步得到的證書請求文件。

10 .下載生成好的證書,命名為aps_development.cer。

到了這里,我們有多種選擇繼續了。
1 .使用第三方小工具PushMeBaby模擬應用后臺服務器發送推送信息。
2 .搭建應用后臺服務器發送推送信息。
下面先試一試第一種方法,使用PushMeBaby。這是一個開源的Mac小程序,我們直接去Github下載源碼,用Xcode打開,將applicationDelegate.m中天上deviceToken和證書的位置。
- (id)init { self = [super init]; if(self != nil) { //77e231f0 76257e00 eed93ac6 47b52c78 12bae79f 9c9d1c67 4c990589 36c9a235 ---- 保留空格 self.deviceToken = @""; //推送內容,JSON格式 self.payload = @"{/"aps/":{/"alert/":/"長沙戴維營教育iOS開發培訓最好!/",/"badge/":1}}"; //獲取證書路徑 self.certificate = [[NSBundle mainBundle] pathForResource:@"aps_development" ofType:@"cer"]; } return self;}deviceToken的獲取在下面的代碼部分。
一定要記得將剛才的證書文件添加到項目中,當然也可以直接將證書路徑賦值給self.certificate。
接下來試一試第二種方法,我們使用php來發送通知(其實運行PHP并不需要另外搭建服務器和下載程序,Mac默認支持PHP運行,不信到命令行運行一下php)。
這種方式相對來說麻煩一些,但是也是實際使用的時候會采取的方式。我們需要進一步處理私鑰和證書文件。
1 .首先將證書文件和私鑰處理成單個方便使用的pem文件,假設CSR、p12和cer文件都放在桌面上。
$ cd ~/Desktop$ls aps_development.cerCertificateSigningRequest.certSigningRequestPushKey.p122 .將aps_development.cer轉換為pem文件。
$ openssl x509 -in aps_development.cer -inform der -out PushCert.pem$ lsaps_development.cerCertificateSigningRequest.certSigningRequestPushCert.pemPushKey.p123 .將p12私鑰文件轉換為pem文件。
$ openssl pkcs12 -nocerts -out PushKey.pem -in PushKey.p12 Enter Import PassWord:MAC verified OKEnter PEM pass phrase:Verifying - Enter PEM pass phrase:4 .將兩個文件合成同一個。
$ cat PushCert.pem PushKey.pem > ck.pem$ lsaps_development.cerCertificateSigningRequest.certSigningRequestck.pemPushCert.pemPushKey.pem PushKey.p125 .測試證書是否有效。
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushCert.pem -key PushKey.pem 如果有效的話,會輸出一堆信息,并且建立連接,否則不會成功建立連接。
6 .使用PHP進行測試,下載SimplePush.php,修改文件并填入deviceToken和密碼。在終端運行該代碼。
$ php simplepush.php Connected to APNSMessage successfully delivered成功發送推送消息。
有了上面的這些準備工作,iOS端的開發非常簡單,UIApplicaton中有好幾個方法都與推送消息有關,包括本地推送。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //判斷是否注冊了遠程通知 if (![application isRegisteredForRemoteNotifications]) { UIUserNotificationSettings *uns = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:nil]; [application registerUserNotificationSettings:uns]; //注冊遠程通知 [application registerForRemoteNotifications]; } return YES;}//注冊成功,返回deviceToken- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{ NSLog(@"%@", deviceToken);}//注冊失敗- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{ NSLog(@"%@", error);}//接收到推送消息- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ NSLog(@"remote: %@", userInfo);}甚至可以使用APNs實現一個聊天工具,具體請查看參考資料(4)。
本文檔由長沙戴維營教育整理。
|
新聞熱點
疑難解答