iOS推送通知
-
注意:这里说的推送通知跟NSNotification有所区别
-
NSNotification是抽象的,不可见的
-
推送通知是可见的(能用肉眼看到)
-
iOS中提供了2种推送通知
-
本地推送通知(Local Notification)
-
远程推送通知(Remote Notification)
-
推送通知的作用
- 让app不在前台时,告示用户App的最新情况
-
推送通知的呈现方式
- 在屏幕顶部一块横幅
- 在屏幕中间弹出UIAlertView
- 同时可以播放音效
- 锁屏时展示
- App图标右上角额数字提示
-
本地推送通知(具体实现)
- 本地通知的作用:清理App缓存,记账,买衣服,看电影,玩游戏等
-
发送本地通知
/**
创建本地通知对象
*/
UILocalNotification *localnotification = [[UILocalNotification alloc]init];
/**
* 设置推送的相关属性
*/
localnotification.fireDate = [NSDate dateWithTimeInterval:5.0 sinceDate:[NSDate date]];//通知触发时间
localnotification.alertBody = @"明天放假啦";//通知具体内容
localnotification.alertTitle = @"房租";//谁发出的通知
localnotification.soundName = @"buyao.wav";//通知时的音效
localnotification.applicationIconBadgeNumber = 1;
localnotification.alertAction = @"查看更多精彩内容";//默认为 滑动来 +查看;锁屏时显示底部提示
/**
* 调度本地通知,通知会在特定时间发出
*/
[[UIApplication sharedApplication] scheduleLocalNotification:localnotification];
[[UIApplication sharedApplication] presentLocalNotificationNow:localnotification];//立即发出本通知
-
点击本地通知,会自动打开app
- 当用户点击本地推送通知,会自动打开app,这里有2种情况
- app并没有关闭,一直隐藏在后台
让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
- app已经被关闭(进程已死)
启动app,启动完毕会调用AppDelegate的下面方法
//launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
-
具体代码如下:(要注意iOS8之后,需要获取用户授权)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//授权
if ([[UIDevice currentDevice].systemVersion floatValue]>=8.0) {
/**
* iOS8注册授权,设置本地通知模式
*/
/*
UIUserNotificationTypeNone = 0, 不发出通知
UIUserNotificationTypeBadge = 1 << 0, 改变应用程序图标右上角的数字
UIUserNotificationTypeSound = 1 << 1, 播放音效
UIUserNotificationTypeAlert = 1 << 2, 是否运行显示横幅
*/
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound |UIUserNotificationTypeAlert categories:nil];
/**
* 然后注册通知
*/
[application registerUserNotificationSettings:settings];
}
/**
* 如果程序正常启动(冷启动),launchOptions的参数为null
* 如果程序非正常启动(热启动),launchOptions的参数时有值的
*/
if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
NSLog(@"%@",launchOptions);
[self jumpToSession];
}
return YES;
}
/**
* 该方法,接收到本地通知执行,如果应用程序在前台,依然收到通知,但不应该执行跳转;
如果应用程序在后台,收到通知,点击通知,执行跳转代码;
应用程序被关闭,收到通知,但不能执行跳转代码,(需要在didFinishLaunchingWithOptions方法中执行)
*
*/
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
NSLog(@"收到本地通知");
[application setApplicationIconBadgeNumber:0];
if (application.applicationState == UIApplicationStateActive) {
return;
}else if (application.applicationState == UIApplicationStateInactive)
{
[self jumpToSession];
}else if(application.applicationState == UIApplicationStateBackground){
/**
* 不会执行该代码
*/
NSLog(@"在后台");
}
}
- (void)jumpToSession
{
NSLog(@"执行跳转页面");
UIView *redView = [[UIView alloc]init];
redView.backgroundColor = [UIColor redColor];
redView.frame = CGRectMake(100, 100, 100, 100);
[self.window.rootViewController.view addSubview:redView];
}
- 远程推送请看下一篇内容
- 发现错误请各位多多指正,谢谢.
网友评论