【SwiftUI】LiveActivityを実装する part 1(iOS16.1)

未分類

LiveActivityはiOS16.1から実装される機能です。
Dynamic Islandやロックスクリーンに色々と表示出来て便利ですので、
ぜひ使いこなせる様になりましょう。

今回はLiveActivityを実装する方法について紹介します。
part 1ではLiveActivityをプロジェクトに追加し、シミュレータで表示する所まで行います。

LiveActivityの更新や表示されるViewについての詳細はpart 2以降に紹介します。

開発環境・動作環境について

2022/10/25に正式リリース予定なので、以降に読んでいる方は読み飛ばして下さい。

今回は正式リリース前なのでXcode14.1RCを使用しています。
シミュレータも付属のものを使用しています。

実機は使用していませんが、必要な場合はRC版を使用して下さい。

Xcode14.1betaでもLiveActivityは使用出来ますが、
RC版のからWidget作成時にLive Activityのコードを生成する機能がついているので、RC版を使用した方が楽です。

LiveActivityを実装する

Info.plistへの追記

まずはアプリのInfo.plistにLiveActivityの許可設定を追記します。
これを怠ると例外が出てLiveActivityの表示が出来ません。

Supports Live Activitiesを追加しValueをYesにして下さい。
コードで直に書く場合はNSSupportsLiveActivitiesです。

許可しなかった場合の例外にあるエラーメッセージは以下の通りです。
「com.apple.ActivityKit.ActivityInput error 1.」
このメッセージは他のパターンでも同じものを使っているので忘れると面倒です。
必ずInfo.plistへの追記を忘れないようにしましょう。

Widgetを追加する

LiveActivityはWidget Extensionに含まれます。
LiveActivityで個別に項目がある訳でないので注意しましょう。

先程と同じくプロジェクト設定の下部にあるTargetの追加ボタンから追加します。
沢山あってWidget Extensionを探すのが面倒なので検索をすると良いです。

追加時にProduct Nameを入力する画面で「Include Live Activity」の項目があります。
LiveActivityのコードを生成してくれて便利なのでチェックは入れたままにしましょう。

WidgetとLiveActivityのコードが生成されました。

〜WidgetBundleはWidgetやLiveActivityを複数使う時に必要になるものです。
〜WidgetLiveActivityがLiveActivityのコードが書いてあるファイルです。
〜WidgetにはWidgetのコードが書いてあります。

Widgetを使用不可にする

このままではデフォルトで生成されたWidgetが使用可能な状態となっています。
使用しない場合は消す必要があります。

WidgetBundleには使用するWidgetとLiveActivityが書いてあります。
追加する場合はここに追記し、削除する場合はここから消します。
今回はWidgetを使用しないのでコメントアウトしてしまいましょう。

import WidgetKit
import SwiftUI

@main
struct LiveActivityForBlogWidgetBundle: WidgetBundle {
    var body: some Widget {
//        LiveActivityForBlogWidget()
        LiveActivityForBlogWidgetLiveActivity()
    }
}

Target Membershipの追加

デフォルトのままですがLiveActivityが使用できる様になりました。
一旦どんなものか表示してみたい所ですが、LiveActivityはWidgetと異なり、
アプリ側から表示を行う必要があります。

LiveActivityを表示する為にはActivityAttributesが必要になって来ます。
先程の〜WidgetLiveActivityファイルにありました。

struct LiveActivityForBlogWidgetAttributes: ActivityAttributes {
    public struct ContentState: Codable, Hashable {
        // Dynamic stateful properties about your activity go here!
        var value: Int
    }

    // Fixed non-changing properties about your activity go here!
    var name: String
}

そのままではアプリ側で使用出来ないので、アプリ側にコードを書く前にActivityAttributesを使用できる様にします。

〜WidgetLiveActivityファイルを開き、左のペインからTarget Membershipを追加します。

アプリのTargetにチェックを入れましょう。
これでアプリ側でも〜WidgetLiveActivityを参照できる様になり、
ActivityAttributesが使える様になります。

LiveActivityを表示する

ひとまずLiveActivityを表示してみましょう。

ContentViewにボタンを設置し、押すとLiveActivityを表示する様にします。

内容は至って単純で、AttributesとAttributes.ContentStateをActivity.requestの引数に渡すだけです。
AttributesとAttributes.ContentStateの中身については、
まだ表示する様になっていないのでなんでも良いです。

import SwiftUI
import ActivityKit

struct ContentView: View {
    var body: some View {
        VStack {
            Button("Request LiveActivity"){
                do {
                    let attributes = LiveActivityForBlogWidgetAttributes(name: "TestName")
                    let contentState = LiveActivityForBlogWidgetAttributes.ContentState(value: 1)
                    _ = try Activity.request(attributes: attributes, contentState: contentState)
                } catch (let error) {
                    print("Error requesting Live Activity \(error.localizedDescription).")
                }
            }
        }
        .padding()
    }
}

Request LiveActivityボタンを押すとLiveActivityが発行されます。
ホーム画面や他のアプリ使用中、ロックスクリーンに表示されます。

ホーム画面や他のアプリ使用中はDynamic Islandに表示されます。
普段は小さく表示され、タップすると大きく表示されます。

ロックスクリーンには以下の様に表示されます。
通知の様にスワイプして削除することも出来ます。

ロックスクリーンのLiveActivityを許可する

ロックスクリーンのLiveActivityは初回に表示についての可否ボタンが表示されます。
この時、オフにすると以降は設定を変更するまでLiveActivityが使えなくなります。
インスタンス1つに対してでなく、アプリ全体の設定なので注意して下さい。

要は初回通知設定時のアラートと同じ様なものなのですが、
他と異なり、request時にアラートを出さず動作し、
ロックスクリーンにだけボタンが出る形式なので分かり難いです。

ユーザーも間違える可能性があると思うので、
アプリ内で説明した方が良いかもしれません。

拒否してしまった場合はrequest時に以下の例外が発生します。
「com.apple.ActivityKit.ActivityInput error 1.」
Info.plistで許可を忘れた場合と同じなので注意して下さい。

設定を変更する場合は設定アプリから行います。
変更方法については通知やATTなどと同じですね。

最後に

LiveActivityを実装する part 1は以上となります。

ProjectにLiveActivityを追加し実行する所までを紹介しました。
part 2ではWidget Extension側に実装するLiveActivityのViewやDeepLinkについて紹介しています。

コメント

  1. […] 【SwiftUI】LiveActivityを実装する part 1(iOS16.1)LiveActivityはiOS16.1から実装され… […]

  2. […] 【SwiftUI】LiveActivityを実装する part 1(iOS16.1)LiveActivityはiOS16.1から実装され… […]

タイトルとURLをコピーしました