iOS 10 推送的簡單使用

首先介紹一下本文涉及到UserNotifications的幾個主要類。服務器

其中app

[1]UNNotification主要是做爲通知delegate方法的參數使用。包含UNNotificationRequest信息。ide

[2]UNNotificationAction是通知中添加的action,展現在通知欄的下方。默認以的button樣式展現。有一個文本輸入的子類UNTextInputNotificationAction。能夠在點擊button以後彈出一個鍵盤,輸入信息。用戶點擊信息和輸入的信息能夠在UNNotificationResponse中獲取。fetch

[3]UNNotificationAttachment是新增的通知內容格式,能夠設置圖像和視頻。Demo中使用說明。ui

[4]UNNotificationCategory是通知樣式類型。在註冊通知以後,展現通知以前,能夠自定義通知樣式,並使用spa

[[UNUserNotificationCenter currentNotificationCentersetNotificationCategories:[NSSetsetWithObject:categoryNotification]]設置到通知中心中。根據通知內容中的categoryIdentifier使用不一樣的通知樣式。這裏須要注意:使用自定義的通知操做按鈕和通知Content能夠設置爲同一個category。code

[5]UNNotificationContent通知的主體內容,原通知的title,sound,badge和新的attachments,lacnchImageName都在這裏進行設置,是建立一個通知的前提。視頻

[6]UNNotificationRequest通知請求。當通知內容,觸發條件都準備好以後,須要包裝爲一個通知請求,由通知中心來激活這個通知。token

[7]UNNotificationResponse通知響應。做爲通知的action被用戶觸發以後,App能夠拿到的信息。和action對應,有普通的UNNotificationResponse和子類UNTextInputNotificationResponse。其中包括action的identifier和完整的UNNotification。子類UNTextInputNotificationResponse還包含userText,用戶輸入的內容。事件

[8]UNNotificationServiceExtension一個extension。用戶能夠在收到特性的通知時,通常是遠程,而且該遠程通知的apns中包含一個mutable-content字段,值爲1。極光示例如圖

你有30秒的時間處理這個通知,能夠同步下載圖像和視頻到本地,而後包裝爲一個UNNotificationAttachment扔給通知,這樣就能展現用服務器獲取的圖像或者視頻了。這裏須要注意:若是數據處理失敗,超時,extension會報一個崩潰信息,可是通知會用默認的形式展現出來,app不會崩潰。

[9]UNNotificationSetting沒使用,不評論。

[10]UNNotificationSound通知的聲音。能夠直接使用聲音的name,而不是文件路徑。

[11]UNNotificationTrigger通知的觸發條件。本Demo僅使用了其中的延時觸發功能,其它諸如定時和地理圍欄的功能不作說明。地理圍欄能能夠做爲觸發條件,就減小了以前須要在地理圍欄的delegate中手動添加一個延遲的本地通知的問題。

[12]UNUserNotificationCenter通知中心。最主要的類,通知的註冊,激活,編輯,刪除等功能都由該類完成。

 

一、通知受權

通知受權部分包括了iOS7 - iOS10。受權方式此處分爲兩種,一種是蘋果原生的註冊方法,另外一種使用了極光推送的版本。

原生的註冊方法:

iOS 10以前的版本不受影響,10版本中使用UNUserNotificationCenter判斷用戶是否容許app接收通知。若是granted == false,建議彈框提示用戶開啓通知功能。第一行設置UNUserNotificationCenterDelegate的delegate,能夠在AppDelegate中獲取兩個方法,分別爲在app在活躍狀態下接收到通知和用戶點擊action進入app。

極光的註冊方法

極光須要輸入極光帳戶中的appKey等信息,此處參照了極光官方文檔。

 

二、通知註冊

通知註冊的方法在10中被保留,不作修改。

[[UIApplication sharedApplicationregisterForRemoteNotifications];

 

三、獲取APNS Token

獲取Token的方法在10中被保留,不作修改。因爲單一使用極光做爲遠程推送,token提交部分只有極光的代碼。- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {

    //  Apns註冊成功,該方法沒有沒有變化。

    //  經過JPUSH上傳設備Token.

    [JPUSHService registerDeviceToken:deviceToken];

}

 

 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

    [JPUSHService handleRemoteNotification:userInfo];

}

 

很差意思。實在受夠了這個在線版本的圖片上傳。以後很差在貼圖。直接上代碼。你們湊合看吧。

 

四、App獲取通知信息。

在iOS10以前,使用didReceiveRemoteNotification:fetchCompletionHandler:方法獲取用戶信息。

在iOS10中,統一使用UNUserNotificationCenterDelegate的兩個delegate方法來獲取通知信息。

這裏須要注意:若是沒有設置UNUserNotificationCenterDelegate的delegate,仍然使用原方法獲取用戶信息。同時,在獲取遠程通知的時候,如何沒有帶mutable-content字段,也在被原方法獲取,即便設置了delegate。

本文只講在須要進app的cation時,觸發的event。

delegate方法。注意須要調用completionHandler()

原生版本:

//  iOS10特性。App在前臺獲取通知

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification*)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {

 

 completionHandler(UNNotificationPresentationOptionAlert);

}

//  iOS10特性。點擊通知進入App

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler {

 

completionHandler()

}    

極光版本:

#pragma mark - JPUSHRegisterDelegate

