◉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-26上級

ユーザー自身の画像を「ファイル」アプリから取り込む — Rorkアプリのドキュメントピッカーとセキュリティスコープ付きURL

写真アプリにない画像を「ファイル」アプリやiCloud Driveから取り込むと、選んだはずのURLが直後に無効になります。expo-document-pickerとセキュリティスコープ付きURL、サンドボックスへの確実なコピーまでを、動くコードで整理します。

Rork577Expo213iOS114ドキュメントピッカーファイル管理

✦ プレミアム記事

壁紙アプリに「お手持ちの画像も壁紙にできます」という一文を足したくなったのは、あるユーザーから「自分で撮った写真を加工して使いたい」という要望をいただいたときでした。写真ライブラリから選ぶだけなら expo-image-picker で十分です。ところが、ユーザーが使いたい画像はカメラロールにあるとは限りません。クラウドに置いたデザイン素材、AirDropで受け取った1枚、iCloud Driveに整理したフォルダ。これらは「写真」ではなく「ファイル」アプリの領域にあります。

そこで expo-document-picker を入れてみると、選択まではあっさり動くのに、取り込んだ画像が翌日には開けなくなる、という現象に遭遇しました。原因は、iOSがファイルアプリの実体を直接渡しているわけではない、という一点に尽きます。以下では、私自身が個人開発の現場でつまずいた順番のまま、ドキュメントピッカーの最小実装から、URLが消える理由、サンドボックスへの確実なコピー、そしてRork Maxでネイティブに踏み込む場合の作法までを順に追います。

写真ピッカーで届く範囲、ファイルピッカーが必要な範囲

expo-image-picker が扱うのは Photos フレームワークの世界、つまりカメラロールとアルバムです。一方で「ファイル」アプリは、オンマイiPhone・iCloud Drive・サードパーティのクラウド(Dropbox や Google Drive のプロバイダ拡張)まで横断する別の入口です。

両者は技術的にも権限モデルが違います。写真ピッカーは「ユーザーが選んだ1枚だけをコピーして渡す」設計で、アプリにフォトライブラリ権限は不要です。ドキュメントピッカーも「選んだ瞬間だけ」のアクセスを渡しますが、その渡し方が曲者で、対象がアプリのサンドボックスの外にある以上、URLには寿命があります。ここを理解しないまま uri を保存すると、後から必ず壊れます。

expo-document-picker の最小実装と、最初の壁

まずは素直に書いてみます。

import * as DocumentPicker from 'expo-document-picker';
 
async function pickImageFromFiles() {
  const result = await DocumentPicker.getDocumentAsync({
    type: ['image/jpeg', 'image/png', 'image/heic'],
    copyToCacheDirectory: true,
    multiple: false,
  });
 
  if (result.canceled) return null;
 
  const asset = result.assets[0];
  // asset.uri / asset.name / asset.size / asset.mimeType
  return asset.uri;
}

copyToCacheDirectory: true を指定すると、Expoが裏でファイルをアプリのキャッシュ領域へコピーし、そのfile://のURIを返してくれます。ここまでは問題なく表示できます。落とし穴は次です。キャッシュディレクトリ(FileSystem.cacheDirectory)はOSがいつでも空にできる一時領域です。ストレージ逼迫時やアプリ更新時に消えても文句は言えません。つまり、このuriを AsyncStorage に保存して「次回も同じ壁紙」を再現しようとすると、ある日突然読めなくなります。

copyToCacheDirectory: false にすると、コピーを挟まないぶん高速ですが、返ってくるのはセキュリティスコープ付きの一時URLです。これは選択直後のコールバックの中でしか有効でなく、外に持ち出した瞬間に無効化されます。Androidでは content:// が返り、こちらも長期保存には向きません。

✦

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

この記事の続きを読む

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

この記事で得られること
✦copyToCacheDirectory の真偽で挙動が変わる理由と、キャッシュ消失を避ける documentDirectory への退避コード
✦Rork Max のネイティブSwiftで startAccessingSecurityScopedResource と NSFileCoordinator を正しく扱う iOS 16+ のネイティブ実装
✦iCloud Drive の未ダウンロードファイル・HEIC・巨大ファイル・複数選択でつまずく具体的な対処
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駆動開発
※ アフィリエイトリンクを含みます