iOS开发基础性知识(七)----本地推送和远程推送

推送通知跟NSNotification不同

1.NSNotification是抽象的,不可见的

2.推送通知是可见的

iOS中提供了2中推送通知

1.本地推送通知(Local Notification)

2.远程推送通知(Remote Notification)

推送的作用:可以让不在前台运行的app,告知客户app内部发生的事情.(QQ消息推送,微信消息推送等等)

推送通知的呈现效果:

1.在屏幕顶部显示的一条横幅

2.在屏幕中间弹出一个UIAlertView

3.在锁屏界面显示一块横幅

4.更新app图标的数字

5.播放音效

本地通知

1.不需要服务器支持(无需联网)就能发出的推送通知

2.使用场景: 定时类任务(闹钟,简单的游戏等等)

本地通知推送的实现很简单:

1.创建本地推送通知对象

[[UILocalNotification alloc] init];创建一个本地通知

2.设置本地通知的相关属性

必须设置的属性

2.1.推送通知的触发时间(何时发出推送通知)

@property(nonatomic,copy) NSDate *fireDate

2.2.推送通知的具体内容

@property(nonatomic,copy) NSString *alertBody

2.3.在锁屏时显示的动作标题(完整测标题:"滑动来" + alertAction)

@property(nonatomic,copy) NSString *alertAction

2.4.设置锁屏界面alertAction是否有效

localNote.hasAction = YES;

2.5.app图标数字

@property(nonatomic,assign) NSInteger applicationIconBadgeNumber

2.6.调度本地推送通知(调度完毕后,推动通知会在特定时间fireDate发出)

[[UIApplication shareApplication] scheduleLocalNotification:ln]

可以进行设置的设置

2.7.设置通知中心通知的标题

localNote.alertTitle = @"222222222222";

2.8.设置音效(如果不设置就是系统默认的音效, 设置的话会在mainBundle中查找)

localNote.soundName = @"buyao.wav";

2.9.每隔多久重复发一次推送通知

@property(nonatomic) NSCalendarUnit repeatInterval

2.10.点击推送通知打开app时显示的启动图片(mainBundle 中提取图片)

@property(nonatomic,copy) NSSring *alertLaunchImage

2.11.附加的额外信息

@property(nonatomic,copy) NSDictionary *userInfo

2.12.时区

@property(nonatomic,copy) NSTimeZone *timeZone

(一般设置为[NSTimeZone defaultTimeZone],跟随手机的时区)

--代码

- (IBAction)addLocalNote:(id)sender {   

//1.创建一个本地通知   

UILocalNotification *localNote = [[UILocalNotification alloc] init];   

//2.设置本地通知的一些属性(通知发出的时间/通知的内容)   

//2.1.设置通知发出的时间   

localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5.0];   

//2.2.设置通知的内容   

localNote.alertBody = @"吃饭了吗?";   

//2.3.设置锁屏界面的文字   

localNote.alertAction = @"查看具体的消息";   

//2.4.设置锁屏界面alertAction是否有效   

localNote.hasAction = YES;   

//2.5.设置通过点击通知打开APP的时候的启动图片(无论字符串设置成什么内容,都是显示应用程序的启动图片)   

localNote.alertLaunchImage = @"111";   

//2.6.设置通知中心通知的标题   

localNote.alertTitle = @"222222222222";   

//2.7.设置音效   

localNote.soundName = @"buyao.wav";   

//2.8.设置应用程序图标右上角的数字   

localNote.applicationIconBadgeNumber =1;   

//2.9.设置通知之后的属性   

localNote.userInfo = @{@"name": @"张三", @"toName": @"李四"};   

//3.调度通知   

[[UIApplication sharedApplication] scheduleLocalNotification:localNote];

}

当消息被推送过来时,我们需要点击推送消息,来完成一些特定的任务.不如更新界面什么的(监听本地推送通知的点击)

当用户点击本地推送通知的时候,会自动打开app,这里有2种情况

1.app没有关闭,只是一直隐藏在后台

让app进入前台,并会调用AppDelegate的下面的方法(并非重新启动app)

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

// 在这里写跳转代码// 如果是应用程序在前台,依然会收到通知,但是收到通知之后不应该跳转if(application.applicationState ==UIApplicationStateActive)

return;

if(application.applicationState ==UIApplicationStateInactive)

{

// 当应用在后台收到本地通知时执行的跳转代码

[self gotoNotice];   

}

NSLog(@"%@", notification);

}

- (void)gotoNotice

{

UILabel*redView = [[UILabelalloc] init];   

redView.backgroundColor = [UIColorredColor];   

redView.frame =CGRectMake(0,100,300,400);   

redView.numberOfLines =0;

// redView.text = [NSString stringWithFormat:@"%@", launchOptions];

[self.window.rootViewController.view addSubview:redView];

}

2.app已经被关闭(进程被杀死)

启动app,启动完毕会调用AppDelegate的下面的方法

- (BOOL)application:(UIApplication *)application didFinishLaunchWithOptions:(NSDictionary *)launchOptions;

launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象

需要特别注意的是:在iOS8.0以后本地通知有了一些变化,如果要使用本地通知,需要得到用户的许可.

在didFinishLaunchWithOptions方法中添加如下代码:

#define IS_iOS8 ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)

@interfaceAppDelegate()

@end

@implementationAppDelegate

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

{

/*

UIUserNotificationTypeNone    = 0,      不发出通知

UIUserNotificationTypeBadge  = 1 << 0, 改变应用程序图标右上角的数字

UIUserNotificationTypeSound  = 1 << 1, 播放音效

UIUserNotificationTypeAlert  = 1 << 2, 是否运行显示横幅

*/

[application setApplicationIconBadgeNumber:0];

if(IS_iOS8)

{

UIUserNotificationSettings*settings = [UIUserNotificationSettingssettingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeAlert|UIUserNotificationTypeSoundcategories:nil];        [application registerUserNotificationSettings:settings];   

}

// 如果是正常启动应用程序,那么launchOptions参数是null

// 如果是通过其它方式启动应用程序,那么launchOptions就值if(launchOptions[UIApplicationLaunchOptionsLocalNotificationKey])

{

// 当被杀死状态收到本地通知时执行的跳转代码

// [self  gotoNotice];

UILabel*redView = [[UILabelalloc] init];       

redView.backgroundColor = [UIColorredColor];       

redView.frame =CGRectMake(0,100,300,400);       

redView.numberOfLines =0;       

redView.text = [NSStringstringWithFormat:@"%@", launchOptions];     

 [self.window.rootViewController.view addSubview:redView];   

}

returnYES;

}

远程推送(Remote Notification)

1.从远程服务器推送给客户端的通知(需要联网)

2.远程推送服务, 苹果起名为:APNS (Apple Push Notification Services)

解决问题:只要联网了, 就能够接收到服务器推送的远程通知

使用须知:

所有的苹果设备,在联网状态下,都会与苹果服务器建立长连接.

1.长连接:一直连接,客户端与服务器

2.长连接作用:

1>事件校准

2>系统升级

3>查找我的iPhone等....

3.长连接的好处

1>数据传输速度快

2>数据保持最新状态

官方结实长连接的使用

1.获得deviceToken的过程


remote1


remote2

1>客户端向苹果服务APNS,发送设备的UDID和英语的Bundle Identifier.

2>经苹果服务器加密生成一个deviceToken

3>将当前用户的deviceToken(用户标识),发送给自己应用的服务器

4>自己的服务器,将得到的deviceToken,进行保存

2.利用deviceToken进行数据传输,推送通知

remote3

5>需要推送的时候,将消息和deviceToken一起发送给APNS,苹果服务器,再通过deviceToken找到用户,并将消息发给用户


remote4

这里不再演示关于证书的配置, 简单的只进行说明步骤:

1> 创建明确的AppID,只有明确的AppID才能进行一些特殊的操作

2>真机调试的APNS SSL证书

3>发布程序的APNS SSL证书

4>生成描述文件

[依次安装证书, 再装描述]

注册远程推送通知:

1.客户端如果想要接收APNs的远程推送通知,必须先进行注册(得到用户授权)

一般在APP启动完毕后就马上进行注册

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

{

if([[UIDevicecurrentDevice].systemVersion doubleValue] >=8.0)

{

// 1.注册UserNotification,以获取推送通知的权限

UIUserNotificationSettings*settings = [UIUserNotificationSettingssettingsForTypes:UIUserNotificationTypeSound|UIUserNotificationTypeAlert|UIUserNotificationTypeBadgecategories:nil];        [application registerUserNotificationSettings:settings];

// 2.注册远程推送

[application registerForRemoteNotifications];   

}else{       

[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeNewsstandContentAvailability|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound];  

}

returnYES;

}

2.注册成功后, 调用AppDelegate的方法,获取到用户的deviceToken

-(void)application:(UIApplication*)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken

{

NSLog(@"%@", deviceToken.description);

}

3.点击推送通知,和本地一样有两种状况.

1> app没有关闭,只是一直隐藏在后台

让app进入前台, 并调用下面的方法(app没有重新启动)

过期的方法:

// 当接受到远程退职时会执行该方法(当进入前台或者应用程序在前台)

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo

{

NSLog(@"%@", userInfo);

UIView*redView = [[UIViewalloc] init];   

redView.backgroundColor = [UIColorredColor];   

redView.frame =CGRectMake(100,100,100,100);   

[self.window.rootViewController.view addSubview:redView];

}

苹果系统建议使用下面的方法:

/*

1.开启后台模式

2.调用completionHandler,告诉系统你现在是否有新的数据更新

3.userInfo添加一个字段:"content-available" : "1" : 只要添加了该字段,接受到通知都会在后台运行

*/

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler

{

NSLog(@"%@", userInfo);

UIView*redView = [[UIViewalloc] init];   

redView.backgroundColor = [UIColorredColor];   

redView.frame =CGRectMake(100,100,100,100);   

[self.window.rootViewController.view addSubview:redView];    completionHandler(UIBackgroundFetchResultNewData);

}

2>app已经关闭,需要重新开启,---基本实现方法和本地通知一样



站在巨人的肩膀上才有这些总结

菜鸟走向大牛,大家共同前进,如果觉得不错,请给个赞/关注。

一起交流学习,有问题随时欢迎联系,邮箱:383708669@qq.com

由于资料很早之前整理的了,现在找不到原来的出处,如对大神们有冒犯之举,还请联系,鄙人及时修改,多多包涵!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容