iOS本地通知(推送)

weixin_34290000發表於2018-02-09

專案中用到了本地通知功能,便到網上搜羅了一翻,各式各樣的說法,經過自己的驗證,親測可用, 整理如下

首先要說明的是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個,超過這個數量將被系統忽略

相關文章