◉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-06-30上級

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

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

SensitiveContentAnalysisRork Max236Expo219iOS115コンテンツモデレーション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-10-15
adjustsFontSizeToFit で特定の1行だけ極小になるとき、疑うのは文字列ではなく枠の高さです
一覧の10行目だけ文字が4ptまで縮む。データも文字列も正常なのに起きる iOS の症状を、Yoga の丸めと縮小判定のソースで確かめ、Node で再現率を数えた記録です。
◈ Rork 入門2026-09-08
Rork Max が要るかどうかは、料金表ではなく権限の棚卸しで判断できます
Rork Max に上げるべきか迷ったとき、料金表を先に見ないようにしています。app.json と Info.plist から実際に要求している OS 機能を抜き出し、標準版で届くもの・設定で届くもの・ネイティブが要るものへ仕分ける手順を書き残します。
◇ アプリ開発2026-10-15
EAS Build だけ「No matching variant」で落ちるとき、まず疑う手元の android/build
手元の Gradle は通るのに、EAS Build の Android だけが「No matching variant of project」で止まる。GitHub の報告を読み比べ、Windows で生成した autolinking のキャッシュが Linux のビルド機へ渡っていた経路と、ビルドを投げる前に確かめる診断スクリプトをまとめました。