RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/開発ツール
開発ツール/2026-03-25上級

Rork Max で構築する Apple Intelligence 対応アプリ — Writing Tools・Image Playground・Genmoji API 統合ガイド

Rork Max を使って Apple Intelligence の主要 API(Writing Tools、Image Playground、Genmoji)をネイティブ Swift アプリに統合する方法を、コード例付きで詳しく解説します。

Rork Max229Apple Intelligence3Swift48Writing ToolsImage PlaygroundCore ML6ネイティブアプリ20

Apple Intelligence とは何か — アプリ開発者にとっての意味

Apple Intelligence は、iOS 18.4 以降で利用可能になった Apple 独自の AI フレームワーク群です。従来の Core ML や Natural Language Framework とは異なり、システムレベルで統合されたオンデバイス AI として、ユーザー体験に直接作用する点が大きな特徴です。

Rork Max を使えば、これらの Apple Intelligence API をネイティブ Swift アプリにシームレスに統合できます。Xcode を使わずにブラウザだけで、Writing Tools によるテキスト支援、Image Playground による画像生成、Genmoji によるカスタム絵文字を、自分のアプリに組み込めるのです。

ここではRork Max の Swift ネイティブ開発環境を活かして、Apple Intelligence の3大 API を実際のアプリに統合する方法を、動作するコード例とともに解説します。

前提条件と環境準備

必要な環境

Apple Intelligence API を利用するには、以下の条件を満たす必要があります。

  • Rork Max プラン(ネイティブ Swift ビルドが必要)
  • デプロイターゲット: iOS 18.4 以上
  • 対応デバイス: A17 Pro 以降のチップ搭載端末(iPhone 15 Pro / iPhone 16 シリーズ)
  • Xcode 16.3 相当のビルド環境(Rork Max のクラウド Mac フリートが提供)

Rork Max プロジェクトの初期設定

Rork Max でプロジェクトを作成する際、プロンプトに以下のような指示を含めます。

// Rork Max プロンプト例:
// 「iOS 18.4 以上をターゲットにした SwiftUI アプリを作成してください。
//   Apple Intelligence の Writing Tools と Image Playground を統合し、
//   ユーザーがテキスト編集と画像生成を行える画面を実装してください。」

Rork Max は Claude Opus 4.6 を搭載しており、このようなプロンプトから適切なプロジェクト構成と API 統合コードを自動生成します。

Writing Tools API の統合

Writing Tools は、ユーザーがアプリ内のテキストフィールドで文章の校正・要約・書き換えを行える機能です。iOS 18.4 では、標準の UITextViewTextField にシステムレベルで自動統合されますが、カスタム実装でより高度な制御が可能です。

基本的な Writing Tools 対応

SwiftUI の TextEditor は、デフォルトで Writing Tools に対応しています。ただし、動作をカスタマイズするには writingToolsBehavior モディファイアを使用します。

import SwiftUI
 
struct ContentEditorView: View {
    @State private var articleText: String = ""
    @State private var isProcessing: Bool = false
 
    var body: some View {
        VStack(spacing: 16) {
            // Writing Tools が自動的に利用可能になる
            TextEditor(text: $articleText)
                .writingToolsBehavior(.complete) // 全機能を有効化
                .frame(minHeight: 300)
                .padding()
                .background(Color(.systemGray6))
                .cornerRadius(12)
 
            // Writing Tools の処理状態を表示
            if isProcessing {
                ProgressView("AI が文章を処理中...")
                    .padding()
            }
        }
        .padding()
        .navigationTitle("記事エディタ")
    }
}
 
// 期待する動作:
// テキスト選択時にコンテキストメニューから
// 「校正」「書き換え」「要約」等が利用可能

カスタム Writing Tools デリゲート

より高度な制御が必要な場合、WritingToolsDelegate を実装してコールバックを受け取ります。

import UIKit
 
class CustomTextViewController: UIViewController,
                                UITextViewDelegate {
    private let textView = UITextView()
 
    override func viewDidLoad() {
        super.viewDidLoad()
        textView.delegate = self
        // Writing Tools の動作モードを設定
        textView.writingToolsBehavior = .complete
 
        // テキストビューの基本設定
        textView.font = .preferredFont(forTextStyle: .body)
        textView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(textView)
 
        NSLayoutConstraint.activate([
            textView.topAnchor.constraint(
                equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16),
            textView.leadingAnchor.constraint(
                equalTo: view.leadingAnchor, constant: 16),
            textView.trailingAnchor.constraint(
                equalTo: view.trailingAnchor, constant: -16),
            textView.bottomAnchor.constraint(
                equalTo: view.bottomAnchor, constant: -16)
        ])
    }
 
    // Writing Tools がテキストを変更する前に呼ばれる
    func textView(_ textView: UITextView,
                  writingToolsIgnoredRangesIn range: NSRange) -> [NSRange] {
        // コードブロックなど、AI に編集させたくない範囲を返す
        return findCodeBlockRanges(in: textView.text, within: range)
    }
 
    private func findCodeBlockRanges(
        in text: String, within range: NSRange
    ) -> [NSRange] {
        // バッククォートで囲まれた範囲を保護する
        var ignoredRanges: [NSRange] = []
        let nsText = text as NSString
        let pattern = "```[\\s\\S]*?```"
 
        if let regex = try? NSRegularExpression(pattern: pattern) {
            let matches = regex.matches(in: text, range: range)
            ignoredRanges = matches.map { $0.range }
        }
        return ignoredRanges
    }
}
 
