作者:IIronMan
連結:https://www.jianshu.com/p/027120ca9179
總體內容
1、推送通知的介紹
2、本地通知
3、遠端通知
4、極光推送的使用
一、推送通知的介紹
1.1、推送通知的作用:讓不在前臺(後臺或者關閉)的APP知道APP內部發生的事情,效果如下
推送通知的效果
提示:這裡說的推送通知跟 NSNotification 有所區別
NSNotification 是抽象的,不可見的
推送通知是可見的(能用肉眼看到)
1.2、通知的分類
(1)、本地通知
-
概念:由APP本身給應用程式推送訊息,不需要伺服器的支援
-
常見場景:記賬軟體定時提醒記賬/番茄工作法中提醒你時間等等
-
註意:不是非常常用.
(2)、遠端通知
-
概念:由伺服器推送訊息給使用者,需要伺服器的支援
-
常見場景:微信提醒新訊息/淘寶提醒有新活動/影片軟體提供您有最新電影
-
註意:非常常用.但是如果僅僅是給使用者提醒,客戶端(你)做的事情就非常簡單.
1.3、推送通知的呈現樣式
(1)、在螢幕頂部顯示一塊橫幅
在螢幕頂部顯示一塊橫幅
(2)、鎖屏介面也可以顯示
鎖屏介面也可以顯示
提示:收到通知還可以做如下操作
收到通知時,同時播放音效.(比如支付寶或者微信收賬語音提示)
收到通知時,改變APP圖示上的數字(app圖示上的訊息數量)
二、本地通知(不經常用),demo
https://gitee.com/JKWC/JKLocalNotification.git
2.1、本地通知的介紹
-
直接由應用程式(程式中寫入對應程式碼)給使用者發出通知
-
本地通知需要用到一個重要的類: UILocalNotification
-
本地通知的實現步驟:
(1)、建立本地通知
(2)、設定本地通知要發出的內容等資訊
發出時間
發出內
播放的音效
(3)、排程本地通知
2.2、實現本地通知
(1)、註冊通知
-
iOS8 之後,如果想要發出通知(無論本地還是遠端),必須先進行註冊.(iOS8之前不需要)
-
通常是在 AppDelegate的didFinishLaunchingWithOptions 中進行註冊,程式碼如下
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (@available(iOS 10.0, *)) {
//iOS10
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
}];
}else{
/**
// 不設定型別
UIUserNotificationTypeNone = 0,
// 訊息數量
UIUserNotificationTypeBadge = 1 << 0,
// 聲音
UIUserNotificationTypeSound = 1 << 1,
// 彈出通知
UIUserNotificationTypeAlert = 1 << 2,
*/
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:notificationSettings];
}
return YES;
}
提示:UIUserNotificationSettings 在iOS10被廢棄了,蘋果推新的 UNUserNotificationCenter,使用UNUserNotificationCenter需要匯入#import,掛代理
(2)、建立並且發出通知
-
使用 UIUserNotificationSettings(iOS 8.0~
if (@available(iOS 10.0, *)) {
// 訊息標識
NSString *identifier = @"request1";
// 獲取通知中心用來啟用新建的通知
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
// 通知的內容
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.badge = [NSNumber numberWithInt:1];
content.title = @"測試";
content.body = @"幹嘛呢";
content.sound = [UNNotificationSound defaultSound];
// 間隔多久推送一次
//UNTimeIntervalNotificationTrigger 延時推送
//UNCalendarNotificationTrigger 定時推送
//UNLocationNotificationTrigger 位置變化推送
// 當前時間之後的10s後推送一次(如果重覆的話時間要大於等於60s)
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:10 repeats:NO];
// 定時推送
//NSDateComponents *dateCom = [[NSDateComponents alloc] init];
// 每天下午3點10分推送
// dateCom.hour = 15;
// dateCom.minute = 10;
// UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:dateCom repeats:YES];
// 建立通知請求
UNNotificationRequest *notificationRequest = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:trigger];
// 將建立的通知請求新增到通知中心
[center addNotificationRequest:notificationRequest withCompletionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"%@本地推送 :( 報錯 %@",identifier,error);
}else{
NSLog(@"通知請求新增到通知中心 Success");
}
}];
} else {
// 1.建立本地通知
UILocalNotification *localNotification = [[UILocalNotification alloc]init];
// 2.設定通知顯示的內容
// 2.1、設定通知彈出的時間
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:6];
// 2.2、設定通知中心的標題
localNotification.alertTitle = @"測試";
// 2.3、設定提示資訊
localNotification.alertBody = @"幹嘛呢";
// 2.4、設定滑塊顯示的文字
localNotification.alertAction = @"快點";
// 2.5、設定通知的聲音
// 自定義聲音
// localNotification.soundName = @"buyao.wav";
// 系統預設聲音
localNotification.soundName = UILocalNotificationDefaultSoundName;
// 2.6、設定應用程式圖示右上角的數字
localNotification.applicationIconBadgeNumber = 1;
// 3、排程本地通知(排程之後某個時刻會彈出通知)
[[UIApplication sharedApplication]scheduleLocalNotification:localNotification];
}
提示:總體屬性展示
// 設定通知彈出的時間
@property(nullable, nonatomic,copy) NSDate *fireDate;
// 時區,預設系統使用的時區
@property(nullable, nonatomic,copy) NSTimeZone *timeZone;
// 通知的重覆間隔
@property(nonatomic) NSCalendarUnit repeatInterval;
// 重覆日期
@property(nullable, nonatomic,copy) NSCalendar *repeatCalendar;
// 區域:當進入該區域時,就會發出一個通知
@property(nullable, nonatomic,copy) CLRegion *region NS_AVAILABLE_IOS(8_0);
// YES:進入某一個時區只會發出一次通知,NO:每次進入該區域都會發出通知
@property(nonatomic,assign) BOOL regionTriggersOnce NS_AVAILABLE_IOS(8_0);
// 提示資訊
@property(nullable, nonatomic,copy) NSString *alertBody;
// 用於決定 alertAction 是否生效
@property(nonatomic) BOOL hasAction;
// 鎖屏介面滑塊下顯示的文字
@property(nullable, nonatomic,copy) NSString *alertAction;
// 不需要設定
@property(nullable, nonatomic,copy) NSString *alertLaunchImage;
// 通知中心的標題
@property(nullable, nonatomic,copy) NSString *alertTitle NS_AVAILABLE_IOS(8_2);
// 設定通知發出時音效
@property(nullable, nonatomic,copy) NSString *soundName;
// 應用程式右上角的數字
@property(nonatomic) NSInteger applicationIconBadgeNumber;
// 額外資訊
@property(nullable, nonatomic,copy) NSDictionary *userInfo;
(3)、移除通知
// 移除所有的通知
[[UIApplication sharedApplication] cancelAllLocalNotifications];
// 移除某個通知
// [[UIApplication sharedApplication] cancelLocalNotification:@"某個通知物件"];
提示:如果在iOS 10之後 UNUserNotificationCenter 可以如下移除通知, requestID 是識別符號
[center removePendingNotificationRequestsWithIdentifiers:@[requestID]]; [center removeAllDeliveredNotifications];
2.3、監聽本地通知的點選
(1)、為什麼要監聽本地通知的點選?
-
通知點選之後會發生什麼事情?
-
不管應用程式出於後臺還是被殺死,點選通知都可以開啟應用程式
-
什麼情況下需要監聽使用者點選了通知(不常用)
-
比如:當用點選通知時,進入到某一個固定介面
(2)、監聽本地通知的點選,應用程式分很多種狀態
-
在前臺:如果在前臺不需要進行頁面跳轉
-
在後臺:點選應用時進行頁面的跳轉
-
被殺死:點選應用開啟應用時,進行頁面的跳轉
應用程式在前臺或者後臺時的程式碼如下
// 應用在前臺時,也會收到該通知,這時不應該進行頁面的跳轉
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
NSLog(@"本地通知的點選");
/**
UIApplicationStateActive, 前臺
UIApplicationStateInactive, 進入前臺
UIApplicationStateBackground 在後臺
*/
if (application.applicationState == UIApplicationStateActive)
return; // 前臺情況下 不做操作
// 進行頁面的跳轉
}
應用程式被殺死時的情況下不會走上面的程式碼,但是不管是在任何情況下都會走下麵的程式碼,透過launchOptions的key來做出各種判斷,程式碼如下
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (@available(iOS 10.0, *)) {
//iOS10
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error)
{
}];
}else{
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:notificationSettings];
}
// 判斷是否是透過點選通知開啟了應用程式
if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
// 在app殺死的情況下,本地通知的所走的地方
}
return YES;
}
提示:對應 launchOptions 的其他常用 key 如下
對應的是啟動應用程式的的遠端通知資訊userInfo(NSDictionary)
UIApplicationLaunchOptionsRemoteNotificationKey
對應的是為啟動應用程式的的本地通知物件(UILocalNotification)
UIApplicationLaunchOptionsLocalNotificationKey
對應的物件為啟動URL(NSURL)
UIApplicationLaunchOptionsURLKey
從點選3D Touch iCon啟動,對應的是點選的iCon的資訊。
UIApplicationLaunchOptionsShortcutItemKey
有關藍芽的操作
UIApplicationLaunchOptionsBluetoothPeripheralsKey
UIApplicationLaunchOptionsBluetoothCentralsKey
對應啟動的源應用程式的bundle ID (NSString)
UIApplicationLaunchOptionsSourceApplicationKey
三、遠端通知,demo
3.1、什麼是遠端通知 ?
-
概念:由伺服器傳送訊息給使用者彈出訊息的通知(需要聯網)
-
遠端推送服務,又稱為 APNs(Apple Push Notification Services)
-
APNs 通知:是指透過向 Apple APNs 伺服器傳送通知,到達 iOS 裝置,由 iOS 系統提供展現的推送。使用者可以透過 IOS 系統的 “設定” >> “通知” 進行設定,開啟或者關閉某一個 App 的推送能力。
3.2、為什麼需要遠端通知 ?
-
例子:京東 搞活動,促銷活動或者商品降價,想告知使用者.但是該使用者不經常開啟京東APP.京東如何通知該使用者有最新的活動呢?
-
傳統方式:只有使用者開啟了京東客戶端,客戶端向伺服器請求是否有最新的活動,才能在APP中告知使用者活動.
-
侷限性:只要使用者關閉了app,就無法跟app的伺服器溝通,無法從伺服器上獲得最新的資料內容
-
遠端通知的好處:不管使用者開啟還是關閉app,只要聯網了,都能接收到伺服器推送的遠端通知
3.3、遠端通知的原理
(1)、原理圖
遠端通知的原理圖
(2)、為什麼京東伺服器不直接推訊息給使用者?
-
在通常情況下伺服器端是不能主動向客戶端推訊息的.
-
如果想伺服器端給客戶端推訊息,必須建立長連線
-
京東客戶端在處於後臺時(app殺死的情況下)不能和伺服器端建立長連線
(3)、為什麼蘋果伺服器可以推訊息給使用者?
所有的蘋果裝置,在聯網狀態下,都會與蘋果的伺服器建立長連線
蘋果建立長連線的作用: 時間校準、系統升級提示、查詢我的iPhone、遠端通知 等等
常見疑惑:蘋果在推送訊息時,如何準確的推送給某一個使用者,並且知道是哪一個APP ?
在京東伺服器把訊息給蘋果的APNs伺服器時,必須告知蘋果DeviceToken
什麼是 DeviceToken ?
-
DeviceToken是由使用者手機的UDID和應用程式的BundleID共同生成的
-
透過DeviceToken可以找到唯一手機中的唯一應用程式
如何獲得DeviceToken:客戶端到蘋果的APNs註冊即可獲得。
(4)、完整的流程圖
遠端推送完整的流程圖
3.4、如何做遠端通知 ?
首先,BundleID對應的App ID必須是明確的(特殊功能)
該APPID必須配置兩個證書
-
開發證書:用於除錯遠端推送
-
釋出證書:用於釋出後給使用者推送訊息
根據上面的App ID重新配置描述檔案
安裝對應的證書,即可開始測試遠端推送
3.5、遠端通知證書配置
(1)、我們先建立一個 CSR 檔案(又叫做:證書簽名請求檔案)(下麵會用到,它是用來系結電腦的)
找到 Launchpad 裡面的 鑰匙串訪問
鑰匙串訪問
開啟鑰匙串訪問->證書助理->從證書機構頒請求證書
出現如下介面,選擇儲存到磁碟,點選繼續
選擇儲存到待會好找的地方(比如:桌面,自己建的檔案夾等等),儲存
(2)、在 Identifiers裡面建立一個明確的App ID,如下
提示:Bundle ID 一定要填寫明確的
(3)、為(2)中建立的App ID 配置推送 開發證書(測試證書)與推送釋出證書
配置推送 **開發證書**(測試證書)與推送**釋出證書**
點選上圖的Edit之後滾動到下麵
選擇我們上面建立的CSR檔案
下載開發推送證書
提示:推送釋出的證書也一樣:點選 Create Certificate->選擇 CSR 檔案->下載釋出推送證書
開發證書和釋出證書
配置成功後的效果
(4)、配置描述檔案
iOS證書分2種,1種是開發證書,用來給你(開發人員)做真機測試的;1種是釋出證書,釋出證書又分釋出到app store的(這裡不提及)和釋出測試的ad hoc證書。
配置描述檔案分類
在此我們僅僅建立 iOS App Development 來進行測試遠端推送
下載下來描述檔案
提示:描述檔案下載完後記得雙擊執行一下
3.6、獲取遠端推送要用的 DeviceToken
(1)、工程的 Bundle identifier 要與我們上面設定的 App ID 保持一致,並且開啟下麵的選項
(2)、在蘋果的APNs伺服器註冊,以獲取DeviceToken
通常在 AppDelegate 裡面的 didFinishLaunchingWithOptions 中新增如下程式碼進行註冊
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([UIDevice currentDevice].systemVersion.doubleValue <= 8.0) {
/**
向伺服器發請求,要註冊推送功能,以此獲取到伺服器傳回的deviceToken
type 用來說明 支援的通知形式
如 橫幅 聲音 角標
*/
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert];
}else{
if (@available(iOS 10.0, *)) {
//iOS10
// 1.向用戶請求可以給使用者推送訊息
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
}];
}else{
// 1.向用戶請求可以給使用者推送訊息
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:notificationSettings];
}
// 2.註冊遠端通知(拿到使用者的DeviceToken)
[application registerForRemoteNotifications];
}
return YES;
}
註冊之後在另外一個代理方法中,拿到DeviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
// 將使用者的使用者名稱和deviceToken傳送給伺服器,讓伺服器進行儲存備份即可
NSLog(@"%@", deviceToken);
// 例如:
// 其中我們伺服器要儲存的 deviceToken 是不包括兩邊的尖括號的
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog(@"%@", error.userInfo);
}
提示:
獲取到的 deviceToken 傳送給伺服器,讓伺服器進行儲存備份即可
我們伺服器要儲存的 deviceToken 是不包括兩邊的尖括號的
3.7、測試方式一: 遠端通知
(1)、使用一個第三方的Mac程式來測試:PushMeBaby,並刪除裡面的資源,把我們自己推送的開發證書與釋出證書模仿其命名改名並拖進去
修改後的工程
(2)、修改 PushMeBaby裡面的ApplicationDelegate.m,把 self.deviceToken 修改為我們上面 3.6 中執行後拿到的 DeviceToken,切記 DeviceToken 不包含左右尖括號
修改內容
(3)、做完面操作,執行PushMeBaby,選擇相應的內容
進行選擇
執行後的效果
3.8、測試方式二:使用SmartPush可以在電腦上方便的模擬APNs推送。執行程式,選擇我們生成的證書和填上列印欄獲得的DeviceToken,就能在我們的App中看到APNs推送來的帶有3DTouch功能的通知。
SmartPush
提示:推送的效果和上面的一樣,但是體驗更好,建議測試使用 SmartPush
3.9、監聽遠端通知的點選事件,其實和本地通知的監聽是一樣的,一種是在前臺和後臺的監聽,一種是在app殺死情況下的監聽,程式碼如下
#import "AppDelegate.h"
#import
@interface AppDelegate ()<UNUserNotificationCenterDelegate>
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([UIDevice currentDevice].systemVersion.doubleValue <= 8.0) {
//向伺服器發請求,要註冊推送功能,以此獲取到伺服器傳回的deviceToken
//type 用來說明 支援的通知形式
//如 橫幅 聲音 角標
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert];
}else{
if (@available(iOS 10.0, *)) {
//iOS10
// 1.向用戶請求可以給使用者推送訊息
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
}];
}else{
// 1.向用戶請求可以給使用者推送訊息
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:notificationSettings];
}
// 2.註冊遠端通知(拿到使用者的DeviceToken)
[application registerForRemoteNotifications];
}
// 判斷是否是透過點選通知開啟了應用程式
if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
// 遠端通知的監聽
}
return YES;
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
// 將使用者的使用者名稱和deviceToken傳送給伺服器,讓伺服器進行儲存備份即可
NSLog(@"%@", deviceToken);
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog(@"%@", error);
}
#pragma mark 使用者在後臺狀態或者前臺狀態收到遠端通知的方法
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
NSLog(@"收到遠端通知");
// 應用在前臺時,也會收到該通知,這時不應該進行頁面的跳轉
/**
UIApplicationStateActive, 前臺
UIApplicationStateInactive, 進入前臺
UIApplicationStateBackground 在後臺
*/
if (application.applicationState == UIApplicationStateActive)
return; // 前臺情況下 不做操作
// 進行頁面的跳轉
}
@end
提示:我們可以使用新的監聽使用者點選遠端通知的方法,如下:(包含上面的兩種監聽方式)
/*
此方法是新的用於響應遠端推送通知的方法
1.如果應用程式在後臺,則通知到,點選檢視,該方法自動執行
2.如果應用程式在前臺,則通知到,該方法自動執行
3.如果應用程式被關閉,則通知到,點選檢視,先執行didFinish方法,再執行該方法
4.可以開啟後臺掃清資料的功能
step1:點選target-->Capabilities-->Background Modes-->Remote Notification勾上
step2:在給APNs伺服器傳送的要推送的資訊中,新增一組字串如:
{"aps":{"content-available":"999","alert":"bbbbb.","badge":1}}
其中content-availabel就是為了配合後臺掃清而新增的內容,999可以隨意定義
*/
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// 前臺情況下 不做操作
if (application.applicationState == UIApplicationStateActive)
return;
//NewData就是使用新的資料 更新介面,響應點選通知這個動作
completionHandler(UIBackgroundFetchResultNewData);
}
其中 content-availabel 就是為了配合後臺掃清而新增的內容,999可以隨意定義
四、極光推送 的使用,demo
4.1、極光推送 iOS 檔案
-
APNs 通知:是指透過向 Apple APNs 伺服器傳送通知,到達 iOS 裝置,由 iOS 系統提供展現的推送。使用者可以透過 IOS 系統的 “設定” >> “通知” 進行設定,開啟或者關閉某一個 App 的推送能力。
-
JPush iOS SDK 不負責 APNs 通知的展現,只是向 JPush 伺服器端上傳 Device Token 資訊,JPush 伺服器端代理開發者向 Apple APNs 推送通知。
-
APNs 通知與應用內訊息對比
APNS | 應用內訊息 | – |
---|---|---|
推送原則 | 由 JPush 伺服器傳送至 APNS 伺服器,再下發到手機。 | 由 JPush 直接下發,每次推送都會嘗試傳送,如果使用者線上則立即收到。否則儲存為離線。 |
離線訊息 | 離線訊息由 APNS 伺服器快取按照 Apple 的邏輯處理。 | 使用者不線上 JPush server 會儲存離線訊息,時長預設保留一天。離線訊息保留 5 條。 |
推送與證書環境 | 應用證書和推送指定的 iOS 環境匹配才可以收到。 | 自定義訊息與 APNS 證書環境無關。 |
接收方式 | 應用退出,後臺以及開啟狀態都能收到 APNS。 | 需要應用開啟,與 JPush 建立連線才能收到。 |
展示效果 | 如果應用後臺或退出,會有系統的 APNS 提醒。如果應用處於開啟狀態,則不展示,iOS 10 開始可實現前臺展示。 | 非 APNS,預設不展示。可透過獲取介面自行編碼處理。 |
處理函式 | Apple 提供的介面:didReceiveRemoteNotification | JPush 提供的介面:networkDidReceiveMessage |
JPush APNs 通知的意義
OS 平臺上推送通知,只有 APNs 這個官方的通道,是可以隨時送達的。一般開發者都是自己部署應用伺服器向 APNs Server 推送。
JPush iOS 推送相比直接向 APNs 推送有什麼好處呢?
減少開發及維護成本:
-
應用開發者不需要去開發維護自己的推送伺服器與 APNs 對接。
-
集成了 JPush iOS SDK 後不必自己維護更新 device token。
-
透過 JPush 的 Web Portal 直接推送,也可以呼叫 JPush 的 HTTP 協議 API 來完成,開發工作量大大減少。
減少運營成本:
-
極光推送支援一次推送,同時向 Android, iOS, WinPhone 三個平臺。支援統一的 API 與推送介面。
-
極光推送提供標簽、別名系結機制,以及提供了非常細分的使用者分群方式,運營起來非常簡單、直觀。
提供應用內推送:
-
除了使得 APNs 推送更簡單,也另外提供應用內訊息推送。這在類似於聊天的場景裡很有必要。
4.2、在極光推送平臺建立一個應用
4.3、iOS SDK 整合,官網講解的很詳細,在此我們就簡單的採用 Cocoapods 匯入 極光推送的iOS SDK
透過 Cocoapods 下載地址:
pod 'JPush'
提示:如果無法匯入最新版本,請執行 pod repo update master 這個命令來升級本機的 pod 庫,然後重新 pod ‘JPush’
如果需要安裝指定版本則使用以下方式(以 3.1.0 版本為例):
pod 'JPush', '3.1.0'
提示:匯入成功後還有一些工程的配置問題大家看官方檔案即可
4.4、測試專案的 Bundle Identifier要與我們上面建立證書的 Bundle ID 保持一致,並且開啟如下圖所示
靜默推送的設定
靜默推送(silent_push):如果只攜帶content-available: 1,不攜帶任何badge,sound 和訊息內容等引數,則可以不打擾使用者的情況下進行內容更新等操作即為“Silent Remote Notifications”。
4.5、在 AppDelegate.m 匯入極光推送的相應程式碼,在此我就不再匯入了,說一下幾個引數,在didFinishLaunchingWithOptions 方法裡面會使用到下麵的引數
appKey:選擇 Web Portal 上 的應用 ,點選“設定”獲取其 appkey 值。請確保應用內配置的 appkey 與 Portal 上建立應用後生成的 appkey 一致。
提示其實也就是我們上面建立應用成功後生成的key
channel:指明應用程式包的下載渠道,為方便分渠道統計,具體值由你自行定義,如:App Store。
apsForProduction:1.3.1 版本新增,用於標識當前應用所使用的 APNs 證書環境。
0(預設值)表示採用的是開發證書,1 表示採用生產證書釋出應用。
註:此欄位的值要與 Build Settings的Code Signing 配置的證書環境一致。
advertisingIdentifier: 詳見關於 IDFA。
在demo裡面我們寫了一個來處理推送是跳轉還是其他操作的方法
#pragma mark 對於推送的處理(可以把上面notificationUI的方法替換掉)
- (void)goToMessageViewControllerWithDic:(NSDictionary *)userInfo {
if ([[userInfo objectForKey:@"go"] isEqualToString:@"update"]) {
// 應用程式更新
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@""]];
return;
}
//將欄位存入本地,因為要在你要跳轉的頁面用它來判斷,這裡我只介紹跳轉一個頁面,
NSUserDefaults *pushJudge = [NSUserDefaults standardUserDefaults];
[pushJudge setObject:@"push"forKey:@"push"];
[pushJudge synchronize];
// 這個是我要跳到的測試頁面 (你的標的頁面)
TestViewController *testVC = [[TestViewController alloc]init];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:testVC];//這裡加導航欄是因為我跳轉的頁面帶導航欄,如果跳轉的頁面不帶導航,那這句話請省去。
[self.window.rootViewController presentViewController:nav animated:YES completion:nil];
}
4.6、在極光推送後臺進行推送,傳送通知
傳送通知
可選設定
在當我們點選推送後,我們在手機可以收到如下效果
在app的 AppDelegate.m 列印推送的內容,如下
在app的 `AppDelegate.m` 列印推送的內容
到此,極光推送使用完畢,有興趣還可以看看 個推 的推送
推薦本地通知與遠端通知的部落格:
-
iOS開發本地推送(iOS10)UNUserNotificationCenter
https://www.cnblogs.com/xianfeng-zhang/p/8310394.html
-
關於使用 UNUserNotificationCenter 的本地通知
https://www.jianshu.com/p/3260f864e5aa
-
iOS10 本地推送 UNUserNotificationCenter
https://www.jianshu.com/p/bed37cfe7386
-
iOS10 推送通知詳解(UserNotifications)
iOS 遠端推送通知https://www.cnblogs.com/czq1989/p/5098871.html
-
iOS10以前的本地通知和遠端通知
https://www.cnblogs.com/yang-shuai/p/9104013.html