Android - TECH PLAY - TECH PLAY

TECH PLAY

Android

むベント

マガゞン

技術ブログ

    株匏䌚瀟゚ブリヌは、「前向きなきっかけを、ひずりひずりの日垞にずどける。」ずいうミッションのもず、デリッシュキッチン、retail HUB、トモニテ、MOMENTH ずいった BtoC・BtoB を暪断するメディアやサヌビスを展開しおいたす。同瀟では、小売事業者向けサヌビス retail HUB におけるピッキングサヌビスの新芏開発にあたり、デヌタベヌスずしお Amazon Aurora DSQL を採甚したした。本ブログでは、お客様の開発チヌムに䌺った Aurora DSQL 採甚の背景、導入の取り組み、そしお導入埌に埗られた効果に぀いおご玹介したす。 察象システム 今回 Aurora DSQL を採甚したのは、 retail HUB 事業のネットスヌパヌサヌビスにおけるピッキングサヌビスです。 retail HUB は、お客様が提䟛する小売事業者向けの DX ゜リュヌションです。店頭サむネヌゞによるレシピ提案、デゞタルチラシ、ネットスヌパヌアプリの提䟛、店頭運営の効率化、CRM によるロむダルカスタマヌ育成たで、小売事業者の販促プロセス党䜓をデゞタル化し、業務効率化ずきめ现やかな顧客アプロヌチを実珟しおいたす。 retail HUB 事業のネットスヌパヌサヌビスでは、店舗偎が売り堎から泚文商品をピックアップする䜜業が発生したすが、埓来この運甚は玙のリストで行われおおり、商品を探すのに時間がかかるこずや習熟床による䜜業スピヌドのばら぀きなどにより人的ミスの防止が難しく、誀ピックによる取り盎しが発生するずいった課題がありたした。この問題を解決するため、ピッキングアプリ「retail HUB Picker」の開発が求められたした。 アヌキテクチャ ピッキングサヌビスのアヌキテクチャは、ピッキングアプリAndroid アプリから Amazon ECS + ALB で構成された API サヌバヌに接続し、担圓者の認蚌管理には Amazon Cognito を利甚しおいたす。バック゚ンドのデヌタベヌスずしお Aurora DSQL を採甚し、ピッキング察象の商品情報やピッキング状態、担圓者情報の栌玍・参照に䜿甚しおいたす。 ピッキングサヌビスのシステムアヌキテクチャは以䞋のずおりです。今回新芏に開発したピッキングシステムは既存のネットスヌパヌシステムずは分離しおおり、泚文デヌタを連携する箇所のみで結合しおいたす。 デヌタベヌス遞定の背景 今回のピッキングサヌビスは新芏開発であり、デヌタベヌスの遞定にあたっおはシステムの特性に合わせた怜蚎が行われたした。デヌタベヌスに求められる芁件は以䞋でした。 安定性ず可甚性 ピッキング䜜業䞭にシステムが停止するず店舗のピッキング業務に圱響を䞎え、導入店舗数が増えるほどその圱響範囲も倧きくなるため、安定性ず高い可甚性が重芁な芁件でした。たた、小売店舗は土日も皌働しおいるため、運営偎の郜合でメンテナンス時間を蚭定しにくいずいうビゞネス䞊の課題も考慮する必芁がありたした。 䜎コストによるスモヌルスタヌト 初期フェヌズではリク゚スト数が限定的であり、構築・運甚にあたりコストをかけたくないずいう芁望がありたした。䞀方で、今埌サヌビスの成長に䌎いトラフィックの増加も想定されるため、高いスケヌラビリティを備えたデヌタベヌスであるこずが望たしいず考えおいたした。 運甚負荷の軜枛 メンテナンスりィンドりに䌎う運甚負荷が課題ずなっおいたした。新芏サヌビスでは、こうした運甚負荷を極力䞋げたいずいう考えがありたした。 Aurora DSQL を遞択した理由 お客様では圓初、既存システムで利甚しおいる Amazon RDS for MySQL や Amazon Aurora MySQL の導入を想定しおいたした。しかし、䞊蚘の芁件を螏たえお怜蚎を進めた結果、サヌバヌレスの分散デヌタベヌスである Aurora DSQL が採甚されたした。その理由は以䞋の通りです。 安定性ず可甚性 — シングルリヌゞョン構成で 99.99%マルチリヌゞョン構成では 99.999%の可甚性を備えたサヌバヌレスの分散デヌタベヌスであり、むンフラ管理が䞍芁。ピッキング䜜業䞭のシステム停止リスクを䜎く抑えられる 䜎コストによるスモヌルスタヌト — 埓量制の課金モデルで初期コストを抑え぀぀、将来のサヌビス成長に䌎うトラフィック増加にも自動スケヌルで察応できる 運甚負荷の軜枛 — パッチ適甚がダりンタむムなしで自動的に行われるため、関係者ずの調敎や䜜業工数が䞍芁になる 加えお、Aurora DSQL が PostgreSQL ずの互換性を備えおいたこずで、瀟内の既存知芋を掻かしながら導入できる点も埌抌しずなりたした。たた、お客様の開発チヌムには分散デヌタベヌスぞの技術的な関心が高く、Aurora DSQL を通じお埗られる知芋が今埌の技術遞定の指暙になるずいう期埅も倧きく、採甚の決め手の䞀぀ずなりたした。 Aurora DSQL ずは Aurora DSQL は、AWS が提䟛するサヌバヌレスの分散 SQL デヌタベヌスです。埓来のデヌタベヌスのようにク゚リ凊理・ストレヌゞ・トランザクション管理が密結合した構成ではなく、それぞれが独立したコンポヌネントに分かれおいたす。各コンポヌネントがワヌクロヌドに応じお個別にスケヌルするため、特定の凊理がボトルネックになりにくく、䜎レむテンシヌで匷固な䞀貫性を実珟しおいたす。たた、PostgreSQL ずの互換性を備えおおり、既存の PostgreSQL の知芋やツヌルを掻かしお開発を進めるこずができたす。 お客様が遞定の理由に挙げた以䞋の 3 ぀に぀いお、Aurora DSQL の特性を簡単に説明したす。 安定性ず可甚性 Aurora DSQL では、すべおの曞き蟌みトランザクションを分散トランザクションログにコミットし、コミットされたすべおのログデヌタを 3 ぀のアベむラビリティヌゟヌンにあるストレヌゞレプリカに同期レプリケヌションしたす。これにより、Aurora の Multi-AZ 構成ず同等の 99.99% の可甚性を実珟しおいたす。以䞋の図は、Aurora DSQL の可甚性に関する特性を瀺しおいたす。 䜎コストによるスモヌルスタヌト 課金はリク゚スト数やデヌタ量に応じた埓量制で、リク゚スト数が少ない段階ではコストを䜎く抑えられたす。アヌキテクチャを倉曎するこずなく自動的にスケヌルするため、小芏暡な構成から始めお、トラフィックの増加に応じおシヌムレスにスケヌルするこずができたす。以䞋の図は、Aurora DSQL のコストモデルを瀺しおいたす。 運甚負荷の軜枛 サヌバヌのプロビゞョニングやパッチ適甚、むンフラのアップグレヌドずいった管理䜜業が䞍芁です。パッチ適甚やセキュリティアップデヌトはダりンタむムなしで自動的に凊理されるため、メンテナンスりィンドりの調敎や蚈画停止が䞍芁です。以䞋の図は、Aurora DSQL ず埓来のデヌタベヌスにおけるメンテナンスの違いを瀺しおいたす。 開発時の課題 開発スケゞュヌル 開発スケゞュヌルは以䞋のずおりです。 時期 内容 2025幎5月 小売事業者に察するヒアリング事業郚門開発郚門 2025幎6月 運甚分析、開発芁件定矩、分析芁件定矩、システム蚭蚈 2025幎7月〜8月 開発アプリケヌション、API サヌバヌ、むンフラ、分析基盀 2025幎9月䞊旬 瀟内 QA 2025幎9月䞭旬 リリヌス、小売事業者にお怜蚌・運甚開始 Aurora DSQL を甚いた開発にあたっおは、PostgreSQL ずの互換性に関しおいく぀かの課題がありたした。 スキヌマ倉曎の制玄 Aurora DSQL ではカラム远加時にデフォルト倀を指定する構文がサポヌトされおいないこずが開発䞭に刀明したした。PostgreSQL では䞀般的に䜿甚される構文であるため、既存の知芋をそのたた適甚できないケヌスでした。察凊ずしお、カラムのみを远加し、デフォルト倀や NOT NULL 制玄は゜フトりェアレベルで保蚌する実装ずしたした。なお、サヌビスリリヌス前であったため、最終的にはテヌブルを再䜜成するこずで問題を回避したした。このように、事前のドキュメント確認だけでは把握しきれず、実際の操䜜を通じお発芋される差分もありたした。 ロヌカル開発環境ずの互換性 圓初ロヌカル開発では PostgreSQL のコンテナを䜿甚しおいたしたが、 CREATE INDEX を CREATE INDEX ASYNC に倉曎する必芁があるなど、Aurora DSQL ずの互換性がない郚分が刀明したため、ロヌカル環境でも Aurora DSQL を䜿甚する方匏に切り替えたした。 トランザクションサむズの制限 Aurora DSQL にはトランザクションデヌタ件数に制限があるため、倧量のデヌタを䞀括で凊理する実装には工倫が必芁でした。この制限を回避するため、倧量のデヌタ投入凊理においおは党䜓を 1 トランザクションにたずめず、凊理を分割する蚭蚈ずしたした。具䜓的には、デヌタ量が倧きい投入凊理ではトランザクションを䜿わずに実行し、途䞭で゚ラヌが発生しおも䜕床でもやり盎せる蚭蚈ずしたした。その䞊で、敎合性の担保が必芁な少量のデヌタ曎新凊理だけをトランザクション内で実行するようにしたした。 こうした課題を䞀぀ず぀解消しながら開発を進め、ピッキングサヌビスは無事にロヌンチを迎えたした。 ロヌンチず導入埌の効果 2025 幎 9 月䞭旬にロヌンチしおから数ヶ月が経過しおいたすが、倧きな問題は発生しおおらず、安定した皌働を続けおいたす。 導入埌に埗られた効果は以䞋のずおりです。 コスト削枛 Aurora PostgreSQLProvisionedで想定しおいたむンスタンスサむズず比范するず、コストは 90% 以䞊䜎くなっおいたす。埓量制のコストモデルにより、初期フェヌズにおいお倧幅なコスト削枛を実珟したした。 以䞋は、今回のワヌクロヌドを想定したコスト比范の詊算です。Aurora PostgreSQLProvisionedを 100 ずした堎合の盞察コストを瀺しおいたす。 構成 Pattern S コスト比 Pattern M コスト比 Pattern L コスト比 Aurora PostgreSQL (Provisioned) 100% 100% 100% Aurora Serverless v2 41% 41% 66% Aurora DSQL 4% 6% 12% 安定皌働ずメンテナンスフリヌ サヌビス導入埌は安定しお皌働しおおり、パフォヌマンス䞊の問題も発生しおいたせん。メンテナンスりィンドりが䞍芁であるため、基盀のメンテナンス䜜業そのものだけでなく、それに䌎う小売事業者やサヌビス利甚者ずの調敎業務も䞍芁ずなりたした。既存システムでは 3 ヶ月ごずのパッチアップデヌトのたびに、メンテナンス時間垯の調敎、圱響範囲の掗い出し、小売事業者や関係郚眲ぞの連携が必芁でしたが、Aurora DSQL ではこうした業務コストがれロになり、運甚負荷が倧きく削枛されたした。 スケヌラビリティの確保 珟時点でのリク゚スト数の倉動に぀いおは特に倧きな問題は発生しおいたせん。今埌のサヌビス成長に䌎うトラフィック増加に぀いおも、怜蚌の結果スケヌリングに問題がないこずを確認しおおり、今埌のトラフィック増加にも䞍安なく運甚できる芋通しです。 お客様の声 お客様に Aurora DSQL の導入効果に぀いお䌺ったずころ、次のように述べおいたす。 スケヌラビリティず安定性の芁件が高いシステムにおいお Aurora DSQL を遞択する利点は高いず考えおいたす。 – 内原 ç«  氏 株匏䌚瀟゚ブリヌ 開発本郚 開発2郚 郚長 今埌の展望 お客様では、今回のピッキングサヌビスでの導入実瞟を螏たえ、スケヌラビリティの芁件が高いシステムにおいお Aurora DSQL を遞択肢ずしお怜蚎しおいく方針です。新芏開発だけでなく、既存システムのリプレヌスにおいおも Aurora DSQL の掻甚を芖野に入れおいたす。 たた、Aurora DSQL のさらなる進化ぞの期埅ずしお、PostgreSQL ずの互換性向䞊を挙げおいたす。特に RLSRow Level Securityのような機胜がサポヌトされるこずで、より幅広いナヌスケヌスに察応しやすくなるず考えおいたす。 Aurora DSQL は、高い可甚性ずスケヌラビリティを必芁ずするシステムにおいお、運甚負荷ずコストの䜎枛が期埅できるデヌタベヌスです。本ブログが、同様の課題を持぀お客様にずっお参考になれば幞いです。
はじめに こんにちは、新芏事業郚フロント゚ンドブロックの 倧野玔平 です。2025幎床に新卒入瀟し、珟圚のチヌムに配属されたした。チヌムでFlutter補モバむルアプリを開発する䞭で、新芏プロゞェクトの立ち䞊げを効率化するための瀟内テンプレヌトリポゞトリの敎備を進めおいたす。 このテンプレヌトを育おる䞭で、 Flutter 3.44 ぞのアップデヌトに䌎うCocoaPodsからSPMぞの移行察応が積み残しになっおいたした。あわせお、このタむミングでdev / stg / prdの3環境察応も新芏に远加したした3 flavor化自䜓はSPM移行の必須芁件ではなく、テンプレヌト敎備の䞀環で同時に着手したものです。本蚘事では、 CocoaPodsからSPMぞの移行 ず、 3 flavorを mise run setup で䞀括敎備する仕組み を玹介したす。あわせお、Flutterにおけるビルド構成ファむルを解説したす。 目次 はじめに 目次 Flutterプロゞェクトのビルド構成 iOS偎のしくみ Android偎のしくみ Dart偎のしくみ 3局を貫く党䜓像 背景・課題 3環境の蚭定敎合が壊れやすい 解決策の党䜓像 実装内容ず具䜓的な解決策 1. CocoaPodsを撀去しおSPMに移行する CocoaPodsの統合を解陀する Crashlytics dSYMのパスを曎新する 2. iOSxcconfigでBuild Configurationを9パタヌンに敎える Firebase plistをBuild Phaseで差し替える 3. AndroidproductFlavorsずgoogle-services.jsonをflavorごずに配眮する 4. Dartfirebase_optionsをセレクタshim化する main.dartでduplicate-appを凊理する 5. mise run setupで党flavorを䞀括生成する たずめ Flutterプロゞェクトのビルド構成 Flutterアプリは iOSネむティブ局・Androidネむティブ局・Dartå±€ の3぀が組み合わさっおいたす。環境flavorの切り替えずは「3局すべおに、同じflavor甚の蚭定を遞ばせるこず」です。 iOS偎のしくみ Xcodeは以䞋の単䜍を組み合わせおビルドを定矩したす。 単䜍 圹割 Flutter デフォルト Project ( .xcodeproj ) プロゞェクト党䜓の定矩。実䜓は project.pbxproj Runner.xcodeproj Target ビルド成果物の単䜍 Runner Build Configuration ビルド蚭定倀の集合 Debug / Profile / Release の 3 çš® Scheme Run / Test / Profile / Analyze / Archive の各アクションで䜿う Target ず Configuration を定矩する起動蚭定 Runner 1 ぀ xcconfig はBuild Configurationの倀をテキストで宣蚀するファむルです。別のxcconfigを #include で取り蟌んだずき、同じ倉数があれば 埌から読み蟌んだ倀が優先 されたす。共通倀を曞いたxcconfigを先に、flavor固有倀を曞いたxcconfigを埌に重ねれば、最終的な倀が組み䞊がりたす。 Info.plist の CFBundleIdentifier は $(PRODUCT_BUNDLE_IDENTIFIER) を参照しおいたす。そのため、xcconfig偎で PRODUCT_BUNDLE_IDENTIFIER を決めればBundle IDが自動的に解決されたす。 iOS・macOSで倖郚ラむブラリを䜿うずきの䟝存管理ツヌルには、 CocoaPods ず Swift Package ManagerSPM の2぀がありたす。Flutterプロゞェクトでは長らくCocoaPodsが暙準でしたが、Flutter 3.44からiOS・macOSの䞡方でSPMがデフォルトに切り替わりたした。䞡者の違いは以䞋のずおりです。 CocoaPods Swift Package Manager (SPM) 提䟛元 OSSRuby 補 Apple 公匏 蚭定ファむル Podfile Package.swift Xcode では Package Dependencies UI から線集 成果物 Pods/ + .xcworkspace を別管理 Xcode が盎接管理 ロックファむル Podfile.lock Package.resolved Flutter での状況 長幎の暙準 3.44 でデフォルト有効化 Android偎のしくみ AndroidのビルドはGradleが android/app/build.gradle.kts を読んで実行したす。 抂念 圹割 buildTypes ビルド皮別 debug / release  productFlavors 同じアプリのバリアント定矩。 applicationId やリ゜ヌスを分岐できる applicationId / applicationIdSuffix アプリの䞀意な識別子。iOS の Bundle ID 盞圓 resValue ビルド時に文字列リ゜ヌスを生成する Gradle の機胜 AndroidManifest.xml アプリのメタデヌタ宣蚀。 android:label でアプリ名を指定 Gradleは、flavor別のリ゜ヌス AndroidManifest.xml や res/ 配䞋などを source set ずいう仕組みでディレクトリ単䜍に分けたす。Gradleがflavorを遞んだずきに src/main/ ず自動マヌゞしたす。なお google-services.json は厳密にはsource set mergeの察象ではありたせん。google-servicesプラグむンが src/<flavor>/google-services.json などのパスを優先床順に探玢し、1ファむルを遞びたす。 Dart偎のしくみ Dartでflavorを識別するにはコンパむル時定数を䜿いたす。 API / オプション 圹割 --dart-define-from-file=path/to/x.json .json たたは .env  KEY=VALUE 圢匏で曞いた倀をたずめお Dart に枡す flutter コマンドのオプション String.fromEnvironment('KEY') 枡された倀をコンパむル時定数ずしお参照する API。 switch の case 倀にもできる firebase_options.dart flutterfire configure が生成する Firebase 蚭定ファむル。通垞は 1 ファむル = 1 Firebase プロゞェクト 3局を貫く党䜓像 3局を1枚にたずめるず、 app_config.yaml → mise run setup → 各局のファむル矀 → flutter run --flavor X ずいう流れです。以降、iOS・Android・Dartの順に、各局内で mise run setup ず flutter run --flavor X がどのファむルぞ぀ながるかを瀺したす。 iOS局では、xcconfigチェヌンが Info.plist を解決したす。 project.pbxproj のRun Scriptがflavor別の GoogleService-Info.plist をコピヌしたす。 Android局では、 build.gradle.kts がflavorディレクトリの google-services.json ず AndroidManifest.xml を結び぀けたす。 Dart局では、 flavor/{dev,stg,prd}.json の FLAVOR が起点になりたす。 firebase_options.dart が FLAVOR に応じお firebase_options_{dev,stg,prd}.dart を切り替えお返すコヌド セレクタ shim になりたす。 flutter run --flavor dev --dart-define-from-file=flavor/dev.json を1回実行したずきに、各局で䜕が起きるかを䞊べるず以䞋のようになりたす。 iOS Scheme dev → Debug-dev.xcconfig で PRODUCT_BUNDLE_IDENTIFIER が .dev 付きに解決される。Build PhaseのRun Scriptが ios/firebase/dev/ のplistをコピヌする。 Android productFlavor dev が遞ばれお applicationIdSuffix=".dev" が適甚される。 src/dev/google-services.json がsource setにマヌゞされる。 Dart  flavor/dev.json の FLAVOR=dev がコンパむル時定数になる。 firebase_options.dart のセレクタshimが firebase_options_dev.dart を返す。 ここたでがFlutterプロゞェクトのビルド構成の抂芁です。これを螏たえお、本蚘事で取り組んだ課題ず解決策を芋おいきたす。 背景・課題 3環境の蚭定敎合が壊れやすい dev / stg / prdの3環境を切り替えるには、iOS・Android・Dartの3局を敎合させる必芁がありたす。各局の察象は次のずおりです。 iOSBundle ID、 GoogleService-Info.plist Android applicationId 、 google-services.json DartFirebase初期化オプション 3局が独立しおいるため蚭定挏れによるビルド倱敗やFirebase接続䞍可が繰り返し発生し、原因特定にも時間がかかっおいたした。 解決策の党䜓像 以䞋の5぀の取り組みで課題を解決したした。 # å±€ 取り組み 1 iOS / 基盀 CocoaPods 撀去 → SPM 移行 2 iOS / flavor xcconfig × 9 Build Configuration + flavor 別 Firebase plist 3 Android / flavor productFlavors + flavor 別 google-services.json 4 Dart firebase_options.dart のセレクタ shim 化 5 setup app_config.yaml の per-flavor 化ず mise 自動化 1぀のflavorを遞んで flutter run するず、iOS・Android・Dartの3局でそれぞれ察応する蚭定が適甚されたす。 実装内容ず具䜓的な解決策 1. CocoaPodsを撀去しおSPMに移行する CocoaPodsはRuby補のAppleプラットフォヌム向けパッケヌゞマネヌゞャヌで、Swift Package ManagerSPMはApple公匏の代替です。Flutter 3.44では新芏プロゞェクトでiOS・macOSずもにSPMがデフォルトで有効化され、Firebaseをはじめずする䞻芁プラグむンもSPM察応を完了しおいたす。 pod install が䞍芁になるため、CIのセットアップも倧幅に高速化されたす。 CocoaPodsの統合を解陀する 既存プロゞェクトでは、 Podfile をいきなり削陀するのではなく、たず pod deintegrate でXcodeプロゞェクトからCocoaPodsの統合を解陀したす。 cd app/ios pod deintegrate # project.pbxproj から Pods 統合を陀去 rm Podfile Podfile.lock # Podfile 本䜓を削陀 rm だけで枈たせおはいけたせん。 Podfile を削陀しただけでは project.pbxproj にCocoaPods統合の痕跡が残りたす。たずえば [CP] Check Pods Manifest.lock などのBuild Phaseや、 Pods-Runner xcconfigの #include 参照などです。 pod deintegrate はこれらを正しく陀去したす。 .gitignore も忘れず曎新したす。 # app/ios/.gitignore -.symlinks/ -Pods/ +# SPM +.build/ SPMが管理する Package.resolved はバヌゞョンを固定するためリポゞトリにコミットしたす。 Crashlytics dSYMのパスを曎新する dSYMDebug Symbolsはクラッシュレポヌトのスタックトレヌスを人間が読めるシンボルに埩元するためのファむルです。Crashlyticsを䜿っおいる堎合、そのdSYMをアップロヌドするBuild PhaseスクリプトをSPM構成のパスに合わせお曎新したす。このRun Scriptは setup 系スクリプトが自動生成するものではなく、Crashlyticsを利甚する堎合はプロゞェクトごずに手動で远加する手順です。 Firebase公匏のApple向けガむド は珟圚SPM構成を前提ずしおおり、Run Scriptに以䞋を远加するよう蚘茉されおいたす。 # Build Phases > Run Script " ${BUILD_DIR % /Build/* } /SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run " CocoaPods時の ${PODS_ROOT}/FirebaseCrashlytics/run に盞圓したす。Xcode 15以降は User Script Sandboxing がデフォルトで有効になっおいたす。有効な堎合はRun ScriptのInput Filesに以䞋を列挙する必芁がありたす Firebase公匏ドキュメント 。 ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME} ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME} ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist $(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist $(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH) # Debug DylibDEBUG_DYLIBが有効な堎合は远加で必芁 ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}.debug.dylib 2. iOSxcconfigでBuild Configurationを9パタヌンに敎える iOSのXcodeプロゞェクトは「Build Configuration」ずいうビルド蚭定の単䜍を持ちたす。各Configurationにはxcconfigファむルテキストでビルド蚭定を蚘述する仕組みを1぀玐付けられたす。本テンプレヌトは、以䞋の9通りのBuild Configurationを甚意しおいたす。 dev stg prd Debug Debug-dev Debug-stg Debug-prd Profile Profile-dev Profile-stg Profile-prd Release Release-dev Release-stg Release-prd これらはあらかじめ project.pbxproj にコミット枈みです。あわせお、それらを参照する dev / stg / prd の3 Schemeもコミット枈みです。各Schemeは、Run/Test/Analyzeで Debug-<flavor> を参照したす。Profileでは Profile-<flavor> 、Archiveでは Release-<flavor> を参照したす。3぀のSchemeには、Flutter暙準の Run Prepare Flutter Framework Script pre-actionも含めお完党な状態で甚意されおいたす。このpre-actionは xcode_backend.sh prepare を実行したす。これによりSPM統合に必芁な FlutterGeneratedPluginSwiftPackage が解決されたす。 mise run setup はこのScheme⇔Configurationのマッピングやpre-actionには䞀切觊れたせん。曞き換えるのは、各Configurationに玐づくxcconfigの倀Bundle IDやアプリ名などだけです。 Flutter/Shared.xcconfig ← å…š Configuration 共通の倀 Flutter/flavor-dev.xcconfig ← dev 固有の倀BUNDLE_ID_SUFFIX など Flutter/flavor-stg.xcconfig Flutter/flavor-prd.xcconfig Flutter/Debug-dev.xcconfig ← #include で連結9ファむル Flutter/Debug-stg.xcconfig ... Flutter/Release-prd.xcconfig 埌ろの #include が前の倀を䞊曞きするため、共通倀 Shared → flavor固有倀 flavor-dev の順に重ねるこずで最終的な倀が決たりたす。 Debug-dev.xcconfig は3行の #include のみで構成されたす。 #include "Debug.xcconfig" #include "Shared.xcconfig" #include "flavor-dev.xcconfig" これでビルド時に察応するxcconfigが PRODUCT_BUNDLE_IDENTIFIER を解決したす。その倀が Info.plist 経由でflavor付きBundle ID䟋 jp.testapp.dev ずしお適甚されたす。 Firebase plistをBuild Phaseで差し替える flavor別の GoogleService-Info.plist を䜿い分けるため、Build PhaseにRun Scriptを远加したす。Run Script内の ${FLAVOR} は実行盎前にxcconfigの倀 dev / stg / prd に眮き換えられたす。これによりコピヌ元ディレクトリがflavorごずに切り替わり、該圓するplistだけが .app バンドルに入りたす。 # Build Phases > Run Script SRC = " ${SRCROOT} /firebase/ ${FLAVOR} /GoogleService-Info.plist " DST = " ${BUILT_PRODUCTS_DIR} / ${PRODUCT_NAME} .app/GoogleService-Info.plist " if [ -f " $SRC " ]; then cp -f " $SRC " " $DST " else echo " warning: $SRC not found, Firebase native init will be skipped " fi plistが存圚しないflavorでもビルドが倱敗しないよう、存圚チェックを入れおいたす。 firebase_project_id を空にしおFirebase蚭定をスキップした堎合がこれに該圓したす。このRun Scriptは読み曞き察象のパスをInput Files / Output Filesずしおあらかじめ宣蚀しおいたす。そのためUser Script Sandboxingが有効な環境でも安党に動䜜したす。 plistは以䞋のスロットに配眮したす setup:firebase が生成。 app/ios/firebase/ ├── dev/GoogleService-Info.plist ├── stg/GoogleService-Info.plist └── prd/GoogleService-Info.plist 3. AndroidproductFlavorsずgoogle-services.jsonをflavorごずに配眮する Androidでは build.gradle.kts に productFlavors を远加し、flavorごずに applicationIdSuffix ずアプリ名を蚭定したす。 // app/android/app/build.gradle.kts flavorDimensions + = "env" productFlavors { create( "dev" ) { dimension = "env" applicationIdSuffix = ".dev" resValue( "string" , "app_name" , "Flutter Template App Dev" ) } create( "stg" ) { dimension = "env" applicationIdSuffix = ".stg" resValue( "string" , "app_name" , "Flutter Template App Stg" ) } create( "prd" ) { dimension = "env" resValue( "string" , "app_name" , "Flutter Template App" ) } } google-services.json はAndroid Gradleのflavor゜ヌスセット src/<flavor>/ に配眮したす。flavor甚の蚭定ファむルはgoogle-servicesプラグむンが自動で遞択したす。 android/app/src/ ├── dev/google-services.json # setup:firebase が生成 ├── stg/google-services.json └── prd/google-services.json 泚意点が2぀ありたす。1぀目は google-services.json の package_name です。suffix蟌みの最終applicationIdに合わせたす䟋 com.example.app.dev 。suffixなしの com.example.app だけFirebaseに登録しおいるず、dev / stgビルド時にプラグむンが䟋倖を投げおビルドが通りたせん。Firebase偎のアプリ登録もsuffix蟌みのapplicationIdで行う必芁がありたす。 AndroidManifest.xmlで android:label="@string/app_name" のように参照したす。 productFlavors の resValue がflavorごずに生成した文字列が、そのたたアプリ名ずしお䜿われたす。 <!-- app/android/app/src/main/AndroidManifest.xml --> <application android : label = "@string/app_name" ...> 2぀目は、 strings.xml ずの重耇です。 resValue("string", "app_name", ...) はビルド時に文字列リ゜ヌスを生成したす。そのため、 res/values/strings.xml に同名の app_name が定矩されおいるず Duplicate resources ゚ラヌになりたす。 app_name は strings.xml には眮かず、各flavorの resValue に䞀本化しおください。 4. Dartfirebase_optionsをセレクタshim化する flutterfire configure が生成する firebase_options.dart は単䞀の蚭定しか返したせん。そこでファむル名ずAPIを保ったたた、 セレクタ shim に眮き換えたす。 たず app/flavor/dev.json に FLAVOR キヌを定矩し、 --dart-define-from-file で読み蟌みたす。 { " FLAVOR ": " dev " } FLAVOR はDartコヌド偎で String.fromEnvironment('FLAVOR') を䜿っお、コンパむル時定数ずしお参照できたす。 // app/lib/firebase_options.dart import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; import 'firebase_options_dev.dart' as dev; import 'firebase_options_prd.dart' as prd; import 'firebase_options_stg.dart' as stg; const _flavor = String .fromEnvironment( 'FLAVOR' ); class DefaultFirebaseOptions { static FirebaseOptions get currentPlatform { switch (_flavor) { case 'dev' : return dev.DefaultFirebaseOptions.currentPlatform; case 'stg' : return stg.DefaultFirebaseOptions.currentPlatform; case 'prd' : return prd.DefaultFirebaseOptions.currentPlatform; default : throw StateError( 'Unknown FLAVOR: "$_flavor". ' 'Run with --dart-define-from-file=flavor/<flavor>.json' , ); } } } 呌び出し偎 main.dart は DefaultFirebaseOptions.currentPlatform をそのたた䜿うだけで、flavorの切り替えを意識する必芁がありたせん。 setup:firebase はこのファむルを䞊曞きせず、本物の firebase_options_<flavor>.dart だけを再生成したす。 泚意flavor指定は必須 _flavor が空 --dart-define-from-file 未指定だずshimの default が StateError を投げたす。 _initializeFirebase はこれをcatchしないため、flavorなしの flutter run は起動時に萜ちたす。VS Codeのlaunch.jsonや mise run タスクで各flavorを必ず枡す構成にしおおくず安党です。 main.dartでduplicate-appを凊理する Firebaseには2぀の初期化経路がありたす。ネむティブの自動初期化ず、Dart偎の Firebase.initializeApp() です。䞡方が呌ばれるず duplicate-app の FirebaseException が発生したす。ただし duplicate-app はflavor䞍敎合ネむティブのplist/jsonが別のFirebaseプロゞェクトを指しおいる等でも発生しうるため、無条件で成功扱いにはできたせん。ネむティブ初期化枈みの options ず比范し、䞀臎した堎合のみ成功扱いにしたす。䞍䞀臎の堎合は䟋倖を再throwし、アプリを起動時にクラッシュさせたす。䟋倖を握り぀ぶしおしたうず、䞍正なAPIキヌや蚭定䞍敎合ずいった怜知したいバグを芋逃しおしたう可胜性があるためです。 // app/lib/main.dart抜粋 Future< bool > _initializeFirebase() async { try { await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); return true ; } on UnimplementedError { // placeholdersetup:firebase 未実行の堎合は Firebase を無効化しお続行 return false ; } on FirebaseException catch (e) { if (e.code == 'duplicate-app' ) { final existing = Firebase.app().options; final expected = DefaultFirebaseOptions.currentPlatform; final matchesNativeConfig = existing.appId == expected.appId && existing.projectId == expected.projectId && existing.apiKey == expected.apiKey; if (matchesNativeConfig) return true ; } rethrow ; } } 5. mise run setupで党flavorを䞀括生成する mise は、タスク実行ずツヌルのバヌゞョン管理を兌ねるCLIツヌルです。本テンプレヌトではセットアップスクリプトの実行に利甚しおいたす。手䜜業の蚭定挏れを防ぐため、セットアップの入力ファむル app_config.yaml にFirebaseのproject_idをflavorごずに蚭定できる構造を远加したした。これにより、 mise run setup:firebase で党flavorの蚭定ファむルを䞀括生成できたす。 flavor : dev : app_name_suffix : " Dev" bundle_id_suffix : ".dev" firebase_project_id : "my-project-dev" # 空文字なら Firebase 蚭定をスキップ stg : app_name_suffix : " Stg" bundle_id_suffix : ".stg" firebase_project_id : "my-project-stg" prd : app_name_suffix : "" bundle_id_suffix : "" firebase_project_id : "my-project-prd" mise run setup:firebase は app_config.yaml の各flavorの firebase_project_id を読み取りたす。読み取った倀で flutterfire configure をflavorごずに実行したす。 iOSは --ios-out でパスを盎接指定するず、plistは出力されるもののproject.pbxprojぞの参照は Runner/ 配䞋を前提に远加されたす。配眮ず参照のズレでビルドが萜ちる事䟋もありたした。そこで setup:firebase は flutterfire configure のデフォルト出力 Runner/ を利甚し、埌凊理で配眮を敎えたす。 Build PhaseのRun Scriptがflavorに応じおplistを動的にコピヌするので、 project.pbxproj の静的参照は䞍芁です。 setup:firebase は実行のたびに远蚘される参照を毎回陀去し、pbxprojが肥倧化しないようにしおいたす。 # クリヌンアップ確認0 であれば OK grep -c " GoogleService-Info.plist .*PBXBuildFile " \ app/ios/Runner.xcodeproj/project.pbxproj mise run setup:flavor はxcconfigやflavor JSONを app_config.yaml から再生成したす。Firebaseの蚭定ファむルは別途 setup:firebase で曎新したす。䜕床実行しおも同じ出力になるため、蚭定倉曎埌に再実行すればxcconfigずflavor JSONが同期されたす。 この仕組みにより、新芏プロゞェクトでは app_config.yaml を線集しお mise run setup を実行するだけで枈みたす。iOS xcconfig・Android productFlavors・Dartセレクタshim・Firebase蚭定ファむルのすべおが䞀括でできあがりたす。 たずめ 本蚘事では、FlutterプロゞェクトにおけるCocoaPodsからSPMぞの移行を玹介したした。あわせおdev / stg / prdの3 flavorをiOS・Android・Dartの3局で敎合させる仕組みの構築も玹介したした。 CocoaPodsからSPMぞの移行自䜓は pod deintegrate → Podfile削陀で思ったよりシンプルです。手間がかかるのはflavorの3局敎合で、それぞれが独立した蚭定䜓系を持぀ため䞀぀ひず぀繋ぎ蟌む必芁がありたす。 app_config.yaml → mise run setup ずいう自動化の仕組みを敎えたした。これにより手動䜜業による蚭定挏れのリスクを排陀し、チヌムが本来の開発に集䞭できる環境を䜜れたした。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
チラシやポスタヌ、商品パッケヌゞ、店頭POPなど、印刷物からWebサむトぞ誘導する手段ずしお、QRコヌドは広く利甚されおいたす。 手軜に䜜成でき、スマヌトフォンで簡単に読み取れる。その䟿利さから、 QRコヌドそのものの品質や確認工皋 に぀いおは、十分に意識されないたた制䜜が進んでしたうこずがありたす。 しかし、QRコヌドは印刷埌に䞍具合が芋぀かっおも、 Webペヌゞのようにその堎で修正するこずはできたせん 。 読み取れないQRコヌドが印刷されおしたえば、 チラシやパッケヌゞ、販促物の刷り盎し が必芁になり、印刷費だけでなく、 玍期の遅延、廃棄コスト、キャンペヌン機䌚の損倱、取匕先からの信甚䜎䞋 に぀ながる可胜性がありたす。 株匏䌚瀟モンテカンポ では、こうした印刷埌のトラブルを防ぐために、 QRコヌドの䜜成ず実機怜蚌を行うサヌビス を提䟛しおいたす。 QRコヌドのトラブルは、なぜ印刷埌に発芚するのか 印刷物の制䜜珟堎では、 耇数の䌚瀟や担圓者が関わるこずが䞀般的 です。 発泚元は「制䜜䌚瀟が確認しおいるはず」ず考え、制䜜担圓者は「自分のスマヌトフォンで読めたから問題ない」ず刀断し、印刷䌚瀟は「支絊されたデヌタをそのたた印刷する」ずいう立堎を取るこずがありたす。 その結果、QRコヌドの品質を 誰が最終的に保蚌するのかが曖昧なたた 、入皿たで進んでしたいたす。 パ゜コンの画面䞊で問題なく芋えおいおも、実際に印刷するず、サむズや解像床、印刷状態、掲茉する玠材などの圱響によっお、読み取りにくくなる堎合がありたす。 䞀台のスマヌトフォンで読み取れたずしおも、すべおの利甚者が同じ機皮、同じOS、同じカメラを䜿甚するわけではありたせん。 QRコヌドは、䜜成するだけではなく、 実際の利甚環境を想定しお確認するこずが重芁 です。 無料のQRコヌド䜜成ツヌルに朜むリスク むンタヌネット䞊には、URLを入力するだけでQRコヌドを䜜成できる無料ツヌルが数倚くありたす。 䞀時的な案内や、すぐに差し替えられるWeb䞊の画像であれば、こうしたツヌルが䟿利な堎面もありたす。 䞀方、数千郚、数䞇郚を印刷するチラシやパッケヌゞに掲茉するQRコヌドでは、「 画面䞊では読み取れた 」ずいう確認だけで入皿するのは危険です。 QRコヌドには、コヌドの䜍眮や向きを認識するための「䜍眮怜出パタヌン」がありたす。生成した画像を䞍適切な方法で拡倧・瞮小したり、デザむンデヌタ䞊でサむズを倉曎したりするず、 読み取りに必芁な比率が厩れ 、認識に時間がかかったり、読み取れなくなったりする可胜性がありたす。 たた、URLが長い堎合は QRコヌドの情報密床が高くなり 、印刷サむズや印刷品質によっおは読み取りにくくなるこずがありたす。 問題は、無料ツヌルそのものだけではありたせん。 「 誰が、どのツヌルで、どのような条件で䜜成し、どの環境で確認したのか 」が管理されおいないこずが、倧きなリスクになりたす。 䞀床の確認䞍足が、倧きな損倱に぀ながる QRコヌドの䞍具合は、䞀芋するず小さな制䜜ミスに思えるかもしれたせん。 しかし、キャンペヌン甚の印刷物がすべお䜿甚できなくなれば、損害は印刷費だけにずどたりたせん。 たずえば、次のような圱響が考えられたす。 印刷物の党数廃棄 再印刷費甚の発生 玍品・配垃スケゞュヌルの遅延 キャンペヌン開始日の倉曎 店舗や関係各瀟ぞの再手配 クラむアントからの信甚䜎䞋 問い合わせやクレヌム察応の増加 添付資料では、無料ツヌルで䜜成したQRコヌドを十分に確認せず入皿した結果、印刷埌にアクセスできないこずが刀明し、 1,000䞇円を超える損害 に぀ながった事䟋も玹介されおいたす。 倧芏暡な案件ほど、QRコヌド䞀぀の䞍具合が、 事業䞊の倧きな事故に発展する可胜性 がありたす。 入皿前に確認したい5぀のポむント QRコヌドを印刷物に掲茉する際は、少なくずも次の項目を確認する必芁がありたす。 1十分な掲茉サむズが確保されおいるか QRコヌドが小さすぎるず、スマヌトフォンのカメラが認識しにくくなりたす。 資料では、コヌド領域ずしお20mm以䞊を確保するこずが掚奚されおおり、10mm以䞋は特に泚意が必芁ずされおいたす。 掲茉スペヌスだけで刀断せず、実際に読み取れるサむズであるかを確認するこずが重芁です。 2埋め蟌むURLが長すぎないか QRコヌドは、埋め蟌む情報量が倚くなるほど暡様が现かくなりたす。 長いURLをそのたた䜿甚するずコヌドの密床が高くなり、小さな印刷物や印刷条件によっおは読み取り性胜に圱響する可胜性がありたす。 3実際の印刷物で確認したか 制䜜画面やPDF䞊で読み取れるこずず、印刷埌に読み取れるこずは同じではありたせん。 可胜であれば、校正刷りや実際に近い印刷条件で出力し、読み取り確認を行う必芁がありたす。 4耇数の端末で確認したか 䞀台のスマヌトフォンだけで確認を終えるのではなく、iPhoneずAndroid、異なる機皮やOS、暙準カメラなど、耇数の環境で怜蚌するこずが望たれたす。 5䜜成元ず確認責任者が明確か 担圓者が個人的に芋぀けた無料ツヌルで䜜成し、誰も生成条件を把握しおいない状態は避けるべきです。 どのツヌルを䜿い、誰が䜜成し、誰が怜蚌したのかを蚘録できるフロヌを敎えるこずで、確認挏れを防ぎやすくなりたす。 QRコヌドの事故を防ぐには、個人の泚意力に頌らない 繁忙期や玍期盎前には、どれほど経隓のある担圓者でも確認挏れを起こす可胜性がありたす。 そのため、組織ずしお次のようなルヌルを蚭けるこずが有効です。 印刷物に䜿甚するQRコヌドは、担圓者個人が無料ツヌルで䜜成しない 指定された方法で生成し、実機怜蚌を終えおから入皿する QRコヌドの䜜成者ず確認者を分ける 校正時のチェック項目にQRコヌドの読み取り確認を入れる 確認工皋をルヌル化すれば、担圓者の経隓や忙しさに巊右されにくくなり、トラブルを構造的に防ぐこずができたす。 株匏䌚瀟モンテカンポの「QRコヌド䜜成怜蚌サヌビス」 株匏䌚瀟モンテカンポは、 ゜フトりェアテストず第䞉者怜蚌を専門ずする䌚瀟 です。 QRコヌド䜜成怜蚌サヌビスでは、正芏ツヌルを䜿甚しおQRコヌドを生成し、実際のスマヌトフォン端末で読み取り確認を行いたす。 瀟内で専門的な確認環境を甚意するこずが難しい堎合 や、 倧量印刷を䌎う重芁な案件 、 倱敗できないキャンペヌン などで、倖郚の怜蚌サヌビスを掻甚できたす。 サヌビス内容 QRコヌドの䜜成 正芏ツヌルを䜿甚した生成 スマヌトフォン実機での読み取り確認 案件芏暡や予算に応じた怜蚌範囲の調敎 キャンペヌンサむトを含む倖郚怜蚌の盞談 料金は、 QRコヌド1個に぀き20,000円皎別 からです。 倧がかりな怜蚌だけでなく、範囲を絞った簡易的な察応に぀いおも盞談できたす。 QRコヌドを印刷する前に、専門家による確認を チラシ、ポスタヌ、パッケヌゞ、POPなどに掲茉するQRコヌドに぀いお、次のような䞍安はありたせんか。 無料ツヌルで䜜成したQRコヌドを䜿甚しおいる 誰が䜜成したデヌタなのか分からない 䞀台のスマヌトフォンでしか確認しおいない 校正刷りで読み取り確認をしおいない 倧量印刷を予定しおおり、倱敗が蚱されない クラむアントに提出できる確認䜓制を敎えたい 䞀぀でも圓おはたる堎合は、入皿前に䜜成方法ず怜蚌工皋を確認するこずをおすすめしたす。 株匏䌚瀟モンテカンポでは、QRコヌドの䜜成・怜蚌に加え、キャンペヌンサむトの倖郚怜蚌に぀いおも盞談を受け付けおいたす 。 印刷埌に埌悔する前に、たずは案件の内容や印刷条件、必芁な確認範囲をご盞談ください。 QRコヌド䜜成怜蚌サヌビス 料金1個20,000円皎別から 提䟛株匏䌚瀟モンテカンポ 所圚地東京郜枯区西新橋2-13-6 ミタニビル3階 電話03-5510-8991 担圓䞭村 無料盞談予玄 https://calendar.app.google/S7vdSYCYgvPPh8vL8

動画

曞籍