亮 iOS 本地通知以及远程通知

By admin in 亚洲必赢app在哪下载 on 2018年10月18日

正文主要描述了iOS的当地与长距离通知的骨干用,以及某些是注意的题材。

Note:文章有诸多身旁同学提供了援手,大量引用或转载本文请宣示原文地址,多谢。

如出一辙:用户通报简介

用户通报是什么

iOS中设有三栽常见的事件通报方式:NSNofiticationCenter、KVO Notification
和 User Notifications,其中 User
Notifications,就是本文将探讨的用户通报。

咱俩都清楚 iOS 系统时的发出一些和 App
相关的通知栏消息,这些消息往往伴随着提示音同 App
的桌面图标右上比赛的无念消息提示,这些通知就是 iOS 的用户通报。

用户通报的归类

用户通报分为两近似:本地通知及长途通知,其中长途通知同时称之为推送通知。

彼此极其根本的界别是:本地通知是由于 App
发送到目前装备及,不待网络支持;而远程通知是出于 App
的服务器发送到苹果之 APNs 服务器,并出于 APNs 服务器转发到相应设备(由 App
服务器指定接收通知之装备)。

二者极其要的共同点是:本地通知以及远程通知对用户之表现形式是同样的,两者均可以运用通知栏消息、App
桌面图标右上较量角标和唤醒音的方法通知用户。

用户通报起啊用

随即有效之(无论是当前台要后台)向用户发送信息(聊天信息、新闻、待办事项、天气变化等)是用户通报不过老之优势。

除此以外,有效成立之采取用户通报,可以被咱的 App 有重好之体验,如:

  • 当待办事项将过期时可以即时提拔用户;
  • 当用户执行下载好文件任务时进入后台,当下载就后得以通用户;
  • 当用户环球旅行时,可以根据用户的地理位置推送天气转等信息;
  • 当用户订阅的有杂志或新闻主题有更新时,通知用户;
  • ……

本文后续内容以因为运开发者的角度对用户通报进行深刻的探讨,本文讨论内容对iOS7/8/9,有关
iOS10 系统的用户通报会见另外做讲解。

此而生载
本文demo
。此外,本文中的长途通知下了
Simplepush.php
,内部代码很简单,可采用该脚本于定义远程通知的内容,当然好行使
本文demo
里我修改了之本子文件,建议花几分钟查看以下 Simplepush.php
的用法。此外,demo
不提供证书,如有长途通知要求,请自行报名证书,否则无法正常下
Simplepush。

本文主要参照了苹果官方的 Local and Remote Notification Programming
Guide
以及本文用到的接口的官方文档。

亚:本地通知的用

打开本地通知功能

  • 于 iOS7,如果用户并未以系装置里关闭该 App
    的通告功能,那么开发者无需召开其他操作即可使当地通知功能。

  • 对此 iOS8
    及然后的系统,若得使用当地通知功能,则需注册通知类型。
    通告类型有四种植:角标(UIUserNotificationTypeBadge)、提示音(UIUserNotificationTypeSound)、提示信息(UIUserNotificationTypeAlert)和任任何通知(UIUserNotificationTypeNone)。

    公可挂号上诉四栽通知类型的任性组合,但最终可用的通报形式要依据用户指向这个
    App 通知之安装规定。比如:App
    内部注册了角标、提示音和提示信息,但是用户关闭了动静通知,那么接本地通知时凡未会见发提示音的。
    对于 iOS8 及然后的系,注册本地通知的代码示例如下:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // 只有 iOS8 and later 才需要
        if ([[UIApplication sharedApplication]  respondsToSelector:@selector(registerForRemoteNotifications)]) {
            // 这里 types 可以自定义,如果 types 为 0,那么所有的用户通知均会静默的接收,系统不会给用户任何提示(当然,App 可以自己处理并给出提示)
            UIUserNotificationType types = (UIUserNotificationType) (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert);
            // 这里 categories 可暂不深入,本文后面会详细讲解。
            UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
            // 当应用安装后第一次调用该方法时,系统会弹窗提示用户是否允许接收通知
            [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
        }
    
        // Your own other codes.
        return YES;
    }
    

