iOS本地推送(本地通知)

简介:

在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中有下面这个方法:

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

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

第一步:注册本地通知:

// 设置本地通知
+ (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;
      }
    }
  }
}


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


目录
打赏
0
0
0
0
41
分享
相关文章
iOS15适配本地通知功能及语音播报探索
iOS15适配本地通知功能及语音播报探索
842 0
iOS15适配本地通知功能及语音播报探索
iOS中使用本地通知为你的APP添加提示用户功能(二)
iOS中使用本地通知为你的APP添加提示用户功能
319 0
iOS中使用本地通知为你的APP添加提示用户功能(一)
iOS中使用本地通知为你的APP添加提示用户功能
231 0
iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权
本篇文章将会从PEGASUS漏洞形成的原因开始分析,然后一步一步教大家写出OS X上利用PEGASUS提权的攻击代码。
2655 1
iOS Notification(本地通知)
代码 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { ...
1217 0
iOS中 本地通知/本地通知详解 韩俊强的博客
布局如下:(重点讲本地通知) iOS开发者交流QQ群: 446310206 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 Notification是智能手机应用编程中非常常用的一种传递信息的机制,而且可以非常好的节省资源,不用消耗资源来不停地检查信息状态(Pooling),在iOS下应用分为两种不同的Notification种类,本地和远程。
950 0
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
213 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决

热门文章

最新文章

  • 1
    苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
    87
  • 2
    苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
    54
  • 3
    uniapp云打包ios应用证书的获取方法,生成指南
    81
  • 4
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    128
  • 5
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    37
  • 6
    iOS各个证书生成细节
    53
  • 7
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    253
  • 8
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    81
  • 9
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    94
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    77
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等