RORK LABEN
MAX — Rork MaxはネイティブSwiftアプリを生成し、iPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますNATIVE — Rork MaxはAR/LiDARスキャン、Metalの3D、ウィジェット、Live Activities、HealthKitなどネイティブ機能を解放しますFUNDING — Rorkはa16zから280万ドルを調達し、月間訪問は74万を超え、成長率は85%に達していますRN — 通常のRorkはReact Native(Expo)でiOSとAndroidアプリをまとめて生成しますFOCUS — Rorkはネイティブモバイルアプリ専業で、Web中心のBoltやLovableと一線を画しますPRICING — 無料で始められ、有料プランは月25ドルから、Rork Maxは月200ドルで2クリックのApp Store公開に対応しますMAX — Rork MaxはネイティブSwiftアプリを生成し、iPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますNATIVE — Rork MaxはAR/LiDARスキャン、Metalの3D、ウィジェット、Live Activities、HealthKitなどネイティブ機能を解放しますFUNDING — Rorkはa16zから280万ドルを調達し、月間訪問は74万を超え、成長率は85%に達していますRN — 通常のRorkはReact Native(Expo)でiOSとAndroidアプリをまとめて生成しますFOCUS — Rorkはネイティブモバイルアプリ専業で、Web中心のBoltやLovableと一線を画しますPRICING — 無料で始められ、有料プランは月25ドルから、Rork Maxは月200ドルで2クリックのApp Store公開に対応します
記事一覧/開発ツール
開発ツール/2026-06-29上級

写真の「選択した項目だけ許可」に正しく向き合う設計

iOS の写真ライブラリ限定アクセス(選択した項目だけ許可)に Rork(Expo)アプリで正しく対応します。フルアクセス・限定・拒否の3状態の判定、選んだ写真だけを扱う前提の画面設計、追加選択を促す導線までを実装コードとともに整理します。

Rork473Expo122写真ライブラリ権限6プライバシー9iOS85

プレミアム記事

壁紙アプリに「自分の写真も背景に使いたい」という要望をもらい、写真ライブラリへのアクセスを足したときのことです。手元の検証端末では問題なく動いていたのに、ある利用者から「写真を選んだはずなのに、アプリには何も出てこない」という報告が届きました。原因は、その方が iOS の権限ダイアログで「すべての写真へのアクセス」ではなく「選択した写真」を選んでいたことでした。アプリ側がフルアクセスを前提に「ライブラリ全体を読む」作りになっていたため、利用者が選んだ数枚を正しく扱えていなかったのです。

iOS の限定アクセス(選択した項目だけ許可)は、プライバシーを尊重する利用者ほど選びがちな選択肢です。ここでは Rork で生成した Expo アプリを題材に、限定アクセスを「例外」ではなく「前提」として組み込む設計を整理します。

「許可されたか」ではなく「どの程度許可されたか」

写真権限を granted の真偽だけで扱うと、限定アクセスを取りこぼします。iOS の写真権限には、実質的に3つの状態があります。

状態利用者の選択アプリができること正しい導線
フルアクセスすべての写真ライブラリ全体を読める通常の一覧表示
限定アクセス選択した写真選ばれた写真だけ読める選択分を表示+追加選択の導線
拒否許可しない何も読めない設定アプリへの案内

落とし穴は、限定アクセスでも権限取得自体は「成功」する点です。granted === true だけを見ると、フルと限定の区別がつきません。限定アクセスなのにライブラリ全体を読もうとすると、選ばれた数枚しか返ってこず、実装によっては「空」に見えてしまいます。これを権限拒否と取り違えると、利用者に的外れな「設定で許可してください」を出してしまい、混乱させます。

3状態を正しく受け取る

Expo の expo-media-library は、フルと限定を区別できる情報を返します。accessPrivileges(iOS)を見て、all / limited / none を判定します。

// photos/permission.ts
import * as MediaLibrary from "expo-media-library";
 
export type PhotoAccess = "all" | "limited" | "denied";
 
export async function requestPhotoAccess(): Promise<PhotoAccess> {
  // writeOnly を false にして読み取り権限を要求
  const res = await MediaLibrary.requestPermissionsAsync(false);
  return normalize(res);
}
 
export async function getPhotoAccess(): Promise<PhotoAccess> {
  const res = await MediaLibrary.getPermissionsAsync(false);
  return normalize(res);
}
 
function normalize(res: MediaLibrary.PermissionResponse): PhotoAccess {
  if (res.status !== "granted") return "denied";
  // iOS: accessPrivileges が "limited" のとき限定アクセス
  // Android やフルアクセスの iOS では "all"(または未定義)
  const priv = (res as any).accessPrivileges as string | undefined;
  if (priv === "limited") return "limited";
  return "all";
}

requestPermissionsAsync(false) の引数は「書き込み専用ではない」、つまり読み取りを含めて要求する指定です。ここを誤ると読み取りができず、原因の分かりにくい不具合になります。

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

この記事の続きを読む

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

この記事で得られること
フルアクセスではなく「限定アクセス」を前提に、選ばれた写真だけで成立する画面設計に切り替えられる
許可状態を granted ではなく 3 状態(all / limited / denied)で受け取り、それぞれに正しい導線を出すロジックを手に入れられる
限定アクセス時に追加の写真を選び直してもらう導線と、空に見える状態を誤って権限拒否と混同しない設計を組み立てられる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-05-21
RorkでビルドしたiOSアプリがTestFlightで「ITMS-90683」拒否される — Info.plistの使用目的文字列の埋め方
Rork書き出しのiOSアプリをApp Store Connectに提出した直後、メールで「ITMS-90683: Missing Purpose String in Info.plist」を受け取る現象について、原因とapp.jsonからの恒久的な修正手順を、12年間の個人開発で繰り返しハマってきた立場から具体的に説明します。
開発ツール2026-06-26
ユーザー自身の画像を「ファイル」アプリから取り込む — Rorkアプリのドキュメントピッカーとセキュリティスコープ付きURL
写真アプリにない画像を「ファイル」アプリやiCloud Driveから取り込むと、選んだはずのURLが直後に無効になります。expo-document-pickerとセキュリティスコープ付きURL、サンドボックスへの確実なコピーまでを、動くコードで整理します。
開発ツール2026-06-23
アプリスイッチャーに個人的な画面が残る——背景へ回した瞬間のスナップショットを隠す設計
Rork が生成した React Native アプリをホームに戻すと、iOS はその瞬間の画面をアプリスイッチャー用に撮影してディスクに保存します。手記や個人的な入力画面はそこに残り、第三者の目に触れます。iOS の目隠しオーバーレイ(inactive で出す理由)、Android の FLAG_SECURE、機密画面だけに絞る方法、スクショ検知までを動くコードで示します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →