跳转至

高级

创建通知组

您可以在通知中心以组的形式显示通知。对应于同一事件的通知可以被分组并以折叠的形式显示。用户可以再次展开折叠的通知组,并且可以单独执行每个属于该组的个别通知。

通过将组键更改为启用并在控制台 > 通知 > 推送 v4 > 注册推送活动 > 活动注册 > 选项 > 组键中添加键值,可以创建通知组。在控制台中创建组后,您可以在发送本地推送和远程推送通知时使用groupId应用通知组。当组被应用时,通知将按组折叠显示,如下所示。

安卓
iOS
</tbody>

iOS 媒体通知

通过利用苹果的 UserNotifications 框架,您可以将媒体文件,如图像和视频,添加到通知中。

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

操作过程

媒体通知功能使用 iOS 的 通知服务扩展(以下简称扩展)进行操作。

通知服务扩展是一种应用扩展,允许您在远程通知发送给用户之前修改有效负载,从而在不切换上下文的情况下使用其他应用的进程(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提供的指南进行设置。

添加扩展

要使用媒体通知功能,您需要向项目中添加一个通知服务扩展。不要直接添加或覆盖类,而是向项目添加一个新目标。

当您添加一个目标时,会自动创建一个模板。

<summary>在Unity项目中添加目标</summary>
在Unity编辑器中,Hive SDK会自动使用PostProcess功能执行目标添加和Info.plist创建过程。您只需启用媒体推送选项;不需要其他手动步骤。

1. 在Unity编辑器菜单栏中,转到 <b>Hive > 构建项目后处理设置 > iOS</b>
2. 启用 <b>推送媒体内容</b>
<summary>在非Unity环境中添加目标</summary>
1. 在Xcode项目设置中,点击<b>添加目标</b>按钮(左下角的<i>*+*</i>按钮)
![noti_adv_1_plus-button](../img/noti_adv_1_plus-button.png){width="700px"}

2. 选择 <b>通知服务扩展</b> 并点击 <b>下一步</b> <br>
(自 Xcode 8 起,您可以将通知服务扩展作为项目中的目标添加)
![noti_adv_1_plus-button](../img/noti_adv_2_template.png){width="700px"}

3. 输入<b>产品名称</b>
![noti_adv_1_plus-button](../img/noti_adv_3_create.png){width="700px"}

4. 当弹出窗口出现时,点击 <i>*激活*</i> <br>
扩展将自动嵌入当前项目,并将添加构建方案。
![noti_adv_1_plus-button](../img/noti_adv_4_activate.png){width="700px"}

5. 在<i>*常规<b>选项卡中,检查</b>扩展<b>是否已添加到项目中
![noti_adv_1_plus-button](../img/noti_adv_5_general-frameworks.png){width="700px"}

6. 确认</b>NotificationService<b>模板类已添加到项目中
![noti_adv_1_plus-button](../img/noti_adv_6_template-source.png){width="700px"}


添加 HIVEExtensions.framework

您可以轻松地使用Hive提供的HIVEExtensions.framework下载媒体。

添加HIVEExtensions.framework*的方法如下:

  1. Hive SDK 支持 CocoaPods。如果您的项目目录中没有 Podfile,请运行 pod initnoti_adv_7-2_pod-init-terminal

如果您已经有一个 Podfile,请打开该文件并添加目标 'NotificationServiceExtension (示例目标名称)' do-end 语句。 noti_adv_7-2_pod-init-terminal

  1. 请参考截图并写出 pod 语句。 noti_adv_7-2_pod-init-terminal

  2. 关闭 Podfile 并在您的项目目录中运行 pod installnoti_adv_7-2_pod-init-terminal

  3. 当你打开 NotificationSample (示例项目名称).xcworkspace 时,你会看到 Pods 项目已被添加,如下所示。现在你可以在 NotificationSample 和 NotificationServiceExtension 目标中导入 HIVEExtensionsnoti_adv_7-2_pod-init-terminal

应用框架

在 NotificationService.swift 文件中导入框架,如示例所示。 实现模板中提供的方法,以调用 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到达。

设备容量

通过推送通知接收的媒体存储在用户的设备上,然后通过推送进行展示,接收到的媒体存储在设备的内部缓存数据空间中,占用用户设备的内部容量。如果用户设备的内部存储容量不足,操作系统会自动清除缓存数据空间。

用户的移动数据使用情况

通过推送通知接收到的媒体将使用用户的移动数据进行下载,下载将在未经用户同意的情况下进行,这可能会在下载过程中产生数据使用费用。

在通过推送交付音频/视频文件的情况下,在下载之前检查用户的网络连接状态。如果用户未连接到 Wi-Fi,请不要继续下载,而是显示没有媒体的推送通知。

此时,通过推送接收到的媒体类型由媒体 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 域进行通信,则需要设置应用程序传输安全性 (ATS) 例外。
即使应用程序具有 ATS 例外处理,您也必须在扩展中设置 ATS 例外,以便对通过推送通知传输的 URL 使用 http 域。

当媒体未在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中,可能会出现媒体未传送的情况,同时显示如上所示的错误日志。在这种情况下,请检查创建的扩展目标的架构中是否包含armv7和arm64值。
noti_adv_7-2_pod-init-terminal

推送操作按钮

推送操作按钮是系统按钮,当您长按推送通知时会出现,如下所示。通过在推送通知中显示这些额外的按钮,您可以鼓励用户互动。

使用 Hive SDK,您可以通过简单的配置轻松实现推送操作按钮。

安卓 iOS
noti_adv_14-1_push_action_mockup_ad noti_adv_14-2_push_action_mockup_ios
Note

Android SDK 中的推送操作按钮无需额外设置。有关使用操作按钮功能的详细信息,请参阅 单推送 API - ActionPayload 指南。对于 iOS SDK,您可以使用基本或高级实现方法来实现推送操作按钮。

Warning

在 iOS SDK 中将推送操作按钮与 iOS 媒体通知 一起使用时,媒体通知功能可能无法正常工作。发送推送时,每次只能使用一个功能——要么是“媒体 URL”,要么是“操作推送”。如果同时使用这两者,接收时只会显示媒体缩略图,长按时不会出现扩展查看器。

Warning

要在虚幻引擎中使用 iOS 推送操作,您必须使用虚幻引擎 5.3.2 或更高版本提供的 现代构建 系统构建您的 iOS 应用(在虚幻引擎 5.6.0 / XCode 16.1 / macOS 15.5 上测试)。

基本实现 (iOS)

Hive SDK 提供了一组基于常用模式的默认推送操作按钮,例如“确认”、“拒绝”等。这些内置按钮组合可以快速应用,您还可以根据需要定义和扩展自定义操作按钮集。默认的推送操作按钮集如下所示。

  • 确认
  • 关闭
  • 确认,关闭
  • 执行,取消
  • 接受所有,关闭
  • 立即索赔,关闭
  • 购买,拒绝
  • 出售,拒绝
  • 接受,拒绝,保持
类别(类别标识符) 按钮名称(操作标识符)
确认(INFO_CATEGORY) 确认(CONFIRM_ID)
关闭(CLOSE_CATEGORY) 关闭(CLOSE_ID)
确认选择(CONFIRM_CATEGORY) 确认(CONFIRM_ID), 关闭(CLOSE_ID)
执行(EXECUTE_CATEGORY) 执行(EXECUTE_ID), 取消(CANCEL_ID)
批量接受(ACCEPT_ALL_CATEGORY) 接受全部(ACCEPT_ALL_ID), 关闭(CLOSE_ID)
立即索赔(ACCEPT_NOW_CATEGORY) 立即索赔(ACCEPT_NOW_ID), 关闭(CLOSE_ID)
购买决定(PURCHASE_CATEGORY) 购买(PURCHASE_ID), 拒绝(DECLINE_ID)
销售请求(SALE_CATEGORY) 出售(SALE_ID), 拒绝(DECLINE_ID)
决策(ACCEPT_DECISION_CATEGORY) 接受(ACCEPT_ID), 拒绝(REJECT_ID), 保留(HOLDING_ID)

不需要额外的代码来应用这些推送操作按钮集,但您必须向您的项目添加一个 Notification Content Extension 目标。请参阅下面的“推送操作按钮集应用指南”,以便在您的开发环境中添加目标并激活推送操作按钮。

在Unity中应用推送操作按钮集

在Unity编辑器中,Hive SDK的后处理功能会自动处理目标添加和Info.plist的创建。只需勾选使用推送操作按钮的选项;不需要其他手动步骤。

  1. 在 Unity 编辑器菜单栏中,转到 Hive > 构建项目后处理设置 > iOS
  2. 启用 推送操作按钮
    启用按钮时显示的列表预览了 hive_push_actions.json 文件中的 categories 字段,该文件在 高级实现 中使用。如果您在没有此文件的情况下继续使用默认实现,将显示“无”。
在非Unity环境中应用推送操作按钮集

生成Xcode项目(.xcodeproj)后,请按照以下步骤操作:

  1. 在 Xcode 项目设置中,点击左下角的 + 按钮以添加目标。 noti_adv_11_adding-content-extension_1
  2. 选择通知内容扩展,然后点击 下一步noti_adv_11_adding-content-extension_2
  3. 输入产品名称,并将您的主游戏应用目标分配给“嵌入到应用程序”。 noti_adv_11_adding-content-extension_3
  4. 当弹出窗口出现时,点击 激活。扩展将自动嵌入当前项目,并将添加构建方案。 noti_adv_11_adding-content-extension_4
  5. 在主游戏应用目标的 常规 > 框架、库和嵌入内容 中,确认您输入的产品名称已被添加。 noti_adv_11_adding-content-extension_5
  6. 在产品名称路径下,检查模板类文件 NotificationViewController.swift 是否已自动创建,如下所示。 noti_adv_11_adding-content-extension_6-1 确认模板类文件后,按如下方式修改此文件中的代码:
    import UIKit
    import HIVEExtensions
    import UserNotifications
    import UserNotificationsUI
    
    @objc(NotificationController)
    class NotificationViewController: UIViewController, UNNotificationContentExtension {
    
          func didReceive(_ notification: UNNotification) {
              HiveNotificationContent.didReceive(notification)
          }
    
          func didReceive(_ response: UNNotificationResponse) async -> UNNotificationContentExtensionResponseOption {
              await HiveNotificationContent.didReceive(response)
          }
    
    }
    
    编辑下图中橙色高亮的行。 noti_adv_11-adding-content-extension_6-2
  7. 删除以下自动生成的文件:
    • 产品名称/Info.plist
    • 产品名称/MainInterface.storyboard noti_adv_11_adding-content-extension_7
  8. 在扩展目标的 Info 选项卡中,配置 Info.plist 键值:
    • NSExtension/NSExtensionAttributes/UNNotificationExtensionCategory 类型更改为 Array,然后将 SDK 预定义类别 ID来自您文件的自定义类别 ID 添加到列表中。
    • NSExtension/NSExtensionAttributes/UNNotificationExtensionInitialContentSizeRatio 设置为 0
    • 添加 NSExtension/NSExtensionPrincipalClass 键,并将步骤 6 中定义的类名 (NotificationViewController.swift) 作为值输入 (默认: NotificationViewController)
    • 删除 NSExtension/NSExtensionMainStoryboard 键。 noti_adv_11_adding-content-extension_8
  9. 在扩展目标的 常规 > 库和框架 中,添加所需的框架:
    • HIVEExtensions (如果已经通过 CocoaPods 添加,则跳过)
    • UIKit
    • NotificationCenter noti_adv_11_adding-content-extension_9

一旦您在开发环境中应用了设置的推送操作按钮,请在控制台发送推送时指定操作。
在指定操作时,请使用上面详细列表中的类别和操作标识符。

有关控制台设置的更多详细信息,请参阅控制台指南。

高级实现 (iOS)

hive_push_actions.json 文件中定义 actionscategories 的值。定义后,将 hive_push_actions.json 文件包含在您的目标中并构建应用程序。当应用程序运行时,Hive SDK 会自动解析该文件并在通知中心注册操作和类别。

下面显示了hive_push_actions.json文件的示例。

hive_push_actions.json 示例
{
    "actions": {
        "ACCEPT_ALL_ID": { ... },
        "ACCEPT_ID": { ... },
        "ACCEPT_NOW_ID": { ... },
        "CANCEL_ID": { ... },
        "CLOSE_ID": { ... },
        "CONFIRM_ID": { ... },
        "DECLINE_ID": { ... },
        "EXECUTE_ID": { ... },
        "HOLDING_ID": { ... },
        "PURCHASE_ID": { ... },
        "REJECT_ID": { ... },
        "SALE_ID": { ... }
    },
    "categories": {
        "INFO_CATEGORY": ["CONFIRM_ID"],
        "CLOSE_CATEGORY": ["CLOSE_ID"],
        "CONFIRM_CATEGORY": ["CONFIRM_ID", "CLOSE_ID"],
        "EXECUTE_CATEGORY": ["EXECUTE_ID", "CANCEL_ID"],
        "ACCEPT_ALL_CATEGORY": ["ACCEPT_ALL_ID", "CLOSE_ID"],
        "ACCEPT_NOW_CATEGORY": ["ACCEPT_NOW_ID", "CLOSE_ID"],
        "PURCHASE_CATEGORY": ["PURCHASE_ID", "DECLINE_ID"],
        "SALE_CATEGORY": ["SALE_ID", "DECLINE_ID"]
    }
}

写文件的注意事项:

  • 每个类别(集合)最多可以有 3 个按钮。
  • 上面的示例定义了默认按钮集合。对于自定义操作按钮,请勿使用重复的标识符;使用唯一且可区分的字符串。
  • 多语言支持遵循 游戏语言,您可以输入最多 16 种由 Hive SDK 支持的语言。英语("en")是多语言字符串的默认值
Note

Unity PostProcess 是支持的。如果您将 hive_push_actions.json 文件添加到 Unity 项目中与 hive_config.xml 相同的路径,它将在构建 Xcode 项目时自动添加到应用目标中。

Warning

写入文件后,将文件中“categories”字段的键添加到Notification Content Extension的Info.plist中的UNNotificationExtensionCategory
在Unity中,这通过分析文件自动完成。

常见问题

如果自定义操作按钮在包含文件后仍然不出现
  • 检查文件名是否为'hive_push_actions.json'。
  • 确保它包含在“复制捆绑资源”中。 noti_adv_15-1_push_action_faq1