xml地图|网站地图|网站标签 [设为首页] [加入收藏]

iOS远程推送和本地推送,UILocalNotification本地通知

来源:http://www.ccidsi.com 作者:集成经验 人气:75 发布时间:2020-04-05
摘要:一个应用大概要各样分裂的通but知,点击分裂的打招呼可以跳转分化分界面,这一个有该怎么办吧? 1.在出殡和下葬文告时候,设置userInfo属性 // 7.设置应用信息 ln.userInfo = @{@"pageKey":@"friend
一个应用大概要各样分裂的通but知,点击分裂的打招呼可以跳转分化分界面,这一个有该怎么办吧?

1.在出殡和下葬文告时候,设置userInfo属性

 // 7.设置应用信息 ln.userInfo = @{@"pageKey":@"friend"};

2.在AppDelegate本地通告代理方法中进行判定

/** * 一旦接收到本地通知就会调用该方法 * 注意这个方法:应用在前台也会调用 * @param application 应用 * @param notification 本地通知对象 */-  application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{// 当应用在前台时候什么都不做 if (application.applicationState == UIApplicationStateActive) { return; }// 当应用不再前台的时候才去跳转,这样用户体检更好// 获取tabBarController UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;// 获取用户设置的跳转页 NSString *page = notification.userInfo[@"pageKey"];// 如果是朋友圈 if ([page isEqualToString:@"session"]) { tbVc.selectedIndex = 1; }else{// 否则跳转到好友 tbVc.selectedIndex = 0; }}
  • 测试launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]中的内容
- application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch.// 获取UIApplicationLaunchOptionsLocalNotificationKey对应内容 id obj = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];// 获取控制器(注意此时需要通过self.window,通过application.keyWindow无法获取到,因为此时的window还没有成为keyWindow) UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;// 获取索引为0的控制(注意此时tbVc.selectedViewController为nil) UIViewController *vc = tbVc.viewControllers[0];// 创建一个文本 UILabel *label = [[UILabel alloc] init]; label.backgroundColor = [UIColor brownColor];// 设置text为UIApplicationLaunchOptionsLocalNotificationKey对应的内容 label.text = [obj description] ; label.frame = CGRectMake(10, 100, 300, 400); label.numberOfLines = 0;// 添加到控制器的View上 [vc.view addSubview:label]; return YES;}

图片 1Snip20160425_11.png

  • 咱俩从当中能够出她是一个UILocalNotification对象
  • 就此我们抽取UILocalNotification对象,剩下的做法与接收到本地文告代理方法中管理相仿,所以咱们把它提取为多少个公用的法子
/** * 根据通知跳转到不同页面 */-  jumpToPageWithLocalNotification:(UILocalNotification *) notification{ // 获取tabBarController UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController; // 获取用户设置的跳转页 NSString *page = notification.userInfo[@"pageKey"]; // 如果是朋友圈 if ([page isEqualToString:@"session"]) { tbVc.selectedIndex = 0; }else{ // 否则跳转到好友 tbVc.selectedIndex = 1; }}
  • 在didReceiveLocalNotification方法中
/** * 一旦接收到本地通知就会调用该方法 * 注意这个方法:应用在前台也会调用 * @param application 应用 * @param notification 本地通知对象 */-  application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{// 当应用在前台时候什么都不做 if (application.applicationState == UIApplicationStateActive) { return; }// 当应用不再前台的时候才去跳转,这样用户体检更好 [self jumpToPageWithLocalNotification:notification];}
  • 在didFinishLaunchingWithOptions方法中
- application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch.// 如果是点击本地通知进来的那么launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]就会有内容 UILocalNotification *notifcation = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];// 如果存在通知 if(notifcation){ [self jumpToPageWithLocalNotification:notifcation]; } return YES;}

 

AppDelegate本地布告代理方法

/**
 *  一旦接收到本地通知就会调用该方法
 *  注意这个方法:应用在前台也会调用
 *  @param application  应用
 *  @param notification 本地通知对象
 */
- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{

//  当应用在前台时候什么都不做
    if (application.applicationState == UIApplicationStateActive) {
        return;
    }

//  当应用不再前台的时候才去跳转,这样用户体检更好
    UITabBarController *tbVc = (UITabBarController *)application.keyWindow.rootViewController;
    tbVc.selectedIndex = 1;

}

只是当使用已经脱离的时候,点击公告进入本利用时候,不在调用application:didReceiveLocalNotification:的代理方法,难道当使用退出后,客商再步向应用我们就不再跳转内定分界面了啊?为了更加好顾客体验,笔者此时也理应让动用跳转到钦定的分界面,怎么技艺贯彻那么些成效吗? 大家领会当应用程序运行的时候一定会调用application: didFinishLaunchingWithOptions:的代办方法,在那我们能得到本地公告音讯,也能够跳转相应的分界面

//  如果是点击本地通知进来的那么launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]就会有内容
    if(launchOptions[UIApplicationLaunchOptionsLocalNotificationKey])
    {
        //页面跳转
        UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;
        tbVc.selectedIndex = 1;
    }
iOS8的分化点

您倘诺把下边包车型大巴程序运营在iOS8上,会暴光如下错误

][615:7847] Attempting to schedule a local notification {fire date = Monday, July 13, 2015 at 9:02:25 AM China Standard Time, time zone = , repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Monday, July 13, 2015 at 9:02:25 AM China Standard Time, user info = { pageKey = friend; }} with an alert but haven't received permission from the user to display alerts

也正是在iOS8上要发送本地通知供给 央求客商权限 怎样央浼客商权限呢?日常在新版有生成之处,在头文件中都会有相应的表明,所以点击到scheduleLocalNotification:方法中,看看有未有大家要求音讯

图片 2Snip20160425_12.png

情趣就是说:在iOS8.0今后,在调节通报在此以前您必要选择UIApplication的靶子方法registerUseNotificationSetting:来号令客户授权.

这种恳求权限的代码常常坐落于didFinishLaunchingWithOptions:方法中,在顾客不卸载的景观下,只供给央求贰次,下一次在运行就无须诉求了!

// 1.如果是iOS8请求用户权限 if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) { /* UIUserNotificationType: UIUserNotificationTypeBadge = 1 << 0, // 接收到通知可更改程序的应用图标 UIUserNotificationTypeSound = 1 << 1, // 接收到通知可播放声音 UIUserNotificationTypeAlert = 1 << 2, // 接收到通知课提示内容 如果你需要使用多个类型,可以使用 "|" 来连接 */// 向用户请求通知权限// categories暂时传入nil UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil]; [application registerUserNotificationSettings:setting]; }

运维程序

图片 3Snip20160425_13.png

测试点击文告,进入应用,也没难题

接下去,大家说说-[UIUserNotificationSettings settingsForTypes:categories:] 中的 categories

  • categories能够让我们发送通告在此以前预订义一些布告也正是通报上能够显得开关,他索若是一个装有UIUserNotificationCategory类的靶子的NSSet的对象. 不过官方推荐大家使用它的子类UIMutableUserNotificationCategory,来动态的充裕通报的作为按键,iOS8帮助前台和后台的二种行为.

图片 44月 25, 2016 16:41.gif

  • 通告Action按键以长条呈现如图

图片 54月 25, 2016 16:43.gif

  • 登记分类,并在分拣中增加区别的所作所为由于注册客户通报设置代码量超大大家兑现叁个新的格局registerUserNotification
 registerUserNotification{ // 向用户请求通知权限 /* UIUserNotificationType:用户通知的类型 UIUserNotificationTypeBadge = 1 << 0, // 接收到通知可更改程序的应用图标 UIUserNotificationTypeSound = 1 << 1, // 接收到通知可播放声音 UIUserNotificationTypeAlert = 1 << 2, // 接收到通知课提示内容 如果你需要使用多个类型,可以使用 "|" 来连接 */// 1.设置用户通知权限类型 UIUserNotificationType types = UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert;// 2.创建通知的行为按钮// 2.1创建第一个行为 UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];// 2.1.1 设置行为的唯一标示 action1.identifier = UIMutableUserNotificationActionBackground;// 2.1.2 设置通知按钮的的标题 action1.title = @"后台";// 以什么样模式运行应用// UIUserNotificationActivationModeForeground, // 当应用在前台的时候触发// UIUserNotificationActivationModeBackground // 即使应用不在前台也触发 action1.activationMode = UIUserNotificationActivationModeBackground;// 2.1.3 是否只有锁屏的锁屏状态下才能显示 action1.authenticationRequired = NO;// 2.1.4 按钮的性质 action1.destructive = NO;// 2.1创建第一个行为 UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];// 2.1.1 设置行为的唯一标示 action2.identifier =UIMutableUserNotificationActionForeground;// 2.1.2 设置通知按钮的的标题 action2.title = @"前台";// 以什么样模式运行应用 // UIUserNotificationActivationModeForeground, // 当应用在前台的时候触发 // UIUserNotificationActivationModeBackground // 即使应用不在前台也触发 action2.activationMode = UIUserNotificationActivationModeForeground; // 2.1.3 用户必须输入密码才能执行 action2.authenticationRequired = YES; // 2.1.4 按钮的性质 action2.destructive = YES;// 3.创建用户通知分类 UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];// 3.1 设置类别的唯一标识 category.identifier = @"myCategory";// 3.2 设置通知的按钮 // Context: // UIUserNotificationActionContextDefault, //默认上下文下的英文 // UIUserNotificationActionContextMinimal //通知内容区域受限情况下内容 [category setActions:@[action1,action2] forContext:UIUserNotificationActionContextDefault];// 4.创建用户通知的设置信息 UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:types categories:[NSSet setWithObject:category]];// 注册设置 [[UIApplication sharedApplication] registerUserNotificationSettings:setting];}
  • 在出殡和安葬本地推送公告时候钦定文告的归类标记
 // 9.设置通知的类别 ln.category = @"myCategory";
  • 监听点击公告按键的行为,在AppDelegate中完毕监听布告按键点击方法
/** * 当用户点击通知上定制的按钮执行的行为(注意:不点击行为按钮,不会进入该方法) * * @param application 应用 * @param identifier 行为标识符 * @param notification 本地通知 * @param completionHandler 完成回调 */- application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:completionHandler{// 处理不同行为 if ([identifier isEqualToString:UIMutableUserNotificationActionBackground]) { NSLog(@"后台运行程序"); }else if ([identifier isEqualToString:UIMutableUserNotificationActionForeground]){ NSLog(@"前台运行程序"); }else{ NSLog; } /** You should call the completion handler as soon as you've finished handling the action. 当任务处理完毕时候,你应该尽快的调用completion的block. */// 在当任务完成的时候,调用任务完成的block completionHandler();}

选择应用 UIApplication 调解本地文告

地面通知使用意况
  • 常用来唤醒客商完毕都部队分定时职分,比方
  • 理清垃圾堆,买服装,看电影,睡觉,运动等

地点推送文告页面跳转

不管接收是在前台,后台依然已经倒闭都能依期收到到地面公告,但是当客商点击文告进入应用的时候,大家须求基于分歧情况,进行处理

1 //  让应用调度通知
2 [[UIApplication sharedApplication] scheduleLocalNotification:ln];

2. 地点推送通告页面跳转


任凭选择是在前台,后台依然曾经关闭都能按期收到到地面通告,不过当客户点击通告步入应用的时候,大家必要依据不一样景观,实行管理

本地布告

什么是地面文告

  • 一面之识,不必要联网就能够发送的文告,无需服务器.

地面公告使用情况

  • 常用来提示顾客达成都部队分依期职务,举个例子
  • 石英钟,清理垃圾,买时装,看录制,睡觉,运动等
 1 //  1.设置通知的内容(如果此属性不设置是不会发送通知的)
 2 ln.alertBody = @"小明,你妈叫你回家吃饭了!";
 3 //  2.设置通知触发的开始时间
 4 ln.fireDate = [NSDate dateWithTimeIntervalSinceNow:3];
 5 //  3.设置重复通知的时间,间隔
 6 ln.repeatInterval = NSCalendarUnitSecond;
 7 //  4.设置重复执行使用日历(用户设置的日历)
 8 ln.repeatCalendar = [NSCalendar  currentCalendar];
 9 //    NSString * const NSGregorianCalendar; 公历
10 //    NSString * const NSChineseCalendar; 农历
11 //    ln.repeatCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSChineseCalendar];
12 //  5.设置应用图标右上角的数字
13 ln.applicationIconBadgeNumber = 3;
14 //  6.设置点击推送通知进入界面的时候显示,加载图片
15 ln.alertLaunchImage = @"";
16 //  7 设置通知的音效(只有真机有效)
17 local.soundName = UILocalNotificationDefaultSoundName;
18 //  8 设置一些额外信息
19 local.userInfo = @{@"QQ":@"55555",@"info":@"约了没"};
20  
21 //  iOS8.0 以后新增属性
22 //  ************************************
23 //  1.设置区域,进入或离开某个区域的时候触发
24 //    CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(40.1,106.1);
25 //    ln.region = [[CLCircularRegion alloc] initWithCenter:coordinate radius:10.0 identifier:@"ab"];
26 //  2.设置进入或离开某个区域只执行一次
27 //    ln.regionTriggersOnce = YES;
28 //  ***************************************
29  
30 //  iOS8.2 新增属性
31 //    ln.alertTitle = @"通知标题";
怎么是地点通告
  • 看名称就会想到其意义,无需联网就能够发送的照料,不供给服务器.
说明
  • 依据地方本地布告,提示做不到那些规范他凭仗与GPS和四周的非数字信号基站
  • 依据地方的本地布告,独有真机技术测量试验
  • 依附地点的地头通告,没有必要编制程序职员主动赢得顾客地方,我们抬高应用调整中,假诺顾客手提式有线电话机展开了稳定,系统会基于顾客这段日子的职位来调节是不是要给该客户发送文告.

安装本地布告属性

1. 怎么发送本地推送文告


推送公告也归于UI的一有个别,所以推送布告对象是以UI初叶

艺术送通知的代码方法调节器的-touchesBegan: withEvent: 中测量试验,相比确切,放到viewDidLoad方法,顾客的登记须求还还未有到位章程就调用了

  • 创立本地公告
//  创建本地通知对象
    UILocalNotification *ln = [[UILocalNotification alloc] init];
  • 设置本地通告属性(推荐三个四个属性测量试验运行卡塔尔(قطر‎
//  1.设置通知的内容(如果此属性不设置是不会发送通知的)
    ln.alertBody = @"小明,你妈叫你回家吃饭了!";
//  2.设置通知触发的开始时间
    ln.fireDate = [NSDate dateWithTimeIntervalSinceNow:3];
//  3.设置重复通知的时间,间隔
    ln.repeatInterval = NSCalendarUnitSecond;
//  4.设置重复执行使用日历(用户设置的日历)
    ln.repeatCalendar = [NSCalendar  currentCalendar];
//    NSString * const NSGregorianCalendar; 公历
//    NSString * const NSChineseCalendar; 农历
//    ln.repeatCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSChineseCalendar];
//  5.设置应用图标右上角的数字
    ln.applicationIconBadgeNumber = 3;
//  6.设置点击推送通知进入界面的时候显示,加载图片
    ln.alertLaunchImage = @"";
//  7 设置通知的音效(只有真机有效)
    local.soundName = UILocalNotificationDefaultSoundName;
//  8 设置一些额外信息
    local.userInfo = @{@"QQ":@"55555",@"info":@"约了没"};

//  iOS8.0 以后新增属性
//  ************************************
//  1.设置区域,进入或离开某个区域的时候触发
//    CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(40.1,106.1);
//    ln.region = [[CLCircularRegion alloc] initWithCenter:coordinate radius:10.0 identifier:@"ab"];
//  2.设置进入或离开某个区域只执行一次
//    ln.regionTriggersOnce = YES;
//  ***************************************

//  iOS8.2 新增属性
//    ln.alertTitle = @"通知标题";
  • 运用使用[UIApplication]调解本地文告
//  让应用调度通知
    [[UIApplication sharedApplication] scheduleLocalNotification:ln];
怎么着是依照地方的本地通知
  • 传说地点的地点文告正是当顾客步向或离开有个别区域,就能够给该客商发送一条地方文告
  • 依据地方的本地通告独有在iOS8.0之后本事运用

本土推送通告页面跳转

甭管选拔是在前台,后台依旧曾经关闭都能限制时间收到到本地公告,可是当顾客点击布告步向应用的时候,大家要求依照不一致处境,举办管理

AppDelegate本地文告代理方法

 1 /**
 2  *  一旦接收到本地通知就会调用该方法
 3  *  注意这个方法:应用在前台也会调用
 4  *  @param application  应用
 5  *  @param notification 本地通知对象
 6  */
 7 - (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
 8     
 9     //  当应用在前台时候什么都不做
10     if (application.applicationState == UIApplicationStateActive) {
11         return;
12     }
13     
14     //  当应用不再前台的时候才去跳转,这样用户体检更好
15     UITabBarController *tbVc = (UITabBarController *)application.keyWindow.rootViewController;
16     tbVc.selectedIndex = 1;
17     
18 }

而是当使用已经淡出的时候,点击文告进入本金和利息用时候,不在调用application:didReceiveLocalNotification:的代理方法。难道当使用退出后,顾客再走入应用大家就不再跳转钦定分界面了呢?

为了越来越好客商体验,笔者此刻也应有让使用跳转到内定的分界面,怎么技能促成这一个职能吗?

咱俩知道当应用程序运维的时候自然会调用application: didFinishLaunchingWithOptions:的代办方法,在这里边大家能获得本地布告音信,也可以跳转相应的分界面。

1 //  如果是点击本地通知进来的那么launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]就会有内容
2 if(launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
3     //页面跳转
4     UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;
5     tbVc.selectedIndex = 1;
6 }

贰个使用可能要有种种分化的照管,点击分裂的通知能够跳转分歧分界面,那么些有该如何是好吗?

在出殡和安葬布告时候,设置userInfo属性

1 //  7.设置应用信息
2 ln.userInfo = @{@"pageKey":@"friend"};

在AppDelegate本地布告代理方法中展开判别

 1 /**
 2  *  一旦接收到本地通知就会调用该方法
 3  *  注意这个方法:应用在前台也会调用
 4  *  @param application  应用
 5  *  @param notification 本地通知对象
 6  */
 7 - (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
 8     
 9     //  当应用在前台时候什么都不做
10     if (application.applicationState == UIApplicationStateActive) {
11         return;
12     }
13     //  当应用不再前台的时候才去跳转,这样用户体检更好
14     //  获取tabBarController
15     UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;
16     
17     
18     //  获取用户设置的跳转页
19     NSString *page = notification.userInfo[@"pageKey"];
20     //  如果是朋友圈
21     if ([page isEqualToString:@"session"]) {
22         tbVc.selectedIndex = 1;
23     }else{
24         //       否则跳转到好友
25         tbVc.selectedIndex = 0;
26     }
27 }

一个利用只怕要种种不一样的通but知,点击不一致的通报能够跳转差异分界面,那些有该咋办啊?

  1. 在发送文告时候,设置userInfo属性
//  7.设置应用信息
    ln.userInfo = @{@"pageKey":@"friend"};
  1. 在AppDelegate本地通知代理方法中开展推断
/**
 *  一旦接收到本地通知就会调用该方法
 *  注意这个方法:应用在前台也会调用
 *  @param application  应用
 *  @param notification 本地通知对象
 */
- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{

//  当应用在前台时候什么都不做
    if (application.applicationState == UIApplicationStateActive) {
        return;
    }
//  当应用不再前台的时候才去跳转,这样用户体检更好
//  获取tabBarController
    UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;


//  获取用户设置的跳转页
    NSString *page = notification.userInfo[@"pageKey"];
//  如果是朋友圈
    if ([page isEqualToString:@"session"]) {
        tbVc.selectedIndex = 1;
    }else{
//       否则跳转到好友
        tbVc.selectedIndex = 0;
    }
}
  • 测试launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]中的内容
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
//  获取UIApplicationLaunchOptionsLocalNotificationKey对应内容
    id obj = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
//  获取控制器(注意此时需要通过self.window,通过application.keyWindow无法获取到,因为此时的window还没有成为keyWindow)
    UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;
//  获取索引为0的控制(注意此时tbVc.selectedViewController为nil)
    UIViewController *vc = tbVc.viewControllers[0];

//  创建一个文本
    UILabel *label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor brownColor];
//  设置text为UIApplicationLaunchOptionsLocalNotificationKey对应的内容
    label.text =  [obj description] ;
    label.frame = CGRectMake(10, 100, 300, 400);
    label.numberOfLines = 0;
//  添加到控制器的View上
    [vc.view addSubview:label];


    return YES;
}

展示结果:

图片 6

336729BE-B7DA-4B83-9515-E10864F3FADE.png

  • 小编们从当中能够出她是三个UILocalNotification对象
  • 所以大家抽取UILocalNotification对象,剩下的做法与选取到本地布告代理方法中拍卖肖似,所以我们把它提取为二个公用的点子
/**
 *  根据通知跳转到不同页面
 */
- (void) jumpToPageWithLocalNotification:(UILocalNotification *) notification
{
    //  获取tabBarController
    UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;

    //  获取用户设置的跳转页
    NSString *page = notification.userInfo[@"pageKey"];
    //  如果是朋友圈
    if ([page isEqualToString:@"session"]) {
        tbVc.selectedIndex = 0;
    }else{
        //       否则跳转到好友
        tbVc.selectedIndex = 1;
    }
}
  • 在didReceiveLocalNotification方法中
/**
 *  一旦接收到本地通知就会调用该方法
 *  注意这个方法:应用在前台也会调用
 *  @param application  应用
 *  @param notification 本地通知对象
 */
- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{

//  当应用在前台时候什么都不做
    if (application.applicationState == UIApplicationStateActive) {
        return;
    }
//  当应用不再前台的时候才去跳转,这样用户体检更好
    [self jumpToPageWithLocalNotification:notification];
}

在didFinishLaunchingWithOptions方法中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
//  如果是点击本地通知进来的那么launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]就会有内容
    UILocalNotification *notifcation = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
//  如果存在通知
    if(notifcation){
        [self jumpToPageWithLocalNotification:notifcation];
    }

    return YES;
}```

###3. iOS8的不同点
---
你如果把上面的程序运行在iOS8上,会爆出如下错误

>预习01-本地推送通知[掌握][615:7847] Attempting to schedule a local notification <UIConcreteLocalNotification: 0x7f935182b150>{fire date = Monday, July 13, 2015 at 9:02:25 AM China Standard Time, time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Monday, July 13, 2015 at 9:02:25 AM China Standard Time, user info = {
    pageKey = friend;
}} **with an alert but haven't received permission from the user to display alerts**

也就是在iOS8上要发送本地通知需要 **请求用户权限**
如何请求用户权限呢?一般在新版有变化的地方,在头文件中都会有相应的说明,所以点击到scheduleLocalNotification:方法中,看看有没有我们需要信息
![4D110E8B-9D15-4460-B093-6970621F3229.png](http://upload-images.jianshu.io/upload_images/1253942-62c168e5061a56c9.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
点击进去,我们看到
![B3F79CF3-8DCE-4E4D-8F0A-3BD39EF08AF1.png](http://upload-images.jianshu.io/upload_images/1253942-6174fc97ba719369.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
意思就是说:在iOS8.0以后,在调度通知之前你需要使用UIApplication的对象方法registerUseNotificationSetting:来请求用户授权.

这种请求权限的代码一般放在didFinishLaunchingWithOptions:方法中,在用户不卸载的情况下,只需要请求一次,下次在运行就不用请求了!

// 1.如若是iOS8诉求顾客权限
if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {

    /*
     UIUserNotificationType:

     UIUserNotificationTypeBadge   = 1 << 0, // 接收到通知可更改程序的应用图标
     UIUserNotificationTypeSound   = 1 << 1, // 接收到通知可播放声音
     UIUserNotificationTypeAlert   = 1 << 2, // 接收到通知课提示内容
     如果你需要使用多个类型,可以使用 "|" 来连接
     */

// 向客户须要公告权限
// categories暂且传入nil
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];

    [application registerUserNotificationSettings:setting];
}

运行程序

![21E244DC-087A-4679-9D62-BFDEC648672C.png](http://upload-images.jianshu.io/upload_images/1253942-ee6ddc53a049ddb5.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
测试点击通知,进入应用,也没问题

--------
接下来,我们说说-[UIUserNotificationSettings settingsForTypes:categories:] 中的 **categories**

* categories可以让我们发送通知之前预定义一些通知也就是通知上可以显示按钮,他需要是一个装有UIUserNotificationCategory类的对象的NSSet的对象.
但是官方推荐我们使用它的子类UIMutableUserNotificationCategory,来动态的添加通知的行为按钮,iOS8支持前台和后台的两种行为.
* 通知Action按钮以长条展示如图
![notifcation_action_button.gif](http://upload-images.jianshu.io/upload_images/1253942-22b7dbce7618a358.gif?imageMogr2/auto-orient/strip)
* 通知Action按钮以AlertView展示如图
![notification_action_allertview.gif](http://upload-images.jianshu.io/upload_images/1253942-4a6cf2c9fda8767c.gif?imageMogr2/auto-orient/strip)

1. 注册分类,并在分类中添加不同的行为
由于注册用户通知设置代码量比较大我们实现一个新的方法registerUserNotification
  • (void) registerUserNotification
    {
    // 向客商央浼文告权限
    /*
    UIUserNotificationType:顾客通报的等级次序

    UIUserNotificationTypeBadge = 1 << 0, // 选取到通报可改革程序的运用Logo
    UIUserNotificationTypeSound = 1 << 1, // 接受到文告可播放声音
    UIUserNotificationTypeAlert = 1 << 2, // 选取到布告课提醒内容
    比如您须求利用七个档案的次序,能够使用 "|" 来连接
    */
    // 1.装置客商通报权限项目
    UIUserNotificationType types = UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert;

// 2.开立通告的作为按键

// 2.1创造第四位展览馆现
UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
// 2.1.1 设置行为的独一标示
action1.identifier = UIMutableUserNotificationActionBackground;
// 2.1.2 设置文告按键的的标题
action1.title = @"后台";
// 以什么样情势运作应用
// UIUserNotificationActivationModeForeground, // 当应用在前台的时候接触
// UIUserNotificationActivationModeBackground // 即便使用不在前台也触及
action1.activationMode = UIUserNotificationActivationModeBackground;
// 2.1.3 是不是唯有锁屏的锁屏状态下本事展现
action1.authenticationRequired = NO;
// 2.1.4 按键的性质
action1.destructive = NO;

// 2.1创办第几个人展览馆现
UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];
// 2.1.1 设置行为的只此一家独此一家标示
action2.identifier =UIMutableUserNotificationActionForeground;
// 2.1.2 设置布告按键的的标题
action2.title = @"前台";
// 以什么情势运转应用
// UIUserNotificationActivationModeForeground, // 当应用在前台的时候接触
// UIUserNotificationActivationModeBackground // 纵然选择不在前台也触及
action2.activationMode = UIUserNotificationActivationModeForeground;
// 2.1.3 顾客必需输入密码技术实行
action2.authenticationRequired = YES;
// 2.1.4 开关的性质(毫无意义卡塔尔
action2.destructive = YES;

// 3.创建顾客通报分类
UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];
// 3.1 设置类别的独占鳌头标志
category.identifier = @"myCategory";
// 3.2 设置通告的按键
// Context:
// UIUserNotificationActionContextDefault, //默许上下文(情景State of Qatar下的德语(平常都以State of Qatar
// UIUserNotificationActionContextMinimal //文告内容区域受限意况下内容
[category setActions:@[action1,action2] forContext:UIUserNotificationActionContextDefault];

// 4.创立客户通报的装置新闻
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:types categories:[NSSet setWithObject:category]];

// 注册安装
[[UIApplication sharedApplication] registerUserNotificationSettings:setting];
}

* 在发送本地推送通知时候指定通知的分类标示

// 9.设置布告的体系
ln.category = @"myCategory";

* 监听点击通知按钮的行为,在AppDelegate中实现监听通知按钮点击方法

/**

  • 当客户点击文告上定制的开关推行的行为(注意:不点击行为按键,不会跻身该方式卡塔尔
    • @param application 应用
  • @param identifier 行为标志符
  • @param notification 当地布告
  • @param completionHandler 完结回调
    */
  • (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString )identifier forLocalNotification:(UILocalNotification )notification completionHandler:(void (^)())completionHandler
    {
    // 管理差别行为
    if ([identifier isEqualToString:UIMutableUserNotificationActionBackground]) {
    NSLog(@"后台运路程序"卡塔尔;
    }else if ([identifier isEqualToString:UIMutableUserNotificationActionForeground]){
    NSLog(@"前台运路程序"State of Qatar;
    }else{
    NSLog(@"其他");
    }
    /*
    You should call the completion handler as soon as you've finished handling the action.
    当义务管理达成时候,你应有尽快的调用completion的block.
    /

// 在当任务到位的时候,调用任务完成的block
completionHandler();
}

本文由68399皇家赌场发布于集成经验,转载请注明出处:iOS远程推送和本地推送,UILocalNotification本地通知

关键词: 68399皇家赌场 iOS iOS开发笔记

上一篇:看这一篇就够,7单聊集成与使用

下一篇:没有了

最火资讯