当系统弹窗提示用户是否允许收取通知后,用户可能会见拒绝;我们得以当
AppDelegate 的 application:didRegisterUserNotificationSettings:
方法被之所以来查阅注册成功之关照类型,我们可以当拿到注册结果后做打定义操作(比如失败时弹个窗提示用户眼前无法运用用户通报)。

苹果推荐以随后发送的本土通知时,要避免采取没有登记成功之通类型(并无是强制要求)。

- (void)application: (UIApplication*)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    if (notificationSettings.types & UIUserNotificationTypeBadge) {
        NSLog(@"Badge Nofitication type is allowed");
    }
    if (notificationSettings.types & UIUserNotificationTypeAlert) {
        NSLog(@"Alert Notfication type is allowed");
    }
    if (notificationSettings.types & UIUserNotificationTypeSound) {
        NSLog(@"Sound Notfication type is allowed");
    }
}

出殡本地通知

发送一个地面通知重要发生如下步骤:

  1. 率先使按照上述 “开启本地通知功能” 步骤注册通知类型;

  2. 始建一个 UILocalNotification 对象;

  3. 设置 UILocalNotification 对象的 fireDate
    属性,该属性表示什么日子接触发送即时长达地方通知;同时可以装 timeZone
    属性表示时区,设置 timeZone 后,当用户过时区经常,fireDate
    会按照时区被调整(类似于钟表调整);此外,可以使用 repeatInterval 和
    repeatCalendar 来安装周期性的关照。

  4. 设置通知的提示信息:

    • 装 alertTitle 作为通知之大校,设置 alertBody
      作为通知的切切实实信息;注意这里强烈建议使用本地化的字符串,即
      NSLocalizedString(@"This is alert body", nil);
      注意 alertTitle 属性只适用于 iOS8.2 及之后的系统
    • 安装 applicationIconBadgeNumber 用于展示 App
      桌面图标的右边上斗角标。
    • 装 soundName, 我们一般设置也
      UILocalNotificationDefaultSoundName;使用从定义 sound
      在后会越加讲解。
    • 于装置提示道的价值时,对于 iOS8
      及之后的系统,可以检查下时提醒道是否业已登记成功(可以用
      [[UIApplication sharedApplication] currentUserNotificationSettings]
      获取注册成功之关照类型)。
  5. 可选设置 userInfo 属性,该属性一般可以存放业务有关的音(如 ID
    等),这样收到通知后得以方便处理业务有关逻辑;

  6. 用上面创建的 UILocalnotification 放入通知队列中:使用方法
    scheduleLocalNotification: 会按照 UILocalnotification 中的
    fireDate 进行通报之发送,而使 presentLocalNotificationNow:
    会立即发送该地方通知。

下面给来同样段子示例代码:

- (void)scheduleLocalNotification {
    NSDate *itemDate = [NSDate date];

    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    if (localNotif == nil)
        return;
    localNotif.fireDate = [itemDate dateByAddingTimeInterval:10];
    localNotif.timeZone = [NSTimeZone defaultTimeZone];

    localNotif.alertBody = [NSString stringWithFormat:NSLocalizedString(@"%@ after %i seconds scheduled.", nil), @"本地通知", 10];

    localNotif.alertTitle = NSLocalizedString(@"Local Notification Title", nil);

    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 1;

    NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"ID:10" forKey:@"LocalNotification"];
    localNotif.userInfo = infoDict;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
}

拍卖收到的地方通知

此间分三种情形讨论哪边处理地方通知:

应用处于前台

采用处于前台时,本地通知到时,不会见生提示音、通知栏横幅提示,但是 App
桌面图标的右手上较量角标是发数值显示的,所以即便在前台,我们也该对角标数量做处理
此时,我们得以在 application:didReceiveLocalNotification:
方法中拿走到地面通知,示例代码如下:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    NSString *itemName = [notification.userInfo objectForKey:@"LocalNotification"];
    [self.windowRootController displayNotification:[NSString stringWithFormat:@"%@ receive from didReceiveLocalNotificaition", itemName]];
    // 这里将角标数量减一,注意系统不会帮助我们处理角标数量
    application.applicationIconBadgeNumber -= 1;
}

采取处于后台

当用处于后台时,本地通知到时,会基于地方通知设置的通类型和用户安装的通报类型进行提醒,例如锁屏界面通知、通知栏通知、声音、角标。

这时而滑动锁屏界面通知或者点击通知栏通知,则会切换应用到前台,我们可使与使用处于前台时一样的落通知之措施。

然而只要我们点击 App
桌面图标,则无法获得到用户通报,此时通知栏消息还是会存在。此外,角标也不见面变,如果期望改角标,则需
App 进入前台后拿其修改。

行使尚未运行

一旦应用尚未运行,当本地通知到时,会因地面通知设置的通知类型和用户设置的关照类型进行提示,例如锁屏界面通知、通知栏通知、声音、角标。此时若滑动锁屏界面通知或者点击通知栏通知,则会打开应用,但这我们收获通知之方式和前方有所不同,通过application:didReceiveLocalNotification:
是力不从心得到通知之。 这种情况我们需要经
application:didFinishLaunchingWithOptions: 中之 LaunchOptions
获取通知,示例代码如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (localNotif) {
        NSString *itemName = [localNotif.userInfo objectForKey:@"LocalNotification"];
        [self.windowRootController displayNotification:[NSString stringWithFormat:@"%@ receive from didFinishLaunch", itemName]];  // custom method
        [UIApplication sharedApplication].applicationIconBadgeNumber = localNotif.applicationIconBadgeNumber-1;
    }

    // Your own other codes.
    return YES;
}

一如既往的,但是要是我们点击 App
桌面图标,则无从获得到用户通报,此时通知栏消息还是会设有。此外,角标也未见面变,如果希望修改角标,则需
App 进入前台后用那修改。

地理位置相关的本土通知

在 iOS8
及事后系统面临,我们得以定义一个暨地理位置有关的地头通知,这样当我们跨越了设定的地理区域时,系统会发送本地通知。

报位置相关的当地通知

  1. 消创造一个 CLLocationManager 对象,并为其安一个 delegate;

  2. 伸手用户同意下固定服务:调用 CLLocationManager 的
    requestWhenInUseAuthorization,注意工程的 plist 中需配置
    NSLocationWhenInUseUsageDescription
    选项,否则一定服务无法正常启用;示例代码如下:

    - (void)registerLocationBasedNotification {
        CLLocationManager *locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
        // 申请定位权限
        [locationManager requestWhenInUseAuthorization];
    }
    
  3. 通过 CLLocationManagerDelegate
    回调检查用户是否允许以一定服务,如果同意了服务,那么好发送一个职相关的地方通知。

    - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
        // 因为上面我们是使用了 requestWhenInUseAuthorization,所以这里检查的是 kCLAuthorizationStatusAuthorizedWhenInUse
        if (status == kCLAuthorizationStatusAuthorizedWhenInUse) {
        [self scheduleLocalBasedNotification];
        }
    }
    
  4. 创立一个职务相关的地面通知,并将那至由系统处理。

    - (void)scheduleLocalBasedNotification {
        UILocalNotification *locationNotification = [[UILocalNotification alloc] init];
        locationNotification.alertBody = @"到达xxx";
        locationNotification.regionTriggersOnce = NO; // 表示每次跨越指定区域就会发送通知
        locationNotification.region = [[CLCircularRegion alloc] initWithCenter:LOC_COORDINATE radius:LOC_RADIUS identifier:LOC_IDENTIFIER];
    
        [[UIApplication sharedApplication] scheduleLocalNotification:locNotification];
    }
    

拍卖位置相关的本土通知

