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().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就完成了

 


免責聲明!

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



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