Skip to content

Install eas#99

Merged
sooom1627 merged 6 commits intomainfrom
installEAS
Apr 6, 2025
Merged

Install eas#99
sooom1627 merged 6 commits intomainfrom
installEAS

Conversation

@sooom1627
Copy link
Owner

@sooom1627 sooom1627 commented Apr 6, 2025

Summary by CodeRabbit

  • 新機能

    • 環境設定用テンプレートの追加により、サービス連携の設定が簡易化されました。
  • ドキュメンテーション

    • README に新たなビルドガイドと「Building the App」セクションが追加され、アプリ構築手順が明確になりました。
    • プロジェクトの現状や設定方法を記載した文書が充実しています。
  • その他の改善

    • 各プラットフォーム向けの構成ファイルや依存性、起動スクリプトが整理・更新され、全体の品質向上に寄与しています。

…定を追加しました。これにより、Supabaseの設定が一元管理され、プロジェクトの構成が改善されました。
…で環境変数を動的に読み込む機能を実装しました。また、`app.json`のバージョンを`0.0.1`に変更し、iOSの設定を更新しました。新たに`eas.json`を追加し、ビルド環境に応じた設定を定義しました。
…により、アプリの安定性とパフォーマンスが向上することが期待されます。
…sonおよびpackage-lock.jsonからexpo-permissionsの依存関係を削除しました。これにより、アプリの設定が整理され、不要な依存関係が排除されました。
…EADME.mdに追記しました。これにより、Expoの開発環境が整備され、アプリのビルドが容易になります。
…。また、プロジェクトステータスの依存関係テーブルを整形し、設定の変更履歴を更新しました。これにより、アプリのビルドとテストに関する情報が明確になり、開発者が必要な手続きを理解しやすくなります。
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Apr 6, 2025

Walkthrough

このプルリクエストでは、Supabase 用の環境変数テンプレート (.env.example) の追加、Git の環境ファイル除外ルールの補強、Expo アプリのビルド手順およびプロジェクト設定のドキュメント更新が行われています。さらに、Android および iOS のネイティブビルド環境の構成ファイル、設定ファイル、リソースファイル、起動スクリプトなどが新規に追加または更新され、全体としてアプリケーションの環境依存設定とネイティブ統合が整理されています。

Changes

ファイル/ディレクトリ 変更内容
.env.example
.gitignore (ルート)
Supabase 用の環境変数テンプレート追加、および .env.development.env.production を無視するエントリを追加
README.md
docs/build-guide.md
docs/project-status.md
eas.json
ビルド手順とプロジェクト状況に関するドキュメントを新規作成・追加
android/** Android 用の新規 Gradle 設定、Manifest ファイル(debug/main)、MainActivity や MainApplication の追加、各種リソース (drawable, mipmap, values)・ビルドスクリプト(gradle.properties, gradlew, gradlew.bat, settings.gradle)の新規作成および設定
app.config.js
app.json
環境変数を読み込む loadEnv 関数の追加、および iOS/Android 固有の設定項目、バージョン・メタ情報の更新
ios/** Xcode プロジェクト構成 (Linpe.xcodeproj, xcworkspace 等) の新規追加、plist、AppDelegate, ブリッジヘッダー、各種リソース (Images.xcassets, SplashScreen.storyboard 等)、Podfile および Podfile.properties.json の追加
package.json Expo/React Native の起動スクリプトの変更および依存関係のバージョン更新、expo-dev-client の追加

Sequence Diagram(s)

sequenceDiagram
    participant App as アプリ起動
    participant Config as app.config.js
    participant Env as 環境ファイル (.env.development/.env.production)
    
    App->>Config: loadEnv() を呼び出す
    Config->>Env: APP_ENV に基づいて環境ファイルをチェック
    alt 存在する場合
      Env-->>Config: 環境変数を返す
    else 存在しない場合
      Config->>Env: デフォルトの .env をロード
      Env-->>Config: 環境変数を返す
    end
    Config->>App: ロード済み設定を返す
Loading

Possibly related PRs

  • Setup auth #4: Supabase 用の環境変数設定ファイル削除に伴う変更と関連しており、今回の環境設定テンプレートの追加とコードレベルで連携しています。

Poem

ひょっこり現る
新たな設定ファイルの花
アプリの道を照らすよ
Android と iOSも
ぴょんぴょんと踏み出す
コードの森で
うさぎは笑顔で走る 🐰🌸

✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai plan to trigger planning for file edits and PR creation.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (14)
.env.example (1)

1-7: 環境変数テンプレートは十分に整備されていますが、細かい点を改善できます。

APP_ENV=development の末尾に不要なトレーリングスペースが含まれているようです。以下のようにトレーリングスペースを削除し、ファイル末尾に改行を追加するとより良いでしょう。

-APP_ENV=development 
+APP_ENV=development
eas.json (1)

1-30: EASの設定が適切に構成されています

eas.jsonファイルには以下の良い点があります:

  1. CLI、ビルド環境、およびサブミッションプロセスのための明確な設定が定義されています
  2. 開発、プレビュー、本番の3つの環境が適切に区別されています
  3. 各環境に対して正しいAPP_ENV環境変数が設定されています

また、開発環境ではdevelopmentClient: trueが設定されており、テスト用に開発クライアントが有効になっています。本番環境ではautoIncrement: trueが設定されており、ビルド番号が自動的に増加します。

ただし、preview環境とproduction環境の違いがわかりにくいので、コメントで説明を追加することをお勧めします。

ios/Linpe/Info.plist (2)

26-34: URLスキームの指定を見直すことを検討してください

CFBundleURLSchemesに「myapp」という一般的な名前が含まれていますが、これは他のアプリケーションと競合する可能性があります。アプリ固有のスキーム(例: 「linpe」)を使用することで、ディープリンクの競合を避けられます。

<array>
-  <string>myapp</string>
+  <string>linpe</string>
   <string>com.linpe.app</string>
</array>

48-55: プライバシー関連の使用説明文をより詳細にすることを検討してください

現在のカメラ、Face ID、マイク、フォトライブラリのアクセス許可説明文は最小限です。App Storeのレビュープロセスをスムーズに通過するためにも、なぜこれらのアクセス許可が必要なのか、ユーザーにより具体的に説明することをお勧めします。

<key>NSCameraUsageDescription</key>
-<string>Allow $(PRODUCT_NAME) to access your camera</string>
+<string>$(PRODUCT_NAME)がプロフィール写真の撮影や画像のアップロードのためにカメラへのアクセスを必要としています</string>
<key>NSFaceIDUsageDescription</key>
-<string>Allow $(PRODUCT_NAME) to access your Face ID biometric data.</string>
+<string>$(PRODUCT_NAME)が安全なログインとデータ保護のためにFace IDを使用します</string>
<key>NSMicrophoneUsageDescription</key>
-<string>Allow $(PRODUCT_NAME) to access your microphone</string>
+<string>$(PRODUCT_NAME)が音声メッセージや通話機能のためにマイクへのアクセスを必要としています</string>
<key>NSPhotoLibraryUsageDescription</key>
-<string>Allow $(PRODUCT_NAME) to access your photos</string>
+<string>$(PRODUCT_NAME)がプロフィール写真の設定や画像の共有のためにフォトライブラリへのアクセスを必要としています</string>
ios/Linpe/Supporting/Expo.plist (1)

1-12: Expo 設定の確認:
この Expo.plist ファイルは正しく記述されています。ただし、更新チェックを「ALWAYS」にしている一方で、更新機能自体が無効(EXUpdatesEnabled が false)になっている点について、意図した設定かどうか確認してください。もし自動更新を有効にする必要がある場合は、この値を true に変更する必要があります。

android/app/build.gradle (1)

68-68: ProGuardの有効化設定について再度ご確認ください。
android.enableProguardInReleaseBuildsの値によってProGuardを有効にしていますが、リリース時のパフォーマンスと可読性を考慮し、ProGuardの最適化レベルを事前に確認することをおすすめします。もし最適化に時間がかかったり、デバッグ性が下がりすぎる場合は、設定を調整してください。

app.json (1)

46-54: extraセクションの設定がEASビルドプロファイルや他の環境変数と連携しているか確認してください。
router.origineas.projectIdを定義していますが、これらがビルドフローやAPIの呼び出しに影響する場合、実際の挙動をテストして確認してください。また、ownerキーを変更する場合はExpoプロジェクトのオーナー設定も併せて調整が必要です。

android/app/src/main/java/com/linpe/app/MainActivity.kt (1)

15-24: SplashScreenManager.registerOnActivity(this)使用時にアプリテーマを適切に読み込んでいるか確認してください。
コメントアウトされているsetTheme(R.style.AppTheme)のように、スプラッシュスクリーン表示前のテーマが適切に設定されていない場合、画面描画に不具合を生じることがあります。CVやステータスバーの色調整を実施する際は、onCreate前後の処理タイミングを十分に検証してください。

ios/Podfile (4)

5-5: rescue修飾子の使用を避けましょう
この行ではrescueを修飾子形式で使用していますが、可読性の観点から推奨されません。以下のようにブロック形式で記述してください。

- podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {}
+ begin
+   podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json')))
+ rescue
+   podfile_properties = {}
+ end
🧰 Tools
🪛 RuboCop (1.73)

[convention] 5-5: Avoid using rescue in its modifier form.

(Style/RescueModifier)


30-30: マルチライン配列の末尾にカンマを追加しましょう
RuboCopの指摘に従い、マルチライン配列では末尾要素の後にカンマを付与すると可読性が向上します。

 ...
🧰 Tools
🪛 RuboCop (1.73)

[convention] 30-30: Put a comma after the last item of a multiline array.

(Style/TrailingCommaInArrayLiteral)


44-44: メソッド呼び出しにおける最後の引数の後ろにカンマは不要です
メソッド呼び出しの引数末尾にカンマを残さないように修正してください。

-    :privacy_file_aggregation_enabled => podfile_properties['apple.privacyManifestAggregationEnabled'] != 'false',
+    :privacy_file_aggregation_enabled => podfile_properties['apple.privacyManifestAggregationEnabled'] != 'false'
🧰 Tools
🪛 RuboCop (1.73)

[convention] 44-44: Avoid comma after the last parameter of a method call.

(Style/TrailingCommaInArguments)


52-52: 呼び出しパラメータの末尾のカンマを削除してください
同様に、最後のパラメータ行にあるカンマは削除が推奨されます。

-      :ccache_enabled => podfile_properties['apple.ccacheEnabled'] == 'true',
+      :ccache_enabled => podfile_properties['apple.ccacheEnabled'] == 'true'
🧰 Tools
🪛 RuboCop (1.73)

[convention] 52-52: Avoid comma after the last parameter of a method call.

(Style/TrailingCommaInArguments)

android/app/src/main/AndroidManifest.xml (1)

2-7: WRITE_EXTERNAL_STORAGEなどのパーミッション使用を再検討してください
APIレベル33以降でストレージ関連のパーミッションが厳格化されたため、もし不要であれば削除やスコープドストレージへの移行を検討すると安全です。

android/gradle.properties (1)

15-18: 並列実行機能のコメントアウトについて

並列実行機能は現在コメントアウトされていますが、ビルド時間を短縮するために有効化を検討することをお勧めします。特に複数のモジュールを持つプロジェクトで効果的です。

-# org.gradle.parallel=true
+org.gradle.parallel=true
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c018f00 and 368553e.

⛔ Files ignored due to path filters (12)
  • android/app/src/main/res/drawable-hdpi/splashscreen_logo.png is excluded by !**/*.png
  • android/app/src/main/res/drawable-mdpi/splashscreen_logo.png is excluded by !**/*.png
  • android/app/src/main/res/drawable-xhdpi/splashscreen_logo.png is excluded by !**/*.png
  • android/app/src/main/res/drawable-xxhdpi/splashscreen_logo.png is excluded by !**/*.png
  • android/app/src/main/res/drawable-xxxhdpi/splashscreen_logo.png is excluded by !**/*.png
  • android/gradle/wrapper/gradle-wrapper.jar is excluded by !**/*.jar
  • ios/Linpe/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png is excluded by !**/*.png
  • ios/Linpe/Images.xcassets/SplashScreenLogo.imageset/image.png is excluded by !**/*.png
  • ios/Linpe/Images.xcassets/SplashScreenLogo.imageset/image@2x.png is excluded by !**/*.png
  • ios/Linpe/Images.xcassets/SplashScreenLogo.imageset/image@3x.png is excluded by !**/*.png
  • ios/Podfile.lock is excluded by !**/*.lock
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (51)
  • .env.example (1 hunks)
  • .gitignore (1 hunks)
  • README.md (2 hunks)
  • android/.gitignore (1 hunks)
  • android/app/build.gradle (1 hunks)
  • android/app/proguard-rules.pro (1 hunks)
  • android/app/src/debug/AndroidManifest.xml (1 hunks)
  • android/app/src/main/AndroidManifest.xml (1 hunks)
  • android/app/src/main/java/com/linpe/app/MainActivity.kt (1 hunks)
  • android/app/src/main/java/com/linpe/app/MainApplication.kt (1 hunks)
  • android/app/src/main/res/drawable/ic_launcher_background.xml (1 hunks)
  • android/app/src/main/res/drawable/rn_edit_text_material.xml (1 hunks)
  • android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (1 hunks)
  • android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (1 hunks)
  • android/app/src/main/res/values-night/colors.xml (1 hunks)
  • android/app/src/main/res/values/colors.xml (1 hunks)
  • android/app/src/main/res/values/strings.xml (1 hunks)
  • android/app/src/main/res/values/styles.xml (1 hunks)
  • android/build.gradle (1 hunks)
  • android/gradle.properties (1 hunks)
  • android/gradle/wrapper/gradle-wrapper.properties (1 hunks)
  • android/gradlew (1 hunks)
  • android/gradlew.bat (1 hunks)
  • android/settings.gradle (1 hunks)
  • app.config.js (1 hunks)
  • app.json (2 hunks)
  • docs/build-guide.md (1 hunks)
  • docs/project-status.md (1 hunks)
  • eas.json (1 hunks)
  • ios/.gitignore (1 hunks)
  • ios/.xcode.env (1 hunks)
  • ios/Linpe.xcodeproj/project.pbxproj (1 hunks)
  • ios/Linpe.xcodeproj/xcshareddata/xcschemes/Linpe.xcscheme (1 hunks)
  • ios/Linpe.xcworkspace/contents.xcworkspacedata (1 hunks)
  • ios/Linpe/AppDelegate.h (1 hunks)
  • ios/Linpe/AppDelegate.mm (1 hunks)
  • ios/Linpe/Images.xcassets/AppIcon.appiconset/Contents.json (1 hunks)
  • ios/Linpe/Images.xcassets/Contents.json (1 hunks)
  • ios/Linpe/Images.xcassets/SplashScreenBackground.colorset/Contents.json (1 hunks)
  • ios/Linpe/Images.xcassets/SplashScreenLogo.imageset/Contents.json (1 hunks)
  • ios/Linpe/Info.plist (1 hunks)
  • ios/Linpe/Linpe-Bridging-Header.h (1 hunks)
  • ios/Linpe/Linpe.entitlements (1 hunks)
  • ios/Linpe/PrivacyInfo.xcprivacy (1 hunks)
  • ios/Linpe/SplashScreen.storyboard (1 hunks)
  • ios/Linpe/Supporting/Expo.plist (1 hunks)
  • ios/Linpe/main.m (1 hunks)
  • ios/Linpe/noop-file.swift (1 hunks)
  • ios/Podfile (1 hunks)
  • ios/Podfile.properties.json (1 hunks)
  • package.json (4 hunks)
