这段时间项目要求做一个类似的闹钟提醒功能,对通知不太熟悉的我,决定先用到xcode自带的本地通知试试,最终成功的实现了功能,特整理分享下。

它的表现特点:

app关闭的时候也能接收和显示通知。

app处于后台的时候能接收通知也能显示。

app处于前台的时候能接收,但不能显示,但是会走应用程序delegate中的方法

具体的创建方法:

-》创建一个本地通知对象UILocalNotification

-》设置fireDate,AlertBody,AlertAction,soundName,applicationBadgeNumber,repeatInterval,alertLanuchImage属性

-》配置通知参数,userInfo。及通知的内容。我们可以在接收通知的方法中获取该对象。

-》调用通知,使用UIApplication的单例对象scheduleLocalNotificaiton按照计划启动通知

此处需要注意的是自从iOS8之后需要征求用户的通知,如果同意则创建UIUerNotificationSettings,然后 registerUserNotificationSettings。网上有说法:对本地通知的数量限制,iOS最多允许最近本地通知数量是64个,超过限制的本地通知将被iOS忽略。经过测试,本地通知根本没有限制,可能以前有限制吧,现在已经不限制数量了。

下面就是详细的代码:

 1.注册通知 ,同样也适用于iOS10

  在appdelegate的application:didFinishLaunchingWithOptions:中调用下面的方法

   

另外补充:为了适配iOS10,上面的代码最好是换成下面的

  

  2.本地通知的定义和使用

  在需要使用本地通知的控制器定义,这里为了简便直接定义一个5s之后的闹钟,可以改成任意一个时间点的,转换成NSDate类型替换[NSDate dateWithTimeIntervalSinceNow:5]即可。

  

  为了区分不同的本地通知,可以在定义的同时定义下面的属性

  //设置通知的相关信息,这个很重要,可以添加一些标记性内容,方便以后区分和获取通知的信息
     NSDictionary *infoDic = [NSDictionary dictionaryWithObjectsAndKeys:LOCAL_NOTIFY_SCHEDULE_ID,@"id", nil];
    localNotification.userInfo = infoDic;

3.取消本地通知

  注意::在每次不需要或者重新刷新所有的本地通知之前必须先取消所有的本地通知,不然会有重复的相同的通知。

  //取消某一个通知
     NSArray *notificaitons = [[UIApplication sharedApplication] scheduledLocalNotifications];
     //获取当前所有的本地通知
     if (!notificaitons || notificaitons.count <= 0) {
         return;
     }
     for (UILocalNotification *notify in notificaitons) {
        if ([[notify.userInfo objectForKey:@"id"] isEqualToString:LOCAL_NOTIFY_SCHEDULE_ID]) {
            //取消一个特定的通知
            [[UIApplication sharedApplication] cancelLocalNotification:notify];
            break;
        }
    }
    
    //取消所有的本地通知
    [[UIApplication sharedApplication] cancelAllLocalNotifications];

4.本地通知的响应

  如果已经注册了本地通知,当客户端响应通知时:

a、应用程序在后台的时候,本地通知会给设备送达一个和远程通知一样的提醒

b、应用程序正在运行中,则设备不会收到提醒,但是会走应用程序delegate中的方法:

  - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {  
  }

  如果你想实现程序在后台时候的那种提醒效果,可以在上面这个方法中添加相关代码

  if ([[notification.userInfo objectForKey:@"id"] isEqualToString:LOCAL_NOTIFY_SCHEDULE_ID]) {  
       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"test" message:notification.alertBody delegate:nil cancelButtonTitle:@"关闭" otherButtonTitles:notification.alertAction, nil nil];  
       [alert show];  
   }

  需要注意的是,在情况a中,如果用户点击提醒进入应用程序,也会执行收到本地通知的回调方法,这种情况下如果你添加了上面那段代码,则会出现连续出现两次提示,为了解决这个问题,修改代码如下:

  if ([[notification.userInfo objectForKey:@"id"] isEqualToString:LOCAL_NOTIFY_SCHEDULE_ID]) {  
         //判断应用程序当前的运行状态,如果是激活状态,则进行提醒,否则不提醒  
         if (application.applicationState == UIApplicationStateActive) {  
             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:notification.alertBody delegate:nil cancelButtonTitle:@"关闭" otherButtonTitles:nil, nil];  
            [alert show];  
         }  
     }

  如果适配了iOS10,则还应该加上下面的

  

  

iOS开发中UILocalNotification本地通知实现简单的提醒功能的更多相关文章

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

    这两天在做一个日程提醒功能,用到了本地通知的功能,记录相关知识如下: 1.本地通知的定义和使用: 本地通知是UILocalNotification的实例,主要有三类属性: scheduled time ...

  2. iOS开发中打开本地应用、打开appStore应用、给app评分功能实现

    app开发中,通常会有邀请用户给app打分的功能.而在iOS中,正式应用都是通过appStore 下载的,因此给app 打分也只能在 appStore中.因此,需要从应用跳转到appStore.方法是 ...

  3. IOS开发中如何使用通知NSNotification传值

    通知 是在跳转控制器之间常用的传值代理方式,除了代理模式,通知更方便.便捷,一个简单的Demo实现通知的跳转传值. 输入所要发送的信息 ,同时将label的值通过button方法调用传递, - (IB ...

  4. iOS开发中关于本地数据中SQLite数据库常用的SQL语句

    创建表 CREATE TABLE IF NOT EXISTS "student" ("number" INTEGER PRIMARY KEY AUTOINCRE ...

  5. iOS开发UI篇—iOS开发中三种简单的动画设置

    iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...

  6. ios开发中超简单抽屉效果(MMDrawerController)的实现

    ios开发中,展示类应用通常要用到抽屉效果,由于项目需要,本人找到一个demo,缩减掉一些不常用的功能,整理出一个较短的实例. 首先需要给工程添加第三方类库 MMDrawerController: 这 ...

  7. iOS开发中遇到的一些问题及解决方案【转载】

    iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // //  MyScrollView.m //  Creat ...

  8. GIT在iOS开发中的使用

    前言 在iOS开发中,很多公司对项目的版本控制管理都使用了git,当然也有部分公司使用的是svn.当年我最初接触的是svn,觉得使用起来挺方便的,但是每次切分支都需要下载一份新的代码起来,这实在太麻烦 ...

  9. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

随机推荐

  1. 规范抢先看!微信小程序的官方设计指南和建议

    基于微信小程序轻快的特点,我们(微信官方)拟定了小程序界面设计指南和建议. 设计指南建立在充分尊重用户知情权与操作权的基础之上.旨在微信生态体系内,建立友好.高效.一致的用户体验,同时最大程度适应和支 ...

  2. code1043 方格取数

    第一次走用dfs枚举每种情况,第二次走用dp求剩下的最大值 设一个点集q用来保存有价值的点,排序,在最后加一个终点:x=m+1,y=m+1,v=0  //m是矩阵长宽 因为v=0的点是没有意义的,所以 ...

  3. [SoapUI] Context is per test case, every test case has a different context

  4. understand的安装

    1.win7 64位下安装 1)下载Understand.4.0.908.x64.rar. 2)解压之,直接运行里面的Understand-4.0.908-Windows-64bit.exe. 3)选 ...

  5. Oracle 用户验证日志

    1.sysdba/sysoper 权限用户验证日志;2.非sysdba/sysoper 权限用户验证日志;3.关于sqlcode; 1.sysdba/sysoper 权限用户验证日志:在数据库设置了参 ...

  6. 开发工具Visual Studio使用相关知识和经验的碎片化记录

    开发工具Visual Studio使用相关知识和经验的碎片化记录 1.Visual Studio提示"无法启动IIS Express Web服务器"的解决方法 有时,在使用Visu ...

  7. PBOC中文件结构,文件类型解析

    1.明确两个规范,a. ISO7816   b.EMV规范/PBOC规范,二者的区别,7816是ISO制定的,是国际规范,而EMV规范是卡组织制定的,是遵循ISO7816规范的,PBOC是抄袭EMV规 ...

  8. Webstorm 10.0.4 配置

    1. 更换为sublime text的keymaps: https://github.com/ekaragodin/idea-sublime-keymap  (idea-sublime-keymap- ...

  9. 3.1.7 线程阻塞工具类:LockSupport

    package 第三章.线程阻塞工具LockSupport; import java.util.concurrent.locks.LockSupport; /** * Created by zzq o ...

  10. Spring框架总结(十一)

    切入点表达式 可以对指定的“方法”进行拦截:从而给指定的方法所在的类生层代理对象. 其他跟十一样,只更改bean.xml <?xml version="1.0" encodi ...