iOS實時活動最佳實踐

最新更新:2024-06-27

實時活動設置

LiveActivity 是 iOS 16.1 推出的功能。借助 ActivityKit 框架,您可以啟動實時活動以在靈動島和鎖定屏幕上看到來自您的應用程序的實時更新內容。例如,體育應用程序允許用戶啟動實時活動,在比賽期間通過實時活動可以一目瞭然地看到信息的更新(詳情參考 iOS 版本特性指南)。

  • 在主工程中使用 ActivityKit 框架來開啟、更新、結束實時活動。在 widget extension 中使用 SwiftUI 和 WidgetKit 來創建 Live Activity 的界面。
  • 開啟、更新、結束實時活動不僅可以使用 ActivityKit 實現,也可以使用遠程推送來實現。
  • LiveActivity 遠程推送更新功能,不支持 p12 證書。需要用戶配置 p8 證書。

此外,還需要注意:蘋果對每小時發送的 LiveActivity 推送通知會有數量上的限制。若您有頻繁更新 LiveActivity 推送通知的需求,需要在 info.plist 文件裡面添加 NSSupportsLiveActivitiesFrequentUpdates 條目,並將其布爾值設置為 YES(更多信息請參考 iOS LiveActivity)。

為您的項目添加實時活動功能

設置

1. 設置 Info.plist

在主工程的 Info.plist 文件中添加一個鍵值對,key 為 NSSupportsLiveActivities,value 為 YES;

alt text

2. 添加一個 Widget Extension

2.1 新建一個 Target

Go to File > New > Target.

2.2 選擇 Widget Extension

alt text

2.3 設置 Widget Extension

請勾選 inclue Live Activity

alt text

點擊 Finish

這時 XCode 已經幫我們創建了一個 LiveActivity。

LiveActivityWidgetAttributes 為屬性,裡面可以定義實時活動的可改變的和不可改變的屬性值。

結構體 LiveActivityWidgetLiveActivity 裡對實時活動的樣式進行了自定義。 alt text

然後在 LiveActivityWidgetBundle 裡面允許該實時活動展現。 alt text

3. 測試

在主工程中啟動一個 liveActivity,並監聽它的 pushtoken 的變化,並將 pushtoken 上報到 EngageLab。上報成功後你就可以使用 EngageLab 的服務給手機上的 LiveActivity 推送消息了。

func startLiveActivity1() { let initialContentState = MTLAAttributes.ContentState(eventStr: "begin", eventTime: 1) let activityAttributes = MTLAAttributes(name: "LiveActivity", number: 33, tag: "") do { // 創建 Activity let activity = try Activity.request(attributes: activityAttributes, contentState: initialContentState, pushType: PushType.token) // 監聽 pushToken 變化 Task { for await pushtoken in activity.pushTokenUpdates { let pushtokenstr = pushtoken.map { String(format: "%02.2hhx", arguments: [$0]) }.joined() // 向 EngageLab 註冊 liveactivity,在推送平台通過 liveactivityId 推送通知進行更新 MTPushService.registerLiveActivity("my_define_liveactivity_id", pushToken: pushtoken, completion: { code, liveactivityId, token, seq in print("result:\(code)") }, seq: 1) } } } catch { print("Error requesting Live Activity \(error.localizedDescription).") } }
          func startLiveActivity1() {
    
    let initialContentState = MTLAAttributes.ContentState(eventStr: "begin", eventTime: 1)
    let activityAttributes = MTLAAttributes(name: "LiveActivity", number: 33, tag: "")
    
    do {
      // 創建 Activity
      let activity = try Activity.request(attributes: activityAttributes, contentState: initialContentState, pushType: PushType.token)
      
      // 監聽 pushToken 變化
      Task {
        for await pushtoken in activity.pushTokenUpdates {
          let pushtokenstr = pushtoken.map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
          // 向 EngageLab 註冊 liveactivity,在推送平台通過 liveactivityId 推送通知進行更新
          MTPushService.registerLiveActivity("my_define_liveactivity_id", pushToken: pushtoken, completion: { code, liveactivityId, token, seq in
            print("result:\(code)")
          }, seq: 1)
        }
      }
      
    } catch {
      print("Error requesting Live Activity \(error.localizedDescription).")
    }
  }

        
此代碼塊在浮窗中顯示
  • 從 iOS 17.2 開始,蘋果允許使用推送啟動一個 liveactivity,這個操作依賴於 pushToStartToken。監聽 pushToStartTokenUpdates 函數獲取 liveactivity 的 pushToStartToken 的變化,並將其上報到 EngageLab。
func pushToStart() { Task { if #available(iOS 17.2, *) { var beforeToken = "" for await pushtoken in Activity<MTLAAttributes>.pushToStartTokenUpdates { let pushtokenstr = pushtoken.map { String(format: "%02.2hhx", arguments: [$0]) }.joined() print("pushToStartToken: MTLAAttributes -> \(pushtokenstr)") if beforeToken == pushtokenstr { return } beforeToken = pushtokenstr MTPushService.registerLiveActivity("MTLAAttributes", pushToStartToken: pushtoken, completion: { code, alias, token, seq in print("register MTLAAttributes pushToStartToken result: \(pushtokenstr) result:\(code) seq:\(seq)") }, seq: seq()) } } else { // Fallback on earlier versions } } }
          func pushToStart() {
    Task {
      if #available(iOS 17.2, *) {
        var beforeToken = ""
        for await pushtoken in Activity<MTLAAttributes>.pushToStartTokenUpdates {
          
          let pushtokenstr = pushtoken.map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
          print("pushToStartToken: MTLAAttributes -> \(pushtokenstr)")
          if beforeToken == pushtokenstr {
            return
          }
          beforeToken = pushtokenstr
          
          MTPushService.registerLiveActivity("MTLAAttributes", pushToStartToken: pushtoken, completion: { code, alias, token, seq in
            print("register MTLAAttributes pushToStartToken result: \(pushtokenstr) result:\(code) seq:\(seq)")
          }, seq: seq())
        }
      } else {
        // Fallback on earlier versions
      }
    }
}

        
此代碼塊在浮窗中顯示
在文档中心打开
Contact Sales