iOS 本地通知的实现
Posted HeathHsia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 本地通知的实现相关的知识,希望对你有一定的参考价值。
iOS本地通知
- 所有的逻辑都在AppDelegate中, 一个程序更新后用户长时间没有使用的提醒
- 由本地应用触发的, 它是基于时间行为的一种通知形式, 例如闹钟, 提醒事项, 过了一段时间后台程序提醒用户使用该应用
iOS 通知机制又叫做消息机制, 包括(本地通知, 推送通知)
- 两种通知在ios中的表现一致, 可以通过横幅或者弹框两种形式来告诉用户, 点击通知可以
打开应用程序, 但是两种实现原理却不相同
创建一个本地通知分为以下几个步骤
- 创建UILocationNotification
- 设置处理通知的时间fireDate
- 配置通知的内容 : 通知主体, 通知声音, 图片数字等
- 配置通知传递的自定义数据参数userinfo (可选)
- 调用通知, 可以使用scheduleLocationNotification 按计划调度一个通知. 也可以
presentLocationNotificationNow立即调用通知
进入应用后如果没有注册通知, 需要首先注册通知请求用户允许通知, 一旦调用完注册方法, 无论用户是否选择允许通知此刻都会调用应用程序 -- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
代理方法
在这个方法中根据用户的选择, 如果允许通知, 则会按照前面的步骤创建通知并在一定时间后执行
需要注意
- 在使用通知之前必须注册通知类型(声音, 图标, 内容)
- 本地通知是由操作系统统一调度, 只有关闭应用, 或者应用进入后台才能收到通知
- 通知的声音是由iOS系统播放的, 格式必须是Linear PCM、
MA4(IMA/ADPCM)、µLaw、aLaw中的一种, 播放时间的限制(30s), 否则被系统声音替换,自定义的声音必须放到main Boundle中 - 本地通知的数量有限, 最近的本地通知最多只能有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开发中UILocalNotification实现本地通知实现提醒功能