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-04-18中級

RorkアプリがiOSで動くのにAndroidだけおかしい:プラットフォーム差異を修正する実践ガイド

RorkアプリがiOSで動くのにAndroidで崩れる問題を解決します。シャドウ・フォント・権限・キーボード制御など主要なプラットフォーム差異を実例コードで解説します。

Rork515Android43iOS108トラブルシューティング77プラットフォーム差異React Native209クロスプラットフォーム7

Rorkでアプリを作っていて、「iOSのプレビューでは完璧に動くのに、Androidで試したら見た目が崩れた」「ボタンを押してもAndroidだけ反応しない」という経験をした方は少なくないのではないでしょうか。

私自身、最初にRorkでアプリを公開したとき、iOSのTestFlightでは問題なく動いていたものが、Androidの実機でシャドウが全部消えていて「え、なにこれ」と思ったことがあります。Rorkが生成するコードはReact Nativeベースなので、基本的にクロスプラットフォームで動くはずなのですが、いくつかの場面でiOSとAndroidの挙動が明確に変わります。

ここではRorkアプリでiOS/Android間に差が出やすいポイントを具体的なコード例とともに整理します。AIにプロンプトで修正を依頼する際のヒントも合わせてお伝えします。

なぜRorkアプリでiOS/Androidの差が生まれるのか

Rorkが生成するアプリはReact Native(Expo)をベースにしています。React Nativeはクロスプラットフォームを謳っていますが、あくまで「同じコードで両OSに対応できる仕組み」であり、「両OSで完全に同じ見た目・動作になる」とは少し違います。

iOSはApple独自の描画エンジン(Core Animation)、AndroidはAndroid独自のレンダリング(Skia等)を使うため、同じスタイル設定でも実際の描画結果が異なることがあります。また、権限の取得方法・フォントのデフォルト設定・キーボードの挙動など、OS固有の仕様が絡む部分はコードで明示的に分岐させる必要があります。

よくある差異 1:シャドウ(影)がAndroidで表示されない

これはRorkアプリで最もよく見かけるプラットフォーム差異です。

iOSでは shadowColorshadowOffsetshadowOpacityshadowRadius というスタイルプロパティが使えます。ところがAndroidではこれらが無視されます。Androidでシャドウを表示するには elevation プロパティを使う必要があります。

Rorkが生成するコードでiOSのシャドウだけ設定されていた場合、以下のように両方の記述を追加するようAIに依頼するか、手動でコードを修正します。

// iOS・Android両方で影を表示するスタイル
const cardStyle = {
  backgroundColor: '#ffffff',
  borderRadius: 12,
  padding: 16,
  // iOS用シャドウ
  shadowColor: '#000',
  shadowOffset: { width: 0, height: 2 },
  shadowOpacity: 0.15,
  shadowRadius: 4,
  // Android用シャドウ(elevation)
  elevation: 4,
};

Rorkへの依頼例:「カードコンポーネントのシャドウがAndroidで表示されありません。iOSのshadowプロパティに加えて、Android用のelevationプロパティも設定してほしい」

よくある差異 2:フォントがAndroidで違う・太字が効かない

iOSではシステムフォント(San Francisco)が自動的に使われますが、Androidのシステムフォント(Roboto等)は字形が異なります。特にカスタムフォントを読み込んでいる場合、Androidでフォントウェイト(fontWeight)が正しく適用されないことがあります。

Androidでは fontWeight: 'bold' と書いても効かないケースがあり、正しく太字にするには fontFamily にボールド体のフォントを明示的に指定する必要があります。

import { Platform } from 'react-native';
 
const titleStyle = {
  fontSize: 18,
  // Androidではfontweightが効かない場合がある
  // Platform.OSで分岐して対応する
  fontFamily: Platform.OS === 'android' ? 'Roboto-Bold' : undefined,
  fontWeight: Platform.OS === 'ios' ? '700' : undefined,
  color: '#111827',
};

カスタムフォントを使っている場合は、expo-font で読み込む際にボールド体のファイルも必ず追加しておくことが大切です。

よくある差異 3:ステータスバーの高さが異なる

iPhoneにはノッチ・Dynamic Island、Androidにはパンチホールカメラやノッチなど、各端末でステータスバー(上部の通知エリア)の高さが異なります。StatusBar.currentHeight(Android専用)を使って動的にパディングを設定しないと、Androidでコンテンツがステータスバーに隠れてしまうことがあります。

import { Platform, StatusBar, SafeAreaView } from 'react-native';
 
// StatusBarの高さを考慮したコンテナ
const containerStyle = {
  flex: 1,
  paddingTop: Platform.OS === 'android' ? StatusBar.currentHeight : 0,
};
 
// または SafeAreaView を使う(推奨)
function MyScreen() {
  return (
    <SafeAreaView style={{ flex: 1 }}>
      {/* コンテンツ */}
    </SafeAreaView>
  );
}

Rorkが生成するコードでは SafeAreaView が使われていることが多いですが、Androidで上部が切れている場合は、明示的に StatusBar.currentHeight を使ったパディングを追加することで解決できます。

よくある差異 4:カメラ・マイク権限の取得方法が違う

カメラやマイクを使うアプリで、iOSでは権限ダイアログが表示されるのにAndroidでは表示されない、またはその逆というケースがあります。

iOSでは Info.plist に権限の説明文を記載するだけで、実行時に自動でダイアログが表示されます。Androidでは AndroidManifest.xml に権限を宣言した上で、コード上で PermissionsAndroid.request() を使って明示的に許可を求める必要があります。

import { Platform, PermissionsAndroid, Alert } from 'react-native';
 
async function requestCameraPermission(): Promise<boolean> {
  if (Platform.OS === 'ios') {
    // iOSはexpo-cameraの権限フックが処理するため不要
    return true;
  }
 
  try {
    const granted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.CAMERA,
      {
        title: 'カメラへのアクセス許可',
        message: 'アプリがカメラを使用するには許可が必要です。',
        buttonNeutral: '後で確認',
        buttonNegative: '拒否',
        buttonPositive: '許可',
      }
    );
    return granted === PermissionsAndroid.RESULTS.GRANTED;
  } catch (err) {
    Alert.alert('エラー', '権限の取得中にエラーが発生しました。');
    return false;
  }
}

Rorkへの依頼例:「カメラ機能をAndroidでも使えるようにしたい。PermissionsAndroid を使って、Androidでカメラ権限を明示的にリクエストするコードを追加してほしい」

よくある差異 5:キーボードがテキスト入力フィールドを隠す

フォームなど、テキスト入力がある画面でよく起きる問題です。iOSでは KeyboardAvoidingViewbehavior="padding" がうまく機能しますが、Androidでは behavior="height" にしないとうまくいかないことがあります。

import { KeyboardAvoidingView, Platform, ScrollView } from 'react-native';
 
function FormScreen() {
  return (
    <KeyboardAvoidingView
      style={{ flex: 1 }}
      // Androidは"height"、iOSは"padding"が安定
      behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
      keyboardVerticalOffset={Platform.OS === 'ios' ? 0 : 20}
    >
      <ScrollView keyboardShouldPersistTaps="handled">
        {/* テキスト入力フィールドを含むコンテンツ */}
      </ScrollView>
    </KeyboardAvoidingView>
  );
}

なお、Rorkが生成したコードに KeyboardAvoidingView が含まれていない場合は「テキスト入力フィールドがキーボードで隠れないよう、KeyboardAvoidingViewで囲んでほしい。iOSはpadding、Androidはheight動作で」と依頼すると適切なコードが生成されます。

Rorkへの修正依頼をうまく伝えるコツ

プラットフォーム差異の修正をRorkのAIに依頼するとき、「Androidで動かない」だけでは情報が少なすぎて精度の高い修正が返ってきません。以下のように具体的に伝えると、一発で解決できる確率が上がります。

  • 「Androidの実機(Pixel 8 / Android 15)でxxが起きる。iOSでは問題ない」
  • 「Platform.OS === 'android' の分岐を追加して対応してほしい」
  • 「スタイルの差異ならPlatform.selectを使いたい」

また、複数の問題が絡んでいる場合は一度に全部頼まず、1つずつ修正を確認しながら進めた方が安全です。AIが複数の変更を一度に加えると、意図しない箇所まで変更されてしまうことがあります。関連する記事としてRork AIが既存コードを上書きしてしまう問題の対策も参考にしてみてください。

まずAndroid実機でテストする習慣をつける

iOSシミュレーターでの開発が中心になりがちですが、Androidの実機テストは早い段階からやっておくことをおすすめします。Rork CompanionはiOS・Android両方の実機テストに対応しています。開発の後半になってAndroid固有の問題がまとめて出てくると対処が大変です。

UIの差異は見た目を確認しながら直せますが、権限やキーボード・フォントの問題は実機でしか再現しないことが多いです。アプリのコア機能が完成したタイミングで一度Android実機を使って全画面を流し見する、という習慣だけで、リリース前に多くの問題を事前につぶせます。

シェア

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

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

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

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

関連記事

開発ツール2026-05-02
Rork で StatusBar の色・スタイルが反映されない時の対処法
Rork で生成したアプリの StatusBar が iOS と Android で意図通りに表示されない問題を、実装パターン別に切り分けて解決する手順をまとめました。
開発ツール2026-04-24
Rork アプリの WebView が真っ白になる・ページが表示されないときに確認する 6 つの原因
Rork で WebView を組み込んだら画面が真っ白になる、ページが読み込まれない、JavaScript が動かない ─ そんな症状を切り分けて確実に直すためのチェックリストです。
開発ツール2026-05-19
Rork で AsyncStorage に大容量データを保存すると Android で CursorWindow エラーが出る原因と対処
Rork(React Native)で AsyncStorage に大きな JSON や画像メタデータを保存すると Android で発生する Row too big to fit into CursorWindow エラーの原因と、MMKV・SQLite・分割保存・圧縮など複数の現実的な対処をまとめています。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →