
- TOP
- ã¿ã°äžèЧ
- Android
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


















