target 'OneSignalWidgetExtension' do use_frameworks! pod 'OneSignal/OneSignal', '>= 5.0.0', '< 6.0'end
# Uncomment the next line to define a global platform for your project# platform :ios, '9.0'target 'Demo Momenta' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! pod 'OneSignal/OneSignal', '>= 5.0.0', '< 6.0' pod 'OneSignal/OneSignalInAppMessages', '>= 5.0.0', '< 6.0'endtarget 'OneSignalNotificationServiceExtension' do use_frameworks! pod 'OneSignal/OneSignal', '>= 5.0.0', '< 6.0'endtarget 'OneSignalWidgetExtension' do use_frameworks! pod 'OneSignal/OneSignal', '>= 5.0.0', '< 6.0'end
Xcodeを閉じて、pod repo update && pod installを実行してOneSignalLiveActivities podをインストールします。これを行った後も「No such module ‘OneSignalLiveActivities’」エラーが表示され続ける場合は、「Widget Extensionターゲット」> 一般 > フレームワークとライブラリ > +アイコンに移動して、依存関係を手動で追加できます。OneSignalLiveActivitiesフレームワークを選択します:
Push To Start APIリクエストを送信します。すべての名前とIDがウィジェットの構成と正確に一致することを確認してください(パラメーターは大文字小文字を区別します)。何かが欠落しているか、誤って追加された場合、ウィジェットの起動時に問題が発生する可能性があります。上記の例で機能するリクエストの例を次に示します。置き換え:
Update Live Activity APIを使用してアクティブなウィジェットを更新します。アクティビティを開始するときに使用したactivity_idと一致させます。このサンプルリクエストは、定義したactivity_idがpush-to-startというタイトルであるため、push-to-startウィジェットを更新します。
click-to-startウィジェットを更新するには、リクエストパスをpush-to-startの代わりにclick-to-startを使用するように更新します。
Live Activityが開始された後、ユーザーが更新を受信できない場合は、アプリを開くことでアクティビティが更新されます。最初の更新を送信することを見込んでいる時点以降の将来の日時にstale dateを設定します。更新を受信していないユーザーには、代わりにフォールバックメッセージが表示されます。ウィジェットUIでこの「stale」状態をリッスンして、フォールバックメッセージを表示できます:
Live Activityがstaleになったときに表示されるフォールバックメッセージ。
struct ptsLiveActivity: Widget { var body: some WidgetConfiguration { ActivityConfiguration(for: ptsAttributes.self) { context in //stale dateの後にtrueになります let isStale = context.isStale if !isStale{ VStack { Text("\(context.attributes.name) \(context.state.emoji)") .activityBackgroundTint(Color.cyan) .activitySystemActionForegroundColor(Color.black) } } else { //メッセージがstaleの場合、ユーザーにウィジェットをクリックしてアプリを開くように要求します VStack { Text("Something went wrong, please click to refresh") } } // ... ウィジェットUIの残り } }}
Task { for await content in activity.contentUpdates { print("LA activity id: \(activity.id), content update: \(content.state)") }}// 出力例:// LA activity id: EFE6D54D-F7E1-45EF-9514-4C2598F8DED2, content update: ContentState(message: "My message from payload")
ライフサイクルの変更を追跡:
Task { for await state in activity.activityStateUpdates { print("LA state update: \(state)") //状態に基づいて何かをしたい場合は、これを使用します: if state != ActivityState.active { //ここで何かを行う } }}// 出力例 1 - LAは終了したが、まだ表示されている// LA state update: active/* StateはActivityState列挙型の4つの可能な値のいずれかになりますactive、dismissed、ended、stale*/