iOS10全新推送功能實(shí)現(xiàn)代碼
從iOS8.0開(kāi)始推送功能的實(shí)現(xiàn)在不斷改變,功能也在不斷增加,iOS10又出來(lái)了一個(gè)推送插件的開(kāi)發(fā)(見(jiàn)最后圖),廢話(huà)不多說(shuō)直接上代碼:
#import <UserNotifications/UserNotifications.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
/* APP未啟動(dòng),點(diǎn)擊推送消息的情況下 iOS10遺棄UIApplicationLaunchOptionsLocalNotificationKey,使用代理UNUserNotificationCenterDelegate方法didReceiveNotificationResponse:withCompletionHandler:獲取本地推送
*/
// NSDictionary *localUserInfo = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
// if (localUserInfo) {
// NSLog(@"localUserInfo:%@",localUserInfo);
// //APP未啟動(dòng),點(diǎn)擊推送消息
// }
NSDictionary *remoteUserInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
if (remoteUserInfo) {
NSLog(@"remoteUserInfo:%@",remoteUserInfo);
//APP未啟動(dòng),點(diǎn)擊推送消息,iOS10下還是跟以前一樣在此獲取
}
[self registerNotification];
return YES;
}
注冊(cè)推送方法的改變:
新增庫(kù) #import <UserNotifications/UserNotifications.h> 推送單列UNUserNotificationCenter 等API
- (void)registerNotification{
/*
identifier:行為標(biāo)識(shí)符,用于調(diào)用代理方法時(shí)識(shí)別是哪種行為。
title:行為名稱(chēng)。
UIUserNotificationActivationMode:即行為是否打開(kāi)APP。
authenticationRequired:是否需要解鎖。
destructive:這個(gè)決定按鈕顯示顏色,YES的話(huà)按鈕會(huì)是紅色。
behavior:點(diǎn)擊按鈕文字輸入,是否彈出鍵盤(pán)
*/
UNNotificationAction *action1 = [UNNotificationAction actionWithIdentifier:@"action1" title:@"策略1行為1" options:UNNotificationActionOptionForeground];
/*iOS9實(shí)現(xiàn)方法
UIMutableUserNotificationAction * action1 = [[UIMutableUserNotificationAction alloc] init];
action1.identifier = @"action1";
action1.title=@"策略1行為1";
action1.activationMode = UIUserNotificationActivationModeForeground;
action1.destructive = YES;
*/
UNTextInputNotificationAction *action2 = [UNTextInputNotificationAction actionWithIdentifier:@"action2" title:@"策略1行為2" options:UNNotificationActionOptionDestructive textInputButtonTitle:@"textInputButtonTitle" textInputPlaceholder:@"textInputPlaceholder"];
/*iOS9實(shí)現(xiàn)方法
UIMutableUserNotificationAction * action2 = [[UIMutableUserNotificationAction alloc] init];
action2.identifier = @"action2";
action2.title=@"策略1行為2";
action2.activationMode = UIUserNotificationActivationModeBackground;
action2.authenticationRequired = NO;
action2.destructive = NO;
action2.behavior = UIUserNotificationActionBehaviorTextInput;//點(diǎn)擊按鈕文字輸入,是否彈出鍵盤(pán)
*/
UNNotificationCategory *category1 = [UNNotificationCategory categoryWithIdentifier:@"Category1" actions:@[action2,action1] minimalActions:@[action2,action1] intentIdentifiers:@[@"action1",@"action2"] options:UNNotificationCategoryOptionCustomDismissAction];
// UIMutableUserNotificationCategory * category1 = [[UIMutableUserNotificationCategory alloc] init];
// category1.identifier = @"Category1";
// [category1 setActions:@[action2,action1] forContext:(UIUserNotificationActionContextDefault)];
UNNotificationAction *action3 = [UNNotificationAction actionWithIdentifier:@"action3" title:@"策略2行為1" options:UNNotificationActionOptionForeground];
// UIMutableUserNotificationAction * action3 = [[UIMutableUserNotificationAction alloc] init];
// action3.identifier = @"action3";
// action3.title=@"策略2行為1";
// action3.activationMode = UIUserNotificationActivationModeForeground;
// action3.destructive = YES;
UNNotificationAction *action4 = [UNNotificationAction actionWithIdentifier:@"action4" title:@"策略2行為2" options:UNNotificationActionOptionForeground];
// UIMutableUserNotificationAction * action4 = [[UIMutableUserNotificationAction alloc] init];
// action4.identifier = @"action4";
// action4.title=@"策略2行為2";
// action4.activationMode = UIUserNotificationActivationModeBackground;
// action4.authenticationRequired = NO;
// action4.destructive = NO;
UNNotificationCategory *category2 = [UNNotificationCategory categoryWithIdentifier:@"Category2" actions:@[action3,action4] minimalActions:@[action3,action4] intentIdentifiers:@[@"action3",@"action4"] options:UNNotificationCategoryOptionCustomDismissAction];
// UIMutableUserNotificationCategory * category2 = [[UIMutableUserNotificationCategory alloc] init];
// category2.identifier = @"Category2";
// [category2 setActions:@[action4,action3] forContext:(UIUserNotificationActionContextDefault)];
[[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObjects:category1,category2, nil]];
[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) {
NSLog(@"completionHandler");
}];
/*iOS9實(shí)現(xiàn)方法
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:[NSSet setWithObjects: category1,category2, nil]];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
*/
[[UIApplication sharedApplication] registerForRemoteNotifications];
[UNUserNotificationCenter currentNotificationCenter].delegate = self;
}
代理方法的改變:
一些本地和遠(yuǎn)程推送的回調(diào)放在了同一個(gè)代理方法
#pragma mark -
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED{
NSLog(@"didRegisterUserNotificationSettings");
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0){
NSLog(@"deviceToken:%@",deviceToken);
NSString *deviceTokenSt = [[[[deviceToken description]
stringByReplacingOccurrencesOfString:@"<" withString:@""]
stringByReplacingOccurrencesOfString:@">" withString:@""]
stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"deviceTokenSt:%@",deviceTokenSt);
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0){
NSLog(@"didFailToRegisterForRemoteNotificationsWithError:%@",error);
}
/*iOS9使用方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo NS_DEPRECATED_IOS(3_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] or -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:] for user visible notifications and -[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] for silent remote notifications"){
}
*/
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
NSLog(@"willPresentNotification:%@",notification.request.content.title);
// 這里真實(shí)需要處理交互的地方
// 獲取通知所帶的數(shù)據(jù)
NSString *notMess = [notification.request.content.userInfo objectForKey:@"aps"];
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
//在沒(méi)有啟動(dòng)本App時(shí),收到服務(wù)器推送消息,下拉消息會(huì)有快捷回復(fù)的按鈕,點(diǎn)擊按鈕后調(diào)用的方法,根據(jù)identifier來(lái)判斷點(diǎn)擊的哪個(gè)按鈕
NSString *notMess = [response.notification.request.content.userInfo objectForKey:@"aps"];
NSLog(@"didReceiveNotificationResponse:%@",response.notification.request.content.title);
// response.notification.request.identifier
}
//遠(yuǎn)程推送APP在前臺(tái)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
NSLog(@"didReceiveRemoteNotification:%@",userInfo);
}
/*
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler NS_DEPRECATED_IOS(8_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]") __TVOS_PROHIBITED
{
}
*/
/*
// 本地通知回調(diào)函數(shù),當(dāng)應(yīng)用程序在前臺(tái)時(shí)調(diào)用
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification NS_DEPRECATED_IOS(4_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] or -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]") __TVOS_PROHIBITED{
NSLog(@"didReceiveLocalNotification:%@",notification.userInfo);
// 這里真實(shí)需要處理交互的地方
// 獲取通知所帶的數(shù)據(jù)
NSString *notMess = [notification.userInfo objectForKey:@"aps"];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"本地通知(前臺(tái))"
message:notMess
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
// 更新顯示的徽章個(gè)數(shù)
NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
badge--;
badge = badge >= 0 ? badge : 0;
[UIApplication sharedApplication].applicationIconBadgeNumber = badge;
// 在不需要再推送時(shí),可以取消推送
[FirstViewController cancelLocalNotificationWithKey:@"key"];
}
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void(^)())completionHandler NS_DEPRECATED_IOS(8_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]") __TVOS_PROHIBITED
{
//在非本App界面時(shí)收到本地消息,下拉消息會(huì)有快捷回復(fù)的按鈕,點(diǎn)擊按鈕后調(diào)用的方法,根據(jù)identifier來(lái)判斷點(diǎn)擊的哪個(gè)按鈕,notification為消息內(nèi)容
NSLog(@"%@----%@",identifier,notification);
completionHandler();//處理完消息,最后一定要調(diào)用這個(gè)代碼塊
}
*/
還有推送插件開(kāi)發(fā): 類(lèi)似iOS tody widget插件開(kāi)發(fā)

本文已被整理到了《iOS推送教程》,歡迎大家學(xué)習(xí)閱讀。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- iOS10添加本地推送(Local Notification)實(shí)例
- iOS10 適配遠(yuǎn)程推送功能實(shí)現(xiàn)代碼
- 使用iOS推送時(shí)警告錯(cuò)誤的解決方法
- iOS10實(shí)現(xiàn)推送功能時(shí)的注意點(diǎn)和問(wèn)題總結(jié)
- iOS點(diǎn)擊推送消息跳到應(yīng)用指定頁(yè)面方法
- iOS實(shí)現(xiàn)遠(yuǎn)程推送原理及過(guò)程
- iOS自定義推送消息提示框
- 解析iOS10中的極光推送消息的適配
- 輕松搞定iOS本地消息推送
- iOS學(xué)習(xí)筆記之遠(yuǎn)程推送、靜默推送與自定義消息推送
相關(guān)文章
如何用IOS調(diào)用WebService(SOAP接口)
這篇文章主要介紹了如何用IOS調(diào)用WebService(SOAP接口),需要的朋友可以參考下2015-07-07
IOS中(Xcode) DEBUG模式(RELEASE模式)控制NSLog輸出,NSLog輸出方式
這篇文章主要介紹了IOS中(Xcode) DEBUG模式(RELEASE模式)控制NSLog輸出,NSLog輸出方式的相關(guān)資料,需要的朋友可以參考下2016-11-11
iOS實(shí)現(xiàn)日歷翻頁(yè)動(dòng)畫(huà)
本文的內(nèi)容主要是在IOS中實(shí)現(xiàn)日歷翻頁(yè)的動(dòng)畫(huà),界面簡(jiǎn)單但效果很好,以后可以運(yùn)用到app中,下面一起來(lái)看看。2016-08-08
Flutter?ScrollController滾動(dòng)監(jiān)聽(tīng)及控制示例詳解
這篇文章主要為大家介紹了Flutter?ScrollController滾動(dòng)監(jiān)聽(tīng)及控制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
iOS應(yīng)用中使用AsyncSocket庫(kù)處理Socket通信的用法講解
這篇文章主要介紹了iOS應(yīng)用中使用AsyncSocket庫(kù)處理Socket通信的用法講解,AsyncSocket同時(shí)支持TCP和UDP,文中展示了其建立斷開(kāi)連接及發(fā)送接收消息的操作,very好用,需要的朋友可以參考下2016-05-05
淺談關(guān)于如何檢測(cè)iOS14本地網(wǎng)絡(luò)權(quán)限的一些思路
這篇文章主要介紹了淺談關(guān)于如何檢測(cè)iOS14本地網(wǎng)絡(luò)權(quán)限的一些思路,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

