◉RORK LABEN
●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主
記事一覧/開発ツール
⬡ 開発ツール/2026-07-04上級

Rork Max のアプリでアプリを起動せずに Live Activity を出す — push-to-start トークンが無言で取れない時の設計

Rork Max が生成したネイティブ Swift アプリで、アプリを一度も開かずにサーバから Live Activity を開始したい。ところが push-to-start トークンが観測できず無言で失敗する——その原因と、トークンを確実に取り切る観測レイヤーの実装をまとめます。

Rork Max235Live Activities5ActivityKit4push-to-startSwift48iOS114

✦ プレミアム記事

配車が確定した瞬間に、ユーザーがアプリを開いていなくてもロック画面へ到着予定を出したい——そんな Live Activity をサーバ起点で始めたくて、Rork Max が生成したアプリに push-to-start を組み込もうとしたときの話です。iOS 17.2 以降なら、アプリを一度も前面に出さなくても、リモート通知だけで Live Activity を開始できます。ところが実装を入れても、サーバへ届くはずの開始用トークンがいつまでも空のまま。エラーも警告も出ず、ただトークンが観測されないだけでした。

原因は Activity.pushToStartTokenUpdates を回すタスクが、実際にはトークンを一度も拾えていなかったことです。個人開発でロック画面まわりを触ると、この「実装は入っているのに無言でトークンが来ない」状態に最初に足を止められます。Dolice Labs で運用しているアプリでも、通知や配信基盤が絡む機能ほど実機でしか露見しない不具合が多く、慎重に切り分けてきました。ここでは Rork Max のネイティブアプリに、アプリ未起動から Live Activity を立ち上げる導線を最小差分で足す前提で、無言の失敗の切り分けと、そのまま使える観測レイヤーを順に見ていきます。

push-to-start と update は別のトークンで動く

まず整理したいのは、Live Activity のリモート制御には性質の違う二種類のトークンが登場することです。ここを混同すると、片方が取れているのにもう片方で詰まって「なぜ動かない」に陥ります。

開始トークンと更新トークンの役割

一つ目が push-to-start トークンです。これは「まだ存在しない Live Activity を、アプリ未起動の状態から開始する」ための鍵で、ActivityAuthorizationInfo が有効なら、アプリごとに一つ観測できます。二つ目が各 Activity の update トークンで、こちらは既に始まっている個別の Activity を更新・終了するためのものです。

push-to-start はアプリ単位、update は Activity 単位という粒度の違いがそのまま、配信基盤側の指定にも効いてきます。APNs へ送る際の apns-topic は、通常のプッシュ(bundleId)とは異なり、開始・更新ともに {bundleId}.push-type.liveactivity を使い、apns-push-type: liveactivity を付けます。ここが通常プッシュと同じ topic のままだと、トークンが正しくても配信段で無言に弾かれます。

まず「トークンが観測できているか」を log で確かめる

原因を憶測で追う前に、私はトークン観測タスクが実際に値を吐いているかを実機の log で確認します。push-to-start は非同期シーケンスで届くため、タスクが起動していない・途中で解放された、というだけで無言に止まります。

import ActivityKit
import os
 
let laLog = Logger(subsystem: "net.rorklab.sample", category: "liveactivity")
 
@MainActor
final class LiveActivityBootstrap {
    private var startTokenTask: Task<Void, Never>?
 
    func begin() {
        // 権限が無いと token は永遠に来ない
        guard ActivityAuthorizationInfo().areActivitiesEnabled else {
            laLog.error("live activities disabled by user")
            return
        }
        observeStartTokens()
    }
 
    private func observeStartTokens() {
        startTokenTask = Task {
            for await tokenData in Activity<DeliveryAttributes>.pushToStartTokenUpdates {
                let token = tokenData.map { String(format: "%02x", $0) }.joined()
                laLog.info("push-to-start token: \(token.prefix(12))…")
                await self.registerStartToken(token)   // サーバへ送る
            }
        }
    }
}

pushToStartTokenUpdates は Activity の型に対して静的に生えている点に注意が要ります。DeliveryAttributes は自分で定義した ActivityAttributes 準拠型で、この型に紐づくアプリ全体の開始トークンを観測します。log に token の断片が一度も出ないなら、原因はほぼ観測タスクの起動タイミングか権限のどちらかです。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦アプリを開かずにサーバから Live Activity を開始する push-to-start が、権限・Info.plist・トークン観測タスクのどこで無言に落ちているか log から切り分けられるようになります
✦pushToStartTokenUpdates を起動直後から回し、トークンをサーバへ確実に届ける観測レイヤーを、そのまま Rork Max の生成コードへ足せる薄い実装として手に入ります
✦開始と更新で別物になっている二種類のトークンの扱いを整理し、配信基盤側の topic 指定まで含めて実機で通す勘所がわかります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 開発ツール2026-04-05
Rork Max × WidgetKit・ライブアクティビティ実装ガイド 2026 — Dynamic Island 対応まで
Rork Max で iOS Widget・ロック画面ウィジェット・Dynamic Island 対応のライブアクティビティを実装した記録。Timeline の焼き込み設計、APNs のヘッダーと優先度、push-to-start、stale-date の扱いまで実運用の判断を残します。
⬡ 開発ツール2026-05-16
Rork Max 製 iOS アプリの Firebase CocoaPods を Swift Package Manager へ移行した実録——2026年10月の廃止前に対応した手順と3つの落とし穴
Firebase Apple SDK の CocoaPods 配信が2026年10月に停止します。Rork Max 製 iOS アプリ4本を Swift Package Manager へ移行した実体験をもとに、手順・落とし穴・Dropbox競合コピー問題の解決策を詳細に解説します。
⬡ 開発ツール2026-05-01
Rork アプリに Notification Service Extension を後付けする — 画像付き通知・暗号化ペイロード復号・動的書き換えの実装メモ
Rork で作った iOS アプリに Notification Service Extension を後付けし、画像付き通知・E2E暗号化ペイロードの復号・APNs ペイロードの動的書き換えを本番品質で動かすまでの設計と、実際に踏んだ落とし穴を、動作する Swift コードとともにまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます