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

  • 相关阅读:
    MySQL全文索引--转载
    提升接口tps
    数据库连接池了解和常用连接池对比
    SpringBoot跨域配置,解决跨域上传文件
    oss上传
    MySQL高级 之 explain
    spring cloud集群负载均衡
    Xmind日常操作
    产品经理应该懂点经济学
    初谈产品
  • 原文地址:https://www.cnblogs.com/AbeDay/p/5026876.html
Copyright © 2011-2022 走看看