跳转至

高级

创建通知组

在通知中心,可以将通知显示为组。相同事件的通知可以进行分组并缩小显示。缩小的通知组可以由用户再次展开,子通知(属于该组的每个通知)可以单独执行。

通知组可以通过在控制台 > 通知 > 推送 v4 > 推送活动注册 > 活动注册 > 选项 > 组键中将组键设置为使用并添加键值来创建。在控制台创建组后,本地推送和远程推送时可以使用groupId应用通知组。应用组后,通知将按组缩小显示,如下所示。

安卓
iOS

iOS 媒体通知

利用 Apple 的 UserNotifications 框架,可以在通知中添加图像、视频等媒体文件。

JPG(图片)
GIF(图片)
MP4(视频)

操作过程

此功能利用 iOS 的 Notification Service Extension(以下简称 Extension)进行操作。 Notification Service Extension 是一种应用扩展,允许在用户接收到远程通知之前修改有效负载,且可以在不切换上下文的情况下使用其他应用的进程(UI 或功能)。 有关详细信息,请参阅 详细信息

  • 应用扩展后的远程通知传递过程

文件大小和类型限制

媒体文件附加时有容量限制,详细内容可在 UNNotificationAttachment 中查看。

Warning

我们发现,当使用AVAudioSession的应用程序(如Youtube或各种移动游戏,例如《召唤师战争》、《变成星星》、《链式打击》等)正在运行时,如果传送通过推送收到的音频,主屏幕(Springboard)会重启。这种情况与iOS版本或设备类型无关,确认是在Apple系统内部发生的冲突,与Hive无关。

截至2018年12月20日,我们已向Apple方面询问该现象,并在应对措施制定之前,请停止使用通过媒体推送的音频传输功能

分类 类型 限制容量
音频 WAV, MP3, MP4(音频) 5MB
图片 JPG, JPEG, PNG, GIF 10MB
视频 MP4, AVI 50MB
  • 如果网络不畅导致超时,用户将收到不包含媒体的普通通知。
  • 在非常慢的网络中,下载可能会持续长达10分钟,因此应考虑该地区的网络状况,使用适当容量的媒体。

实现与应用

为了下载媒体并重构通知对象以传递给用户,需要进行一些设置和添加源代码。

Note

通知服务扩展无法作为库或框架进行分发,因此要使用扩展,必须根据Hive提供的指南进行设置。

添加扩展

要使用此功能,您需要在项目中添加Notification Service Extension,并使用添加新目标的方式,而不是直接添加或重写类。

在项目中添加目标后,将自动生成模板。

1. 在项目设置中,点击添加目标按钮(下方的红色方框) noti_adv_1_plus-button

2. 选择 Notification Service Extension,然后点击 Next
(从 Xcode 8 开始,可以将 Notification Service Extension 添加为项目的目标) noti_adv_1_plus-button

3. 输入产品名称 noti_adv_1_plus-button

4. 如果出现如下弹窗,请点击 Activate
当前项目会自动包含(嵌入)Extension,并添加用于构建的 Scheme noti_adv_1_plus-button

5. 在“常规”选项卡中,确认扩展已添加到项目中 noti_adv_1_plus-button

6. 项目中添加了名为 NotificationService 的模板类 noti_adv_1_plus-button

添加 HIVEExtensions.framework

利用Hive提供的**HIVEExtensions.framework**,可以轻松下载媒体。

HIVEExtensions.framework 的添加方法如下。

  1. Hive SDK支持CocoaPods。如果项目路径中没有Podfile,请执行pod init。 noti_adv_7-2_pod-init-terminal

如果有Podfile,请打开文件并编写target 'NotificationServiceExtension(示例目标名)' do-end语句。 noti_adv_7-2_pod-init-terminal

  1. 请参考屏幕截图编写 pod 语句。 noti_adv_7-2_pod-init-terminal

  2. 关闭 Podfile,然后在项目路径下执行 pod install。 noti_adv_7-2_pod-init-terminal

  3. 打开NotificationSample(示例项目名).xcworkspace,可以看到Pods项目已添加。现在可以在NotificationSample和NotificationServiceExtension目标中导入HIVEExtensions。 noti_adv_7-2_pod-init-terminal

框架应用

在NotificationService.m文件中,如示例所示导入框架。 实现从模板提供的方法调用HIVEExtensions.framework提供的方法,并删除方法内部的初始模板代码

import HIVEExtensions

func didReceiveNotificationRequest(request: UNNotificationRequest, with contentHandler: (UNNotificationContent) -> Void) {
    HIVENotificationService.didReceive(request) { content in
        guard let content else { return }
        contentHandler(content)
    }
}

func serviceExtensionTimeWillExpire() {
    HIVENotificationService.serviceExtensionTimeWillExpire()
}
#import <HIVEExtensions/HIVEExtensions.h>

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
[HIVENotificationService didReceiveNotificationRequest:request withContentHandler:contentHandler];
}

- (void)serviceExtensionTimeWillExpire {
[HIVENotificationService serviceExtensionTimeWillExpire];
}

应用时注意事项

发送和接收时间的差异

在扩展中的所有操作完成后,通知将被传递给用户,因此发送时间和接收时间可能会有所不同,客户端将根据服务器发送的时间进行显示。

例如,如果在15:00发送通知,而下载完成的时间是15:05,则通知将显示为在15:00到达。

设备容量

通过推送传递的媒体在用户设备内部存储后通过推送显示,传递的媒体存储在设备内部的缓存数据空间中,占用用户设备的内部容量。 当用户设备内部存储容量不足时,缓存数据空间会被操作系统自动删除数据。

用户的移动数据使用

通过推送接收的媒体将使用用户的移动数据进行下载,并且在未获得用户同意的情况下进行下载,可能会产生下载时的数据使用费用。

在通过推送接收音频/视频文件的情况下,需在下载前检查用户的网络连接状态,如果用户不是在Wifi连接状态,则不进行下载,而是显示没有媒体的推送。

此时通过推送传递的媒体类型可以通过媒体 URL 最后指定的扩展名进行确认,只有在[文件大小和类型限制]部分中指定的扩展名才能正常显示。

接收到的 URL wifi LTE / 3G
http://xxx/notimovie.mp4 始终在下载后将媒体显示在推送中 由于具有视频文件的扩展名 (mp4),因此在不下载媒体的情况下显示推送
http://xxx/notimovie 始终在下载后将媒体显示在推送中 不是音频文件/媒体文件,因此在下载后将媒体显示在推送中
http://xxx/notisound.wav 始终在下载后将媒体显示在推送中 由于具有音频文件的扩展名 (wav),因此在不下载媒体的情况下显示推送
http://xxx/notiimage.jpg 始终在下载后将媒体显示在推送中 不是音频文件/媒体文件,因此在下载后将媒体显示在推送中

应用传输安全设置

苹果的基本政策是所有应用程序进行的服务器通信都必须允许使用https,而通过通知传递的URL也受到该政策的影响。如果希望使用Http域进行通信,则需要进行App Transport Security(以下简称ATS)例外设置。
此时,即使在应用程序中进行了ATS例外处理,要使用http域的url进行推送,也需要在扩展中进行ATS例外设置。

在Unity中媒体未传递的情况

Hub connection error Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.com2us.hivesdk.normal.freefull.apple.global.ios.universal.NotificationServiceExtension" UserInfo={NSDebugDescription=connection to service named com.com2us.hivesdk.normal.freefull.apple.global.ios.universal.NotificationServiceExtension}

在Unity中,如果出现上述错误日志并且媒体未传递,请检查生成的Extension Target的Architectures中是否同时包含armv7和arm64值。 noti_adv_7-2_pod-init-terminal