RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/開発ツール
開発ツール/2026-03-14中級

Rork Max カメラ・ギャラリー機能ガイド — 写真撮影と画像選択を実装する

Rork Maxを使ってカメラアクセスとギャラリー機能を実装する方法を解説。画像の撮影・選択・最適化まで完全ガイド。

rork-max41cameragallerynative-apiimage-handling

Rork Maxカメラ・ギャラリー機能ガイド

モバイルアプリケーションにおいて、カメラアクセスとギャラリー機能は不可欠な要素です。ユーザーが写真を撮影したり、デバイスに保存された画像を選択したりする機能は、SNSアプリ、ECアプリ、ドキュメント管理アプリなど、様々な場面で活用されています。

ネイティブAPIの活用から画像最適化まで、実践的な実装方法をカバーします。

カメラ機能の基本実装

パーミッション設定の重要性

Rork Maxでカメラを使用する際、まず必要なのはパーミッションの設定です。iOSではInfo.plistに、AndroidではAndroidManifest.xmlに、カメラとマイク使用の許可を明記する必要があります。

import { Camera } from 'react-native-vision-camera';
import { useState } from 'react';
 
export function CameraScreen() {
  const [hasPermission, setHasPermission] = useState(false);
 
  // パーミッション要求
  const requestCameraPermission = async () => {
    try {
      const status = await Camera.requestCameraPermission();
      setHasPermission(status === 'granted');
      console.log(`カメラパーミッション: ${status}`);
      // 期待出力: カメラパーミッション: granted
    } catch (error) {
      console.error('パーミッション要求エラー:', error);
    }
  };
 
  return (
    <div>
      <button onClick={requestCameraPermission}>
        カメラを有効化
      </button>
      {hasPermission && <p>カメラが利用可能です</p>}
    </div>
  );
}

このコード例では、ユーザーからカメラ使用の許可を取得しています。パーミッション取得はアプリの初期化時に実行することが推奨されます。

ギャラリー機能の実装

画像選択機能

ユーザーが既存の画像を選択する機能は、react-native-image-pickerなどのライブラリを活用して実装できます。

import ImagePicker from 'react-native-image-picker';
import { useState } from 'react';
 
export function GallerySelector() {
  const [selectedImage, setSelectedImage] = useState(null);
 
  const pickImage = async () => {
    const options = {
      mediaType: 'photo',
      quality: 0.8,
      maxWidth: 1920,
      maxHeight: 1440,
    };
 
    ImagePicker.launchImageLibrary(options, (response) => {
      if (response.didCancel) {
        console.log('画像選択がキャンセルされました');
      } else if (response.error) {
        console.error('ギャラリーエラー:', response.error);
      } else {
        setSelectedImage(response.assets[0]);
        console.log(`選択画像: ${response.assets[0].fileName}`);
        // 期待出力: 選択画像: photo_2026_03_14.jpg
      }
    });
  };
 
  return (
    <div>
      <button onClick={pickImage}>ギャラリーから選択</button>
      {selectedImage && (
        <img
          src={selectedImage.uri}
          alt="Selected"
          style={{ maxWidth: '300px' }}
        />
      )}
    </div>
  );
}

画像最適化とキャッシング

撮影・選択後の画像処理

高解像度の画像をそのままアップロードするとネットワーク負荷が増加します。画像圧縮・リサイズ処理を導入することで、UX向上とストレージ効率化を実現できます。

import ImageResizer from 'react-native-image-resizer';
 
export async function optimizeImage(imagePath) {
  try {
    const resizedImage = await ImageResizer.createResizedImage(
      imagePath,
      1200,  // 幅
      900,   // 高さ
      'JPEG',
      85,    // 品質 (1-100)
      0      // 回転
    );
 
    console.log(`最適化完了: ${resizedImage.size} bytes`);
    // 期待出力: 最適化完了: 245000 bytes
    return resizedImage;
  } catch (error) {
    console.error('画像最適化エラー:', error);
  }
}

このプロセスにより、オリジナル画像を約50-70%削減できます。

ユーザー体験の向上

プログレス表示とエラーハンドリング

大きなファイルのアップロード時は、ユーザーに進捗を表示する点が肝心です。

export function ImageUploadWithProgress() {
  const [progress, setProgress] = useState(0);
  const [isUploading, setIsUploading] = useState(false);
 
  const uploadImage = async (imagePath) => {
    setIsUploading(true);
    const xhr = new XMLHttpRequest();
 
    xhr.upload.addEventListener('progress', (e) => {
      if (e.lengthComputable) {
        const percentComplete = (e.loaded / e.total) * 100;
        setProgress(percentComplete);
        console.log(`アップロード進捗: ${Math.round(percentComplete)}%`);
      }
    });
 
    xhr.addEventListener('load', () => {
      setIsUploading(false);
      console.log('アップロード完了');
      // 期待出力: アップロード完了
    });
 
    // アップロード実行 (省略)
  };
 
  return (
    <div>
      {isUploading && <p>進捗: {Math.round(progress)}%</p>}
    </div>
  );
}

パフォーマンス最適化のベストプラクティス

メモリ管理

カメラ機能はメモリを多く消費します。以下の対策を講じましょう:

  • 画像キャッシング: 同一画像の重複読み込みを避ける
  • メモリリーク対策: コンポーネント卸載時にリソースを解放
  • バックグラウンド処理: 重い画像処理は別スレッドで実行

詳しくは、Rork Max ネイティブAPI ガイドを参照してください。

他の認証機能との連携

ユーザープロフィール画像の設定などは、認証システムと連携します。詳細はRork Max ソーシャルログイン実装ガイドをご覧ください。

また、アニメーション効果を加えた画像プレビューについては、Rork Max アニメーション・ジェスチャーガイドで詳しく解説しています。

12年の個人開発で見えてきたこと

リリース直後にチェックしているもの

  • クラッシュレポートの上位エラーを24時間ごとに確認しているか
  • AdMob/StoreKit の収益ダッシュボードに異常検知が出ていないか
  • ユーザーレビューに技術的な指摘が含まれていないか
シェア

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

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

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

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

開発ツール2026-07-13
Detox と Maestro の E2E が全部緑なのに本番でクラッシュが出ていたとき — 自動リトライが握りつぶした不安定テストをフレーク率で炙り出す運用メモ
E2Eが全部緑なのに本番クラッシュが出る。原因は自動リトライがフレークを握りつぶしていたこと。テスト単位でフレーク率を計測し、隔離とリトライ予算で本物の失敗だけを残す運用メモです。
開発ツール2026-07-01
Rork Max のクラウドコンパイル — Mac を持たずにネイティブアプリを仕上げる
Rork Max のクラウドコンパイルで、ローカル Mac なしに iOS/iPadOS のネイティブアプリをビルド・実機テスト・公開する流れを、失敗時の切り分けと実機 Mac を残す判断基準まで含めて実務目線でまとめます。
開発ツール2026-06-17
誕生日を集めずに年齢を確認する — Declared Age Range API を Rork アプリに組み込む
iOS 26 の Declared Age Range API を使い、生年月日を保存せずに年齢層だけを受け取る実装方法。Rork Max のネイティブ Swift と、標準 Rork(Expo)のネイティブモジュール越しの呼び出しを、責務の線引きとともに整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →