ios開發之本地通知
概述:
在多數移動應用中任何時候都只能有一個應用程式處於活躍狀態,如果其他應用此刻發生了一些使用者感興趣的那麼通過通知機制就可以告訴使用者此時發生的事情。ios中通知機制又叫訊息機制,其包括兩類:一類是本地通知;另一類是推送通知。也叫遠端通知。兩種通知在ios中表現一致,可以通過橫幅或者彈出提醒兩種形式告訴使用者,並且點選通知可以開啟應用程式,但是實現原理卻完全不同。今天就和大家一塊去看一下本地通知,遠端通知下回分享。
本地通知:
本地通知是由本地應用觸發的,它是基於時間行為的一種通知形式,例如鬧鐘定時,代辦事項,又或者一個應用在一段時間內不使用又提示使用者使用此應用等都是本地通知。
ios8之後要在applegate中註冊本地通知,否則本地通知不可用。
要點:ios8後推出了UILocalNotification 本地通知,它的用法如
applegate.m中
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { // iOS8
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:setting];
}
傳送本地通知的方法為
/*
// 建立本地通知
UILocalNotification *localNote = [[UILocalNotification alloc] init];
// 1.1.設定通知發出的時間
localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
// 1.2.設定通知內容
localNote.alertBody = @"這是一個推送這是一個推送";
localNote.alertTitle = @"hello world";
// 1.3.設定鎖屏時,字型下方顯示的一個文字
localNote.alertAction = @"趕緊!!!!!";
localNote.hasAction = YES;
// 1.4.設定啟動圖片(通過通知開啟的)
// localNote.alertLaunchImage = @"../Documents/IMG_0024.jpg";
// 1.5.設定通過到來的聲音
localNote.soundName = UILocalNotificationDefaultSoundName;
// 1.6.設定應用圖示左上角顯示的數字
localNote.applicationIconBadgeNumber = 999;
// 1.7.設定一些額外的資訊
localNote.userInfo = @{@"qq" : @"704711253", @"msg" : @"success"};
// 2.執行通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNote];
*/
注意點:不管任何通知都是程式在後臺或者殺死情況下,以通知欄的形式展示給使用者,在前臺是看不到通知欄的,當初作者就傻啦吧唧在前臺傳送通知,遲遲不出來通知,以為寫錯了,後來發現前臺是不顯示通知欄的,哈哈,1、在applegate中有個方法為
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
當在前臺收到通知會走這個方法, 還有當程式在後臺時,收到通知,然後點選通知欄,也會調這個方法
這個方法一般會這樣寫,
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
NSLog(@"收到本地通知");
NSLog(@"---%@---",notification.alertBody);
if (application.applicationState == UIApplicationStateActive) {
UIAlertController *vc = [UIAlertController alertControllerWithTitle:notification.alertTitle message:notification.alertBody preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *alerAction = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}];
[vc addAction:alerAction];
[self.window.rootViewController presentViewController:vc animated:YES completion:nil];
}
NSLog(@"---%ld---",application.applicationState);
NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
badge --;
badge = badge >= 0 ? badge : 0;
application.applicationIconBadgeNumber = badge;
[application cancelAllLocalNotifications];
}
注意點是:程式從後臺通過點選通知欄調以上方法時,此時程式狀態是非活躍的,程式在前臺收到通知時,程式是出於活躍狀態
到ios10時,蘋果推出新型推送通知框架 #import <UserNotifications/UserNotifications.h> 雖然推出了新型框架來代替之前的UILocalNotification,但是為了相容市面上不同的蘋果系統,UILocalNotification還是可以用
然後說說新型推送通知框架 #import <UserNotifications/UserNotifications.h>
註冊通知
if ([UIDevicecurrentDevice].systemVersion.doubleValue >= 10.0) {
UNUserNotificationCenter *center = [UNUserNotificationCentercurrentNotificationCenter];
center.delegate = self;
UNAuthorizationOptions type = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
[center requestAuthorizationWithOptions:type completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
}];
} else {
NSLog(@"註冊通知失敗");
}
}];
}
和上面的註冊通知相似,而也有很大的不同,類名變了很多,裡面提到了個使用者通知中心新的概念,裡面也判斷了使用者是否授權本地通知, 裡面還設定了代理,到下面再說
傳送本地通知的方法為
UNMutableNotificationContent *content = [[UNMutableNotificationContentalloc] init];
content.title = @"hello";
content.body = @"這是一個推送";
NSInteger badge = [UIApplicationsharedApplication].applicationIconBadgeNumber;
badge++;
content.badge = @(badge);
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTriggertriggerWithTimeInterval:5repeats:NO];
UNNotificationRequest *request = [UNNotificationRequestrequestWithIdentifier:@"你好"content:content trigger:trigger];
[[UNUserNotificationCentercurrentNotificationCenter] addNotificationRequest:request withCompletionHandler:nil];