🧰 Additional context used
🪛 RuboCop (1.73)
ios/Podfile

[convention] 5-5: Avoid using rescue in its modifier form.

(Style/RescueModifier)


[convention] 30-30: Put a comma after the last item of a multiline array.

(Style/TrailingCommaInArrayLiteral)


[convention] 44-44: Avoid comma after the last parameter of a method call.

(Style/TrailingCommaInArguments)


[convention] 52-52: Avoid comma after the last parameter of a method call.

(Style/TrailingCommaInArguments)

🔇 Additional comments (81)
ios/Linpe/Images.xcassets/Contents.json (1)

1-7: JSONファイルの基本情報が正しく定義されています

この新規ファイルでは、info オブジェクト内に "version": 1"author": "expo" が設定されており、Expo に沿ったアセット管理のメタ情報として適切に記述されています。JSON の構造も問題なく、今後のアセット運用に支障はなさそうです。

android/app/src/main/res/values-night/colors.xml (1)

1-1: 空のリソース定義は今後の拡張に向けた適切なプレースホルダーです。

このファイルは夜間モード用のカラーリソースファイルとして、将来的に必要なカラーテーマの定義を追加するための基盤となります。現状は空で問題ありません。

android/.gitignore (1)

1-17: Git管理対象外ファイルの除外設定は適切です。

OSX固有のファイル、Android/IntelliJのビルド関連ファイルや設定ファイル、さらにバンドルのアーティファクトが正しく除外されています。特に問題は見受けられません。

ios/Linpe/Images.xcassets/AppIcon.appiconset/Contents.json (1)

1-14: AppIconのJSON定義は正確です。

iOS用のアプリアイコン設定が正しいフォーマットで記述されており、expoによる管理も意図通り反映されています。特に修正の必要はありません。

ios/.gitignore (1)

1-31: iOS向けの除外設定が適切に記載されています。

Xcodeのビルド生成ファイル、ユーザ固有の設定ファイル、CocoaPods関連ディレクトリなど、不要なファイルがしっかりと除外されています。問題ありません。

ios/.xcode.env (1)

1-11: 環境設定が適切に構成されています

この.xcode.envファイルはXcode内のスクリプトフェーズで使用される環境を適切に設定しています。ローカル環境をカスタマイズするための.xcode.env.localファイルに関する説明も適切に記載されており、バージョン管理されないようになっています。

Node実行ファイルへのパスを取得する方法も効率的です。この設定により、EASビルドプロセスがXcode内で正しく機能するようになります。

ios/Linpe/PrivacyInfo.xcprivacy (1)

1-48: プライバシー設定が適切に構成されています

このプライバシー構成ファイルは、iOS 14以降で必要となるプライバシー関連の設定を正しく定義しています。アプリがアクセスするAPIタイプとその理由が適切に記述されており、以下のカテゴリが含まれています:

  1. UserDefaults
  2. FileTimestamp
  3. DiskSpace
  4. SystemBootTime

また、NSPrivacyCollectedDataTypesが空の配列として定義されており、データ収集が行われないことを示しています。さらに、NSPrivacyTrackingfalseに設定されており、トラッキングが無効になっていることを明確にしています。

これらの設定はApp Storeの審査をスムーズに通過するために重要です。

ios/Linpe/Linpe-Bridging-Header.h (1)

1-3: Swiftブリッジングヘッダーが適切に設定されています

このブリッジングヘッダーファイルはObjective-CのコードをSwiftから利用できるようにするための設定です。現在は空ですが、将来的にSwiftコードからアクセスする必要があるObjective-Cのヘッダーをここにインポートすることができます。

EASビルドプロセスでSwiftコードを使用する場合に必要な設定であり、適切に実装されています。

ios/Linpe/noop-file.swift (1)

1-4: 空のSwiftファイルとしての実装は適切です

このファイルは、ネイティブモジュールでSwiftファイルが必要となる場合に備えた空のファイルとして正しく実装されています。コメントも明確に記載され、意図が十分伝わっています。

ios/Linpe/AppDelegate.h (1)

1-8: AppDelegate.hの内容確認

必要なヘッダーのインポートが行われ、AppDelegateEXAppDelegateWrapperを継承する形で正しく定義されています。全体としてシンプルで、今後の実装と連携もしやすい状態です。

ios/Linpe.xcworkspace/contents.xcworkspacedata (1)

1-11: ワークスペース構成ファイルのレビュー

XML形式のワークスペースファイルが正しく記述され、プロジェクトファイルおよびCocoaPodsのプロジェクトへの参照が適切に設定されています。意図通りの構成となっています。

ios/Linpe/Linpe.entitlements (1)

1-5: エンタイトルメントファイルの内容確認

現時点では空の辞書として定義されていますが、将来的なエンタイトルメントの追加に対応するために適切なファイル構造が確保されています。フォーマットや宣言も正しく記述されています。

ios/Linpe/main.m (1)

1-9: エントリーポイントの実装確認

main関数は適切に定義され、UIApplicationMainによりアプリケーションの起動が正しく処理されています。AppDelegateクラスの指定も適切で、メモリ管理についても@autoreleasepoolでしっかりと管理されています。

android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (1)

1-5: アダプティブアイコンXMLの設定は適切です。

このファイルでは、背景と前景のリソースが正しく定義されており、Android向けのラウンドアイコンとして期待通りの動作が得られると考えられます。

android/app/src/main/res/drawable/ic_launcher_background.xml (1)

1-6: レイヤーリストDrawableの定義は正確です。

背景に設定された色と中央配置されたロゴ画像が組み合わされており、スプラッシュ画面用の背景として問題なく利用できる実装になっています。

.gitignore (1)

35-36: 環境変数ファイルの除外ルールが強化されています。

.env.development.env.production を無視することで、ローカル環境固有の設定ファイルや秘密情報がリポジトリに含まれないようになっており、セキュリティ面でも適切な対応です。

ios/Linpe/Images.xcassets/SplashScreenLogo.imageset/Contents.json (1)

1-24: スプラッシュスクリーン用画像セットのJSON定義は問題ありません。

各スケール(1x, 2x, 3x)の画像ファイルが正しく指定され、infoセクションも整合的に設定されています。Expoの設定と連携して動作することを期待できます。

ios/Podfile.properties.json (1)

1-5: Podfile.properties.json の設定は意図通りです。

Expoで利用するJavaScriptエンジンとして Hermes を指定し、開発クライアント用のネットワークインスペクターおよび新アーキテクチャの有効化が明示されているため、EASビルド環境の要件を満たす設定となっています。

ios/Linpe/Images.xcassets/SplashScreenBackground.colorset/Contents.json (1)

1-20: スプラッシュスクリーンの背景色設定が適切に定義されています

このJSONファイルはiOSアプリのスプラッシュスクリーン背景に純白色(RGBA: 1.0, 1.0, 1.0, 1.0)を定義しています。ユニバーサル設定(全デバイス対応)となっており、Expoフレームワークによって生成されたことがわかります。

