前言:推送分爲本地推送以及遠程推送。git
二者的區別爲本地推送通常爲定時推送、按期推送或者位置推送。而遠程推送更爲多樣化,能知足較高的要求。固然遠程推送須要服務器端開發,開發流程較複雜。github
一、本地推送只須要在客戶端寫代碼便可,實現簡單輕鬆。安全
(1)本地推送在app未開啓的狀況下也能收到本地推送的消息。會走這個入口方法服務器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsapp
(2)app在後臺能收到推送消息。點擊推送的消息,會打開APP,而且走工具
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;測試
(3)app在前臺運行時會收到推送消息,若是將通知中心的代理設爲AppDelegate .這樣本地推送的表現形式在前臺時也能收到banner彈框消息。spa
可是若是將通知中心的代理設爲某個控制器的話,在前臺收不到推送消息,可是依然會回調willPresentNotification代理方法。 3d
可是UIAppDelegate方法代理
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;會自動回調消息的內容
對於iOS 10 用戶點擊 推送消息,都會走代理方法,不管是前臺 後臺 仍是未開啓狀態
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler;
當應用在前臺時,會走以下代理方法 後臺以及未開啓app狀態的狀況下都不會走這個代理方法。目的是在前臺時,應用能及時根據推送的消息進行一些相應的UI處理等。
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification*)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler;
二、遠程推送
遠程推送 服務器端開發比較繁瑣。下面是一些寫在遠程推送開發前的內容。能夠藉助第三方的推送工具如 Push me baby來測試。
有一篇很好的參考文章,感謝這位大俠的分享:https://mobiforge.com/design-development/programming-apple-push-notification-services
簡單說明就是在github上下載push me baby源碼 運行。在代碼中init方法中修改device token\ certificate。注意相應環境的證書和device token要互相匹配。 device token由測試demo在真機上生成。 相應的證書要安裝在mac上。拖入工程目錄的證書要是cer格式。
////////////////////////////////////////////////下面是生成推送證書時須要注意的事項////////////////////////////////////////////////
生成apns推送證書時,服務器端須要pem格式。在電腦上將證書轉成pem格式 ,思路是分別將證書和key導成p12,而後將p12轉成pem格式。最後將兩個pem文件合併成一個pem文件。最後驗證證書是否生成成功。若是驗證不成功的時候,注意請求crs文件,即祕鑰時,爲了安全起見,注意填寫的郵箱爲開發者帳號。
參考連接 https://www.jianshu.com/p/fb180965ff76
https://www.jianshu.com/p/cc952ea07a08
下面來介紹遠程推送,遠程推送的表現形式和本地推送很是一致。可是遠程推送能夠隨時隨地由應用的服務器推送消息,給appns,而後apns再將消息推送給設備。
遠程推送不管應用在前臺或者後臺仍是沒有運行,都會彈banner條幅。同時也會有推送代理方法。