iOS Live Activitiesのベストプラクティス

Live Activityのセットアップ

LiveActivityはiOS 16.1で導入された機能です。ActivityKitフレームワークを使用すると、ライブアクティビティを起動し、ダイナミックアイランドとロック画面でアプリケーションからのリアルタイム更新を確認できます。例えば、スポーツアプリケーションではユーザーがライブアクティビティを開始し、試合中に一瞥で更新情報を確認できます(詳細はiOSバージョン機能ガイドを参照)。

  • メインプロジェクトでActivityKitフレームワークを使用して、ライブアクティビティの開始、更新、終了を行います。ウィジェット拡張機能でSwiftUIとWidgetKitを使用してLive Activityインターフェースを作成します。
  • ライブアクティビティは、ActivityKitだけでなくリモートプッシュ通知を使用しても開始、更新、終了できます。
  • LiveActivityのリモートプッシュ通知更新機能はp12証明書をサポートしていません。ユーザーはp8証明書を構成する必要があります。

さらに、Appleは1時間あたり送信できるLiveActivityプッシュ通知の数を制限していることに注意してください。LiveActivityプッシュ通知を頻繁に更新する必要がある場合は、info.plistファイルにNSSupportsLiveActivitiesFrequentUpdatesエントリを追加し、そのブール値をYESに設定する必要があります(詳細はiOS LiveActivityを参照)。

プロジェクトへのLive Activity機能の追加

セットアップ

1. Info.plistの構成

メインプロジェクトのInfo.plistファイルにキーと値のペアを追加します。キーはNSSupportsLiveActivities、値はYESです。

alt text

2. ウィジェット拡張機能の追加

2.1 新しいターゲットの作成

File > New > Targetに移動します。

2.2 Widget Extensionを選択

alt text

2.3 ウィジェット拡張機能の構成

「Include Live Activity」のチェックボックスをオンにします。 alt text

Finishをクリックします。

Xcodeは自動的にLiveActivityを作成します。

LiveActivityWidgetAttributesはライブアクティビティの属性を定義し、可変プロパティと不変プロパティの両方を含みます。

LiveActivityWidgetLiveActivity構造体はライブアクティビティの外観をカスタマイズします。

alt text

次に、LiveActivityWidgetBundleでライブアクティビティが表示されるように設定します。 alt text

3. テスト

メインプロジェクトでライブアクティビティを開始し、そのプッシュトークンの変更を監視し、プッシュトークンをEngageLabに報告します。報告が成功すると、EngageLabのサービスを使用して電話のLiveActivityにメッセージをプッシュできます。

func startLiveActivity1() { let initialContentState = MTLAAttributes.ContentState(eventStr: "begin", eventTime: 1) let activityAttributes = MTLAAttributes(name: "LiveActivity", number: 33, tag: "") do { // アクティビティの作成 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 {
      // アクティビティの作成
      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から、Appleはプッシュ通知を使用してライブアクティビティを開始することを許可しています。これはpushToStartTokenに依存しています。pushToStartTokenUpdates関数を使用してライブアクティビティの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 { // 以前のバージョンへのフォールバック } } }
              
              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 {
        // 以前のバージョンへのフォールバック
      }
    }
}

            
このコードブロックはフローティングウィンドウ内に表示されます
icon
お問い合わせ