この色設定はAndroidのsplashscreen_background(#ffffff)と一致しており、クロスプラットフォームの一貫性が確保されています。

android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (1)

1-5: Android適応アイコン設定が適切に構成されています

このXMLファイルはAndroid 8.0(API 26)以降で導入された適応アイコン(Adaptive Icon)を正しく定義しています。背景に@color/iconBackgroundを指定し、前景に@mipmap/ic_launcher_foregroundを使用する構成になっています。

これにより、異なるAndroidデバイスの各ランチャーでアイコンの形状が変わっても適切に表示されるようになります。

ios/Linpe/Info.plist (2)

21-36: バージョン管理の確認

アプリバージョンが「0.0.1」、ビルド番号が「1」と設定されています。初期リリースとしては適切ですが、リリース計画に沿ってバージョン番号を管理するプロセスを確立しておくことをお勧めします。


41-47: ネットワークセキュリティ設定が適切に構成されています

NSAppTransportSecurityの設定で、NSAllowsArbitraryLoadsfalseに設定し、NSAllowsLocalNetworkingtrueに設定している点は、セキュリティ上の良い実践です。これにより、HTTPSが強制される一方で、ローカル開発環境での接続が可能になります。

android/app/src/main/res/drawable/rn_edit_text_material.xml (1)

23-35: React Nativeの既知の問題に対する回避策が適切に実装されています

このファイルはReact Nativeの既知のNullPointerException問題を回避するために、特定の状態組み合わせ(state_pressed="false" と state_focused="false")を除外した実装になっています。コメントに問題の詳細と参照先が明記されており、将来のメンテナンスに役立ちます。

この実装は、React Nativeコミュニティで承認された回避策に基づいているため、適切です。参照されているPull Request(https://bit.ly/3CdLStvhttps://bit.ly/3nxOMoR)を確認した結果、この対応は妥当です。

android/app/src/main/res/values/colors.xml (1)

1-6: カラーリソース定義の確認:
新規追加されたカラーリソースは、各要素に対して意図した色が設定されており、デザイン仕様に沿って正しく定義されています。特に問題は見受けられません。

README.md (2)

48-51: ビルドガイドリンクの追加:
README.md に新規で「ビルドガイド」へのリンクが追加されています。Expo の managed workflow を利用したビルド手順を参照するためのリンク先が正しく設定されているか、最終確認をお願いします。


74-77: 『Building the App』セクションの追加:
新たに追加された「Building the App」セクションは、ビルド手順のドキュメントへの誘導として効果的です。全体のドキュメント構成との一貫性も保たれており、内容に問題はありません。

android/app/src/main/res/values/styles.xml (1)

1-19: スタイル定義の確認:
新規に追加された各スタイル(AppTheme、ResetEditText、Theme.App.SplashScreen)は、アプリの UI 一貫性とテーマ管理に寄与する適切な設定となっています。特に指摘すべき点は見当たりません。

android/app/src/debug/AndroidManifest.xml (1)

1-7: AndroidManifest.xml の確認:
デバッグ用の AndroidManifest.xml では、SYSTEM_ALERT_WINDOW 権限の追加および cleartext トラフィックを許可する設定が含まれています。tools 属性による補正も正しく記述されていますが、これらの設定がデバッグ環境として意図通りであるか、再確認をお願いします。

android/app/proguard-rules.pro (3)

1-9: ProGuardの設定が適切に導入されています

ProGuardのルールファイルが適切に設定されており、ドキュメントへの参照も含まれています。この設定は一般的なAndroidアプリの最適化とコード保護に役立ちます。


10-12: React Nativeライブラリの保持ルールが正しく設定されています

React Native Reanimatedおよびturbomoduleパッケージのクラスを保持するルールが適切に設定されており、アプリのビルド時に必要なコードが削除されないようになっています。


14-14: 将来的なカスタムルールのための準備が整っています

プロジェクト固有のProGuardルールを追加するための場所が明確に示されており、将来的な拡張性が確保されています。

ios/Linpe/SplashScreen.storyboard (3)

1-10: iOSスプラッシュスクリーンの基本設定が適切です

スプラッシュスクリーンのStoryboardファイルが適切に設定されており、必要な依存関係とケイパビリティが含まれています。SafeAreaのサポートやInterfaceBuilder関連の設定も正しく行われています。


11-34: スプラッシュスクリーンのレイアウトと制約が正しく設定されています

スプラッシュスクリーンのレイアウトが適切に構成されており、ロゴが中央に配置されるよう制約が設定されています。ビューコントローラーの識別子も適切に設定されています。


36-41: リソースの定義が適切です

スプラッシュスクリーンで使用されるロゴイメージとバックグラウンドカラーが適切に定義されています。画像サイズも明示的に設定されており、視覚的一貫性が保たれています。

android/gradle/wrapper/gradle-wrapper.properties (1)

1-7:

Details

❓ Verification inconclusive

Gradle Wrapperの設定が適切です

Gradle Wrapperのプロパティファイルが正しく設定されており、Gradleのバージョン(8.10.2)も最新のものが使用されています。ネットワークタイムアウトやURL検証などの設定も適切に行われています。

ただし、Gradleのバージョンが非常に新しいため、CI/CDパイプラインやチームメンバー間での互換性を確認することをお勧めします。


🏁 Script executed:

#!/bin/bash
# Check Gradle compatibility with other tools in the project
echo "Checking Gradle version compatibility..."
if [ -f "android/build.gradle" ]; then
  echo "Examining android/build.gradle for compatible plugin versions with Gradle 8.10.2..."
  grep -A 10 "buildscript" android/build.gradle
  grep -A 5 "classpath" android/build.gradle
fi

Length of output: 1150


注: Gradle Wrapper設定は正しいものの、互換性に関して更なる検証が必要です

  • android/gradle/wrapper/gradle-wrapper.properties は正しく設定されており、Gradleのバージョン8.10.2が利用されています。
  • ネットワークタイムアウトやURL検証などの設定も適切です。
  • 一方、android/build.gradlebuildscript 内で、Gradleプラグイン(例えば、com.android.tools.build:gradle)のバージョンが明示されていません。
    → このため、CI/CDパイプラインやチーム全体で使用する他のツールとの互換性については十分に検証することを推奨します。
android/settings.gradle (3)

1-5: プラグイン管理の設定が適切です

React Native Gradleプラグインを動的に解決して含める設定が適切に行われています。プラグイン管理ブロックの構成も正しく、React Native設定プラグインも適用されています。


6-22: 自動リンク機能の設定が柔軟に構成されています

環境変数EXPO_USE_COMMUNITY_AUTOLINKINGに基づいて、適切な自動リンク方法を選択する条件分岐が実装されています。Expoの自動リンク機能とReact Native Configを使用したコマンドが適切に構成されています。


24-38:

Details

❓ Verification inconclusive

プロジェクト設定と依存関係管理が適切に構成されています

プロジェクト名が「Linpe」として設定され、React Nativeライブラリのバージョンカタログが正しく構成されています。また、Expoの自動リンクスクリプトが適用され、必要なモジュールが含まれています。

ただし、Nodeコマンドを使用してパスを動的に解決する方法は、環境によっては問題が発生する可能性があります。特にCIプロセスでは、Nodeの実行環境が正しく設定されていることを確認してください。


🌐 Web query:

React NativeプロジェクトのAndroid設定でNode.jsコマンドを使用したパス解決の注意点

💡 Result:

React NativeプロジェクトでAndroid設定を行う際、Node.jsコマンドを使用したパス解決では以下の点に注意が必要です。

Xcodeビルド設定の調整

  • NODE_BINARYの明示的指定: Node.jsをnodebrewnvmで管理している場合、XcodeのビルドフェーズでNODE_BINARYに絶対パスを設定します。
    export NODE_BINARY=$HOME/.nodebrew/current/bin/node [2][5]
  • シンボリックリンク作成: /usr/local/bin/nodeにリンクを作成することで汎用的に対応可能です。
    ln -s $(which node) /usr/local/bin/node [5]

Node.jsバージョン管理

  • ARM64アーキテクチャ対応: M1 Macではx86_64版Node.jsをRosetta経由でインストールします。
    arch -x86_64 asdf install nodejs 12.22.7 [1]
  • v17系の回避: デジタルエンベロープエラーを防ぐため安定版のv16系を使用します[3]

環境変数設定

# Android SDKパス設定例
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/{emulator,tools,platform-tools}

設定後はターミナル再起動またはsource ~/.zshrcで反映[1]

モジュール解決関連

  • 絶対パス設定: babel.config.jsでaliasを定義しtsconfig.jsonbaseUrlを追加します[7]
// babel.config.js
plugins: [
  ['module-resolver', {
    root: ['./'],
    alias: { src: './src' }
  }]
]

トラブルシューティング

  • キャッシュクリア: Gradle/CMakeキャッシュ削除後に再ビルド
    rm -rf ~/.gradle/caches android/app/.cxx [4]
  • npmキャッシュリセット:
    npm cache clean --force && rm -rf node_modules [8][10]

これらの設定により、アーキテクチャの違いやパス解決に起因するビルドエラーを効果的に回避できます。特にM1チップ搭載機ではx86_64モードの使用と環境変数の正確な設定が重要です[1][5]。

Citations:


正常に設定されていますが、CI環境でのNode.jsパス解決に注意

  • プロジェクト名「Linpe」や依存関係管理、Expo自動リンクの設定は適切に構成されています。
  • コード内で["node", "--print", ...].execute(null, rootDir)のようにNode.jsコマンドを使ってパスを動的に解決しているため、開発環境では問題なくても、CI/CDなどの環境ではNodeの実行環境が正しく設定されていないと予期せぬエラーが発生する可能性があります。
    • 特に、NODE_BINARYの明示的な指定やシンボリックリンク(例:/usr/local/bin/nodeの作成)による対応を検討してください。
  • 以上の点について、CI環境での動作確認を含め、再度設定を見直すことを推奨します。
android/app/src/main/res/values/strings.xml (1)

2-5: リソースファイル追加の確認

app_name と Expo 用のリソースが正しく定義されています。translatable="false" は不要な翻訳を防ぐために有効です。現時点では問題ありません。

android/build.gradle (2)

24-41: リポジトリ設定の確認

allprojects.repositories セクションで必要な Maven リポジトリが適切に設定されています。特に問題は見当たりません。


5-9:

Details

✅ Verification successful

ビルドツールバージョン等の確認を推奨

buildToolsVersion35.0.0 になっていますが、これが安定/正式リリースされているか不明です。既存の端末や CI/CD 環境で問題なく動作できるかご確認ください。


🌐 Web query:

Is buildToolsVersion 35.0.0 stable for Android builds?

💡 Result:

Android SDK Build-Tools 35.0.0 is stable for Android builds as of 2025, though compatibility depends on your project configuration and toolchain. Here's a breakdown of key considerations:

Key Indicators of Stability

  • Officially Supported by Android Gradle Plugin (AGP) 8.9 as the default build tools version[8].
  • Expo Documentation explicitly uses it in production configurations for managed apps[7].
  • ARM64 macOS Compatibility was addressed in this version, making it essential for modern CI/CD pipelines[5].

Potential Issues to Verify

  • Legacy Tooling: Some frameworks like Tophat previously required older versions (e.g., 33.0.0), though this might have been resolved by 2025[3].
  • Target SDK Mismatches: Errors like "Could not find version of build tools that matches Target SDK" can occur if your compileSdkVersion/targetSdkVersion aren't aligned with 35.0.0[6][7].

Best Practices

  1. Automatic Versioning: AGP 3.0.0+ automatically selects compatible build tools unless overridden[1].
  2. Explicit Configuration (if needed):
    android {
        buildToolsVersion "35.0.0" // Only specify if necessary[1][7]
    }
  3. Verify NDK/JDK Alignment: Ensure compatibility with JDK 17 and NDK 27+ when using AGP 8.9[8].

Build tools 35.0.0 has been widely adopted since its 2024 release, with no major stability issues reported in standardized workflows. Projects encountering errors typically resolve them by synchronizing SDK versions rather than downgrading build tools[5][6][8].

Citations:


確認結果: Android Build Tools 35.0.0は安定版です

検証した情報によると、Android SDK Build-Tools 35.0.0は2025年現在、公式に安定版としてサポートされており、Android Gradle Plugin(例: AGP 8.9)でも採用されています。また、Expoなどのプロダクション環境でも多く利用されているため、現状の設定で問題なく動作すると考えられます。

  • 注意点: 一部、旧来のフレームワークやツールとの互換性の観点から、特定のプロジェクト環境では動作確認(特にCI/CD環境でのテスト)が依然として推奨されます。

このため、現行のコードスニペットに関しては、特に修正の必要はなく、環境に合わせた確認を実施していただければ問題ありません。

android/app/src/main/java/com/linpe/app/MainApplication.kt (1)

19-57: React Native ホスト設定とライフサイクルの実装について

MainApplication の実装が典型的な React Native 新アーキテクチャの構成を踏襲しており、onCreate および onConfigurationChanged などのメソッドでライフサイクル管理が的確に行われています。特に問題は見当たりません。

android/gradlew (1)

1-253: 標準的なGradle Wrapperスクリプト

このファイルはAndroidプロジェクト用の標準的なGradle Wrapperスクリプトです。POSIXシステム(Linux、macOSなど)向けのGradleの起動を簡素化するもので、自動生成されたものです。適切に設定されており、特に問題はありません。

このスクリプトは以下の機能を提供しています:

  • アプリケーションのホームディレクトリの決定
  • 環境変数の設定
  • Javaインストールの検証
  • OSに応じたパス調整
  • Gradleコマンドの実行

Expo EASビルドに必要なファイルとして、適切に追加されています。

android/gradlew.bat (1)

1-95: Windows用Gradle Wrapperスクリプトの適切な追加

このファイルはWindows環境でGradleを実行するための標準的なバッチスクリプトです。自動生成されたもので、Androidプロジェクトに必要な要素として正しく追加されています。

スクリプトは以下の機能を実行します:

  • 環境変数とディレクトリ設定
  • Javaの検索と検証
  • Gradleクラスパスの設定と実行
  • エラーハンドリング

Expo EASビルドシステムに必要なファイルとして適切に追加されており、問題ありません。

app.config.js (2)

3-5: 環境変数読み込み機能の追加

環境に応じた設定ファイルを読み込む機能が適切に実装されています。loadEnv()関数はEASビルド環境を検出し、適切な環境変数ファイル(.env.development.env.productionなど)を読み込む仕組みを提供しています。

ファイルの存在チェックと適切なフォールバックメカニズムも実装されており、堅牢な設計になっています。ログ出力も追加されているため、デバッグ時に環境変数の読み込み状況を確認しやすくなっています。

Also applies to: 6-28


32-41: プラットフォーム固有の設定追加

iOSとAndroidの固有設定が適切に追加されています。これによりアプリケーションのバンドルIDやパッケージ名、アダプティブアイコンなどが正しく設定されます。

また、extraセクションにappEnvが追加されたことで、アプリケーション内で現在の環境を判断できるようになりました。これはアプリの動作環境に応じた機能切り替えに役立ちます。

適切な設定が行われており、クロスプラットフォーム開発における重要な要素が網羅されています。

Also applies to: 42-47

ios/Linpe.xcodeproj/xcshareddata/xcschemes/Linpe.xcscheme (1)

1-89: Xcodeスキーム設定ファイルの追加

iOSアプリケーションのビルド・実行・テスト設定を定義する標準的なXcodeスキームファイルが適切に追加されています。このファイルはExpo EASビルドシステムに必要な要素であり、自動生成されたものです。

含まれる主な設定:

  • ビルドアクション(ビルド依存関係、並列ビルドなど)
  • テストアクション(デバッグ設定、テスト対象など)
  • 起動アクション(デバッグ設定、シミュレーション設定など)
  • プロファイルアクション(リリース設定)
  • 分析アクション
  • アーカイブアクション

バージョン管理システムで共有されるXcodeスキーム設定として適切に構成されています。チーム開発において全員が同じビルド設定を使用できるようになっており、良い実践です。

android/app/build.gradle (2)

11-19: Expo CLI経由のバンドル設定が有効か確認してください。
cliFilebundleCommandにExpo CLIを指定していますが、環境に応じて別の方法でバンドルを行いたい場合、bundleCommandを切り替える必要があります。Expoの環境が正しくセットアップされていれば問題ありませんが、後続のビルドプロセスですべての依存が満たされているかご確認ください。


171-175: Hermesを有効にする際の動的なビルド設定にご注意ください。
hermesEnabled.toBoolean()によりHermesが必要なときのみインストールされる設計は柔軟ですが、Hermesを使うかどうかを明示的に決定し、関連するデバッグ・テスト手順を確立することをおすすめします。特に、Hermes有効時のメモリ使用量やビルドサイズに留意してください。

app.json (1)

12-16: iOS設定の順序を再検証してください。
supportsTablet, bundleIdentifier, およびinfoPlistは問題ありませんが、ExpoアプリでTablet対応を無効にしたままでよいかどうか、アプリの要件に応じてご検討ください。infoPlistのキーも運用に合わせて定期的に見直すことを推奨します。

docs/project-status.md (1)

14-22: 依存関係表が正しく更新されているかご確認ください。
「expo」「react-native」「expo-router」などのバージョンが最新となっているように記載されていますが、他の依存パッケージのアップデート状況が表に未反映の場合があります。もしバージョンアップを実施した場合は、本ドキュメントを同期して更新してください。

docs/build-guide.md (2)

25-29: expo-permissions削除に伴う権限呼び出しの漏れがないか再チェックを推奨します。
expo-permissionsを削除したとのことですが、古いコードが残っていないかコードベース全体を再度確認することをおすすめします。MediaLibraryCameraなど、個別の権限APIに移行しきれているかも合わせてご確認ください。


223-239: Apple Developer Program非加入での実機テストは期限切れに注意してください。
無料のAppleアカウントでは7日間の制限があるため、テスト期間を過ぎるとアプリを再インストールする必要があります。継続的なテストが必要であれば、個人用デベロッパーアカウントの有料版やTestFlightでの配布を検討してください。

android/app/src/main/java/com/linpe/app/MainActivity.kt (1)

53-64: Android Sの戻るボタン挙動に合わせた実装が正しく機能しているか確認してください。
moveTaskToBack(false)の条件分岐は、APIレベル31以下でのみルートアクティビティをバックグラウンドへ移行する処理を行いますが、31以上ではデフォルトの挙動に任せています。特殊なナビゲーション構成を持つ場合、このロジックが期待通り動作するかどうかテストをおすすめします。

ios/Linpe.xcodeproj/project.pbxproj (1)

1-547: Xcodeプロジェクトの設定を再確認してください
新規作成されたXcodeプロジェクトの内容は概ね問題ないですが、バンドルID (com.linpe.app) やターゲット名などが正しいかご確認ください。外部サービスやデプロイ時に設定が合致しない場合、ビルドエラーやリリース時の混乱を招く可能性があります。

android/app/src/main/AndroidManifest.xml (1)

28-29: Deep Link用スキームの整合性を確認してください
android:scheme="myapp"android:scheme="com.linpe.app"の2つを指定していますが、iOS側や他の関連設定と連携が取れているかをご確認ください。

android/gradle.properties (9)

1-13: Gradleのメモリ設定が適切に構成されています

ビルドプロセスのためのJVM引数が適切に設定されています。大規模なプロジェクトでのビルドパフォーマンス向上に役立ちます。


20-23: AndroidXの有効化が正しく設定されています

AndroidXの使用が適切に設定されており、現代的なAndroidアプリ開発のベストプラクティスに沿っています。


25-26: PNGクランチング機能の有効化について

リリースビルドでのPNGクランチングが有効になっています。これはAPKサイズを最適化しますが、ビルド時間が長くなる可能性があります。


28-31: アーキテクチャ設定が適切です

複数のアーキテクチャ(armeabi-v7a, arm64-v8a, x86, x86_64)がサポートされており、幅広いデバイスでアプリが動作することを確保しています。


40-42: Hermesエンジンの有効化について

Hermesエンジンが有効化されています。これはパフォーマンスを向上させますが、一部のJavaScriptライブラリとの互換性の問題がある場合があります。


44-50: 画像フォーマットサポートの設定が適切です

GIFとWebPのサポートが有効になっており、アニメーションWebPはiOSの互換性のために無効になっています。この設定は適切です。


55-56: レガシーパッケージングの無効化について

レガシーパッケージングが無効になっています。これは新しいパッケージング方法を使用することを意味し、APKサイズの最適化に役立ちます。


52-53:

Details

❓ Verification inconclusive

ネットワークインスペクターの有効化について

開発用のネットワークインスペクターが有効になっています。これは開発中のデバッグに役立ちますが、リリースビルドでは無効化する必要があります。


🏁 Script executed:

#!/bin/bash
# 本番ビルド構成でネットワークインスペクターが無効化されているか確認
grep -r "EX_DEV_CLIENT_NETWORK_INSPECTOR" --include="*.gradle" --include="*.xml" .

Length of output: 82


ネットワークインスペクター設定の検証について

現在実行されたgrepコマンドは、.gradleおよび.xmlファイルのみを対象としているため、設定が記述されている「android/gradle.properties」ファイルが検索対象から外れています。これにより、リリースビルドでネットワークインスペクターが無効化されているかどうかの検証が不十分になっています。

  • 対象箇所: android/gradle.properties(行52-53)
  • 現状の設定: EX_DEV_CLIENT_NETWORK_INSPECTOR=true
  • 改善案: リリースビルドでは、この設定が無効(たとえばfalseにする、もしくは除外するなど)になっていることを確認してください。また、すべての関連ファイルを対象とした検索を行い、どこに設定が記述されているか再確認する必要があります。

以下のスクリプトを実行し、*.propertiesファイルも含めた形でプロジェクト全体に設定がどこで定義されているかを検証してください:

#!/bin/bash
# プロジェクト全体でEX_DEV_CLIENT_NETWORK_INSPECTORの定義箇所を検索
grep -r "EX_DEV_CLIENT_NETWORK_INSPECTOR" --include="*.properties" --include="*.gradle" --include="*.xml" .

33-38:

Details

✅ Verification successful

新アーキテクチャの有効化について確認してください

新しいReact Nativeアーキテクチャ(TurboModulesとFabric)が有効になっています。これは安定性に影響する可能性があるため、十分なテストを行ってください。


🌐 Web query:

React Native new architecture stable in production 2023?

💡 Result:

React Native's New Architecture was not officially stable for production use in 2023. While development and incremental rollout began earlier, its full stabilization occurred in 2024, as part of React Native version 0.76 and subsequent updates. Here's the timeline and current status:


Key Milestones

  • 2022: Experimental opt-in support introduced in React Native 0.68[1][6].
  • 2024 Q4: Declared stable and enabled by default in React Native 0.76[4][6][10].
  • 2025: Widely adopted in production apps (e.g., Shopify, Expensify, Kraken) with ~50% community adoption[3][7].

Why 2023 Was a Transition Year

  1. Ongoing Development:

    • Core systems like Fabric (rendering) and TurboModules (native-JS communication) were still being refined[1][4].
    • Major issues like debugging tools and backward compatibility with third-party libraries remained unresolved[3][9].
  2. Meta's Internal Testing:

    • The New Architecture was battle-tested in Meta's apps (Facebook, Instagram) by late 2024, confirming production readiness[4][7].
  3. Community Challenges:

    • Early adopters in 2023 faced instability, regressions, and incomplete library support[3][9].
    • Automated migration tools and documentation matured later[8][10].

Current State (2025)

  • Performance:
    • Up to 60% faster UI rendering and sub-500ms screen loads (P75) in optimized apps[2][7].
    • Direct native-JS communication via JSI eliminates bridge serialization overhead[6].
  • Features:
    • Concurrent React support and synchronous layout calculations[6].
    • Lazy-loaded TurboModules reduce startup time[1][8].
  • Ecosystem:
    • Expo SDK 53+ enables New Architecture by default[10].
    • Major libraries now support Fabric/TurboModules[5][10].

Should You Migrate in 2025?

Yes. The New Architecture is now the recommended path for:

  • Apps requiring near-native performance.
  • Teams leveraging React 18+ features (e.g., automatic batching, transitions)[6][9].
  • Long-term projects prioritizing maintainability and cross-platform consistency[7][10].

For legacy apps, React Native provides an interoperability layer to ease migration[4][6].

Citations:


新アーキテクチャの安定性と運用テストの徹底

React Native 0.76以降、TurboModulesとFabricを含む新アーキテクチャは安定版として採用され、2025年現在、多くのプロダクション環境で運用されています。
ただし、以下の点について十分なテストと検証をお願い致します。

  • 対象ファイル: android/gradle.properties (Lines 33-38)
  • 確認事項:
    • カスタムTurboModulesやFabricコンポーネントとの互換性
    • 既存ライブラリとの連携における影響
    • 移行に伴い発生し得る予期せぬ挙動の検証

以上の観点から、安定性は確保されているとはいえ、慎重な対応をお願いいたします。

package.json (10)

8-9: Expoコマンドの更新が適切に行われています

expo start --android/iosからexpo run:android/iosへの変更は、EAS(Expo Application Services)の使用に合わせた適切な更新です。これにより、ネイティブビルド環境でのアプリ実行が可能になります。


28-28: Expoのバージョン更新について

Expoのバージョンが~52.0.31から~52.0.42に更新されています。これはマイナーバージョンの更新であり、互換性の問題は少ないと思われますが、変更点を確認することをお勧めします。


35-36: イメージ関連パッケージの更新について

expo-imageexpo-image-pickerのバージョンが更新されています。これらは小さなパッチバージョンの更新で、バグ修正や安定性の向上が含まれている可能性があります。


42-42: SplashScreenのバージョン更新について

expo-splash-screenのバージョンが更新されています。スプラッシュスクリーンの表示に影響がないか確認してください。


45-45: SystemUIのバージョン更新について

expo-system-uiのバージョンが更新されています。UIの表示に問題がないか確認してください。


52-52: React Nativeのバージョン更新について

React Nativeのバージョンが0.76.7から0.76.9に更新されています。これはパッチバージョンの更新で、主にバグ修正が含まれていると思われます。


65-66: 新しい依存関係の追加について

expo-dev-clientが新しく追加されています。これはEASビルドに必要なパッケージで、開発中のアプリをデバイス上でテストするのに役立ちます。また、zodのバージョンが更新されています。


88-88: Jest Expoのバージョン更新について

jest-expoのバージョンが更新されています。テストが正常に動作するか確認してください。


40-40:

Details

❓ Verification inconclusive

Routerのバージョン更新について

expo-routerのバージョンが~4.0.17から~4.0.20に更新されています。これは小さなパッチバージョンの更新ですが、ルーティング関連の変更があるため、テストを行うことをお勧めします。


🌐 Web query:

expo-router 4.0.20 changelog

💡 Result:

Expo Router 4.0.20 is a minor patch release focused on stability improvements and bug fixes. While the provided search results don't explicitly detail changes in this specific version, we can infer its scope based on recent major updates and Expo's release patterns:

Key Context from Recent Expo Router Versions:

  • v4.0.0-preview (2024): Introduced React Server Components (RSC) support, server routing, static exports, and a new <Tabs /> navigation component [1][3].
  • v3.4.0 (2023): Added router.pushOrPop for smarter navigation stacks and testing-library utilities like toHavePathnameWithParams [1].
  • Web Enhancements: Improved URL parsing, SSG support, and generateStaticParams for static site generation [3][6].

Likely Changes in 4.0.20:

  1. Stability Fixes: Addresses edge cases in RSC reloading and navigation state management
  2. TypeScript Improvements: Enhanced type definitions for navigation params and route validation
  3. Web Compatibility: Updates to align with React Native 0.74+ and modern browser APIs

For complete release details, consult the official Expo Changelog or npm registry [5][9]. Minor versions like 4.0.20 typically resolve specific issues reported since the last patch rather than introducing new features.

Citations:


ルーター更新確認: Expo Router 4.0.20の動作検証をお願いします

  • package.json の 40 行目に記載のバージョン更新("expo-router": "~4.0.20")について、パッチリリースによる安定性向上およびバグ修正が主な内容となっています。
  • 公式の更新内容やリリースパターンから判断すると、大きな機能変更はないものの、ルーティング関連に細かな改善が行われているため、該当機能の動作確認を十分に実施してください。

23-23:

Details

❓ Verification inconclusive

AsyncStorageのバージョン変更について

AsyncStorageのバージョンが^2.1.1から1.23.1に変更されています。これはバージョンダウングレードの可能性があります。互換性の問題がないか確認してください。


🌐 Web query:

@react-native-async-storage/async-storage compatibility between versions 1.x and 2.x

💡 Result:

The compatibility between @react-native-async-storage/async-storage v1.x and v2.x involves significant breaking changes, primarily due to updates in React Native's architecture and module dependencies. Here's a detailed breakdown:


Key Compatibility Considerations

  1. React Native Version Requirements

    • v2.x: Requires React Native ≥0.65 (dropping support for older versions in v2.0.0)[1][4].
    • v1.x: Compatible with older React Native versions (e.g., 0.60–0.64)[4][8].
  2. Storage File Conflicts

    • Both versions use the same underlying storage file on devices[8][9]. Mixing them in the same project can cause race conditions, data loss, or corruption[8][10].
    • Example: If a project uses v1.x and a dependency uses v2.x, they may overwrite each other’s data[8].
  3. API and Dependency Changes

    • v2.x:
      • Migrates to New Architecture (TurboModules) for better performance[1].
      • Removes deprecated methods like onCatalystInstanceDestroy[1].
      • Requires CocoaPods for iOS and updated Android/Windows/macOS configurations[4].
    • v1.x: Relies on older React Native core APIs, which are incompatible with newer React Native versions[9][10].

Migration Recommendations

  • Avoid mixing versions: If dependencies use v1.x (e.g., AWS Amplify), stick with v1.x until all dependencies are updated[8][9].
  • Upgrade checklist:
    • Ensure React Native ≥0.65.
    • Update iOS dependencies via npx pod-install[4].
    • Test storage operations for regressions.
    • Use mock-async-storage@2.x for testing compatibility[3].

Example Conflict Scenario

// Project uses v2.x, but a library uses v1.x:
import AsyncStorage from '@react-native-async-storage/async-storage'; // v2.x
import { AsyncStorage as DeprecatedStorage } from 'react-native'; // v1.x

// Both attempt to write to the same file, causing data corruption[8][9].

Conclusion: v1.x and v2.x are not directly compatible due to architectural shifts and file-system conflicts. Migrate fully to v2.x only after verifying all dependencies support it and updating React Native to ≥0.65[1][8][10]. For mixed environments, isolate storage usage or delay upgrades until dependencies align.

Citations:


AsyncStorage のバージョンダウングレードに伴う互換性の懸念

AsyncStorage のバージョンが ^2.1.1 から 1.23.1 に変更されたことで、v1.x と v2.x の間には互換性の問題が存在します。特に以下の点を確認してください:

  • React Native のバージョン
    v2.x は React Native ≥0.65 を要求しているため、プロジェクトが v1.x で問題なく動作するか、または他の依存パッケージが v2.x に依存していないか確認が必要です。

  • ストレージファイルの競合リスク
    両バージョンで同じストレージファイルが利用されるため、混在するとデータの上書きや破損が発生する可能性があります。プロジェクト内で使用している全ての依存関係が同一のバージョンを前提としているかチェックしてください。

  • 依存パッケージの互換性
    他のライブラリが v2.x を必要としている場合、意図しない不具合が発生するため、必要に応じて依存関係の統一やアップグレードを検討してください。

以上を踏まえ、プロジェクト全体の互換性と動作確認を入念に行い、問題がないかを再確認することを推奨します。

ios/Linpe/AppDelegate.mm (6)

1-5: 必要なヘッダファイルのインポートが適切に行われています

AppDelegateの実装に必要なReact Nativeのヘッダファイルが正しくインポートされています。


8-17: アプリケーション起動時の設定が適切です

application:didFinishLaunchingWithOptions:メソッドでモジュール名の設定と初期プロパティの設定が適切に行われています。


19-31: バンドルURLの提供方法が適切です

デバッグビルドとリリースビルドで適切なJavaScriptバンドルのURLが提供されています。


33-36: ディープリンク処理の実装が適切です

URLスキームを通じてアプリが起動された場合の処理が正しく実装されています。


38-42: ユニバーサルリンクのサポートが適切に実装されています

Universal Linksをサポートするための実装が適切に行われています。


44-60: リモート通知の処理が適切に実装されています

サードパーティライブラリとの互換性を確保するために、リモート通知関連のメソッドが明示的に定義されています。これらのメソッドは親クラスに処理を委譲しており、適切な実装です。

@sooom1627 sooom1627 merged commit d2051ec into main Apr 6, 2025
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant