📖

【Swift】Dynamic island をとりあえず使ってみる

2022/12/13に公開

SwiftKotlin愛好会アドベントカレンダー14日目の記事です。
https://qiita.com/advent-calendar/2022/love_swift_kotlin

概要

ライブアクティビティを表示するための仕組みとしてiPhone14 Proから新しく追加されたDynamic islandを使ってみる記事です。

いくつかチュートリアルがあったのですが、UIの作成などが多く、とりあえず動かすという観点からは複雑すぎるものが多かったので、最小限のコードで表示させてみるところまでの手順を紹介します。

ソースコードはこちら

https://github.com/akinoriakatsuka/ios-dynamic-island-sample

環境

MacOS Version 13.0.1(22A400)
Xcode Version 14.1 (14B47b)

手順

プロジェクトの作成

PlatformはiOS
Applicationはappを選択

プロジェクト名はここでは、LiveActivitiesとする

Targetの追加

Target名はここでは、OrderStatusとする

エクステンションのschemeを有効にするか聞かれるので、Cancelと答える

Target Membershipの追加

OrderStatusLiveActivity.swiftをメインのプロジェクトから参照できるようにTargetMembershipのLiveActivitiesにチェックをつける

info.plistにNSSupportsLiveActivitesを追加し値をYesにする

画面にLiveActivityを呼び出すボタンを追加

ContentView.swiftを以下のように変更

ContentView.swift
import SwiftUI
import ActivityKit

struct ContentView: View {
    var body: some View {
        VStack {
            Button("Add Live Activity") {
                addLiveActivity()
            }
        }
        .padding()
    }
    
    func addLiveActivity(){
        let orderAttributes = OrderStatusAttributes(name: "test")
        let initialContentState = OrderStatusAttributes.ContentState(value: 1)
        
        do{
            let activity = try Activity<OrderStatusAttributes>.request(attributes: orderAttributes, contentState: initialContentState)
            print("Activity Added Successfully. id: \(activity.id)")
        }catch{
            print(error.localizedDescription)
        }
        
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Targetを作った時にデフォルトのAttributesとContentStateのコードが書かれているので、それに従ってActivityを設定します。
Activity<T>.request()の部分で実際にLiveActivityを追加しています。

実行


アプリの画面


ホーム画面 デフォルトのViewとしてLeadingにはLがTrailingにはTが表示されている


Dynamic islandを長押しすると、ExpandedのViewが表示される


ロック画面

トラブルシューティング

SendProcessControlEvent:toPid: encountered an error: Error

ビルドスキームがエクステンションになっていないか確認

The operation couldn’t be completed. (com.apple.ActivityKit.ActivityInput error 1.)

info.plistにNSSupportsLiveActivitiesを設定

Cannot find 'OrderStatusAttributes' in scope

OrderStatusLiveActivity.swiftのTarget MembershipにLiveActivitiesがチェックされているか確認

参考

GitHubで編集を提案

Discussion