RORK LABEN
FUNDING — RorkがLeft Lane Capital主導で$15Mのシードを調達しましたRORK MAX — Rork MaxはReact NativeではなくネイティブSwiftアプリを生成しますPLATFORM — iPhone・iPad・Watch・Vision Proに対応し、Live ActivitiesやCore MLまで使えますGROWTH — 月間74.3万訪問・成長率85%と利用が伸び続けていますTEST — Companionアプリで有料Apple Developerアカウント無しに実機テストができますSTACK — 本体はReact NativeとExpoで、ウェブラッパーでない真のネイティブ体験を提供しますFUNDING — RorkがLeft Lane Capital主導で$15Mのシードを調達しましたRORK MAX — Rork MaxはReact NativeではなくネイティブSwiftアプリを生成しますPLATFORM — iPhone・iPad・Watch・Vision Proに対応し、Live ActivitiesやCore MLまで使えますGROWTH — 月間74.3万訪問・成長率85%と利用が伸び続けていますTEST — Companionアプリで有料Apple Developerアカウント無しに実機テストができますSTACK — 本体はReact NativeとExpoで、ウェブラッパーでない真のネイティブ体験を提供します
記事一覧/アプリ開発
アプリ開発/2026-06-30上級

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

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

SensitiveContentAnalysisRork Max195Expo127iOS88コンテンツモデレーション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-06-29
クリップボード連携のUXを整える — iOSのペースト許可バナーを増やさずに「コピー」と「貼り付け」を成立させる
expo-clipboard で「コピー」と「貼り付け」を実装するとき、iOS のペースト許可バナーが頻発して使い勝手を損なうことがあります。バナーの発生条件を押さえ、hasStringAsync で内容を読まずにボタンを出し分ける設計をまとめました。
アプリ開発2026-06-28
Rork Max でバーコードとテキストを同時に読むスキャナを VisionKit で実装する
Rork Max のネイティブ Swift アプリに、バーコードとテキストをライブで読み取る画面を VisionKit の DataScanner で実装します。SwiftUI への組み込み、可用性判定、連続検出のスロットリング、実機検証までを実装コード付きで扱います。
アプリ開発2026-06-16
初回起動の前に壁紙パックを落としておく — Rork Max と Background Assets の使いどころ
コンテンツの多いアプリは、初回起動時に空のグリッドを見せてしまいがちです。アプリ本体とは別枠でコンテンツを先回りして落とす Background Assets を、Rork(Expo)では届かない領域として Rork Max のネイティブ Swift でどう実装するか、運用判断まで含めてまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →