这段时间项目要求做一个类似的闹钟提醒功能,对通知不太熟悉的我,决定先用到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. IDEA05 mybatis插件之MyBatisCodeHelper-Pro

    前提准备: >IDEA专业版本 1 安装MyBatisCodeHelper-Pro IDEA提供了插件安装功能,可以根据开发需要安装适合的插件 >help -> find actio ...

  2. SUSE Linux 多路径软件+LVM+裸设备的配置

    1.先要查出光纤卡的WWN号,SUSE 10下光纤卡的WWD在/sys/class/fc_host/host5/port_name文件中,有两块卡就会有两个host*的目录 接好光纤后可以在dev下可 ...

  3. [Training Video - 3] [Groovy in Detail] What is a groovy class ?

    log.info "starting" // we use class to create objects of a class Planet p1 = new Planet() ...

  4. 基于CacheManager组件的缓存产品配置

    一.Couchbase 使用CacheManager组件,在配置Couchbase缓存支持时,由于对配置节cache handle命名规则要求不了解,费了点时间查了源码才明白. section配置节 ...

  5. Spring 注解 整理

    首先 在xml中配置 xmlns:context="http://www.springframework.org/schema/context" http://www.spring ...

  6. sklearn中的随机森林

    阅读了Python的sklearn包中随机森林的代码实现,做了一些笔记. sklearn中的随机森林是基于RandomForestClassifier类实现的,它的原型是 class RandomFo ...

  7. QtCreator下QML翻译

    首先打开.pro工程文件,在文件中添加文本段:TRANSLATIONS = testTranslate_zh.ts 在pro右键,单击再次弹出命令提示,如图 在命令行中,输入lupdate testT ...

  8. idea 提示Resource registered by this uri is not recognized (Settings | Languages & Frameworks | Schemas and DTDs)

    idea出现如上图所示的错误提示时,可以用如下方式解决 点击红色代码部分,鼠标悬停后出现红色灯泡,如下图所示 点击灯泡后,选择第一个选项就可以解决了

  9. jQuary总结7:动画操作,显示与隐藏 淡入淡出, 滑入滑出

    1 jquery提供了三组基本动画,这些动画都是标准的.有规律的效果,jquery还提供了自定义动画的功能. 2 显示与隐藏: show([speed],[easing],[callback]) 显示 ...

  10. [LintCode笔记了解一下]80.Median

    Given a unsorted array with integers, find the median of it. A median is the middle number of the ar ...