RORK LABEN
GROWTH — Rorkは月間74.3万訪問・成長率85%と、利用が伸び続けていますMAX — Rork MaxはネイティブSwiftアプリを生成し、iPhone・iPad・Watch・TV・Vision Pro・iMessageに対応しますMAX — AR/LiDARスキャン・Metalの3Dゲーム・Live Activities・HealthKit・Core MLなど、React Nativeでは届きにくい領域に踏み込めますSTACK — 通常のRorkはReact Native(Expo)でiOSとAndroidを同時に生成し、非エンジニアでも実機アプリを作れますPRICE — 料金は無料から用意され、有料プランは月$25から、Rork Maxは月$200ですMARKET — Gartnerは2026年末までに新規アプリの75%が低コード/ノーコード製になると予測していますGROWTH — Rorkは月間74.3万訪問・成長率85%と、利用が伸び続けていますMAX — Rork MaxはネイティブSwiftアプリを生成し、iPhone・iPad・Watch・TV・Vision Pro・iMessageに対応しますMAX — AR/LiDARスキャン・Metalの3Dゲーム・Live Activities・HealthKit・Core MLなど、React Nativeでは届きにくい領域に踏み込めますSTACK — 通常のRorkはReact Native(Expo)でiOSとAndroidを同時に生成し、非エンジニアでも実機アプリを作れますPRICE — 料金は無料から用意され、有料プランは月$25から、Rork Maxは月$200ですMARKET — Gartnerは2026年末までに新規アプリの75%が低コード/ノーコード製になると予測しています
記事一覧/開発ツール
開発ツール/2026-07-04上級

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

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

Rork Max213Live Activities5ActivityKit4push-to-startSwift40iOS101

プレミアム記事

配車が確定した瞬間に、ユーザーがアプリを開いていなくてもロック画面へ到着予定を出したい——そんな 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)   // サーバへ送る
            }
        }
    }
}

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

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

この記事の続きを読む

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

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

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-06-26
Rorkで作ったアプリの進行状況を、ロック画面とダイナミックアイランドに出す
Rork Maxが生成したSwiftアプリにLive ActivitiesとActivityKitを組み込み、瞑想タイマーや配送状況をロック画面・ダイナミックアイランドに表示するまでを、動くコードと申請時のハマりどころつきで整理します。
開発ツール2026-06-14
Live Activities をリモートから更新する設計 — Rork 製アプリにロック画面の生きた情報を載せるまで
ロック画面と Dynamic Island に「いま動いている情報」を出す Live Activities を、APNs プッシュでリモート更新する設計をまとめました。push-to-start トークンの取得、content-state ペイロード、stale-date と更新予算の扱い、Expo からのネイティブ橋渡しまで、本番で詰まった点を実コードつきで共有します。
開発ツール2026-07-04
Rork Max のアプリで、選んだ写真が次回起動時に消えている — PHPicker の限定アクセスで URL を握り続けようとする罠
Rork Max が生成したネイティブ Swift アプリで、PHPickerViewController で選んだ写真が再起動後に読めなくなる——限定アクセスの時代に URL や PHAsset を握り続けようとするのが原因でした。選んだ瞬間に自前ストレージへ実体をコピーする設計をまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →