iOS8本地推送

作者: 船长_ | 来源:发表于2015-12-14 21:16 被阅读1135次
    • 在IOS8下没有注册,所以需要额外添加对IOS8的注册方法

    第一步:注册本地通知

    // 设置本地通知  
    + (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;  
      // 通知参数  
      NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"开始学习iOS开发了" forKey:@"key"];  
      notification.userInfo = userDict;  
        
      // 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;  
      } else {  
        // 通知重复提示的单位,可以是天、周、月  
        notification.repeatInterval = NSDayCalendarUnit;  
      }  
        
      // 执行通知注册  
      [[UIApplication sharedApplication] scheduleLocalNotification:notification];  
    }  
    

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

    // 本地通知回调函数,当应用程序在前台时调用  
    - (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"];  
    } 
    

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

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

    示例图:


    test.png demo.png

    相关文章

      网友评论

      本文标题:iOS8本地推送

      本文链接:https://www.haomeiwen.com/subject/kqnyhttx.html