本地通知和推送通知 - iOS开发

一、通知的类型:

1.横幅(banner)

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

                                                              

2.提醒(alert)

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

                                                                                       

3.标记(badge)

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

                                                                                                                        

4.声音(sound)

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

总结:一般一条推送通知包含:横幅、标记和声音。


二、通知分类:本地通知和推送通知

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

本地通知是UILocalNotification的实例,主要有三类属性:
(1)scheduled time,时间周期,用来指定iOS系统发送通知的日期和时间;
(2)notification type,通知类型,包括警告信息、动作按钮的标题、应用图标上的badge(数字标记)和播放的声音;
(3)自定义数据,本地通知可以包含一个dictionary类型的本地数据。
对本地通知的数量限制,iOS最多允许最近本地通知数量是64个,超过限制的本地通知将被iOS忽略。

本地通知代码示例:

UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif == nil)
return;
//localNotif.fireDate = itemDate;
//NSDate * now = [NSDate new];
NSDate * date1 = [NSDate dateWithTimeInterval:8 sinceDate:date];
localNotif.fireDate = date1;
NSLog(@"now = %@",date1);
localNotif.timeZone = [NSTimeZone defaultTimeZone];
// Notification details
localNotif.alertBody = @"吃饭时间到了,通知提醒 。。。。。。。。";
// Set the action button
localNotif.alertAction = @"View";
localNotif.soundName = UILocalNotificationDefaultSoundName;
localNotif.applicationIconBadgeNumber = 1;
// Specify custom data for the notification
NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"someValue" forKey:@"someKey"];
localNotif.userInfo = infoDict;
// Schedule the notification
[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
[localNotif release];
// NSArray * array = [[UIApplication sharedApplication] scheduledLocalNotifications];
// [[UIApplication sharedApplication] cancelAllLocalNotifications];
// [[UIApplication sharedApplication] cancelLocalNotification:localNotif];

运行结果如下:



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

                                                           

总结:如果使用本地通知的应用程序可以使用横幅、提醒、标记、声音,但是使用推送通知的应用程序需要先在苹果的推送通知服务(APNS)里注册要使用的通知类型


三、推送通知的工作流程和代码实现

1.下面的一段代码就表示同时注册了提醒、标记和声音三种类型的通知,并做程序的启动的触发判断:

- (void)applicationDidFinishLaunching:(UIApplication *)app {
    // other setup tasks here….

//完成推送功能的注册请求,即在程序启动时弹出是否使用推送功能;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
//判断程序的启动是否是通过推送消息窗口触发的,如果是,在这里可以处理推送内容;
if (launchOptions) {
NSDictionary* pushNotificationKey = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (pushNotificationKey) {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@”推送通知” message:@”这是通过推送窗口启动的程序,你可以在这里处理推送内容” delegate:nil cancelButtonTitle:@”知道了” otherButtonTitles:nil, nil];
[alert show];
[alert release];
}
}

}

2.注册推送通知类型后,接收从苹果服务器返回的唯一的设备token,该token是推送服务器发送推送消息的依据,所以需要发送回推送服务器保存

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString* token = [NSString stringWithFormat:@"%@",deviceToken];
NSLog(@”apns -> 生成的devToken:%@”, token);
//把deviceToken发送到我们的推送服务器,例如:
//DeviceSender* sender = [[[DeviceSender alloc]initWithDelegate:self ]autorelease];
//[sender sendDeviceToPushServer:token ];
}
3.接收注册推送通知功能时出现的错误,并做相关处理:
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSLog(@”apns -> 注册推送功能时发生错误, 错误信息:\n %@”, err);
}

4. 接收到推送消息,解析处理
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSLog(@”\napns -> didReceiveRemoteNotification,Receive Data:\n%@”, userInfo);
//把icon上的标记数字设置为0,
application.applicationIconBadgeNumber = 0;
if ([[userInfo objectForKey:@"aps"] objectForKey:@”alert”]!=NULL) {
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@”**推送消息**” message:[[userInfo objectForKey:@"aps"] objectForKey:@”alert”] delegate:self cancelButtonTitle:@”关闭” otherButtonTitles:@”处理推送内容”,nil];
alert.tag = alert_tag_push;
[alert show];
}
}

总结:

通知的工作流程如下:


1. 首先是应用程序注册消息推送。

2. IOS跟APNS Server要deviceToken。应用程序接受deviceToken。

3. 应用程序将deviceToken发送给PUSH服务端程序(Provider)。

4. 服务端程序向APNS服务发送消息。

5. APNS服务将消息发送给iPhone应用程序。

无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的:


四、服务器发给APNS的通知信息载体

载体(payload)是 JSON 字符串(最长 256 字节),封装了你发送给 iOS 应用的信息。这是一个 payload 的例子:
 {

 "aps": {

 "alert" : "Yougot a new message!" ,

 "badge" : 5,

 "sound" : "beep.wav"},
 
 "acme1" : "bar",
 
 "acme2" : 42
 
 }



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

1. 保证标记的内容是最新的
2. 对同一事件不要发出多个通知
3. 通知内容不用包含应用程序的名称
4. 对于标记型通知,当所有的事项都解决后,标记会自动消失。
5. 在横幅和提醒中,以及顶部的通知中心里,iOS系统会自动在消息里显示应用程序的名称,所以在设计通知的内容时,就无需包含app的名称了。
6. 对于声音通知,我们可以使用系统内置的声音,也可以自定义声音。如果使用自定义的声音,应该保证它足够简短,而且是精心制作的。


高级iOS开发技术交流群:415239068,欢迎大家加入


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值