跳转至

高级

创建通知组

通知中心可以将通知以组的形式显示。对应同一事件的通知可以分组并折叠显示。折叠后的通知组,用户可以重新展开,属于该组的各条子通知也可以单独执行。

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

Android
iOS

iOS 媒体通知

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

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

操作过程

媒体通知功能通过 iOS 的 Notification Service Extension(以下简称 Extension)实现。 Notification Service Extension 是一种 App Extension,可以在 Remote Notification 传递给用户之前修改其 Payload,在不切换 Context 的情况下使用其他 App 的进程(UI 或功能)。 详细内容请参考以下链接。详情

  • 应用 Extension 后的 Remote Notification 传递流程

文件大小及类型限制

添加媒体文件时存在大小限制,详细内容可以在 UNNotificationAttachment 中查看。

Warning

我们发现,当使用 AVAudioSession 的应用(例如 YouTube 或各类手机游戏,如 서머너즈 워、별이되어라、체인스트라이크 等)正在运行时,如果发送通过推送接收到的音频,会导致主屏幕(Springboard)重启。该现象与 iOS 版本或设备类型无关,已确认是 Apple 系统内部发生的冲突,与 Hive 平台无关。我们已于 2018 年 12 月 20 日就该现象向 Apple 咨询,在获得应对方案之前,请停止使用媒体推送的音频传输功能

类别 类型 大小限制
音频 WAV, MP3, MP4(Audio) 5MB
图片 JPG, JPEG, PNG, GIF 10MB
视频 MP4, AVI 50MB
  • 如果因网络不畅导致超时,用户将收到不含媒体的普通 Notification。
  • 在网速非常慢的网络环境下,下载最长可能持续 10 分钟,因此需要考虑当地的网络状况,使用大小适当的媒体。

实施和利用

要下载媒体并重新构建 Notification 对象以传递给用户,需要进行一些设置并添加源代码。

Note

Notification Service Extension 无法包含在库或框架中进行分发,因此要使用 Extension,必须基于 Hive 平台提供的指南进行设置。

添加 Extension

要使用媒体通知功能,需要在项目中添加 Notification Service Extension。不是直接添加或重写类,而是采用向项目添加新目标的方式。

在项目中添加目标后,会自动生成 Template。

在 Unity 项目中添加目标

在 Unity 编辑器中,Hive SDK 会通过 PostProcess 功能自动执行添加目标、编写 Info.plist 等一系列过程。只需勾选是否使用媒体推送即可,无需其他操作。

  1. 在 Unity 编辑器顶部菜单栏中进入 Hive > Build project post process settings > iOS 菜单
  2. 启用 Push Media Contents

在 Unity 以外环境中添加目标

开始之前,请先确认以下事项。

  • 要使用推送扩展目标,请确认描述文件中是否包含 aps-environment 权限(entitlement)。如有需要,请重新签发描述文件和证书。
  • 如果通过 Xcode GUI 直接添加目标,扩展目标的最低支持目标版本默认值可能会被设置为最新 OS。请确认该值不超过主游戏 App 目标的最低支持目标版本。

添加目标的方法如下。

  1. 在 Xcode 项目设置中点击 添加目标 按钮(左下角的 + 按钮) noti_adv_1_plus-button
  2. 选择 Notification Service Extension 后,点击 Next
    (自 Xcode 8 起,可以在项目中将 Notification Service Extension 添加为目标) noti_adv_1_plus-button
  3. 输入 Product Name noti_adv_1_plus-button
  4. 出现如下弹窗时,点击 Activate
    Extension 会自动包含(Embedded)到当前项目中,并添加用于构建的 Scheme noti_adv_1_plus-button
  5. General 标签页中,确认项目已添加 Extension 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 initnoti_adv_7-2_pod-init-terminal

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

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

  3. 关闭 Podfile,并在项目路径中执行 pod installnoti_adv_7-2_pod-init-terminal

  4. 打开 NotificationSample(示例项目名).xcworkspace 后,可以看到已添加 Pods 项目,如下所示。现在可以在 NotificationSampleNotificationServiceExtension 目标中导入 HIVEExtensionsnoti_adv_7-2_pod-init-terminal

应用 Framework

在 NotificationService.swift 文件中按照示例导入 Framework。 请在模板提供的方法中实现调用 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];
}

应用时的注意事项

发送与接收时间的差异

由于 Extension 中所有作业结束后才会将 Notification 传递给用户,发送时间与接收时间之间可能出现差异,客户端会按服务器发送的时间进行显示。

例如,在 15:00 发送 Notification,若下载完成时间为 15:05,则 Notification 仍会显示为在 15:00 到达。

设备容量

通过推送接收的媒体会先存储在用户设备内部,再通过推送展示;接收到的媒体存储在设备内部的 Cache 数据空间中,会占用用户设备的内部容量。 当用户设备内部存储容量不足时,OS 会自动清除 Cache 数据空间中的数据。

用户的移动数据使用

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

通过推送接收音频/视频文件时,请在下载前确认用户的网络连接状态;若用户未连接 Wifi,则不进行下载,而是展示不含媒体的推送。

此时,通过推送接收的媒体类型以媒体 URL 末尾指定的扩展名为准进行判断,只有 [文件大小及类型限制] 项目中列明的扩展名才能正常展示。

接收到的 URL wifi LTE / 3G
http://xxx/notimovie.mp4 始终在下载后于推送中展示媒体 由于扩展名(mp4)对应视频文件,无需下载媒体即可在推送中展示
http://xxx/notimovie 始终在下载后于推送中展示媒体 由于不是音频文件/媒体文件,下载后才在推送中展示媒体
http://xxx/notisound.wav 始终在下载后于推送中展示媒体 由于扩展名(wav)对应音频文件,无需下载媒体即可在推送中展示
http://xxx/notiimage.jpg 始终在下载后于推送中展示媒体 由于不是音频文件/媒体文件,下载后才在推送中展示媒体

App Transport Security 设置

Apple 的默认策略是仅允许所有 App 执行的服务器通信使用 https,通过 Notification 接收到的 URL 也会受此策略影响。若要使用 Http 域名进行通信,需要设置 App Transport Security(以下简称 ATS)例外。
此时,即使 Application 中已配置 ATS 例外,若要在通过推送接收的 URL 中使用 http 域名,也需要在 Extension 中设置 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

推送操作按钮

推送操作按钮是指长按推送通知时显示的系统按钮,如下所示。通过在推送通知中展示这些附加按钮,可以引导用户做出反应。

Hive SDK 中可以通过简单的设置,选择性地实现推送操作按钮。

Android iOS
noti_adv_14-1_push_action_mockup_ad noti_adv_14-2_push_action_mockup_ios
Note

Hive SDK Android 无需为推送操作按钮进行额外设置,可参考 单发推送 API - ActionPayload 指南 内容使用操作按钮功能。 Hive SDK iOS 可以参考「基本实现方法」和「高级实现方法」两种方式来实现推送操作按钮。

Warning

在 Hive SDK iOS 中,若将推送操作按钮与上述 iOS 媒体通知 一起应用,iOS 媒体通知功能可能无法完整运行。发送推送时,「媒体地址」与「操作推送」两种功能请每次只使用其中一种。如果同时使用这两种功能,媒体只会以接收推送时的缩略图形式展示,长按时不会出现展开的查看器。

Warning

如果要在 Unreal Engine 中使用 iOS 推送操作,必须使用 Unreal Engine 5.3.2 起提供的 Modern Build 来构建 iOS App(已在 Unreal Engine 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 的 PostProcess 功能会自动执行添加目标、编写 Info.plist 等一系列过程。只需勾选是否使用推送操作按钮即可,无需其他操作。

  1. 在 Unity 编辑器顶部菜单栏中进入 Hive > Build project post process settings > iOS 菜单。
  2. 启用 Push Action Buttons

启用按钮后显示的列表,是下方 高级实现方法 中使用的 hive_push_actions.json 文件内 categories 字段列表的预览。若没有该文件而按基本实现进行,则会显示为 'none'。

在 Unity 以外环境中应用推送操作按钮集

开始之前,请先确认以下事项。

  • 要使用推送扩展目标,请确认描述文件中是否包含 aps-environment 权限(entitlement)。如有需要,请重新签发描述文件和证书。
  • 如果通过 Xcode GUI 直接添加目标,扩展目标的最低支持目标版本默认值可能会被设置为最新 OS。请确认该值不超过主游戏 App 目标的最低支持目标版本。

接下来,生成 Xcode 项目(.xcodeproj)后,请按以下顺序进行。

第 1 步. 添加推送扩展目标

请按以下顺序新建扩展目标并连接到 App 目标。

  1. 在 Xcode 项目设置中点击左下角的 + 按钮添加目标。 noti_adv_11_adding-content-extension_1
  2. 选择 Notification Content Extension 后点击 Nextnoti_adv_11_adding-content-extension_2
  3. 输入 Product Name,并在 Embed in Application 中分配主游戏 App 目标。 noti_adv_11_adding-content-extension_3
  4. 出现下方弹窗时,点击 Activate。当前项目会自动包含(Embedded)Extension,并添加用于构建的 Scheme。 noti_adv_11_adding-content-extension_4
  5. 在主游戏 App 目标的 General > Frameworks, Libraries, and Embedded Content 中,确认已添加上一步输入的 Product Name。 noti_adv_11_adding-content-extension_5
第 2 步. 自定义自动生成文件

请对 Product Name 分组中自动生成的以下 3 个文件分别执行下列操作。

删除 MainInterface.storyboard

删除 Product Name/MainInterface.storyboard

修改 NotificationViewController.swift

修改 Product Name/NotificationViewController.swift

noti_adv_11_adding-content-extension_6-1

如上图所示,将自动生成的模板类文件正文修改如下。可以复制并使用下面的代码块,或添加图片中以橙色高亮的行。

import UIKit
import HIVEExtensions
import UserNotifications
import UserNotificationsUI

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

修改 Info.plist

修改 Product Name/Info.plist

请按以下顺序,将下面的代码粘贴到最上层 Information Property List 行(根字典,图片中以橙色高亮的行)下方。

  1. 展开最上层 Information Property List 行,删除其下级项 NSExtension
  2. 折叠同一行后右键单击,选择 Paste(粘贴)。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSExtension</key>
    <dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>UNNotificationExtensionInitialContentSizeRatio</key>
        <integer>0</integer>
        <key>UNNotificationExtensionCategory</key>
        <array>
        <string>INFO_CATEGORY</string>
        <string>CLOSE_CATEGORY</string>
        <string>CONFIRM_CATEGORY</string>
        <string>EXECUTE_CATEGORY</string>
        <string>ACCEPT_ALL_CATEGORY</string>
        <string>ACCEPT_NOW_CATEGORY</string>
        <string>PURCHASE_CATEGORY</string>
        <string>SALE_CATEGORY</string>
        <string>ACCEPT_DECISION_CATEGORY</string>
        </array>
    </dict>
    <key>NSExtensionPrincipalClass</key>
    <string>$(PRODUCT_NAME).NotificationViewController</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.usernotifications.content-extension</string>
    </dict>
</dict>
</plist>

noti_adv_11_adding-content-extension_7

第 3 步. 填写自定义类别

上一步骤中修改的 Info.plistUNNotificationExtensionCategory 的值,是前面介绍的 Hive SDK 默认提供的类别。如果按照下方 高级实现方法hive_push_actions.json 中编写了自定义类别,请一并作为数组元素添加。

第 4 步. 添加依赖项

连接推送扩展目标所需的依赖项。如果在生成项目后已通过 CocoaPods 等方式添加,则可以省略。

  • 使用依赖管理工具添加
    • 使用 CocoaPods 时:参考指南,向推送扩展目标添加 HiveExtensions
    • 使用 Swift Package Manager 时:参考指南,向推送扩展目标添加 Hive_Extensions
  • 手动添加
    • 在 Xcode GUI 上手动添加,或编写构建流水线脚本进行连接
    • Unreal Engine 不支持单独的依赖管理工具,因此请使用此方法
    • 在扩展目标设置的 General > Frameworks and Libraries 中添加 HIVEExtensions.framework

noti_adv_11_adding-content-extension_8

在各开发环境中应用推送操作按钮集后,请在 Hive 控制台发送推送时一并指定操作
指定操作时,请使用上方推送操作按钮集列表(详细)中类别与操作的各标识符(identifier)。

有关控制台设置的详细内容,请参考控制台指南。

高级实现方法 (iOS)

请在 hive_push_actions.json 文件中定义 actionscategories 对应的值。定义完成后,将 hive_push_actions.json 文件包含在目标中并构建 App,App 运行时 Hive SDK 会自动解析文件内容,将操作与类别注册到通知中心。

hive_push_actions.json 文件的内容示例如下。

hive_push_actions.json 示例
{
    "actions": {
      "ACCEPT_ALL_ID": {
        "ar": "قبول الكل",
        "de": "Alle akzeptieren",
        "en": "Accept All",
        "es": "Aceptar todo",
        "fr": "Tout accepter",
        "id": "Terima Semua",
        "it": "Accetta tutto",
        "ja": "一括承諾",
        "ko": "일괄 수락",
        "pt": "Aceitar tudo",
        "ru": "Принять все",
        "th": "ยอมรับทั้งหมด",
        "tr": "Hepsini Kabul Et",
        "vi": "Chấp Nhận Tất Cả",
        "zh-Hans": "批量接受",
        "zh-Hant": "一鍵接受",
        "tl": "Tanggapin ang Lahat"
      },
      "ACCEPT_ID": {
        "ar": "قبول",
        "de": "Akzeptieren",
        "en": "Accept",
        "es": "Aceptar",
        "fr": "Accepter",
        "id": "Terima",
        "it": "Accetta",
        "ja": "承諾",
        "ko": "수락",
        "pt": "Aceitar",
        "ru": "Принять",
        "th": "ยอมรับ",
        "tr": "İzin Ver",
        "vi": "Chấp Nhận",
        "zh-Hans": "接受",
        "zh-Hant": "接受",
        "tl": "Tanggapin"
      },
      "ACCEPT_NOW_ID": {
        "ar": "استلام الآن",
        "de": "Jetzt erhalten",
        "en": "Claim Now",
        "es": "Recibir ahora",
        "fr": "Recevoir maintenant",
        "id": "Klaim Sekarang",
        "it": "Prendi ora",
        "ja": "今すぐ受け取る",
        "ko": "지금 받기",
        "pt": "Obter agora",
        "ru": "Получить сейчас",
        "th": "รับเลย",
        "tr": "Şimdi Al",
        "vi": "Nhận Ngay",
        "zh-Hans": "立即领取",
        "zh-Hant": "立即領取",
        "tl": "Mag-claim Ngayon"
      },
      "CANCEL_ID": {
        "ar": "تنفيذ",
        "de": "Abbrechen",
        "en": "Cancel",
        "es": "Cancelar",
        "fr": "Annuler",
        "id": "Batal",
        "it": "Annulla",
        "ja": "キャンセル",
        "ko": "취소",
        "pt": "Cancelar",
        "ru": "Отменить",
        "th": "ยกเลิก",
        "tr": "İptal",
        "vi": "Hủy",
        "zh-Hans": "取消",
        "zh-Hant": "取消",
        "tl": "Kanselahin"
      },
      "CLOSE_ID": {
        "ar": "إغلاق",
        "de": "Schließen",
        "en": "Close",
        "es": "Cerrar",
        "fr": "Fermer",
        "id": "Tutup",
        "it": "Chiudi",
        "ja": "閉じる",
        "ko": "닫기",
        "pt": "Fechar",
        "ru": "Закрыть",
        "th": "ปิด",
        "tr": "Kapat",
        "vi": "Đóng",
        "zh-Hans": "关闭",
        "zh-Hant": "關閉",
        "tl": "Isara"
      },
      "CONFIRM_ID": {
        "ar": "موافق",
        "de": "OK",
        "en": "OK",
        "es": "Confirmar",
        "fr": "Voir",
        "id": "OK",
        "it": "Ok",
        "ja": "OK",
        "ko": "확인",
        "pt": "Confirmar",
        "ru": "OK",
        "th": "ตกลง",
        "tr": "TAMAM",
        "vi": "OK",
        "zh-Hans": "确认",
        "zh-Hant": "確認",
        "tl": "Sige"
      },
      "DECLINE_ID": {
        "ar": "رفض",
        "de": "Ablehnen",
        "en": "Decline",
        "es": "Rechazar",
        "fr": "Refuser",
        "id": "Tolak",
        "it": "Rifiuta",
        "ja": "拒否する",
        "ko": "거절하기",
        "pt": "Recusar",
        "ru": "Отклонить",
        "th": "ปฏิเสธ",
        "tr": "Reddet",
        "vi": "Từ Chối",
        "zh-Hans": "拒绝",
        "zh-Hant": "拒絕",
        "tl": "Tanggihan"
      },
      "EXECUTE_ID": {
        "ar": "إلغاء",
        "de": "Ausführen",
        "en": "Run",
        "es": "Ejecutar",
        "fr": "Exécuter",
        "id": "Jalankan",
        "it": "Avvia",
        "ja": "実行",
        "ko": "실행",
        "pt": "Executar",
        "ru": "Запустить",
        "th": "ดำเนินการ",
        "tr": "Devam Et",
        "vi": "Kích Hoạt",
        "zh-Hans": "执行",
        "zh-Hant": "執行",
        "tl": "Tumakbo"
      },
      "HOLDING_ID": {
        "ar": "الاختيار لاحقًا",
        "de": "Halten",
        "en": "Hold",
        "es": "Pendiente",
        "fr": "En attente",
        "id": "Tahan",
        "it": "Rimanda",
        "ja": "保留",
        "ko": "보류",
        "pt": "Manter",
        "ru": "Отложить",
        "th": "พักไว้",
        "tr": "Tut",
        "vi": "Tạm Hoãn",
        "zh-Hans": "暂缓",
        "zh-Hant": "保留",
        "tl": "Hawakan"
      },
      "PURCHASE_ID": {
        "ar": "شراء",
        "de": "Kaufen",
        "en": "Purchase",
        "es": "Comprar",
        "fr": "Acheter",
        "id": "Beli",
        "it": "Compra",
        "ja": "購入する",
        "ko": "구매하기",
        "pt": "Comprar",
        "ru": "Купить",
        "th": "ซื้อ",
        "tr": "Satın Al",
        "vi": "Mua",
        "zh-Hans": "购买",
        "zh-Hant": "購買",
        "tl": "Pagbili"
      },
      "REJECT_ID": {
        "ar": " رفض",
        "de": "Ablehnen",
        "en": "Decline",
        "es": "Rechazar",
        "fr": "Refuser",
        "id": "Tolak",
        "it": "Rifiuta",
        "ja": "拒否",
        "ko": "거절",
        "pt": "Recusar",
        "ru": "Отклонить",
        "th": "ปฏิเสธ",
        "tr": "Reddet",
        "vi": "Từ Chối",
        "zh-Hans": "拒绝",
        "zh-Hant": "拒絕",
        "tl": "Tanggihan"
      },
      "SALE_ID": {
        "ar": "بيع",
        "de": "Verkaufen",
        "en": "Sell",
        "es": "Vender",
        "fr": "Vendre",
        "id": "Jual",
        "it": "Vendi",
        "ja": "販売する",
        "ko": "판매하기",
        "pt": "Vender",
        "ru": "Продать",
        "th": "ขาย",
        "tr": "Sat",
        "vi": "Bán",
        "zh-Hans": "出售",
        "zh-Hant": "販售",
        "tl": "Ibenta"
      }
    },
    "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 个
  • 上述示例是针对默认提供的按钮集的定义。若自定义操作按钮 使用了相同的 identifier 将无法被识别,请使用不重复且可区分的字符串。
  • 多语言遵循 「游戏语言」,最多可以输入 Hive SDK 支持的 17 种语言。英文("en")是多语言字符串的默认值,因此请务必添加。
Note

支持 Unity PostProcess。在 Unity 项目中 hive_config.xml 文件所在路径下添加 hive_push_actions.json 文件后,构建 Xcode 项目时会自动将 hive_push_actions.json 文件添加到 App 目标中。

Warning

编写内容后,请将内容中 "categories" 字段的 key 添加到 Notification Content Extension 的 Info.plist 中的 UNNotificationExtensionCategory
在 Unity 环境下,会自动解析文件内容并添加。

常见问题

即使已包含文件,自定义操作按钮仍未出现的情况
  • 请确认文件名是否为 'hive_push_actions.json'。
  • 请确认是否也已包含在 Copy Bundle Resources 中。 noti_adv_15-1_push_action_faq1