ãŠã©ã¬ããã¯CISã§æã人æ°ã®ãããµãŒãã¹ã§ã¯ãªãããšãäžè¬ã«åãå ¥ããããŠããŸãã ãããããã§ã«2çªç®ã®ãããžã§ã¯ãã§é£ç¶ããŠã顧客ã¯ã¿ã¹ã¯ãããŠã©ã¬ãããšçµ±åãã«èšå®ããŸãã ãããã£ãŠãç§ã¯ãã®èšäºãæžããŠãµãŒãã¹å šäœã«ã€ããŠè©±ãã補åããµãŒãã¹ã«çµ±åããæ¹æ³ã瀺ãããšã«ããŸããã
ãŠã©ã¬ãããšã¯äœã§ããïŒ æºåž¯é»è©±ã«ããŸããŸãªçš®é¡ã®ã«ãŒãïŒãã±ãããå²åŒã«ãŒããªã©ïŒãä¿æã§ããããã補åã®ãŠãŒã¶ãŒã«ãšã£ãŠäœ¿ãããããªããŸãã ããã«ãããã·ã¥éç¥ãä»ããŠãããã«é¢ããæ å ±ãæŽæ°ããããšãå¯èœã§ãããããã¯å¥ã®èšäºã®ãããã¯ã§ãã ãã ããé»è©±ã«çµ±åã§ããã«ãŒã/ãã±ãã/ãµãã¹ã¯ãªãã·ã§ã³ãããå Žåã¯ã解決çããããŸãïŒ æ¹æ³-以äžããèªã¿ãã ããã
ååãšããŠããµãŒããŒã¯ãããã®äœæãæ åœããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯.pkpassãã¡ã€ã«ã®åœ¢åŒã§ã«ãŒããåãåãããŠãŒã¶ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãä»ããŠã«ãŒãããŠã©ã¬ããã«è¿œå ã§ããŸãã
å°å³æ§é
éçºè ã®èŠ³ç¹ããèŠãããããšã¯äœã§ããïŒ ãããã¯ãæ¡åŒµåã.pkpassã®ã¢ãŒã«ã€ãã§ãã ã«ãŒãã®è¡šç€ºãšæäœã«å¿ èŠãªãã¹ãŠã®ããŒã¿ãå«ãŸããŠããŸãã ã¢ãŒã«ã€ãã®å 容ã¯ä»¥äžã®è¡šã«ãããŸãã
ãã¡ã€ã« | äºå® |
---|---|
background.png | ã«ãŒãã®èæ¯ç»åã |
footer.png | ããŒã³ãŒãã®æšªã®ç»å |
icon.png | éç¥ãšæçŽã®ã¢ã€ã³ã³ |
logo.png | ã«ãŒãã®ããŽã å·Šäžã«è¡šç€º |
manifest.json | å«ãŸãããã¹ãŠã®ãã¡ã€ã«ã®ã¬ãžã¹ã㪠|
眲å | PKCS7眲å |
pass.json | å€èŠ³ãšå°å³æ å ± |
strip.png | ã«ãŒãã®äž»ãªèª¬æã®åŸãã«ããç»å |
thumbnail.png | è¿œå ã®ç»åïŒæå®ïŒ |
次ã®ã¿ã€ãã®ã«ãŒããå©çšå¯èœã§ãã
- æä¹åžïŒé£è¡æ©ãŸãã¯é»è»ã§ã éåžžãã¯ãŒãã³ã¯1åã®æ è¡ã§æå¹ã§ãã
- ã¯ãŒãã³ïŒã¯ãŒãã³ããã³ç¹å¥ãªãã¡ãŒçšã
- ã€ãã³ããã±ããïŒ 1ã€ã®ã€ãã³ããšã·ãŒãºã³å šäœã®äž¡æ¹ã§æ©èœããŸãã
- å²åŒã«ãŒãïŒãã€ã³ãã«ãŒããå²åŒã«ãŒããã®ããã«ãŒãã
- äžè¬è¡šç€ºã«ãŒãïŒäžèšã®ãããã«ã該åœããªãå ŽåïŒããšãã°ãå°äžéãŸãã¯ãžã ãžã®ãã¹ã§æ è¡ããããã®ã«ãŒãã
ç°ãªãã«ãŒãã®å€èŠ³ãæš¡åŒçã«æ€èšããŠãã ããã åçã¯ãäžã®è¡šã«ç€ºãããã«ååãä»ããã®ãæé©ã§ãã
æä¹åž