// 期待する動作:
// コードブロック内のテキストは Writing Tools の編集対象外となり、
// それ以外のテキストのみ校正・書き換え・要約が適用される

Image Playground API の統合

Image Playground は、テキストプロンプトからオンデバイスで画像を生成する API です。ユーザーのプライバシーを保ちながら、クリエイティブな画像生成体験を提供できます。

Image Playground シートの表示

最もシンプルな統合方法は、システム提供の Image Playground シートを表示することです。

import SwiftUI
import ImagePlayground
 
struct ImageGeneratorView: View {
    @State private var showPlayground = false
    @State private var generatedImage: Image?
    @State private var conceptText: String = ""
 
    var body: some View {
        VStack(spacing: 24) {
            // 生成された画像の表示エリア
            if let image = generatedImage {
                image
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .frame(maxHeight: 400)
                    .cornerRadius(16)
                    .shadow(radius: 8)
            } else {
                RoundedRectangle(cornerRadius: 16)
                    .fill(Color(.systemGray5))
                    .frame(height: 300)
                    .overlay(
                        VStack {
                            Image(systemName: "photo.badge.plus")
                                .font(.system(size: 48))
                                .foregroundColor(.secondary)
                            Text("画像を生成してみましょう")
                                .foregroundColor(.secondary)
                        }
                    )
            }
 
            // コンセプト入力フィールド
            TextField("画像のコンセプトを入力", text: $conceptText)
                .textFieldStyle(.roundedBorder)
                .padding(.horizontal)
 
            // Image Playground を起動するボタン
            Button(action: { showPlayground = true }) {
                Label("Image Playground で生成",
                      systemImage: "wand.and.stars")
                    .font(.headline)
                    .frame(maxWidth: .infinity)
                    .padding()
                    .background(Color.accentColor)
                    .foregroundColor(.white)
                    .cornerRadius(12)
            }
            .padding(.horizontal)
        }
        .imagePlaygroundSheet(
            isPresented: $showPlayground,
            concept: conceptText
        ) { url in
            // 生成完了時のコールバック
            if let uiImage = UIImage(contentsOfFile: url.path) {
                generatedImage = Image(uiImage: uiImage)
            }
        }
        .navigationTitle("AI 画像生成")
    }
}
 
// 期待する動作:
// ボタンタップで Image Playground シートが表示され、
// ユーザーがプロンプトを編集して画像を生成できる。
// 生成完了後、画像がアプリ内に表示される。

プログラマティックな画像生成

シートを表示せず、バックグラウンドで画像を生成したい場合は ImageGenerator を使用します。

import ImagePlayground
 
class ImageService {
    private let generator = ImageGenerator()
 
    func generateImage(
        from prompt: String,
        style: ImageGenerator.Style = .natural
    ) async throws -> CGImage {
        // 生成リクエストの作成
        let request = ImageGenerator.Request(
            concepts: [.text(prompt)],
            style: style
        )
 
        // 非同期で画像を生成(オンデバイス処理)
        let response = try await generator.generateImage(request: request)
        return response.image
    }
 
    func generateWithMultipleConcepts(
        textPrompt: String,
        referenceImage: CGImage? = nil
    ) async throws -> CGImage {
        var concepts: [ImageGenerator.Concept] = [
            .text(textPrompt)
        ]
 
        // 参照画像がある場合はコンセプトに追加
        if let refImage = referenceImage {
            concepts.append(.image(refImage))
        }
 
        let request = ImageGenerator.Request(
            concepts: concepts,
            style: .animation // アニメーションスタイル
        )
 
        let response = try await generator.generateImage(request: request)
        return response.image
    }
}
 
// 使用例:
// let service = ImageService()
// let image = try await service.generateImage(
//     from: "夕焼けの海岸を散歩する柴犬"
// )

Genmoji API の統合

Genmoji は、テキスト説明からカスタム絵文字を生成する機能です。チャットアプリやリアクション機能に組み込むことで、ユーザーの表現力を大幅に拡張できます。

Genmoji 生成の基本実装

import SwiftUI
import ImagePlayground
 
struct GenmojiPickerView: View {
    @State private var showGenmojiPicker = false
    @State private var selectedGenmoji: NSAttributedString?
    @State private var genmojiDescription: String = ""
 
    var body: some View {
        VStack(spacing: 20) {
            // 生成された Genmoji の表示
            if let genmoji = selectedGenmoji {
                Text(AttributedString(genmoji))
                    .font(.system(size: 96))
                    .padding()
            }
 
            TextField("Genmoji の説明を入力", text: $genmojiDescription)
                .textFieldStyle(.roundedBorder)
                .padding(.horizontal)
 
            Button("Genmoji を作成") {
                showGenmojiPicker = true
            }
            .buttonStyle(.borderedProminent)
        }
        .imagePlaygroundSheet(
            isPresented: $showGenmojiPicker,
            concept: genmojiDescription,
            style: .genmoji
        ) { url in
            // Genmoji 画像の処理
            handleGenmojiResult(url: url)
        }
    }
 
    private func handleGenmojiResult(url: URL) {
        // 生成された Genmoji を NSAttributedString として保持
        if let imageData = try? Data(contentsOf: url),
           let image = UIImage(data: imageData) {
            let attachment = NSTextAttachment()
            attachment.image = image
            attachment.bounds = CGRect(x: 0, y: -8, width: 32, height: 32)
            selectedGenmoji = NSAttributedString(attachment: attachment)
        }
    }
}
 
// 期待する動作:
// 「笑顔でコーヒーを飲むプログラマー」のような説明から
// カスタム Genmoji が生成され、アプリ内で使用可能になる

チャットアプリへの Genmoji 統合

import SwiftUI
 
struct ChatMessage: Identifiable {
    let id = UUID()
    let content: NSAttributedString
    let isFromCurrentUser: Bool
    let timestamp: Date
}
 
struct ChatView: View {
    @State private var messages: [ChatMessage] = []
    @State private var inputText: String = ""
    @State private var showGenmojiPicker = false
 
    var body: some View {
        VStack {
            // メッセージ一覧
            ScrollView {
                LazyVStack(alignment: .leading, spacing: 12) {
                    ForEach(messages) { message in
                        ChatBubble(message: message)
                    }
                }
                .padding()
            }
 
            // 入力エリア
            HStack(spacing: 12) {
                // Genmoji ボタン
                Button(action: { showGenmojiPicker = true }) {
                    Image(systemName: "face.smiling.inverse")
                        .font(.title2)
                        .foregroundColor(.accentColor)
                }
 
                TextField("メッセージを入力", text: $inputText)
                    .textFieldStyle(.roundedBorder)
 
                Button("送信") {
                    sendMessage()
                }
                .buttonStyle(.borderedProminent)
            }
            .padding()
        }
        .imagePlaygroundSheet(
            isPresented: $showGenmojiPicker,
            style: .genmoji
        ) { url in
            appendGenmojiMessage(url: url)
        }
    }
 
    private func sendMessage() {
        guard !inputText.isEmpty else { return }
        let attributed = NSAttributedString(string: inputText)
        let msg = ChatMessage(
            content: attributed,
            isFromCurrentUser: true,
            timestamp: Date()
        )
        messages.append(msg)
        inputText = ""
    }
 
    private func appendGenmojiMessage(url: URL) {
        if let data = try? Data(contentsOf: url),
           let image = UIImage(data: data) {
            let attachment = NSTextAttachment()
            attachment.image = image
            attachment.bounds = CGRect(x: 0, y: -8, width: 40, height: 40)
            let attributed = NSAttributedString(attachment: attachment)
            let msg = ChatMessage(
                content: attributed,
                isFromCurrentUser: true,
                timestamp: Date()
            )
            messages.append(msg)
        }
    }
}

Apple Intelligence 対応の可用性チェック

Apple Intelligence はすべてのデバイスで利用できるわけではありません。アプリ内で機能の可用性を適切にチェックし、非対応デバイスでもグレースフルに動作させる必要があります。

import SwiftUI
import ImagePlayground
 
struct FeatureAvailabilityView: View {
    // Image Playground の可用性を環境変数で取得
    @Environment(\.supportsImagePlayground)
    private var supportsImagePlayground
 
