RORK LABEN
BUILD — Rork Max はクラウド上の実機 Mac に Xcode と iOS SDK を載せ、SwiftUI を書き、ビルドし、エラーを読んで直す反復を回します。コードを吐いて終わりではない点が生成物の質に効いていますNATIVE — 生成されるのは React Native ではなく純粋な Swift / SwiftUI です。AR や Metal、ウィジェットなど React Native からは届かない機能に手が届くことが、他ビルダーとの実質的な差になりますPLATFORMS — 対応は iPhone・iPad・Apple Watch・Apple TV・Vision Pro に加えて iMessage まで含みます。ウォッチや拡張から入る設計を試すのに向いていますCOMPANION — Rork Companion により、有料の Apple Developer アカウントなしで生成したアプリを実機の iPhone で確認できます。最初の一本を試す段階の障壁が一段下がりましたPRICING — 無料で開始でき有料プランは月額25ドルから、Rork Max は月額200ドルの Max プランです。回収できる本数と規模を先に見積もっておく価値がありますDEADLINE — Google Play は2026年8月31日以降、新規アプリと更新の双方に対象 API レベル36 以上を要求します。残り10日で、生成物の targetSdkVersion は自分で確認が必要ですBUILD — Rork Max はクラウド上の実機 Mac に Xcode と iOS SDK を載せ、SwiftUI を書き、ビルドし、エラーを読んで直す反復を回します。コードを吐いて終わりではない点が生成物の質に効いていますNATIVE — 生成されるのは React Native ではなく純粋な Swift / SwiftUI です。AR や Metal、ウィジェットなど React Native からは届かない機能に手が届くことが、他ビルダーとの実質的な差になりますPLATFORMS — 対応は iPhone・iPad・Apple Watch・Apple TV・Vision Pro に加えて iMessage まで含みます。ウォッチや拡張から入る設計を試すのに向いていますCOMPANION — Rork Companion により、有料の Apple Developer アカウントなしで生成したアプリを実機の iPhone で確認できます。最初の一本を試す段階の障壁が一段下がりましたPRICING — 無料で開始でき有料プランは月額25ドルから、Rork Max は月額200ドルの Max プランです。回収できる本数と規模を先に見積もっておく価値がありますDEADLINE — Google Play は2026年8月31日以降、新規アプリと更新の双方に対象 API レベル36 以上を要求します。残り10日で、生成物の targetSdkVersion は自分で確認が必要です
記事一覧/アプリ開発
アプリ開発/2026-06-30上級

ユーザー投稿画像を表示前に端末内で判定する — SensitiveContentAnalysis 実装メモ

AI 生成画像やユーザー投稿を扱うアプリで、不適切な画像を表示前に端末内で弾くための実装メモです。Apple の SensitiveContentAnalysis フレームワークを Swift で呼び、Rork Max が生成したネイティブコードや Expo のネイティブモジュールへ組み込むところまでを、実際にハマった点を添えて解説します。

SensitiveContentAnalysisRork Max233Expo175iOS109コンテンツモデレーション3

プレミアム記事

個人開発で運営している壁紙アプリに、利用者が自分の写真をアップロードして加工できる機能を足そうとしていたときのことです。社内で完結する素材だけを並べているうちは気にしなくてよかったのですが、ユーザー投稿や AI 生成画像が混ざり始めると、不適切な画像がギャラリーに並んでしまうリスクが一気に現実味を帯びてきました。

最初はサーバ側でまとめて判定すればよいと考えていました。けれど、アップロードから配信までのわずかな間に他の利用者の画面へ出てしまう経路や、オフラインで端末内に保存した画像を再表示する経路まで考えると、サーバ判定だけでは隙間が残ります。そこで「表示する直前に、その端末の中で一度確かめる」という層を足すことにしました。その役目をちょうど担えるのが、Apple の SensitiveContentAnalysis フレームワークです。実際に組み込む過程で分かったことを、実装手順としてまとめます。

なぜ「表示前」に「端末内で」判定する必要があるのか

不適切画像対策というと、まずアップロード時のサーバ判定を思い浮かべます。それは正しいのですが、モバイルアプリには次のような取りこぼしの経路があります。

  • アップロード直後、サーバ判定が完了する前に、他の利用者のフィードへ流れてしまう
  • いったん端末にキャッシュ・保存した画像を、オフラインで再表示する
  • 外部 URL を直接読み込むウィジェットや共有シートのプレビュー

App Store の審査ガイドライン 1.2 は、ユーザー生成コンテンツを扱うアプリに対して、不適切なコンテンツをフィルタリングする仕組みと通報導線の用意を求めています。AdMob などの広告を載せている場合、不適切な画像の隣に広告が出ること自体がポリシー上の問題にもなり得ます。つまりこれは「審査を通すため」だけでなく、収益面でも守りの一手なのです。

サーバ判定が一次防衛線だとすれば、表示直前の端末内判定は最後の関所です。私自身、この二段構えにしてから、レビューでの指摘も利用者からの通報も目に見えて落ち着きました。

SensitiveContentAnalysis フレームワークの位置づけ

SensitiveContentAnalysis は iOS 17(macOS 14)で追加された、画像と動画に露骨な性的描写が含まれるかを端末内で判定するための公式フレームワークです。特徴を整理します。

  • 解析はすべてオンデバイスで完結し、画像が外部へ送られることはありません。プライバシーを損なわずに済みます
  • 判定エンジンは Apple が保守するため、自前のモデルを学習・更新する必要がありません
  • 利用には専用のエンタイトルメント com.apple.developer.sensitivecontentanalysis.client が必要です
  • 重要な前提として、利用者が設定で「センシティブな内容の警告(Sensitive Content Warning)」を有効にしている端末でのみ判定が動きます。無効な端末では解析ポリシーが .disabled となり、判定は行われません

最後の一点が設計上いちばん効いてきます。「この API を入れれば全端末で必ず弾ける」わけではない、という前提を最初に握っておくことが、後述するフォールバック設計につながります。

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

この記事の続きを読む

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

この記事で得られること
SCSensitivityAnalyzer を使い、ユーザーのプライバシーを保ったまま端末内(iOS 17 以降)で不適切画像を判定する Swift コードが手に入ります
Rork Max が生成したネイティブコード、または Expo Modules API のネイティブモジュールへ、判定処理を組み込む具体的な手順が分かります
判定が無効化されている端末・シミュレータでの取りこぼしなど、本番で必ず踏む落とし穴とフォールバック設計の判断軸が身につきます
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

アプリ開発2026-07-03
Rork Max アプリで通信の切断と復帰に強くする — NWPathMonitor によるオフライン検知と再送設計
Rork Max のネイティブ Swift アプリで、電波が切れても壊れない通信設計を NWPathMonitor で組み立てます。オフラインの検知、Low Data Mode やモバイル回線の判定、復帰時の自動再送キューまで、動く Swift コードで示します。
アプリ開発2026-07-03
Rork Max アプリでダウンロードをアプリ終了後も続ける — バックグラウンド URLSession の設計と再起動復帰
Rork Max のネイティブ Swift アプリで、アプリがサスペンド・終了されてもダウンロードを OS 側で継続させるバックグラウンド URLSession の設計を解説します。再起動復帰・resumeData・isDiscretionary の実測挙動まで動くコードで示します。
アプリ開発2026-07-01
Rork Max のネイティブ Swift で SharePlay を組む — 二人の画面を同じ状態で動かす設計
GroupActivities を使い、FaceTime 越しに二人の画面を同じ状態で動かす SharePlay を Rork Max のネイティブ Swift で組む実装メモです。GroupActivity の宣言、GroupSession への参加、GroupSessionMessenger での状態同期、遅延と競合の扱い、そして React Native 側から橋渡しするときの境界設計まで、実際に詰まった点を添えてまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →