iOS推送之本地通知UILocalNotification

摘要: Notification是智能手机应用编程中非常常用的一种传递信息的机制,而且可以非常好的节省资源,不用消耗资源来不停地检查信息状态(Pooling),在iOS下应用分为两种不同的Notification种类,本地和远程。本地的Notification由iOS下NotificationManager统一管理,只需要将封装好的本地Notification对象加入到系统Notification管理机制队列中,系统会在指定的时间激发将本地Notification,应用只需设计好处理Notification的方法就完成了整个Notification流程了。
Notification是智能手机应用编程中非常常用的一种传递信息的机制,而且可以非常好的节省资源,不用消耗资源来不停地检查信息状态(Pooling),在iOS下应用分为两种不同的Notification种类,本地和远程。本地的Notification由iOS下NotificationManager统一管理,只需要将封装好的本地Notification对象加入到系统Notification管理机制队列中,系统会在指定的时间激发将本地Notification,应用只需设计好处理Notification的方法就完成了整个Notification流程了。

本地Notification所使用的对象是UILocalNotification,UILocalNotification的属性涵盖了所有处理Notification需要的内容。UILocalNotification的属性有fireDate、timeZone、repeatInterval、repeatCalendar、alertBody、 alertAction、hasAction、alertLaunchImage、applicationIconBadgeNumber、 soundName和userInfo。

UILocalNotification的调度

其中fireDate、timeZone、repeatInterval和repeatCalendar是用于UILocalNotification的调度。fireDate是UILocalNotification的激发的确切时间。timeZone是UILocalNotification激发时间是否根据时区改变而改变,如果设置为nil的话,那么UILocalNotification将在一段时候后被激发,而不是某一个确切时间被激发。 repeatInterval是UILocalNotification被重复激发之间的时间差,不过时间差是完全根据日历单位(NSCalendarUnit)的,例如每周激发的单位,NSWeekCalendarUnit,如果不设置的话,将不会重复激发。 repeatCalendar是UILocalNotification重复激发所使用的日历单位需要参考的日历,如果不设置的话,系统默认的日历将被作为参考日历。

UILocalNotification的提醒内容

alertBody、alertAction、hasAction和alertLaunchImage是当应用不在运行时,系统处理

1、增加一个本地推送

//设置20秒之后
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:20];
/*
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"HH:mm:ss"];
NSDate *now = [formatter dateFromString:@"15:00:00"];//触发通知的时间
*/
 //chuagjian
一个本地推送
 UILocalNotification *noti = [[[UILocalNotification alloc] init] autorelease];
 if (noti) {
  //设置推送时间
  noti.fireDate = date;//=now
  //设置时区
  noti.timeZone = [NSTimeZone defaultTimeZone];
  //设置重复间隔
  noti.repeatInterval = NSWeekCalendarUnit;
  //推送声音
  noti.soundName = UILocalNotificationDefaultSoundName;
  //内容
  noti.alertBody = @"推送内容";
  //显示在icon上的红色圈中的数子
  noti.applicationIconBadgeNumber = 1;
  //设置userinfo 方便在之后需要撤销的时候使用
  NSDictionary *infoDic = [NSDictionary dictionaryWithObject:@"name" forKey:@"key"];
  noti.userInfo = infoDic;
  //添加推送到uiapplication
  UIApplication *app = [UIApplication sharedApplication];
  [app scheduleLocalNotification:noti];
 }

2、程序运行时接收到本地推送消息

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification*)notification
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"接收到本地提醒 in app"
message:notification.alertBody
 delegate:nil
 cancelButtonTitle:@"确定"
 otherButtonTitles:nil];
[alert show];
//这里,你就可以通过notification的useinfo,干一些你想做的事情了
application.applicationIconBadgeNumber -= 1;

}

3、取消一个本地推送

UIApplication *app = [UIApplication sharedApplication];
 //获取本地推送数组
 NSArray *localArr = [app scheduledLocalNotifications];

 //声明本地通知对象
 UILocalNotification *localNoti;
 if (localArr) {
  for (UILocalNotification *noti in localArr) {
   NSDictionary *dict = noti.userInfo;
   if (dict) {
    NSString *inKey = [dict objectForKey:@"key"];
    if ([inKey isEqualToString:key]) {
     if (localNoti){
      [localNoti release];
      localNoti = nil;
     }
     localNoti = [noti retain];
     break;
    }
   }
  }

  //判断是否找到已经存在的相同key的推送
  if (!localNoti) {
   //不存在 初始化
   localNoti = [[UILocalNotification alloc] init];
  }

  if (localNoti && !state) {
   //不推送 取消推送
   [app cancelLocalNotification:localNoti];
   [localNoti release];
   return;
  }

}

4.两种方式取消注册的本地通知,一种是取消指定的通知,第二种是取消所有的注册通知:

[[UIApplication sharedApplication] cancelLocalNotification:localNotification];
[[UIApplication sharedApplication] cancelAllLocalNotification];

5.iOS5的四种通知类型

5.1. 横幅(Banner)

横幅通知是在iOS5中出现的新特性,是显示在屏幕顶部的横条,几秒钟后会自动消失。一条横幅通知会显示程序的小图标(低分屏下显示29×29的图标,高分屏显示58×58的图标),程序的名字和通知的内容。小图标可以帮助用户一眼就看清楚是哪一个应用程序在提醒他们。

5.2. 提醒(Alert)

提醒通知不会自动消失,需要用户与之交互才能关闭。设计师需要设计通知的具体内容,有时还要action button 设计title。整个提醒通知的背景样式,包括里面的按钮的样式都是不可变的,所以设计师和开发者就不要在这里发挥创意了。Android由于其开放性,我们是可以使用自己设计的控件的,而iOS这样做可能是为了保持UI风格一致性。

5.3. 标记(Badge)

标记通知是显示在程序图标的右上角的红色椭圆形标记,里面显示的数字表示需要用户处理的通知的数量。同样地,标记的颜色和形状、大小也是不可以更改的。App Store中有更新的应用程序的数量,Mail中收到的未读邮件的数量都是用标记通知用户的。

5.4. 声音(Sound)

声音提示也是iOS的一种通知方式,支持自定义,可以与前面三种通知类型搭配使用。

6.本地通知和推送通知

iOS应用程序会使用本地通知或推送通知来提醒用户:

6.1. 本地通知

应用程序的本地通知是由用户的iOS设备生成并发布的,无论这个应用程序是否运行在前台。就像一个日历应用,或者是一个to-do list应用,可以发出一条本地通知提醒用户马上有一个会议要开始了。

6.2. 推送通知

应用程序的推送通知是这样发布的:该应用的远程服务器(Provider)先发出一条通知给苹果的推送通知服务(Apple Push Notification service, APNS),苹果的通知服务器再把这个通知推送给所有安装了这个应用的iOS设备。

如果要使用推送通知,必须先在苹果的推送通知服务里注册你要使用哪几种类型的通知,就比如下面的一段代码就表示同时注册了标记和声音两种类型的通知:

- (void)applicationDidFinishLaunching:(UIApplication *)app {// other setup tasks here….
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound)];}

如何使用各种通知

使用本地通知的应用程序可以使用横幅、提醒、标记、声音,但是使用推送通知的应用程序需要先注册要使用的通知类型。

在使用通知的时候需要注意以下几点:

1. 保证标记的内容是最新的

2. 对同一事件不要发出多个通知

3. 通知内容不用包含应用程序的名称

对于标记型通知,当所有的事项都解决后,标记会自动消失。

在横幅和提醒中,以及顶部的通知中心里,iOS系统会自动在消息里显示应用程序的名称,所以在设计通知的内容时,就无需包含app的名称了。

在设计通知的内容时,还需要注意:

1. 关注于信息的表达,而不是用户的动作。避免提示用户去点哪一个按钮或者是怎样打开app

2. 简短,最好不超过两行。长信息难以快速阅读,而且必然会有滚动条

3. 使用句式大写(sentence-style capitalization,第一个单词的首字母大写)和合适的标点符号,结尾一般使用句号

关于“提醒”

一条提醒可能会包含一到两个按钮。对于有两个按钮的提醒,需要把关闭提醒的按钮放在左边,把action button放在右边。

点左边的按钮会关闭提醒,点右边的按钮会关闭这条提醒并打开应用。

如果只有一个按钮,这个按钮应该是一个确定按钮。

点击这个确定按钮也只会关闭提醒,而不会打开应用。

对于提醒通知,在设计action button的title的时候需要注意:

1. title能准确描述打开应用的动作。比如点击Play按钮,就能够打开这个游戏,用户能够立刻玩

2. 使用标题式大写(title-style capitalization,每个单词的首字母都大写)

3. 足够简短

在锁屏状态的时候收到新提醒通知,会把action button的title显示到“slide to view”的信息里,替换掉“view”这个词,并且将所有字母都转化为小写。

关于“声音”

对于声音提示,用户没有使用手机的时候声音可以吸引他们的注意力,这可以避免用户遗漏重要信息。

我们可以使用系统内置的声音,也可以自定义声音。如果使用自定义的声音,应该保证它足够简短,而且是精心制作的。

关于“通知栏”

只要不是锁屏状态,都可以从屏幕顶部向下滑打开通知中心。

如果是在游戏里面,比如水果忍者这种游戏,为了避免手指不小心滑到屏幕外而打开了通知中心,iOS5提高了打开通知中心的难度:先从屏幕顶部下拉出现有类似防滑纹的下拉条,出现下拉条后再次向下拖拽,才可打开通知中心,否则几秒钟后下拉条会自动收起。此处带防滑纹下拉条的设计可以帮助新用户迅速建立下拉打开通知中心的心智模型。

