iOS本地通知(推送)
專案中用到了本地通知功能,便到網上搜羅了一翻,各式各樣的說法,經過自己的驗證,親測可用, 整理如下
首先要說明的是IOS最多允許最近本地通知數量是64個,超過限制的本地通知將被忽略,經過測試,本地通知根本沒有限制,可能以前有限制吧,現在已經不限制數量了。
其次是在iOS8以後需要先註冊才能傳送通知,所以在使用本地通知功能以前需要先註冊。
下面說說用法:
1.註冊通知(iOS8以後)
在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中新增註冊程式碼
if([[UIDevice currentDevice].systemVersion doubleValue]>=8.0){//8.0以後使用這種方法來註冊推送通知
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
}else{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
}
2.構建UILocalNotification
UILocalNotification *notification = [[UILocalNotification alloc] init];
3.配置UILocalNotification
3.1屬性
-
1.觸發時間(fireDate,timeZone,repeatInterval(重複方式),repeatCalendar)//如果傳送通知方式為即時傳送則配置無意義
//10秒以後通知
NSDate * now = [[NSDate alloc] init];
notification.fireDate=[now dateByAddingTimeInterval:10];//使用本地時區
notification.timeZone=[NSTimeZone defaultTimeZone];// 設定重複的方式
notification.repeatInterval = kCFCalendarUnitSecond; 2.通知行為(alertAction,hasAction)
notification.alertAction=NSLocalizedString(@"鎖屏啦,通知時間到啦", nil);3.觸發通知時的啟動畫面(alertLaunchImage)
4.通知的正文內容(alertTitle、alertBody)
notification.alertBody=@"通知內容";5.通知的聲音(soundName)
notification.soundName = UILocalNotificationDefaultSoundName;6.通知訊息數的展示(applicationIconBadgeNumber)App圖示左上角的紅數字
notification.applicationIconBadgeNumber = 1;//不顯示為0-
7.其它(userInfo),可以給通知繫結一些處理通知時需要的額外資訊。
給這個通知增加key 便於取消。NSDictionary *dict =[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:notificationtag],@"akey",nil]; [notification setUserInfo:dict];
3.2傳送方式
- (void)presentLocalNotificationNow:(UILocalNotification *)notification//立即傳送
- (void)scheduleLocalNotification:(UILocalNotification *)notification//按配置時間傳送
3.3取消方式
-- (void)cancelLocalNotification:(UILocalNotification *)notification//取消某個通知
-- (void)cancelAllLocalNotifications//取消所有通知
// 獲取所有本地通知陣列
NSArray *localNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;
for (UILocalNotification *notification in localNotifications) {
NSDictionary *userInfo = notification.userInfo;
if (userInfo) {
// 根據設定通知引數時指定的key來獲取通知引數
NSString *info = userInfo[@"akey"];
// 如果找到需要取消的通知,則取消
if (info != nil) {
[[UIApplication sharedApplication] cancelLocalNotification:notification];
break;
}
}
}
4.處理通知
在AppDelegate.m檔案中- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification方法新增
// 獲取通知所帶的資料
NSString *message = [notification.userInfo objectForKey:@"akey"];
//可按需求進行資料處理
NSLog(@"%@",message);
// 更新顯示的訊息個數
NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
badge--;//讀了一個,所以減1
badge = badge >= 0 ? badge : 0;
[UIApplication sharedApplication].applicationIconBadgeNumber = badge;//本人最討厭這個小紅點。。。
一般在進入App後應當清除小紅點,在- (void)applicationDidBecomeActive:(UIApplication *)application方法中,新增一句[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];即可。
到這裡就全部結束了,是不是很簡單呢?其實我們平時用它也就進行一個類似彈框的提醒功能,註冊、傳送,幾句程式碼就解決了。。。
注意
1.iOS系統沒有自定義時間間隔的通知,如果要實現類似功能需要註冊多個通知
2.如果重複次數為0的話,通知了一次這個通知就會從系統消除
3.如果你的通知沒有消除,即使解除安裝了程式,這依然會殘留,在下次裝入的時候會繼續執行,如果想要移除本地通知可以呼叫UIApplication的cancelLocalNotification:或cancelAllLocalNotifications移除指定通知或所有通知
4.在使用通知之前必須註冊通知型別,如果使用者不允許應用程式傳送通知,則以後就無法傳送通知,除非使用者手動到iOS設定中開啟通知
5.通知的聲音是由iOS系統播放的,格式必須是Linear PCM、MA4(IMA/ADPCM)、µLaw、aLaw中的一種,並且播放時間必須在30s內,否則將被系統聲音替換,同時自定義聲音檔案必須放到main boundle中
6.本地通知的數量是有限制的,最近的本地通知最多隻能有64個,超過這個數量將被系統忽略
相關文章
- ios推送:本地通知UILocalNotificationiOSUI
- iOS推送之本地推送iOS
- iOS 本地推送iOS
- iOS 推送通知及推送擴充套件iOS套件
- iOS 本地通知那些事iOS
- iOS 本地通知NSNotificationcenter --- iOS 開發iOS
- iOS10推送通知適配iOS
- iOS 本地通知(未完待續)iOS
- iOS12中推送通知新特性iOS
- iOS專案開發實戰——實現蘋果本地訊息通知推送服務iOS蘋果
- iOS8本地推送iOS
- iOS - 10以後的本地通知iOS
- iOS推送——本地推送與遠端推送詳解(一圖看懂)iOS
- 一次IOS通知推送問題排查全過程iOS
- Accengage:Android裝置推送通知互動率是iOS的3倍AndroidiOS
- iOS推送之遠端推送iOS
- Hybird推送通知然後跳轉appAPP
- iOS 遠端通知iOS
- iOS 通知中心(NSNotificationCenter)iOS
- iOS 推送整理iOS
- ios中推送iOS
- 《Web 推送通知》系列翻譯 | 第七篇:推送事件 && 第八篇:顯示一個通知Web事件
- 《Web 推送通知》系列翻譯 | 引言&概覽Web
- Android 8.0 Oreo 推送通知的變化Android
- React Native推送通知:完整的操作指南React Native
- iOS 通知擴充套件iOS套件
- nagios mail告警通知iOSAI
- iOS ANCS 通知服務iOS
- IOS 蘋果官方推送iOS蘋果
- iOS推送機制iOS
- 用 Swift 實現通知推送的新手指南Swift
- [譯] 由 Node.js 傳送 Web 推送通知Node.jsWeb
- Urban Airship:使用推送通知的玩家保留率更高AI
- 無法使用 Apple 推送通知服務(APNs)APP
- 《Web 推送通知》系列翻譯 | 第九篇:通知行為 && 第十篇:常用的通知模式Web模式
- iOS開發-鍵盤通知iOS
- iOS中通知非同步?同步?iOS非同步
- 將本地nuget包推送到Nexus