IOS 本地推送通知

本文详细介绍如何在iOS应用中实现本地推送通知,包括针对iOS8及以后版本的特殊配置方法,以及如何发送本地通知、处理通知回调和取消特定通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本地推送通知效果图如下:





  // ios8后,需要添加这个注册,才能得到授权
  if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)])
  {
    UIUserNotificationType type =  UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type
                                                                             categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    // 通知重复提示的单位,可以是天、周、月
    notification.repeatInterval = NSCalendarUnitDay;
  }


当退出后台时,发一条本地通知

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    
            dispatch_async(dispatch_get_main_queue(), ^{
                UILocalNotification * localNotification = [[UILocalNotification alloc] init];
                if (localNotification) {
                    localNotification.fireDate= [[[NSDate alloc] init] dateByAddingTimeInterval:3];
                    localNotification.timeZone=[NSTimeZone defaultTimeZone];
                    localNotification.alertBody = @"客户端有新的版本,点击到 App Store 升级。";
                    localNotification.alertAction = @"升级 ";
                    localNotification.soundName = @"";
                    localNotification.applicationIconBadgeNumber=1; //应用的红色数字
                    [application scheduleLocalNotification:localNotification];
                }
            });
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}


// 本地通知回调函数,当应用程序在前台时调用
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    NSLog(@"noti:%@",notification);
    
    // 获取通知所带的数据
    NSString *notMess = notification.alertBody;//[notification.userInfo objectForKey:@"key"];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"本地通知(前台)"
                                                    message:notMess
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
    
    //将红色的小数字清空掉
     application.applicationIconBadgeNumber = 0;
}

// 取消某个本地推送通知
- (void)cancelLocalNotificationWithKey:(NSString *)key {
  // 获取所有本地通知数组
  NSArray *localNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;
  
  for (UILocalNotification *notification in localNotifications)
  {
    NSDictionary *userInfo = notification.userInfo;
    if (userInfo) {
      // 根据设置通知参数时指定的key来获取通知参数
      NSString *info = userInfo[key];
      
      // 如果找到需要取消的通知,则取消
      if (info != nil)
      {
        [[UIApplication sharedApplication] cancelLocalNotification:notification];
        break;
      }
    }
  }
}


转载自:http://blog.youkuaiyun.com/woaifen3344/article/details/44302635
------------------------------------以下转载------------------------

在iOS8之后,以前的本地推送写法可能会出错,接收不到推送的信息,

如果出现以下信息:


1 Attempting to schedule a local notification

2 with an alert but haven't received permission from the user to display alerts

3 with a sound but haven't received permission from the user to play sounds

说明在IOS8下没有注册,所以需要额外添加对IOS8的注册方法,API中有下面这个方法:



[objc] view plaincopyprint?


  1. // Registering UIUserNotificationSettings more than once results in previous settings being overwritten.  
  2. - (void)registerUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0);  


这个方法是8.0之后才能使用的,所以需要判断一下系统的版本。


第一步:注册本地通知:


[objc] view plaincopyprint?


  1. // 设置本地通知  
  2. + (void)registerLocalNotification:(NSInteger)alertTime {  
  3.   UILocalNotification *notification = [[UILocalNotification alloc] init];  
  4.   // 设置触发通知的时间  
  5.   NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:alertTime];  
  6.   NSLog(@"fireDate=%@",fireDate);  
  7.     
  8.   notification.fireDate = fireDate;  
  9.   // 时区  
  10.   notification.timeZone = [NSTimeZone defaultTimeZone];  
  11.   // 设置重复的间隔  
  12.   notification.repeatInterval = kCFCalendarUnitSecond;  
  13.     
  14.   // 通知内容  
  15.   notification.alertBody =  @"该起床了...";  
  16.   notification.applicationIconBadgeNumber = 1;  
  17.   // 通知被触发时播放的声音  
  18.   notification.soundName = UILocalNotificationDefaultSoundName;  
  19.   // 通知参数  
  20.   NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"开始学习iOS开发了" forKey:@"key"];  
  21.   notification.userInfo = userDict;  
  22.     
  23.   // ios8后,需要添加这个注册,才能得到授权  
  24.   if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {  
  25.     UIUserNotificationType type =  UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;  
  26.     UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type  
  27.                                                                              categories:nil];  
  28.     [[UIApplication sharedApplication] registerUserNotificationSettings:settings];  
  29.     // 通知重复提示的单位,可以是天、周、月  
  30.     notification.repeatInterval = NSCalendarUnitDay;  
  31.   } else {  
  32.     // 通知重复提示的单位,可以是天、周、月  
  33.     notification.repeatInterval = NSDayCalendarUnit;  
  34.   }  
  35.     
  36.   // 执行通知注册  
  37.   [[UIApplication sharedApplication] scheduleLocalNotification:notification];  
  38. }  


第二步:处理通知,这个是在appdelegate中的代理 方法回调



[objc] view plaincopyprint?


  1. // 本地通知回调函数,当应用程序在前台时调用  
  2. - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {  
  3.   NSLog(@"noti:%@",notification);  
  4.     
  5.   // 这里真实需要处理交互的地方  
  6.   // 获取通知所带的数据  
  7.   NSString *notMess = [notification.userInfo objectForKey:@"key"];  
  8.   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"本地通知(前台)"  
  9.                                                   message:notMess  
  10.                                                  delegate:nil  
  11.                                         cancelButtonTitle:@"OK"  
  12.                                         otherButtonTitles:nil];  
  13.   [alert show];  
  14.     
  15.   // 更新显示的徽章个数  
  16.   NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber;  
  17.   badge--;  
  18.   badge = badge >= 0 ? badge : 0;  
  19.   [UIApplication sharedApplication].applicationIconBadgeNumber = badge;  
  20.     
  21.   // 在不需要再推送时,可以取消推送  
  22.   [HomeViewController cancelLocalNotificationWithKey:@"key"];  
  23. }  


第三步:在需要的时候取消某个推送



[objc] view plaincopyprint?


  1. // 取消某个本地推送通知  
  2. + (void)cancelLocalNotificationWithKey:(NSString *)key {  
  3.   // 获取所有本地通知数组  
  4.   NSArray *localNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;  
  5.     
  6.   for (UILocalNotification *notification in localNotifications) {  
  7.     NSDictionary *userInfo = notification.userInfo;  
  8.     if (userInfo) {  
  9.       // 根据设置通知参数时指定的key来获取通知参数  
  10.       NSString *info = userInfo[key];  
  11.         
  12.       // 如果找到需要取消的通知,则取消  
  13.       if (info != nil) {  
  14.         [[UIApplication sharedApplication] cancelLocalNotification:notification];  
  15.         break;  
  16.       }  
  17.     }  
  18.   }  
  19. }  




下载demo:https://github.com/632840804/LocalPush


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值