◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り26日。API 連携を足したアプリは移行先の確認を●SDK 58 — React Native 0.88 に更新されました。Android のリリース版で R8 が既定オンになり、iOS は SceneDelegate を生成します●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り26日。API 連携を足したアプリは移行先の確認を●SDK 58 — React Native 0.88 に更新されました。Android のリリース版で R8 が既定オンになり、iOS は SceneDelegate を生成します●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/アプリ開発
◇ アプリ開発/2026-06-16上級

Rork Max で iMessage 拡張を作り、アプリの世界観をメッセージに持ち込む — 配布導線としての実装メモ

Rork Max が生成するネイティブ Swift プロジェクトに iMessage 拡張を追加し、アプリの素材をメッセージ上で共有する実装を整理しました。コンパクト/拡張表示の切り替え、メッセージ送信、ドロワーに出てこないときの切り分けまで、個人開発の配布目線で押さえます。

Rork Max235iMessageMessages拡張Swift48配布導線App Extension3

✦ プレミアム記事

個人開発の壁紙アプリを長く運用していると、ユーザーが一番自然に友人へ「いいよ」と勧めてくれる瞬間は、アプリストアのリンクを送るときではなく、気に入った一枚をそのまま会話に貼るときだと気づきます。だとすれば、その共有の場であるメッセージそのものに、アプリの世界観を持ち込めないか。そう考えて取り組んだのが iMessage 拡張でした。

iMessage 拡張は、Messages フレームワークに依存するネイティブの仕組みです。React Native からは事実上扱えませんが、Rork Max はネイティブ Swift のプロジェクトを生成するため、拡張ターゲットを足して MSMessagesAppViewController を継承する道が開けます。ここでは配布導線という観点から、表示の切り替え・メッセージ送信・つまずきどころを順に整理します。

なぜ「アプリ本体」ではなくメッセージ拡張なのか

アプリの紹介をストアのリンクで送ると、受け手はアプリを離れて App Store を開く必要があります。一方、iMessage 拡張から送った素材は会話の中に残り、受け手はその場で軽く触れられます。私の感覚では、後者の方が「使ってみようかな」までの心理的な距離がずっと短くなります。AdMob 中心の無料アプリにとって、入口を一つ増やす意味は小さくありません。

ただし拡張は本体アプリとは別のターゲットであり、メモリ制限も厳しめです。素材を丸ごと読み込む発想だと、すぐに限界に当たります。軽さを前提に設計するのが出発点になります。

Step 1: 拡張ターゲットを追加し、本体と素材を共有する

Rork Max が生成したプロジェクトに、iMessage 拡張のターゲットを追加します。本体アプリと素材(画像など)を共有するため、App Group を有効化して共有コンテナ越しに読み出す構成にします。拡張内に画像を二重に抱えると、配布サイズもメモリも無駄に膨らみます。

// 共有コンテナから素材の URL を解決する
func sharedAssetURL(_ name: String) -> URL? {
    let groupID = "group.net.rorklab.sample"
    let base = FileManager.default
        .containerURL(forSecurityApplicationGroupIdentifier: groupID)
    return base?.appendingPathComponent("assets/\(name)")
}

App Group の識別子は本体と拡張で完全に一致させる必要があります。ここがずれていると、拡張側で素材が常に nil になり、原因の特定に時間を取られます。

✦

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

この記事の続きを読む

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

この記事で得られること
✦MSMessagesAppViewController のコンパクト/拡張表示を切り替える実装を、presentationStyle の遷移コードで具体的に把握できます
✦壁紙のような素材をメッセージに添えて送る MSMessage の組み立て方と、受け手の会話に残る見え方を設計できるようになります
✦拡張がメッセージのドロワーに出てこない本番症状を、ターゲット設定とバンドル構成という原因まで切り分けられます
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ 開発ツール2026-04-05
Rork Max × WidgetKit・ライブアクティビティ実装ガイド 2026 — Dynamic Island 対応まで
Rork Max で iOS Widget・ロック画面ウィジェット・Dynamic Island 対応のライブアクティビティを実装した記録。Timeline の焼き込み設計、APNs のヘッダーと優先度、push-to-start、stale-date の扱いまで実運用の判断を残します。
◇ アプリ開発2026-10-31
EAS Build が「Project archive is too big」で止まったら、上がるファイルを大きい順に数えます
EAS Build のアップロードは 150 MiB で警告、2 GiB で失敗します。送る前に同梱ファイルを大きい順に並べる手順と、原因の見つけ方、.easignore に書く内容の決め方をまとめました。
◇ アプリ開発2026-10-29
アップロード前に一度だけ取りにいかれた画像が、エッジで 404 のまま残りました。保持の規則をステータス別に分け、アップロードと消去を一組にしました
新しい壁紙が、一部の地域でだけ 404 のまま表示されない。原因は、アップロード前に一度だけ取りにいかれた 404 を、CDN が画像と同じ長さで保持していたことでした。ステータス別の保持、診断の二本立て、アップロードと消去の一組を、手元で動かして確かめた記録です。