以及方讲了的 “处理收到的地面通知” 比较,这里可以以通报里获得到
region,然后可以举行打定义操作,其余所有操作均和 “处理收到的当地通知”
一致。

留意要用户没有同意采取一定权限,则无从收到位置相关的本地通知。

其三:远程通知之以

APNs 简介

APNs 是苹果提供的远距离通知的服务器,当 App 处于后台或者尚未运行时,如果
App 的服务器(之后我们叫
Provider)需要发送通知消息被客户端,则要靠 APNs 服务器。

运 APNs 服务时,远程通知之路由路径为: Provider –> 苹果的 APNs
服务器 –> 手机设备 –> App。在是路中,Provider 与 APNs
服务器之间有一个 TLS 连接,Provider 通过者连续将远程通知推送到苹果的
APNs 服务器;手机配备与 APNs 服务器之间也会见产生一个 TLS
连接,所有发朝手机配备的 APNs 远程通知都是使就一个
TLS连接,然后由装备区分远程通知所属的
App,进而通知被用户有下来长途通知。

脚简单介绍下此流程:

设备 与 APNs

配备与 APNs 建立连接的进程要图:

Device-APNs.png

内需肯定的中心思想:

  1. 其一连续由系统成立并维持,无需开发人员管理;
  2. 直达图被之关系是苹果设备本身的证书,与开发者账号被申请之证明无关;
  3. 每个设备及 APNs 服务器就待维持一条连接。

Provider 与 APNs

Provider 与 APNs 建立连接的经过要图:

Provider-APNs.png

亟待明确的中心:

  1. 本条连续由 App 的 bundle ID 唯一确定;
  2. 达成图中 Provider certificate 需要经过开发者账号申请变更,其中含有 App
    的 bundle ID。

APNs 工作之流程

Provider-App.png

  1. 第一客户端需要往 APNs 服务器注册时 App,APNs
    会返回一个Token(注意是历程要求 App
    有合法的证明,有关证件这里不开详细描述);注意不同应用在同一设备及得到之
    Token 不同,同一应用在不同装备及赢得之 Token也不比,所以 Token
    是暨设备及 App 唯一绑定的;

  2. App 以到 Token 后需以那个发送给 Provider;

  3. Provider 发送推送通知时,指定 Token 和通内容,并发送给 APNs
    服务器;

  4. APNs 服务器会将通告发送给 Token 对应之装置及;

  5. 设施收到通知后,根据 APNs 发过来的通知受蕴藏的 bundleID
    信息分别是孰App的远距离通知(这里应该是基于 Token 来取 bundleID)。

Feedback 机制

Feedback 是 APNs
服务器提供的用来减少服务器压力及优化网络的劳动,基本的做事流程如下图:

APNs-Feedback.png

  1. Provider 发送一个远距离通知于 APNs 服务器,APNs
    服务器会检测目的设备是否在线,如果不在线,那么 APNs
    服务器会暂时存该消息;

  2. 当目的装备上线后,APNs
    会发送暂存的信息给目的设备(按照苹果官方说法暂存消息就会暂存最后一久信息,之前的音信会让废弃);

  3. 假使目的设备不行老还不曾上线,那么 APNs 消息会将欠装备投入 feedback
    名单。Provider 可以定期去 APNs 拉新 feedback 名单;

  4. 当 Provider 再次叫前面的设备发送远程通知时,需要检查一下 feedback
    名单,如果设备以这榜,则不再发送给 APNs 了;

  5. 当设备更上线后,Provider 可以重将是设施移除 feedback 名单,当
    Provider 更新 feedback list
    后,就好还于该装备发送远程通知了。当然,feedback list
    的更新可能会见有周期,如果要立即有效之翻新 feedback list,那么用
    App 打开后,及时通报 Provider;

  6. 这种体制的好处虽戒发送多余无用的长途通知消息,一方面可以舒缓
    APNs 服务器的压力,另一方面也得以减小网络流量;

敞开远程通知功能