OS5对下拉通知栏里的通知进行了组织,同一个app的通知根据时间先后顺序组合在一起。删除某个app的通知消息需要先点右边的“X”按钮,“X”按钮变为“清除”,用户再次点击清除才能移除这个app下的所有通知。两步操作降低误删几率,而且其交互形式也比常见的弹出二次确认的模态窗口友好得多。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android开发之Notification通知用法详解

    本文实例讲述了Android开发之Notification通知用法.分享给大家供大家参考,具体如下: 根据activity的生命周期,在activity不显示时,会执行onStop函数(比如按下home键),所以你在onStop函数(按退出键除外)里面把notification放在通知栏里,再此显示时,把notification从通知栏里去掉.或者,只要程序在运行就一直显示通知栏图标. 下面对Notification类中的一些常量,字段,方法简单介绍一下: 常量: DEFAULT_ALL 使用所

  • Notification消息通知 自定义消息通知内容布局

    具体操作:自定义消息通知内容布局:点击界面中心的"点击发送消息"TextView控件,模拟发送通知消息,通知栏接收消息,点击几次则发送几次,点击通知栏消息,跳转到详情界面. 1.activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&

  • android使用NotificationListenerService监听通知栏消息

    NotificationListenerService是通过系统调起的服务,在应用发起通知时,系统会将通知的应用,动作和信息回调给NotificationListenerService.但使用之前需要引导用户进行授权.使用NotificationListenerService一般需要下面三个步骤. 注册服务 首先需要在AndroidManifest.xml对service进行注册. <service android:name=".NotificationCollectorService&q

  • Android开发 -- 状态栏通知Notification、NotificationManager详解

    本想自己写一个的,但是看到这篇之后,我想还是转过来吧,实在是非常的详细: 在Android系统中,发一个状态栏通知还是很方便的.下面我们就来看一下,怎么发送状态栏通知,状态栏通知又有哪些参数可以设置? 首先,发送一个状态栏通知必须用到两个类:  NotificationManager . Notification. NotificationManager :  是状态栏通知的管理类,负责发通知.清楚通知等. NotificationManager 是一个系统Service,必须通过 getSys

  • Android中通知Notification使用实例(振动、灯光、声音)

    本文实例讲解了通知Notification使用方法,此知识点就是用作通知的显示,包括振动.灯光.声音等效果,分享给大家供大家参考,具体内容如下 效果图: MainActivity: import java.io.File; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; im

  • Android中通过Notification&NotificationManager实现消息通知

    notification是一种让你的应用程序在没有开启情况下或在后台运行警示用户.它是看不见的程序组件(Broadcast Receiver,Service和不活跃的Activity)警示用户有需要注意的事件发生的最好途径. 1.新建一个android项目 我新建项目的 minSdkVersion="11",targetSdkVersion="19".也就是支持最低版本的3.0的. 2.习惯性地打开项目清单文件AndroidManifest.xml,添加一个权限:&

  • 详解Android中Notification通知提醒

    在消息通知时,我们经常用到两个组件Toast和Notification.特别是重要的和需要长时间显示的信息,用Notification就最 合适不过了.当有消息通知时,状态栏会显示通知的图标和文字,通过下拉状态栏,就可以看到通知信息了,Android这一创新性的UI组件赢得了用户的一 致好评,就连苹果也开始模仿了.今天我们就结合实例,探讨一下Notification具体的使用方法.  首先说明一下我们需要实现的功能是:在程序启动时,发出一个通知,这个通知在软件运行过程中一直存在,相当于qq的托盘

  • Android 使用AlarmManager和NotificationManager来实现闹钟和通知栏

    实现闹钟运行的效果如下: 通知栏的运行后效果图如下: 布局文件(activity_main.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&qu

  • Android种使用Notification实现通知管理以及自定义通知栏实例(示例四)

    示例一:实现通知栏管理 当针对相同类型的事件多次发出通知,作为开发者,应该避免使用全新的通知,这时就应该考虑更新之前通知栏的一些值来达到提醒用户的目的.例如我们手机的短信系统,当不断有新消息传来时,我们的通知栏仅仅是更改传来短信的数目,而不是对每条短信单独做一个通知栏用于提示. 修改通知 可以设置一条通知,当然可以更新一条通知,我们通过在调用NotificationManager.notify(ID, notification)时所使用的ID来更新它.为了更新你之前发布的通知,你需要更新或者创建

  • android中创建通知栏Notification代码实例

    ///// 第一步:获取NotificationManager NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); ///// 第二步:定义Notification Intent intent = new Intent(this, OtherActivity.class); //PendingIntent是待执行的Intent PendingIntent pi

随机推荐