標籤:
APNS的推送機制
首先我們看一下蘋果官方給出的對ios推送機制的解釋。如
Provider就是我們自己程式的後台伺服器,APNS是Apple Push Notification Service的縮寫,也就是蘋果的推送伺服器。
iPhone當然就是我們的iOS裝置了,CllentApp就是我們的用戶端程式
第一階段:應用程式的伺服器端把要發送的訊息、目的iPhone的標識打包,發給APNS。
第二階段:APNS在自身的登入Push服務的iPhone列表中,尋找有相應標識的iPhone,並把訊息發送到iPhone。
第三階段:iPhone把發來的訊息傳遞給相應的應用程式,並且按照設定彈出Push通知。
APNS推播通知的詳細工作流程
下面這張圖是說明APNS推播通知的詳細工作流程:
根據圖片我們可以概括一下:
1、應用程式註冊APNS訊息推送。
2、iOS從APNS Server擷取devicetoken,應用程式接收device token。
3、應用程式將device token發送給程式的PUSH服務端程式。
4、服務端程式向APNS服務發送訊息。
5、APNS服務將訊息發送給iPhone應用程式。
接下來就我準備工作
首先要有一台蘋果的裝置,模擬器是不支援推送的,所以你需要一台iphone,ipod touch或者ipad。
我們的用戶端與蘋果伺服器之間和我們自己的伺服器與蘋果伺服器之間都需要認證來進行連結。下面我們來開始進入認證的製作過程。
CSR檔案
首先我們要有產生一個Certificate Signing Request(也就是CSR)的請求檔案。
在 《應用程式》裡的《工具 + 生產力》中找到《鑰匙串訪問》。
選擇從憑證授權單位請求認證
填上你的郵箱和常用名,常用名要記一下,一會會用到。然後選擇儲存到磁碟,繼續
儲存位置在案頭,點擊儲存。
這裡點擊完成後我們會在案頭上看到一個CertificateSigningRequest.certSigningRequest的請求檔案,也就是我們說的CSR檔案。在我們產生CSR檔案的同時,會在鑰匙串訪問中產生一對秘鑰,名稱為剛才我們填寫的常用名
製作開發認證和發布認證
(這裡為了讓大家看清楚 我把之前刪除了)
首先我們登入開發人員中心 https://developer.apple.com/account/ios/identifiers/bundle/bundleList.action
進入頁面後點擊 App IDs 點擊添加表徵圖 添加app id (如果當前應用已經有了app id 那麼我們可以直接點擊進去編輯)
點擊添加按鈕後進入以下頁面
在這裡我們輸入Name
再輸入Bundle ID
在這裡勾選 Push Notifications 選項 點擊Continue
點擊continue後 再點擊 Submit --》Done
在這裡我們可以看到我們剛才添加的app id 在點擊它
在這裡我們可以看到 Push Notifications一項 還是黃色的 說明我們當前的id 還不能作為推送認證 點擊編輯
再這裡我們點擊 Create Certificate... 按鈕 再點擊 continue
我們點擊 Choose File... 選擇我們剛生產CSR檔案
點擊 Generate 上傳完成後點擊 Download 將cer檔案下載 點擊Done
此時我們可以看到 在 Certificates欄的 All下看到我們剛剛產生的cer檔案 這裡不用管它。 到這裡我們製做了一個開發的推送認證 發布的和以上一樣的操作
接下了 我們在來申請我們的開發認證
首先找到Provisioning Profiles欄 在這裡我們只用於開發測試 所以選擇Development 同樣點擊添加按鈕表徵圖
選擇 iOS App Development 選項 點擊 Continue
這裡選擇我們剛剛申請的app id 點擊 Continue
這裡全選 點擊 Continue
這裡全選 點擊 Continue
輸入Name 點擊 Continue 最後點擊 Download 我們又得到一個名為 Pushdemo.mobileprovision 的檔案 這個檔案就是我們安裝在Xcode裡的開發認證
到目前為止我們已經得到了三個檔案 aps_development.cer 和 CertificateSigningRequest.certSigningRequest 和 Pushdemo.mobileprovision
我們雙擊 aps_development.cer 和 Pushdemo.mobileprovision 分別安裝在 鑰匙串 和 Xcode
推送測試
到目前為止 我們的認證已經做好了。 終於可以上代碼了, 那麼問題來了, 既然是推送, 那肯定需要伺服器的配合啦, 怎麼辦呢?
當前我們只希望在mac電腦上測試一下訊息的推送,可以使用PushMeBaby工具,使用起來非常簡單。該工具是開源的,可以從https://github.com/stefanhafeneger/PushMeBaby 下載,代碼的執行過程實際上就是設定一下SSL認證,然後串連到APNS,接著發送JSON資料。
開啟PushMeBaby項目 將我們下載的aps_development.cer檔案copy到工作中
在ApplicationDelegate.m中 將self.certificate的檔案名稱修改成我們copy到工程的.cer檔案的名稱
等一下我們還需要將self.deviceToken的值改成我們自己裝置中請求到的deviceToken 這樣我們的測試服務端就搞定了
這裡需要注意的是 self.payload 是JSON格式的字串, 格式一定要正確 ;sound欄位位訊息的提示音,為預設,如果寫錯就不會有聲音;badge欄位對應Icon上的小圓點數字,類型一定是整數 否則無法顯示。
接下來就是用戶端的開發了
建立一個名為PushDemo的項目
首先在 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {}方法中註冊通知 由於在iOS8以上的系統方法有所改變 需要判斷一下
var str:NSString = UIDevice.currentDevice().systemVersion var version:Float = str.floatValue if version >= 8.0 { UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert | UIUserNotificationType.Badge, categories: nil)) UIApplication.sharedApplication().registerForRemoteNotifications() } else { UIApplication.sharedApplication().registerForRemoteNotificationTypes( UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound | UIRemoteNotificationType.Alert) }
當推送註冊成功時 系統會回調以下方法 會得到一個 deviceToken 我將列印出的字串複製到 我們剛才所說的 self.deviceToken
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { var token:String = deviceToken.description.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>")) println("token==\(token)") //將token發送到伺服器 }
當推送註冊失敗時 系統會回調
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) { var alert:UIAlertView = UIAlertView(title: "", message: error.localizedDescription, delegate: nil, cancelButtonTitle: "OK") alert.show() }
當有訊息推送到裝置 並且點擊訊息啟動app 時會回調
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { println("userInfo==\(userInfo)") }
userInfo 就是伺服器推送到用戶端的資料
搞了半天終於到了最激動人心的一刻了,首先我們啟動我們用戶端程式拿到 deviceToken 在將 deviceToken複製給PushMeBaby項目的self.deviceToken
再啟動 點擊Push 最多幾秒鐘就可以看到推送到得訊息了
到此為止 一個推送的Demo就完成了
iOS推送小結--swift語言