高级
通知群組建立¶
在通知中心中,可以將通知顯示為群組。相同事件的通知可以進行分組並縮小顯示。縮小的通知群組可以由用戶再次展開,並且子通知(屬於該群組的每個通知)可以單獨執行。
通知群組可以通過在控制台 > 通知 > 推送 v4 > 推送活動註冊 > 活動註冊 > 選項 > 群組鍵中將群組鍵設置為使用並添加鍵值來創建。在控制台創建群組後,當發送 本地推送 和遠程推送時,可以使用 groupId
應用通知群組。應用群組後,通知將按群組縮小顯示,如下所示。
| |
iOS 媒體通知¶
利用 Apple 的 UserNotifications 框架,可以在通知中添加圖片、視頻等媒體文件。
動作過程¶
此功能是利用 iOS 的 通知服务扩展(以下简称扩展)来实现的。 通知服务扩展是一种应用扩展,允许在将远程通知传递给用户之前修改有效负载,可以在不切换上下文的情况下使用其他应用的进程(UI 或功能)。 有关详细信息,请参阅 详细信息。
檔案容量及類型限制¶
附加媒體文件時有容量限制,詳細內容可在UNNotificationAttachment中查閱。
Warning
當使用AVAudioSession的應用程式(例如Youtube或各種手機遊戲,如《召喚師之戰》、《變星》、《鏈接打擊》等)正在運行時,發現當傳送透過推播收到的音訊時,主畫面(Springboard)會重新啟動。這種情況無論在iOS版本或設備類型上都會發生,並且已確認是Apple系統內部的衝突,與Hive無關。
截至2018年12月20日,已向Apple詢問該現象,並在對應措施制定之前,請暫停使用透過媒體推播傳送音訊的功能。
分類 | 類型 | 限制容量 |
---|---|---|
圖片 | JPG, JPEG, PNG, GIF | 10MB |
視頻 | MP4, AVI | 50MB |
- 如果网络不畅导致超时,用户将收到不包含媒体的普通通知。
- 在非常慢的网络中,下载可能会持续长达10分钟,因此应考虑该地区的网络状态,使用适当容量的媒体。
實現與應用¶
下載媒體並重構通知對象,以便將其傳遞給用戶,需要進行一些設置和源代碼的添加。
Note
通知服務擴展無法作為庫或框架進行分發,因此使用擴展時必須根據Hive提供的指南進行設置。
添加擴展¶
要使用此功能,您需要在项目中添加Notification Service Extension,并使用添加新目标的方式,而不是直接添加或覆盖类。
在項目中添加目標後,將自動生成模板。
2. 選擇 Notification Service Extension,然後點擊 Next
(從 Xcode 8 開始,可以將 Notification Service Extension 作為目標添加到項目中)
4. 當出現如下的彈出窗口時,請點擊 Activate
當前項目將自動包含(Embedded)Extension,並添加用於構建的 Scheme
6. 專案中新增名為 NotificationService 的模板類別
添加 HIVEExtensions.framework¶
利用Hive提供的**HIVEExtensions.framework**,可以輕鬆下載媒體。
HIVEExtensions.framework 的添加方法如下。
-
Hive SDK 支援 CocoaPods。如果專案路徑中沒有 Podfile,請執行 pod init。
如果有 Podfile,請打開文件並編寫 target 'NotificationServiceExtension(示例目標名稱)' do-end 語句。
-
打開 NotificationSample(示例項目名稱).xcworkspace,您將看到 Pods 項目已被添加。現在可以在 NotificationSample 和 NotificationServiceExtension 目標中導入 HIVEExtensions。
框架應用¶
在 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 | 始終在下載後將媒體顯示在推送中 | 不是音頻文件/媒體文件,因此在下載後將媒體顯示在推送中 |
App Transport Security 設定¶
Apple的基本政策是所有應用程式進行的伺服器通信必須允許使用https,而透過Notification傳遞的URL也受到該政策的影響。如果想要使用Http域進行通信,則需要進行App Transport Security(以下簡稱ATS)例外設置。
在這種情況下,即使Application已經處理了ATS例外,為了在推送中使用http域的URL,仍需在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值。