iOS-本地推送(本地通知)

第一步:注册本地通知:

// 设置本地通知  
+ (void)registerLocalNotification:(NSInteger)alertTime {  
  UILocalNotification *notification = [[UILocalNotification alloc] init];  
  // 设置触发通知的时间  
  NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:alertTime];  
  NSLog(@"fireDate=%@",fireDate);  

  notification.fireDate = fireDate;  
  // 时区  
  notification.timeZone = [NSTimeZone defaultTimeZone];  
  // 设置重复的间隔  
  notification.repeatInterval = kCFCalendarUnitSecond;  

  // 通知内容  
  notification.alertBody =  @"该起床了...";  
  notification.applicationIconBadgeNumber = 1;  
  // 通知被触发时播放的声音  
  //notification.soundName = UILocalNotificationDefaultSoundName;  //默认声音
  notification.soundName = @"LocalNotificationMusic.m4r";//播放音乐
  // 通知参数  
  NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"开始学习iOS开发了" forKey:@"key"];  
  notification.userInfo = userDict;  

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

  // 执行通知注册  
  [[UIApplication sharedApplication] scheduleLocalNotification:notification];  
}  

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

这里氛围两种情况
1. 当app没有关闭, 进入后台运行时, 通过本地通知途径进入app, 将触发application: didReceiveLocalNotification方法.
2. 当app关闭时, 通过本地通知途径进入app, 不会触发application: didReceiveLocalNotification方法. 需要通过application: didFinishLaunchingWithOptions:方法, 判断是否由本地通知打开app.(具体方法见代码)

当app没有关闭(后台运行), 调用本地通知启动

// 本地通知回调函数,当应用程序在前台时调用  
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {  
  NSLog(@"noti:%@",notification);  

  // 这里真实需要处理交互的地方  
  // 获取通知所带的数据  
  NSString *notMess = [notification.userInfo objectForKey:@"key"];  
  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"本地通知(前台)"  
                                                  message:notMess  
                                                 delegate:nil  
                                        cancelButtonTitle:@"OK"  
                                        otherButtonTitles:nil];  
  [alert show];  

  // 更新显示的徽章个数  
  NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber;  
  badge--;  
  badge = badge >= 0 ? badge : 0;  
  [UIApplication sharedApplication].applicationIconBadgeNumber = badge;  

  // 在不需要再推送时,可以取消推送  
  [HomeViewController cancelLocalNotificationWithKey:@"key"];  
}  

当app关闭, 调用本地通知启动

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    //app启动时,其他代码
    [self otherCode];

    /*本地通知方式-启动*/
    //获取本地通知,如果不是本地通知方式启动, notification将为nil
    UILocalNotification *notification = [launchOptions objectForKey: UIApplicationLaunchOptionsLocalNotificationKey];
    if (notification && [notification isKindOfClass:[UILocalNotification class]]) {
        //获取本地通知详细信息
        NSDictionary *userInfo = notification.userInfo;
        //通过信息判断为哪条本地通知, 做出相应回应
        NSString *name = [userInfo objectForKey:@"name"];
        if ([name isEqualToString:@"remindNotification"]) {
                //做出反应
                [self actionCode];
            }
        }

    return YES;
}

取消某个本地通知

// 取消某个本地推送通知  
+ (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;  
      }  
    }  
  }  
}  

本地推送-应用角标自加

如果利用一个本地推送对象,设置为每天重复,图标的数量始终会一直不变;图标累加需要设置多个本地推送基于不同才场景进行设置。

demo

https://github.com/632840804/LocalPush

转载

http://blog.csdn.net/woaifen3344/article/details/44302635

原文地址:https://www.cnblogs.com/AbeDay/p/5026876.html