ã¯ãŒãã³

ã€ãã³ããã±ãã

ã³ãã¥ããã£ã«ãŒã

å²åŒã«ãŒã

Pass.jsonæ§é
å¿
é ãã£ãŒã«ãã ãã¹ã¿ã€ãIDãããŒã IDãçµç¹åãªã©ãå«ã
é¢é£ã¢ããªã±ãŒã·ã§ã³ã®ããŒã ãããã«ãé¢é£ä»ãããå¿
èŠãããã¢ããªã±ãŒã·ã§ã³ã衚瀺ããå¿
èŠããããŸããã
ããŒãæå¹æéãã«ãŒãã
é¢é£æ§ã®ããŒã ããšãã°ããããã䜿çšã§ãããšãªã¢ã®åº§æšããŸãã¯ãããã®å¯Ÿè±¡ãšãªãã€ãã³ãã®éå§ã
ããŒã¯ã¹ã¿ã€ã«ã§ãã èšäºã®åé ã§ããŠã©ã¬ããçšã®5çš®é¡ã®ã«ãŒãããªã¹ããããŸããã ããããã«ç¬èªã®ã¹ã¿ã€ã«ããããŸãã ãã®ãããªããŒã¯å³å¯ã«1ã€ã§ãªããã°ãªããŸããã
ã«ãŒãã®èŠèŠçãªãã¶ã€ã³ã®ããã®ããŒã æãããªããšã«å ããŠããããã¯ãããã«è¡šç€ºãããããŒã³ãŒãã«é¢ããæ
å ±ãå«ãã§ããŸãã
WebãµãŒãã¹ããŒã WebãµãŒãã¹ã䜿çšããŠãããããæäœããããããããèªåçã«æŽæ°ãããã§ããŸãã
NFCããŒã Apple Payãã©ã³ã¶ã¯ã·ã§ã³ã®è¿œå æ
å ±ãå«ãŸããŠããŸãã
ããŠããã¹ãŠã®è©³çŽ°ã«ã€ããŠã
å¿ é ãã£ãŒã«ã
| | |
---|---|---|
説æ | ã²ã
ããŒã«ã©ã€ãº | ãããã®ç°¡åãªèª¬æã ããŒã«ã©ã€ãºã |
formatVersion | Int | ãã¡ã€ã«åœ¢åŒã®ããŒãžã§ã³ã å€ã¯1ã§ãªããã°ãªããŸããã |
| ã²ã
ããŒã«ã©ã€ãº | ã«ãŒããçºè¡ããçµç¹ã®ååã |
| ã²ã | ã¿ã€ãIDãšéçºè ã¢ã«ãŠã³ããæž¡ããŸãã |
| ã²ã | åäžã«ãŒãã®ã·ãªã¢ã«çªå· |
| ã²ã | éçºããŒã ã®ããŒã ID |
é¢é£ã¢ããªã±ãŒã·ã§ã³ã®ããŒ
| | |
---|---|---|
| [Int] | å¿ èŠã«å¿ããŠã ã«ãŒãã«é¢é£ä»ããããŠããã¢ããªã±ãŒã·ã§ã³ã®IDã çŸåšã®ããã€ã¹ãšäºææ§ã®ããæåã®ãã®ãåžžã«äœ¿çšãããŸãã |
| ã²ã | éãããšãã«ã¢ããªã±ãŒã·ã§ã³ã«æž¡ãããURL |
ã¹ã¿ã€ã«ããŒ
| | |
---|---|---|
| [JSON] | ãããã«é¢ããåºæ¬æ å ±ã |
| [JSON] | èæ¯æ å ±ã |
| [JSON] | è¿œå æ å ±ã®ãã£ãŒã«ãã ãªãã·ã§ãã« |
| [JSON] | ãããã®ã¿ã€ãã«ã ãªã¹ãã«ã«ãŒãã衚瀺ãããŠããå Žåã§ã衚瀺ãããŸãã |
| [JSON] | ãããã«é¢ããåºæ¬æ å ±ã |
| ã²ã | ãã±ããã«ãŒãã®èŒžéã®çš®é¡ã 次ã®å€ãåãããšãã§ããŸãã
PKTransitTypeAirã PKTransitTypeBoatã PKTransitTypeBu`ã PKTransitTypeGenericã ãPKTransitTypeTrainãã |
| [JSON] | ãããã®è£åŽãæ åœãããã£ãŒã«ãã®é å |
ãã®å Žåã®JSONã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
"key" : "value1", "label" : "value2", "value" : "value3"
å€ããŒã«ããå€ã¯ãæ°å€ãŸãã¯æååã®ããããã§ãã ãã ããcurrencyCodeãšæååå€ã¯äœ¿çšã§ããŸããã auxiliaryFieldsãšsecondaryFieldsã«ã€ããŠã¯ããããã®ããã€ããååšããå¯èœæ§ãããããããã§äœ¿çšãããè¡ã®é·ããç£èŠããå¿ èŠããããŸãã
ããžã¥ã¢ã«ãã¶ã€ã³ã®ããŒ
| | |
---|---|---|
| [JSON] | ããŒã³ãŒãã®æ å ±ïŒä»¥äžãåç §ïŒã |
| æååãšããŠã®è² | èæ¯è²ïŒïŒFa32e4ïŒ |
| æååãšããŠã®è² | å€ã§ã©ãã«ã®è² |
| ã²ã | ã€ãã³ããã±ãããšãã©ã³ã¹ããŒããã±ããã®å Žåã¯ãªãã·ã§ã³ã§ãã åãã¹ã¿ã€ã«ã®ã«ãŒã-passTypeIdentifierãšgroupingIdentifier-ã¯ã°ã«ãŒãåãããŸã |
| æååãšããŠã®è² | ãã£ãŒã«ãåã§ããã¹ãã«ã©ãã«ãä»ãã |
| ããŒã«ã©ã€ãºå¯èœãªæåå | ããŽã®æšªã«è¡šç€ºãããããã¹ã |
ããŒã³ãŒã
ãããã®æãéèŠãªéšåã ã«ãŒãèå¥çªå·ãããã«çž«ãä»ããããŠããŸãïŒããšãã°ãç©ççãªã«ãŒãçªå·ããã±ããçªå·ïŒã ã¹ãã£ããŒãŸãã¯ä»ã®ããŒã«ãæ£ãããšã³ã³ãŒãã§ã³ãŒããèªã¿åããããšãéèŠã§ãã
| | |
---|---|---|
| ã²ã | ããŒã³ãŒããèªã¿åãããªãå ŽåãããŒã³ãŒãã®æšªã«è¡šç€ºããããªãã·ã§ã³ã®ããã¹ãã |
| ã²ã | ããŒã³ãŒã圢åŒã å€ãåãå ŽåããããŸãïŒPKBarcodeFormatQRã
PKBarcodeFormatPDF417ã PKBarcodeFormatAztecã PKBarcodeFormatCode128 |
| ã²ã | ããŒã³ãŒãã§æå·åãããã³ãŒããŸãã¯ã«ãŒãçªå·ã |
| ã²ã | ã¡ãã»ãŒãžã®ãšã³ã³ãŒãã éåžžiso-8859-1 |
å Žæ
ãããã®ããŒã¯ãã«ãŒãã䜿çšã§ããå Žæã管çããŸãã
| | |
---|---|---|
| ã²ã | ããŒã³ãŒããèªã¿åãããªãå ŽåãããŒã³ãŒãã®æšªã«è¡šç€ºããããªãã·ã§ã³ã®ããã¹ãã |
| çµåºŠ | 緯床 |
| ããã« | 緯床 |
| ã²ã | ãŠãŒã¶ãŒãã«ãŒãã®ç¯å²ã«å ¥ã£ããšãã«ããã¯ç»é¢ã«è¡šç€ºããããªãã·ã§ã³ã®ããã¹ãã |
è£é¢
è¿œå æ å ±ã¯ã䜿çšæ¡ä»¶ãèªåæŽæ°ããªã·ãŒãé£çµ¡å ã®è©³çŽ°ãããã³ã«ãŒããå±ããã¢ããªã±ãŒã·ã§ã³ãžã®ãªã³ã¯ãªã©ãããã¯æ å ±éšåã«é 眮ã§ããŸãã ãã®å³ã¯ãpass.jsonã®ãã£ãŒã«ãã®å¯Ÿå¿ãšããããã®è£åŽã®å€èŠ³ã瀺ããŠããŸãã å€ãã£ãŒã«ãã«ãªã³ã¯ãé»è©±çªå·ãªã©ãããå Žåããããã¯èªåçã«åŒ·èª¿è¡šç€ºãããŸãã
ããããäœæããŸãã ããŒã2
ãã®ãããåçã®æºåãæŽããpass.jsonã圢æããããã¹ãŠããŸãšããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãmanifest.jsonïŒè¡š1ãåç §ïŒã«å ¥åããŸããããã§ããã¹ãŠã®ç»åãšpass.jsonãå«ããå¿ èŠããããŸãã 次ã®ããã«ãªããŸãã
. . . . . . "pass.json" = 303c753abc39aa732ec74643d6db28348fe8a823; "strip.png" = 736d01f84cb73d06e8a9932e43076d68f19461ff; "strip@2x.png" = 468fa7bc93e6b55342b56fda09bdce7c829d7d46; . . . . . .
ãã以éãäœãå€æŽããå¿ èŠã¯ãããŸãããSHAãæ£ãããªããããå€æŽã®å Žåã¯SHAãåçæããå¿ èŠããããŸãã
次ã«ãéçºè ã®ãªãã£ã¹ã§ãã¹ã¿ã€ãIDãäœæãã蚌ææžãäœæããå¿ èŠããããŸãã ããããžã§ãã³ã°ãããã¡ã€ã«ãªã©ã以åã«äœæããå Žåãæé ã¯å€ããå°ãªããæ £ããŠããå¿ èŠããããŸãã

次ã«ãããŒãã§ãŒã³ã«ç§»åããããããApple Worldwide Developer Relation CertificateïŒWWDRïŒã.pemãšããŠãšã¯ã¹ããŒãããŸãã
ãããããäœæããããã¹ã¿ã€ãIDã.p12ãšããŠãšã¯ã¹ããŒãããŸãã ãã®æç¹ã§ãããŠã¹ããŒããŒã¯èšŒææžã®ãã¹ã¯ãŒãã®å
¥åãæ±ããŸãã ãã®å Žåããã¹ã¯ãŒãã¯ãªãã·ã§ã³ã§ãã
ãã以éã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ãmanifest.jsonãpass.jsonãããã³picturesããã§ã«ååšãã1ã€ã®ãã©ã«ããŒã§å®è¡ããå¿
èŠãããããšã«æ³šæããŠãã ããã
次ã«ãã¢ãŒã«ã€ãã«çœ²åãã眲åãçæããå¿ èŠããããŸãã æåã«ãPass Type IDãšããã«ããŒã.pemãšããŠãšã¯ã¹ããŒãããŸãã
openssl pkcs12 -in certificate.p12 -clcerts -nokeys -out passcertificate.pem -passin pass: your_password
ãããŠ
openssl pkcs12 -in certificates.p12 -nocerts -out passkey.pem -passin pass: -passout pass:new_password
ããã§ã眲åãçæããæºåãæŽããŸããã ã³ãã³ãã«ããŠã¿ãŸãããïŒ
openssl smime -binary -sign -certfile WWDR.pem -signer passcertificate.pem -inkey passkey.pem -in manifest.json -out signature -outform DER -passin pass:___
ãããã£ãŠããã¹ãŠã®æºåãæŽã£ãŠããŸããã¢ãŒã«ã€ããåéããã ãã§ã次ã®ã³ãã³ãã䜿çšããŸãã
zip -r nameOfPass.pkpass manifest.json pass.json signature logo.png logo@2x.png logo@3x.png icon.png icon@2x.png icon@3x.png
ã«ãŒãã®ããŒã¿ã¢ãŒã«ã€ãïŒ.pkpassïŒãå«ãããã¹ãŠã®ãã¡ã€ã«ãããã«ãªã¹ãããå¿
èŠãããããšã«æ³šæããŠãã ããã
ãã®çµæãã³ã³ãã¥ãŒã¿ãŒã§éãããšãã§ãã.pkpassãã¡ã€ã«ãååŸããŸãã ã«ãŒãã®ãã¬ãã¥ãŒã衚瀺ãããŸããããã®å€èŠ³ã¯é»è©±æ©ã®å€èŠ³ãšç°ãªãå ŽåããããŸãã
ããã¯ãã¹ãŠå°ãç°¡åã«è¡ãããšãã§ããŸãã Appleã¯ããã¹ãŠã®SHAèšç®ïŒ manifest.json
ãã¡ã€ã«ããã®ãŸãŸã«ããŠããããšãã§ããŸãïŒããã³çœ²åäœæã®äœæ¥ãè¡ãsignpass
ãŠãŒãã£ãªãã£ïŒ Apple Walletãµã³ãã«meterials ïŒãæäŸããŸãã ããã䜿çšããã«ã¯ããããžã§ã¯ãããã«ãããå¿
èŠãªãã¹ãŠã®ãªãœãŒã¹ãå«ããã©ã«ããŒã«signpass
ãã¡ã€ã«ãé
眮ããå¿
èŠããããŸãã

äžè¬ã«ãæ§é ã¯æ¬¡ã®ããã«ãªããŸãã

次ã«ãã³ãã³ããå®è¡ããŸãã
./signpass -p wallet
ãŠã©ã¬ããã¯ããã¹ãŠã®ãªãœãŒã¹ãé 眮ãããŠãããã©ã«ããŒã®ååã§ãã åºåã¯wallet.pkpassã§ãã ãã®å 容ã¯ãwallet.pkpassã解åããããšã§è¡šç€ºã§ããŸãã
unzip wallet.pkpass
pkpassã®äœæãããã¯ãšã³ãã«éä¿¡ãããå¯èœæ§ããããŸãããã®å Žåã.p12圢åŒã®Pass Type IDã®èšŒææžãšãã®ãã¹ã¯ãŒããWWDRéçºè ã«è»¢éããå¿ èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³çµ±å
ã¢ããªã±ãŒã·ã§ã³ããŠã©ã¬ããã«ã«ãŒããè¿œå ã§ããããã«ããã«ã¯ãã¢ããªIDã§ãã®æ©èœãæå¹ã«ãããããžã§ã¯ãã®æ©èœã§ãã®æ©èœãæå¹ã«ããå¿ èŠããããŸãã


ããã¯ããŠã©ã¬ããã§ã®å®å šãªæ£ããäœæ¥ã«å¿ èŠã§ãã ããããªããšããŠã©ã¬ããããã«ãŒããèªã¿åãããšãã§ããªããªããããšãã°ãåœç€Ÿã®ã«ãŒããè¿œå ãããŠãããã©ãããç解ã§ããªããªããŸãã pass.jsonã®ããŒã IDã¯ããŒã IDãšäžèŽããå¿ èŠããããŸããããããªããšãè³æ Œã«æåã§è¿œå ããå¿ èŠããããããç¶æ³ãä¿®æ£ã§ããŸãããããã¯ç¢ºèªããŸããã§ããã
ã«ãŒããè¿œå ãã
ãããã®è¿œå ã¯éåžžã«ç°¡åã§ãã
guard let passPath = Bundle.main.path(forResource: "wallet", ofType: "pkpass") else { return } let error: ErrorPointer = ErrorPointer(nilLiteral: ()) guard let passData = NSData(contentsOfFile: passPath) else { return } let pass = PKPass(data: passData as Data, error: error) let passLibrary = PKPassLibrary() passLibrary.addPasses([pass]) { (status) in print(passLibrary.containsPass(pass)) }
ãã ããç¹°ãè¿ããŸãããå€ãã®å Žåã.pkpassãã¡ã€ã«ããµãŒããŒããããŠã³ããŒãããå¿
èŠããããŸãã
PassKitã¯éåžžã«èªã¿ããããšã©ãŒãçæããã®ã§ãäœãééã£ãŠããããç°¡åã«ç解ã§ããŸãã
è¿œå ãããã«ãŒãã«é¢ããæ å ±ã®ååŸ
ãŠã©ã¬ããã§äœ¿çšå¯èœãªãã¢ããªã±ãŒã·ã§ã³ã«é¢é£ããã«ãŒãã«é¢ããæ å ±ãååŸããã«ã¯ãPKPassLibraryãªããžã§ã¯ããæå¹ã«ããå¿ èŠããããŸãã
let passLibrary = PKPassLibrary() let passes = passLibrary.passes()
ãããã£ãŠãããããè¿œå ãããã©ãããç解ããã€ã³ã¿ãŒãã§ã€ã¹ãæŽæ°ã§ããŸãã ããã«ãPKPassLibraryã䜿çšããŠãããããæŽæ°ããã³åé€ã§ããŸãã ãããã¯WebãµãŒãã¹ãä»ããŠæŽæ°ããããšãã§ããŸããããã®èšäºã§ã¯ãã®ãããªãªãã·ã§ã³ã¯èæ ®ããŸããã
äžææ§ãã§ãã¯
ãµãŒãã¹ã§ã¯ãååãšããŠãã«ãŒãã¯ã¢ã«ãŠã³ãã«é¢é£ä»ããããŠãããããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã«ãŒããçŸåšã®ãŠãŒã¶ãŒã«å±ããŠãããã©ãããäœããã®æ¹æ³ã§å€æããå¿
èŠããããŸãã ãããserialNumber
è¡ãããšããå§ãããŸãã ããšãã°ããŠãŒã¶ãŒã®serialNumber
çªå·IDãŸãã¯ã«ãŒãçªå·ãèšå®ããŸãã
ãã¹ãäž
Appleã¯ããŸããŸãªã¿ã€ãã®pkpassã®äŸãæäŸããŠããŸãããããã«çŠç¹ãåœãŠãããšãã§ããŸãã
ã¢ããã«ãŠã©ã¬ããã®ãµã³ãã«
ãããã®å€èŠ³ã確èªããã«ã¯ãpkpassããããžã§ã¯ãã«è¿œå ããŸãïŒããããã®è¿œå ããåç
§ïŒã è¿œå /åé€ã®ããã»ã¹ã¯æ¢ã«äžã§èª¬æãããŠããŸãããŠã©ã¬ããã®ã«ãŒãã1ã€ã®éçºè
ã¢ã«ãŠã³ãã§äœæãããéçºèªäœãå¥ã®ã¢ã«ãŠã³ãããå®è¡ãããå ŽåïŒã¢ãŠããœãŒã·ã³ã°äŒç€Ÿã«é¢é£ïŒãã¢ããªã±ãŒã·ã§ã³ã¯æ¢ã«è¿œå ãããã«ãŒãã衚瀺ããªãããšãæãåºããŠãã ããã åé¡ãªãã«ãŒããè¿œå ã§ããŸãã
QRã³ãŒãã¹ãã£ããŒã䜿çšããŠãããŒã³ãŒãã®æ
å ±ãæ£ãããšã³ã³ãŒããããŠãããã©ããã確èªã§ããŸãã ãããŠããã®ã¹ãã£ããŒã§äœæ¥ã®æ£ç¢ºãã確èªããããšã¯ééããªãå¿
èŠã§ãã
ãããã«
ãã®èšäºã§ã¯ããããã®äœæãšèšèšã®ããã»ã¹ãããã³ã¢ããªã±ãŒã·ã§ã³ãšã®çµ±åã®ããã»ã¹ãšãçºçããå¯èœæ§ã®ããåé¡ã«ã€ããŠæ€èšããŸããã ç§ã¯æå³çã«WebãµãŒãã¹ãšå°å³ã®æŽæ°ãšã®çµ±åã®åé¡ã«åãçµãã§ããŸããã§ããã次ã®èšäºã§ãããããããšæã£ãŠããŸãã
䜿çšããææïŒ
https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/PassKit_PG/Creating.html
https://developer.apple.com/library/archive/documentation/UserExperience/Reference/PassKit_Bundle/Chapters/TopLevel.html#//apple_ref/doc/uid/TP40012026-CH2-SW3
https://itechroof.wordpress.com/2015/11/30/apple-wallet-part-13/
https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/PassKit_PG/Updating.html
ãã¹ãã®éçºè ã¢ã«ãŠã³ãã«mehdzorã«æè¬ããŸãã