iOS推送小结--swift语言
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().systemVersionvar version:Float = str.floatValueif 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就完成了
?
轉載于:https://www.cnblogs.com/maple023/p/4277505.html
總結
以上是生活随笔為你收集整理的iOS推送小结--swift语言的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 猜数游戏
- 下一篇: redo log重做日志缓冲