引言:iOS的通知分本地通知和遠(yuǎn)程通知啤誊,iOS10之前采用的是UILocationNotification類,遠(yuǎn)程通知有蘋果服務(wù)器進(jìn)行轉(zhuǎn)發(fā),本地通知和遠(yuǎn)程通知其回調(diào)的處理都是通過AppDelegate中的幾個(gè)回調(diào)方法來完成宾抓。iOS10系統(tǒng)中肠牲,通知功能的增強(qiáng)是一大優(yōu)化之處,iOS10中將通知功能整合成了一個(gè)框架UserNotification恃鞋,其結(jié)構(gòu)十分類似于iOS8中的UIWebView向WebKit框架整合的思路崖媚。并且UserNotification相比之前的通知功能更加強(qiáng)大,主要表現(xiàn)在如下幾點(diǎn):
1.通知處理代碼可以從AppDelegate中剝離恤浪。
2.通知的注冊(cè)畅哑,設(shè)置,處理更加結(jié)構(gòu)化水由,更易于模塊化開發(fā)荠呐。
3.UserNotification支持自定義通知音效和啟動(dòng)圖。
4.UserNotification支持向通知內(nèi)容中添加媒體附件砂客,例如音頻泥张,視頻。
5.UserNotification支持開發(fā)者定義多套通知模板鞠值。
6.UserNotification支持完全自定義的通知界面媚创。
7.UserNotification支持自定義通知中的用戶交互按鈕。
8.通知的觸發(fā)更加容易管理彤恶。
從上面列舉的幾點(diǎn)就可以看出钞钙,iOS10中的UsreNotification真的是一個(gè)大的改進(jìn),溫故而知新声离,關(guān)于iOS之前版本本地通知和遠(yuǎn)程通知的相關(guān)內(nèi)容請(qǐng)查看如下博客:
本地推送:http://my.oschina.net/u/2340880/blog/405491芒炼。
遠(yuǎn)程推送:http://my.oschina.net/u/2340880/blog/413584。
更多詳細(xì)內(nèi)容可以參考這篇博客:https://my.oschina.net/u/2340880/blog/747781
demo參考:http://www.open-open.com/lib/view/open1472632538972.html
下面就是我自己寫的小程序术徊,小試牛刀一下:
第一步必不可少的肯定是要導(dǎo)入我們的頭文件:<UserNotifications/UserNotifications.h>
然后在AppDelegate.m中注冊(cè)通知(第一次寫的時(shí)候就是沒有注冊(cè)通知本刽,直接就寫了,所以導(dǎo)致通知總是不顯示)
#import?"AppDelegate.h"
#import?"ViewController.h"
#import?<UserNotifications/UserNotifications.h>
@interface?AppDelegate?()
@end
@implementation?AppDelegate
- (BOOL)application:(UIApplication?*)application didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions {
?self.window?= [[UIWindow?alloc]?initWithFrame:[UIScreen?mainScreen].bounds];
?ViewController?*vc = [[ViewController?alloc]?init];
?UINavigationController?*nav = [[UINavigationController?alloc]?initWithRootViewController:vc];
?self.window.rootViewController?= nav;
[self.window?makeKeyAndVisible];
?//注冊(cè)本地推送
?//?使用?UNUserNotificationCenter?來管理通知
?UNUserNotificationCenter?*center = [UNUserNotificationCenter?currentNotificationCenter];
?//監(jiān)聽回調(diào)事件
center.delegate?=?self;
?//iOS 10?使用以下方法注冊(cè)赠涮,才能得到授權(quán)
[center?requestAuthorizationWithOptions:(UNAuthorizationOptionAlert?+?UNAuthorizationOptionSound)
?completionHandler:^(BOOL?granted,?NSError?*?_Nullable?error) {
?// Enable or disable features based on authorization.
? ? ? ? ? ? ? ? ? ? ? ? ? }];
?//獲取當(dāng)前的通知設(shè)置子寓,UNNotificationSettings?是只讀對(duì)象,不能直接修改笋除,只能通過以下方法獲取
[center?getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings?*?_Nonnull?settings) {
? ? }];
//
//? ? [self addLocationNotification:5];
?return?YES;
}
#pragma mark - UNUserNotificationCenterDelegate?
- (void)userNotificationCenter:(UNUserNotificationCenter?*)center willPresentNotification:(UNNotification?*)notification withCompletionHandler:(void?(^)(UNNotificationPresentationOptions))completionHandler {
?//1.?處理通知
?//2.?處理完成后條用?completionHandler?别瞭,用于指示在前臺(tái)顯示通知的形式
completionHandler(UNNotificationPresentationOptionAlert);
}
2.然后在ViewController.m文件里發(fā)送通知
#import?"ViewController.h"
#import?<UserNotifications/UserNotifications.h>
@interface?ViewController?()
@property?(nonatomic,?strong)?NSString?*notitle;//通知標(biāo)題
@property?(nonatomic,?strong)?NSString?*content;//通知內(nèi)容
@property?(nonatomic,?strong)?NSURL?*lineUrl;//跳轉(zhuǎn)鏈接
@property?(nonatomic,?strong)?NSURL?*imageUrl;//附加的圖片
@property?(nonatomic,?strong)?NSData?*soundData;//聲音
@end
@implementation?ViewController
- (void)viewDidLoad {
[super?viewDidLoad];
?self.title?=?@"新通知測(cè)試";
?self.view.backgroundColor?= [UIColor?whiteColor];
[self?setUpUI];
}
- (void)setUpNotification {
?//初始化通知
?UNMutableNotificationContent?*noContent = [[UNMutableNotificationContent?alloc]?init];
noContent.title?=?_notitle;//標(biāo)題
noContent.subtitle?=?@"副標(biāo)題";//副標(biāo)題
noContent.body?=?_content;//正文
noContent.badge?=?@1;//
?UNNotificationSound?*sound = [UNNotificationSound?defaultSound];
noContent.sound?= sound;
noContent.categoryIdentifier?=?@"uid";
//5秒后推送通知
?UNTimeIntervalNotificationTrigger?*trigger1 = [UNTimeIntervalNotificationTrigger?triggerWithTimeInterval:5?repeats:NO];
?UNNotificationRequest?*request = [UNNotificationRequest?requestWithIdentifier:@"push"?content:noContent?trigger:trigger1];
?//通知
?UNUserNotificationCenter?*center = [UNUserNotificationCenter?currentNotificationCenter];
[center?addNotificationRequest:request?withCompletionHandler:^(NSError?*?_Nullable?error) {
?NSLog(@"%@? error",error);
? ? }];
}
- (void)setUpUI {
?_notitle?=?@"通知標(biāo)題:iOS10測(cè)試";
?_content?=?@"這是一條緊急通知";
?_lineUrl?= [NSURL?URLWithString:@"http://www.cnblogs.com/zrr-notes/"];
?UIButton?*btn = [UIButton?buttonWithType:UIButtonTypeCustom];
[btn?setTitle:@"發(fā)送通知"?forState:UIControlStateNormal];
[btn?setBackgroundColor:[UIColor?redColor]];
btn.frame?=?CGRectMake(100,?100,?100,?50);
[self.view?addSubview:btn];
[btn?addTarget:self?action:@selector(setUpNotification)?forControlEvents:UIControlEventTouchUpInside];
}