注册通知类型

  • 于 iOS7,无需是步骤;
  • 对 iOS8
    及之后的系,若得采用远程通知功能,则用登记通知类型。步骤和
    “本地通知的使用” 中 “开启本地通知功能” 是完全相同的,此处不再重复。

报远程通知

核心流程也:

  1. 登记通知类型,上同略节已经召开了介绍;
  2. 使用 registerForRemoteNotifications 注册远程通知(对于 iOS7 使用
    registerForRemoteNotificationTypes:);
  3. 使用 application:didRegisterForRemoteNotificationsWithDeviceToken:
    接收 APNs 返回的 Token,使用
    application:didFailToRegisterForRemoteNotificationsWithError:
    处理登记错误;
  4. 一经达等同步骤中登记成功了,那么将取的 Token 发送给 Provider。

注意:

  1. 当下总的来说,对于 iOS9,每次重新安装应用后得到的 Token
    是不一样的,而且每次重装系统也会变动,所以
    老是用启动时还用以点的步调注册一次

  2. 毫无将事先的 Token 缓存,当需要以 Token 传送到 Provider
    时,一定要利用 registerForRemoteNotifications
    获取,并运用回调处理登记结果;当使用注册了通报,而且 Token
    没有更改时,系统会立即回到结果,不会见失掉 APNs 请求。这里猜测系统辅助将
    Token
    缓存下来,且与以之状态进行了关乎,如果使用即状态没转,那么会立马用系统存下的
    Token 返回。为了验证这点,可以将网络关闭进行测试,如果 App
    没有卸载,也是得取到 Token 的;

  3. 肯定要是来开了 Push 功能的关系,才会健康下远程推送。

登记远程通知之以身作则代码如下:

- (void)registerRemoteNotifications {
    // 区分是否是 iOS8 or later
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerForRemoteNotifications)]) {
        // 这里 types 可以自定义,如果 types 为 0,那么所有的用户通知均会静默的接收,系统不会给用户任何提示(当然,App 可以自己处理并给出提示)
        UIUserNotificationType types = (UIUserNotificationType) (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert);
        // 这里 categories 可暂不深入,本文后面会详细讲解。
        UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
        // 当应用安装后第一次调用该方法时,系统会弹窗提示用户是否允许接收通知
        [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
    } else {
        UIRemoteNotificationType types = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound;
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];
    }
}

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(nonnull UIUserNotificationSettings *)notificationSettings {
    // Register for remote notifications.
    [[UIApplication sharedApplication] registerForRemoteNotifications];
}

// Handle register result.
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    //获得 device token,这一步处理为字符串的操作很重要
    NSString *token = [[[deviceToken description]
                        stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]
                        stringByReplacingOccurrencesOfString:@" "
                        withString:@""];
    NSLog(@"DeviceToken string, %@", token);
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
    // 将 token 发送给 Provider
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"Error in registration for apns service. Error: %@", error);
}

出殡远程通知

长途通知的始末

Provider 发送给 APNs 服务器的内容格式如下:

{
   // aps key 是必须要有的
   "aps" : {
      "alert" : {
         "title" : "通知的概要,对 8.2 以前的系统本选项无效"
         "body" : "通知的具体内容",
         "loc-key" : "GAME_PLAY_REQUEST_FORMAT",
         "loc-args" : [ "Jenna", "Frank"]
      },
      "badge" : 3, // 角标数值
      "sound" : “chime.aiff" // 可以自定义提示音
   },

   "userName" : "username", // aps key 之外可以有自定义内容,需要符合 json 格式
   "message" : ["hello", "world", "programmer"]
}

地方只是略介绍了宽广的情,如用更深定制推送通知,建议查看:
苹果官方payload文档

长距离通知之本地化处理

发生些许种植艺术:

  • 于 Provider 端进行本地化
    App 可以用目前下的语言发送给 Provider,Provider
    在殡葬远程通知前,检查时设施以的语言,并做好本地化后发送给 APNs
    服务器。App 发送当前利用的语言让 Provider 的言传身教代码:

    NSString *preferredLang = [[NSLocale preferredLanguages] objectAtIndex:0];
    const char *langStr = [preferredLang UTF8String];
    [self sendProviderCurrentLanguage:langStr]; // custom method
    

    相似的话,将手上网语言信息发送给 Provider 时,也会见拿 Token
    一起发送,这样 Provider
    才会当发送远程通知时冲不同目的设备进行本地化处理。
    另外,当用启动后,用户可能会见窜系统语言,这时,App 需要监听
    NSCurrentLocaleDidChangeNotification
    通知,并于处理通报的措施中更于 Provider 发送当前用的言语。

  • 以客户端本地化
    这种模式下,Provider 在殡葬远程通知时,需要设置 Payload -> alert
    中之本地化相关属性,如下:

    {
        // aps key 是必须要有的
        "aps" : {
            "alert" : {
                      "title" : "通知的概要,对 8.2 以前的系统本选项无效",
                      "loc-key" : "Remote Notification",
                      "loc-args" : [ "hello", "world"]
            },
            "badge" : 3, // 角标数值
            "sound" : “chime.aiff" // 可以自定义提示音
        }
    }
    

面 loc-key 以及 loc-args 就是本地化相关的性能,用于地方化 alert 中的
body。
当 App 收到这信息时,会因系统时底语言设置去相应的本地化文件中摸索和
loc-key 对应的 value,如果 loc-key 对应之 value
是一个格式化的字符串,那么好为此 loc-args 传递参数。

若果本地化文件被: “Remote Notification” = “我们程序员通常钟爱:%@ %@”
,那么提示信息就是: “我们程序员钟爱:hello world”;

另外在本地化文件中我们呢足以为此 %n$@ 代替 %@ 用来代表以 loc-args
的第几单参数。例如:”Remote Notification” = “我们程序员通常钟爱:%2$@
%1$@”,那么提示信息是:”我们程序员钟爱:world hello”。

平的,title-loc-key 和 title-loc-args 是对 alert 中的 title
做本地化的。

处理收到的远距离通知

此分三栽情景讨论哪些处理远程通知:

动用处于前台

以处于前台时,本地通知到时,不见面发提醒音、通知栏横幅提示。但是 App
桌面图标的右边上斗角标是来数值显示的,所以便以前台,我们为应本着角标数量做拍卖;
这时候,我们可于
application:didReceiveRemoteNotification:fetchCompletionHandler:
方法被获取到长途通知,示例代码如下:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler {
    NSData *infoData = [NSJSONSerialization dataWithJSONObject:userInfo options:0 error:nil];
    NSString *info = [[NSString alloc] initWithData:infoData encoding:NSUTF8StringEncoding];
    [self.windowRootController displayNotification:[NSString stringWithFormat:@"From didReceiveRemoteNotification: %@", info]];
    // 这里将角标数量减一,注意系统不会帮助我们处理角标数量
    application.applicationIconBadgeNumber = notification.applicationIconBadgeNumber - 1;
}

运用处于后台

当以处于后台时,远程通知到时,会根据登记通知是安装的通报类型以及用户设置的打招呼类型进行提醒,例如锁屏界面通知、通知栏通知、声音、角标。

这儿使滑动锁屏界面通知或者点击通知栏通知,则会切换应用至前台,我们好采取以及运用处于前台时一致的取得通知的道。

唯独要我们点击 App
桌面图标,则无从赢得到用户通报,此时通知栏消息依然会设有。此外,角标也非会见转变,如果指望修改角标,则要
App 进入前台后将该修改。

使尚未运行

此间有半点种植处理方式:

  • 及地面通知的处理方式相同,在
    application:didFinishLaunchingWithOptions: 的 LaunchOptions
    中获通知,不过其中代码会略有不同,示例如下:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if (remoteNotif) {
            NSData *infoData = [NSJSONSerialization dataWithJSONObject:remoteNotif options:0 error:nil];
            NSString *info = [[NSString alloc] initWithData:infoData encoding:NSUTF8StringEncoding];
            [self.windowRootController displayNotification:[NSString stringWithFormat:@"From didFinishLaunch: %@", info]];
            [UIApplication sharedApplication].applicationIconBadgeNumber -= 1;
        }
        // Your own other codes.
        return YES;
    }
    
  • 同以处于前后台时处理方式相同,使用application:didReceiveRemoteNotification:fetchCompletionHandler:
    方法,示例代码见 “应用处于前台”
    时底处理。对于远程通知,推荐应用此种植艺术处理。

    除此以外,对于远程通知,如果我们点击 App
    桌面图标,则无法获取到用户通报,此时通知栏消息还是会有。此外,角标也不见面扭转,如果欲改角标,则需
    App 进入前台后拿其修改。

长距离通知-静默推送

沉默推送是因利用在前台要后台状态下,收到远程通知时,没有弹窗或横幅提示,即使远在后台也足以拍卖远程通知。具体以流程如下:

  1. 开拓应用工程 Target 的 Capacities,将 Background Modes
    选项打开,并且勾选 Remote Notifications;

  2. 于 Provider 发送远程通知时,需要用远程通知 Payload 中的 aps 内之
    content-available 设置也 1,如下:

     aps {  
         content-available: 1
         alert: {...}
     }
    
  3. 使用得实现
    application:didReceiveRemoteNotification:fetchCompletionHandler:
    方法接收静默推送。

发出几沾用小心:

  1. 采用静默推送时,alert 字段未应其他信息,但好安装 aps
    内之自定义字段;
  2. sound 和 badge 字段可以装,但最不装,否则会发生提醒音;
  3. 沉默推送只有当以处于前台要后台时才会处理,当用尚未启动时凡结束不交静默推送的;
  4. 处理静默推送时,不克举行耗时操作,因为系统才吗这种处理作为分配少量日,如下载文件之类的操作请以后台下载服务。

但是操作通知

首先需要留意的是,可操作通知不过适用于 iOS8 及下的网。

然操作通知其实并无是如出一辙种植新的关照形式,它只是以这地方通知以及长距离通知的基础及加了有些可操作的行事而已。为了直观说明什么是可操作通知,可以参考下图:

Actionable-Notification.png

然而操作通知也用户提供了以通知提示着有益执行操作的计,在使横幅提示通知消息时,最多可生星星点点独操作,在使用弹窗提示通知消息是,最多得有四单操作。下面教如何使:

季:定义可操作通知的作为

主导以方式:

  1. 创立一个 UIMutableUserNotificationAction
    对象,并按照需求安排该目标的特性,示例代码:

    UIMutableUserNotificationAction *acceptAction = [[UIMutableUserNotificationAction alloc] init];
    // 为该操作设置一个 id
    acceptAction.identifier = @"accept";
    // 设置该操作对应的 button 显示的字符串
    acceptAction.title = @"Accept";
    // 指定是否需要应用处于运行状态
    acceptAction.activationMode = UIUserNotificationActivationModeBackground;
    // 表示该操作是否有害,若设置为 YES,则对应的button会有高亮
    acceptAction.destructive = NO;
    // 当锁屏时收到可操作通知,该属性表示是否必须解锁才能执行该操作
    acceptAction.authenticationRequired = YES;
    
  2. 创办一个 UIMutableUserNotificationCategory
    对象,并拿于定义的操作通过 setActions: 的法设置给 category
    对象。代码如下:

    // 这里为了测试,又新建了两个 action,declineAction 和 maybeAction ,代码可见 demo
    UIMutableUserNotificationCategory *inviteCategory = [[UIMutableUserNotificationCategory alloc] init];
    // 设置一个 ID,用于本地通知或远程通知时指定该通知可执行的操作group
    inviteCategory.identifier = @"Action";
    // 为弹窗模式设置 actions
    [inviteCategory setActions:@[acceptAction, maybeAction, declineAction] forContext:UIUserNotificationActionContextDefault];
    // 为横幅模式设置 actions
    [inviteCategory setActions:@[acceptAction, declineAction] forContext:UIUserNotificationActionContextMinimal];
    
  3. 挂号通知类型及可操作的actions

    类于本地通知以及远程通知,调用 registerUserNotificationSettings:
    注册通知,只是这里的 setting 加入了俺们地方定义之 category。

    NSSet *categories = [NSSet setWithObjects:inviteCategory, nil];
    // 这里 types 可以自定义,如果 types 为 0,那么所有的用户通知均会静默的接收,系统不会给用户任何提示(当然,App 可以自己处理并给出提示)
    UIUserNotificationType types = (UIUserNotificationType) (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert);
    // 这里 categories 可暂不深入,本文后面会详细讲解。
    UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:categories];
    // 当应用安装后第一次调用该方法时,系统会弹窗提示用户是否允许接收通知
    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
    

假如用可实施通知用于远程通知,那么用遵循长途通知之挂号方式赢得
token,可参照远程通知的登记。

发送可操作通知

事先说罢,可操作通知只是于当地通知和远程通知的功底及加以了起定义之操作,所以发送可操作通知就是殡葬本地通知或者远程通知。不过,如果期望咱们打定义的
action 有效,在殡葬本地通知或者远程通知时需开展部分改成:

  • 本土通知之可操作通知
    为 UILocalNotification 对象设置我们打定义之 category。如下:

    UILocalNotification *notification = [[UILocalNotification alloc] init];
    // Other configurations
    notification.category = @"Action";
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
    
  • 长距离通知之可操作通知
    当长距离通知之 Payload 中安装我们从定义的 category,如下:

    {
        "aps" :  {
            "alert" : "You’re invited!",
            "category" : "Action"
        }
    }
    

拍卖可操作通知

拍卖可操作通知和处理地方通知及长距离通知一致,唯一的不同点就是当用户执行了有操作后,应用可以在后台运行application:handleActionWithIdentifier:forRemoteNotification:completionHandler:
处理通报(例如后台更新数据等操作),我们得以当此回调里飞的执行操作:

- (void)application:(UIApplication *) application
              handleActionWithIdentifier: (NSString *) identifier
          // either forLocalNotification: (NSDictionary *) notification or
                   forRemoteNotification: (NSDictionary *) notification
                       completionHandler: (void (^)()) completionHandler {

    if ([identifier isEqualToString: @"accept"]) {
        [self handleAcceptActionWithNotification:notification];
    }

    // 执行自定义代码完成后必须调用
    completionHandler();
}

对于本地通知我们可以下
application:handleActionWithIdentifier:forLocalNotification:completionHandler:

而操作通知到底发生什么好处?

这边选出个例证说明:
假如A向B发出了一个在座发布会邀请,并且 App
是以长途通知的不二法门收受及拖欠信息,那么当不使用可操作通知之时节,我们用做的工作根本包括:

  1. 用户需打开应用;
  2. App 查看远程通知的内容是一个请,那么 App
    应该弹窗提示用户是否受该邀请;
  3. 用户挑选后,App 通过 Http(也得采用其它通信协议)
    将结果回到给服务器;
  4. 特约通知处理完毕。

这就是说,如果我们采用可操作通知,可以挺粗略的姣好及时档子工作:

  1. 用户挑选接受或拒绝请(用户无论需打开 App);

  2. App 通过可操作通知的回调处理用户操作结果,将结果发送给服务器;

  3. 请通知处理完毕。

    可看看,不论是自用户角度还是开发者角度,可操作通知都大幅度的便宜了拍卖具有可操作动作之及时看似通知。

五:总结

交此处已教完成了用户通报之情,文章包含了苹果于闹之用户通报的着力享有用法,如果想使承认文档是否生误可自动参考
Local and Remote Notification Programming
Guide
,如果本文中内容有误,欢迎指出与座谈。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2018 亚洲必赢app官方下载 版权所有