◉RORK LABEN
●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主
記事一覧/開発ツール
⬡ 開発ツール/2026-06-29上級

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

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

Rork577Expo213写真ライブラリ権限7プライバシー12iOS114

✦ プレミアム記事

壁紙アプリに「自分の写真も背景に使いたい」という要望をもらい、写真ライブラリへのアクセスを足したときのことです。手元の検証端末では問題なく動いていたのに、ある利用者から「写真を選んだはずなのに、アプリには何も出てこない」という報告が届きました。原因は、その方が 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/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 開発ツール2026-09-21
exit code 0 で止まるビルド — ログを黙らせていた設定と、空ファイルを通した存在チェック
eas build --local が exit code 0 but produced no further output で止まる件と、0 バイトのスタブが埋め込まれず dyld で落ちる件。どちらも原因は出力を減らす設定でした。自分のスクリプトを棚卸しする手順まで書き残します。
⬡ 開発ツール2026-09-05
Widget Extension でも BGTaskScheduler.submit は成功します。走らないのは register が親アプリだけのものだからです
Widget Extension から BGTaskScheduler に依頼を出すとビルドも submit も通るのに、翌朝ウィジェットは変わりません。register がホストアプリ専用である事実から、更新の主語を親アプリへ戻す設計まで、壁紙アプリの運用で詰めた手順を残します。
⬡ 開発ツール2026-07-27
最低サポート iOS をいつ上げるか — 利用率ではなく、コードに残った分岐の数で決める
最低サポート OS の引き上げを利用率で判断すると、毎年同じ結論になって先送りが続きます。OS 分岐に注記を付けて棚卸しし、iOS と Android の引き上げ先ごとに消せる分岐を数えるスクリプトと、引き上げ後に見る指標をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます