iOS 本地通知的实现

Posted HeathHsia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 本地通知的实现相关的知识,希望对你有一定的参考价值。

iOS本地通知

  • 所有的逻辑都在AppDelegate中, 一个程序更新后用户长时间没有使用的提醒
  • 由本地应用触发的, 它是基于时间行为的一种通知形式, 例如闹钟, 提醒事项, 过了一段时间后台程序提醒用户使用该应用

iOS 通知机制又叫做消息机制, 包括(本地通知, 推送通知)

  • 两种通知在ios中的表现一致, 可以通过横幅或者弹框两种形式来告诉用户, 点击通知可以

打开应用程序, 但是两种实现原理却不相同

创建一个本地通知分为以下几个步骤

  1. 创建UILocationNotification
  2. 设置处理通知的时间fireDate
  3. 配置通知的内容 : 通知主体, 通知声音, 图片数字等
  4. 配置通知传递的自定义数据参数userinfo (可选)
  5. 调用通知, 可以使用scheduleLocationNotification 按计划调度一个通知. 也可以

presentLocationNotificationNow立即调用通知

进入应用后如果没有注册通知, 需要首先注册通知请求用户允许通知, 一旦调用完注册方法, 无论用户是否选择允许通知此刻都会调用应用程序 -- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings 代理方法

在这个方法中根据用户的选择, 如果允许通知, 则会按照前面的步骤创建通知并在一定时间后执行

需要注意

  1. 在使用通知之前必须注册通知类型(声音, 图标, 内容)
  2. 本地通知是由操作系统统一调度, 只有关闭应用, 或者应用进入后台才能收到通知
  3. 通知的声音是由iOS系统播放的, 格式必须是Linear PCM、
    MA4(IMA/ADPCM)、µLaw、aLaw中的一种, 播放时间的限制(30s), 否则被系统声音替换,自定义的声音必须放到main Boundle中
  4. 本地通知的数量有限, 最近的本地通知最多只能有64个, 超过这个数量将被系统忽略

关于通知参数的接收问题notification.userinfo 中的绑定附加信息

如果用户关闭应用程序, 那么用户点击通知信息,会走 finishLaunchingWith这个方法

如果应用处于后台运行状态, 会走- didReceiveLocationNotification 会得到notification这个对象, 同时也会得到userinfo

在finish这个 方法中可以访问 launchOptions中键为UIApplicationLaunchOptionsLocalNotificationKey对象, 这个对象就是发送的通知, 由此对象再访问userinfo, 可以将userinfo写入文件方便关闭程序后再通过点击通知打开应用userinfo的过程

具体代码

/** 
 *  iOS 通知机制又叫做消息机制, 包括(本地通知, 推送通知) 
 两种通知在iOS中的表现一致, 可以通过横幅或者弹框两种形式来告诉用户, 点击通知可以打开应用程序 
 但是两种实现原理却不相同 
 */  

/** 
 *  本地通知 : 所有的逻辑都在AppDelegate中, 一个程序更新后用户长时间没有使用的提醒 
 由本地应用触发的, 它是基于时间行为的一种通知形式, 例如闹钟, 提醒事项, 过了一段时间后台程序提醒用户使用该应用, 
 创建一个本地通知分为以下几个步骤: 
 1. 创建UILocationNotification 
 2. 设置处理通知的时间fireDate 
 3. 配置通知的内容 : 通知主体, 通知声音, 图片数字等 
 4. 配置通知传递的自定义数据参数userinfo (可选) 
 5. 调用通知, 可以使用scheduleLocationNotification 按计划调度一个通知. 也可以presentLocationNotificationNow立即调用通知 

 进入应用后如果没有注册通知, 需要首先注册通知请求用户允许通知, 一旦调用完注册方法, 无论用户是否选择允许通知此刻都会调用应用程序 
 -- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings代理方法 
 在这个方法中根据用户的选择, 如果允许通知, 则会按照前面的步骤创建通知并在一定时间后执行 

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


    // 如果已经获得发送通知的授权则创建本地通知, 否则请求授权, 注意: 如果不请求授权在设置中没有对应的通知设置, 如果从来没有发送过请求, 即使通过设置也打不开消息允许设置  
    if ([[UIApplication sharedApplication] currentUserNotificationSettings].types != UIUserNotificationTypeNone)   
        [self addLocationNotification];  
    else   
        // 必须要注册通知类型  
        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]];  
      


    // Override point for customization after application launch.  
    return YES;  
  



#pragma mark ---- 调用过用户注册通知方法之后执行(调用完 registerUserNotificationSettings:之后执行的)  
-(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings  
  
    if (notificationSettings.types != UIUserNotificationTypeNone)   
        [self addLocationNotification];  
      
  

#pragma mark ---- 进入前台后设置消息信息  
- (void)applicationWillEnterForeground:(UIApplication *)application  
  
    // 进入前台取消应用消息图标  
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];  
  


#pragma mark ---- 添加本地通知  
- (void)addLocationNotification  
  
    // 定义本地通知对象  
    UILocalNotification *notification  = [[ UILocalNotification alloc] init];  
    // 设置调用时间----- 当前时间10秒之后  
    notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:10.0];  
    // 通知重复次数  
    notification.repeatInterval = 2;  
    // 当前日历, 使用前对号设置时区等信息, 使其同步  
 //    notification.repeatCalendar = [NSCalendar currentCalendar];  


    // 设置通知的属性  
    // 1. 通知的主体 body  
    notification.alertBody = @"有好玩的东西, 快来尝试吧";  
    // 2. 应用程序图标左上角显示的消息数字  
    notification.applicationIconBadgeNumber = 1;  
    // 3. 待机界面的滑动动作提示  
    notification.alertAction = @"打开应用";  
    // 4. 通过点击通知打开应用时的启动图片, 这里使用默认图片  
    notification.alertLaunchImage = @"Default";  

    // 5. 收到通知时播放的声音, 默认消息声音  
    notification.soundName = UILocalNotificationDefaultSoundName; // 默认系统通知声音  
//    notification.soundName = @"sound.caf"; // 通知声音, 自定义  

    // 6. 设置用户信息  
    notification.userInfo = @@"ID" : @1, @"user" : @"xiayan"; // 绑定通知上的其他附加信息  

    // 7. 调用通知  
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];  
  

/** 
 *  注意: 
 *   
    1. 在使用通知之前必须注册通知类型(声音, 图标, 内容) 
    2. 本地通知是由操作系统统一调度, 只有关闭应用, 或者应用进入后台才能收到通知 
    3. 通知的声音是由iOS系统播放的, 格式必须是Linear PCM、MA4(IMA/ADPCM)、µLaw、aLaw中的一种, 播放时间的限制(30s), 否则被系统声音替换, 自定义的声音必须放到main Boundle中 
    4. 本地通知的数量有限, 最近的本地通知最多只能有64个, 超过这个数量将被系统忽略 
    5. 如果想要移除本地通知可 
 */  
/** 
 *  关于通知参数的接收问题 
 * 
 *  notification.userinfo 中的绑定附加信息 
    如果用户关闭应用程序, 那么用户点击通知信息,会走 finishLaunchingWith 这个方法 
    如果应用处于后台运行状态, 会走- didReceiveLocationNotification 会得到notification这个对象, 同时也会得到userinfo 
    在finish这个 方法中可以访问 launchOptions中键为UIApplicationLaunchOptionsLocalNotificationKey对象, 这个对象就是发送的通知, 由此对象再访问userinfo, 可以将userinfo写入文件方便关闭程序后再通过点击通知打开应用userinfo的过程 
 */  
#pragma mark ---- 移除本地通知, 在不需要的此通知时移除通知  
- (void)removeNotification  
  
    // 设置取消通知  
    [[UIApplication sharedApplication] cancelAllLocalNotifications];  

  

以上是关于iOS 本地通知的实现的主要内容,如果未能解决你的问题,请参考以下文章

iOS 和本地通知

iOS 本地通知的实现

iOS 本地通知的实现

Ios开发中UILocalNotification实现本地通知实现提醒功能

iOS开发中UILocalNotification实现本地通知实现提醒功能

如何在 iOS 中禁用/启用本地通知?