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 ガイド で詳しく解説しています。