◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●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)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/開発ツール
⬡ 開発ツール/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 Max236Apple 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 では、標準の UITextView や TextField にシステムレベルで自動統合されますが、カスタム実装でより高度な制御が可能です。

基本的な 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-05-17
Rork Max の SwiftUI 機能を壁紙アプリ開発で検証した結果 — 実際に動いた機能と手を入れた機能
運用中の壁紙アプリの本番コードを基準に、Rork Max の SwiftUI ネイティブ生成を検証しました。そのまま使えた機能、手を入れた機能、生成を諦めた機能を、動くコードと実機での計測値とともにお伝えします。
⬡ 開発ツール2026-04-05
Rork Max × WidgetKit・ライブアクティビティ実装ガイド 2026 — Dynamic Island 対応まで
Rork Max で iOS Widget・ロック画面ウィジェット・Dynamic Island 対応のライブアクティビティを実装した記録。Timeline の焼き込み設計、APNs のヘッダーと優先度、push-to-start、stale-date の扱いまで実運用の判断を残します。
⬡ 開発ツール2026-07-18
文字サイズ最大とドイツ語で、生成された画面は静かに詰まる — Rork Max の SwiftUI にレイアウト耐性の検証を通した記録
Rork Max が生成した SwiftUI 画面を疑似ローカライズと最大文字サイズに通し、どこから詰まるかを機械的に洗い出した記録です。ViewThatFits・ScaledMetric・layoutPriority の使いどころと、再生成のたびに回帰を捕まえるスナップショット検証を、実際の数値とともにまとめました。