//  只有調用registerForRemoteNotificationConfig:delegate:方法纔會激活該delegate

//  一旦激活該delegate就再也不觸發application:didReceiveRemoteNotification:fetchCompletionHandler:

//  iOS10特性。App在前臺獲取通知

 

1
2
3
4
5
6
7
- ( void )jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:( void  (^)(NSInteger options))completionHandler {
     completionHandler(UNNotificationPresentationOptionAlert);
}
//  iOS10特性。點擊通知進入App
- ( void )jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:( void (^)())completionHandler {
completionHandler()
}

 

 

上面基本包括了一個iOS 10通知的使用。已經能夠正常獲取到推送通知信息。

下面會根據Demo中的示例依次講解。主要就是貼代碼,你們能夠直接下載Demo,在代碼中會有一些注意事項的說明。

本人寫代碼基本不寫註釋。匈牙利流。見諒。

示例順序以下

@"簡單的本地通知",

 @"帶兩個Title的本地通知",

@"帶聲音的本地通知",

@"帶圖像的本地通知",

@"帶視頻的本地通知",

@"不進入應用的按鈕",

@"進入應用的按鈕",

@"帶文本輸入框的按鈕",

@"自定義通知欄UI",

@"隱藏系統默認消息框",

@"不進App-通知欄UI直接反饋用戶操做"

 

五、簡單的本地通知

這是一個最基本的通知激活方法。

從這裏能夠看到,一個通知基本有content,request,trigger組成。其它的示例只是給content添加更多的內容。

全部的通知都是由[UNUserNotificationCenter currentNotificationCenter]激活。

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
     content.body = @ "Hello,world!" ;
     
     UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5
                                                                                                     repeats:NO];
     NSString* requestIdentifer = @ "Request" ;
     UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:requestIdentifer
                                                                           content:content
                                                                           trigger:trigger];
     [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request
                                                            withCompletionHandler:^(NSError * _Nullable error) {
                                                                NSLog(@ "Error%@" , error);
     }];

 

 

六、帶兩個Title的本地通知

該通知攜帶兩個相對新的字段,title和subtitle,都是字符類型。做爲標題顯示。

這兩個字段在iOS8.2以後的通知中被使用,可是隻要在watch上的通知能夠顯示出了。

通知樣式:

竟然仍是得帶圖。換七牛了。

講真,真不想上圖。但是忽然發現字數不夠了。


七、帶聲音的本地通知

使用了新的類UNNotificationSound,添加通知的聲音。

該代碼中同時使用了badge。在Appdelegate中能夠清除。

[[UIApplication sharedApplicationsetApplicationIconBadgeNumber:0];

 

 

八、帶圖像的本地通知

圖像必須是bundle包中的,能夠下拉通知欄放大圖像。

九、帶視頻的本地通知

 

以後3個都是關於action的。

十、不進入應用的按鈕

十一、進入應用的按鈕

二者action的區別在UNNotificationActionOptions中。該枚舉分3種,分別爲

須要解鎖顯示,紅色文字。點擊不會進app。

UNNotificationActionOptionAuthenticationRequired = (1 << 0),

黑色文字。點擊不會進app。    

UNNotificationActionOptionDestructive = (1 << 1),

黑色文字。點擊會進app。    

UNNotificationActionOptionForeground = (1 << 2),

十二、帶文本輸入框的按鈕

其中UNTextInputNotificationAction是UNNotificationAction的子類,初始化方法中分別新增了,鍵盤右上角的點擊按鈕文本和文本輸入框的默認文字。

點擊action在AppDelegate的事件:

NSString* actionIdentifierStr = response.actionIdentifier;

if ([response isKindOfClass:[UNTextInputNotificationResponse class]]) {

        NSString* userSayStr = [(UNTextInputNotificationResponse *)response userText];

}

 

UNNotificationContent* content = response.notification.request.content;

NSDictionary* userInfo = response.notification.request.content.userInfo;

UNNotificationAttachment* attachments = response.notification.request.content.attachments;

基本從之前能夠獲取到通知的所有信息。

 

1三、自定義的通知欄UI

須要新建一個Notification Content。能夠建立多個,可是須要設定不一樣的category。參照Demo。同一個content能夠設置多個category。

默認的NotificationContent的VC中,默認有兩個方法。分別爲viewDidLoad和didReceiveNotification。前者渲染UI,後者獲取通知信息,更新UI控件中的數據。

1四、隱藏默認的消息欄。

系統消息欄會默認出如今下方。若是你已經自定義的顯示的控件,就顯得多餘,能夠隱藏默認。

 

//  隱藏默認消息框。添加UNNotificationExtensionDefaultContentHidden屬性,Bool(YES).

 

1五、不進App在通知欄上反饋用戶的操做。

須要執行UNNotificationContentExtensiondelegate方法didReceiveNotificationResponse:completionHandler:

這裏注意:必須對所有的action進行處理。必須設置completion,不然通知不會消失。

建立通知代碼

處理通知的代碼。在自定義的NotificaitonContent中

 

1六、獲取遠程通知後進行處理顯示。此處以遠程通知發送一個image的uri,通知顯示圖片爲例。

須要添加一個新的target Notification Service extension。

這裏的extension須要在info.plist中設置HTTP。

相關文章
相關標籤/搜索