zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Ubuntu 14.04 卸载通过源码安装的库
    Ubuntu 14.04 indigo 相关依赖
    Ubuntu 14.04 indigo 安装 cartographer 1.0.0
    Ubuntu 14.04 改变文件或者文件夹的拥有者
    安装cartographer遇到Unrecognized syntax identifier "proto3". This parser only recognizes "proto2"问题
    Unrecognized syntax identifier "proto3". This parser only recognizes "proto2". ”问题解决方法
    查看所有用户组,用户名
    1卸载ROS
    Ubuntu14.04 软件安装卸载
    Ubuntu14.04系统显示器不自动休眠修改
  • 原文地址:https://www.cnblogs.com/AbeDay/p/5026876.html
Copyright © 2011-2022 走看看