    var body: some View {
        List {
            Section("Apple Intelligence 機能") {
                // Writing Tools(iOS 18.4+ で自動利用可能)
                HStack {
                    Label("Writing Tools", systemImage: "pencil.and.outline")
                    Spacer()
                    availabilityBadge(
                        available: isWritingToolsAvailable
                    )
                }
 
                // Image Playground
                HStack {
                    Label("Image Playground",
                          systemImage: "photo.badge.plus")
                    Spacer()
                    availabilityBadge(
                        available: supportsImagePlayground
                    )
                }
 
                // Genmoji
                HStack {
                    Label("Genmoji", systemImage: "face.smiling.inverse")
                    Spacer()
                    availabilityBadge(
                        available: supportsImagePlayground
                    )
                }
            }
        }
        .navigationTitle("機能チェック")
    }
 
    private var isWritingToolsAvailable: Bool {
        if #available(iOS 18.4, *) {
            return true
        }
        return false
    }
 
    @ViewBuilder
    private func availabilityBadge(available: Bool) -> some View {
        if available {
            Text("利用可能")
                .font(.caption)
                .foregroundColor(.green)
                .padding(.horizontal, 8)
                .padding(.vertical, 4)
                .background(Color.green.opacity(0.1))
                .cornerRadius(8)
        } else {
            Text("非対応")
                .font(.caption)
                .foregroundColor(.secondary)
                .padding(.horizontal, 8)
                .padding(.vertical, 4)
                .background(Color.gray.opacity(0.1))
                .cornerRadius(8)
        }
    }
}
 
// 期待する動作:
// 各 Apple Intelligence 機能の対応状況が
// デバイスごとに正確に表示される

App Store 審査のベストプラクティス

Apple Intelligence API を使ったアプリを App Store に提出する際は、以下の点に注意が必要です。

審査対策チェックリスト

Info.plist の設定: Apple Intelligence 機能を使用する場合、NSImagePlaygroundUsageDescription キーに使用目的を記載する必要があります。

// Info.plist に追加する項目
// Key: NSImagePlaygroundUsageDescription
// Value: "アプリ内でカスタム画像や絵文字を生成するために
//         Image Playground を使用します"

フォールバック設計: Apple Intelligence 非対応デバイスでもアプリが正常に動作することを確認してください。機能が使えない場合は代替 UI を提供しましょう。

プライバシーポリシー: Apple Intelligence はオンデバイスで処理されますが、ユーザーのコンテンツを扱うため、プライバシーポリシーに AI 機能の利用について明記することが推奨されます。

コンテンツガイドライン: Image Playground で生成された画像には、Apple のコンテンツポリシーが自動適用されます。不適切なコンテンツの生成はシステムレベルでブロックされますが、アプリ側でも追加のフィルタリングを検討してください。

全体を振り返って — Rork Max で Apple Intelligence の力を解き放つ

Apple Intelligence は、アプリ開発者にとって大きなチャンスです。Writing Tools でテキスト編集体験を向上させ、Image Playground でクリエイティブな画像生成を実現し、Genmoji でユーザーの表現力を拡張できます。

Rork Max を使えば、これらの API 統合を Xcode なしで、ブラウザからのプロンプト指示だけで実現できます。従来であれば数週間かかっていたネイティブ AI 機能の実装が、数時間で完了する時代になりましました。

まずは Writing Tools の基本対応(writingToolsBehavior(.complete))から始めて、段階的に Image Playground や Genmoji を追加していくアプローチがおすすめです。

Apple Intelligence API の詳細については Rork Max のネイティブ Swift 完全ガイド も参考にしてください。Core ML との連携については Rork Max Core ML ガイド、Siri 統合については Rork Max Siri App Intents ガイド で詳しく解説しています。

シェア

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

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

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

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

開発ツール2026-07-06
Rork Max のアプリ機能を Apple Intelligence に開く — App Intents Assistant Schemas の設計と、収まらない機能の逃がし方
Rork Max が生成した Swift アプリの操作を Apple Intelligence から呼べるようにする App Intents Assistant Schemas の設計を、固定スキーマへの当てはめ方・収まらない機能の逃がし方・実機での確認手順まで含めて実装ノートとしてまとめます。
開発ツール2026-03-19
Rork Max × Claude Code × Opus 4.6 — 3日で$1.5M ARRを達成した実用的コンビの技術解剖
Rork Max の内部で動く Claude Code と Opus 4.6 の仕組みを技術的に解剖。プロンプト一発でネイティブ Swift アプリが生成される裏側のアーキテクチャ、パフォーマンス最適化、そして実際の開発ワークフローを詳しく解説します。
開発ツール2026-07-18
AR で置いたものが翌朝には消えている — ARWorldMap による配置の永続化とリローカライズ設計
Rork Max が生成する AR アプリは、置いた 3D オブジェクトがアプリ再起動で消えます。ARWorldMap の保存タイミング、カスタムアンカーの符号化、リローカライズ待ちの見せ方、成立しない時の逃げ道までを設計として整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →