iOS 本地通知的实现

来源:互联网 发布:花生壳域名忘记了 编辑:程序博客网 时间:2024/05/18 02:26

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的过




具体代码:

/<span style="font-size:18px;">///  AppDelegate.m//  LocationNofication////  Created by 帝炎魔 on 16/6/3.//  Copyright © 2016年 帝炎魔. All rights reserved.//#import "AppDelegate.h"@interface AppDelegate ()@end@implementation AppDelegate/** *  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];    }- (void)applicationWillResignActive:(UIApplication *)application {    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.}- (void)applicationDidEnterBackground:(UIApplication *)application {    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.}- (void)applicationDidBecomeActive:(UIApplication *)application {    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.}- (void)applicationWillTerminate:(UIApplication *)application {    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.}@end</span>





0 0
原创粉丝点击