詳解 Core NFC - NFC を用いた iOS App 開発のてびき / Demystify Core NFC - A guide to iOS App Dev using NFC
iOSDC Japan 2022 Day 1 2022/09/11 14:10〜 Track B レギュラートーク(40分) https://fortee.jp/iosdc-japan-2022/proposal/40f51161-9c44-4330-ba92-e9aa407454c3
https://www.youtube.com/watch?v=RhLszeyR4h0
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.USFBTUSBJO5BOBLB3ZPHBৄղ$PSF/'$1/'$Λ༻͍ͨJ04"QQ։ൃͷͯͼ͖iOSDC Japan 2022Day 1#iosdc #b
View Slide
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved."CPVUNFUSFBTUSBJO5BOBLB3ZPHB24XJGU J04 XBUDI04 $PSF/'$ 044ɹɹJU`TNZNPUIFSUPOHVFɹɹٱ͠ͿΓʹ+BWB4DSJQUʢ("4ʣΛॻ͍ͨΒTXJUDIจͷɹɹ֤DBTFઅʹCSFBLΛೖΕΕ͍ͯ͢͜͝ͱʹͳͬͨ!ɹɹɹɹɹɹɹɹɹɹ!USFBTUSBJOɹɹIUUQTUSFUKQ%F/"$P -UEɹɹJ04"QQ%FWFMPQFSʢ"QSJM$VSSFOUʣ
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$3
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 4/'$8JLJQFEJBIUUQTKBXJLJQFEJBPSHXJLJ/'$ɹ$$#:4"
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 5/'$8JLJQFEJBIUUQTKBXJLJQFEJBPSHXJLJ/'$ɹ$$#:4"
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 6/'$8JLJQFEJBIUUQTKBXJLJQFEJBPSHXJLJ/'$ɹ$$#:4"
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./FBS'JFME$PNNVOJDBUJPOۙڑແઢ௨৴7
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 8"QQMFr88%$,FZOPUF:PV5VCFIUUQTXXXZPVUVCFDPNXBUDI WOK9H@//J$"
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 9ຊͰJ1IPOF"QQMF8BUDIͷ4VJDB1"4.0Λ͏"QQMFαϙʔτ ຊIUUQTTVQQPSUBQQMFDPNKBKQ)5
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ೖؗূɹɹަ௨ܥ*$ΧʔυɹɹύʔΩϯάϝʔλʔɹɹॅຽجຊாΧʔυϞόΠϧΥϨοτɹɹσϏοτΧʔυɹɹػثͷϖΞϦϯάɹɹϨδܾࡁࣗಈंͷ伴ɹɹӡస໔ڐূɹɹϨϯλϧࣗసंɹɹΫϨδοτΧʔυɹɹࣹثϋʔυΣΞηΩϡϦςΟτʔΫϯɹɹεϚʔτΧʔυɹɹɾࡏݿཧλάϓϦϖΠυΧʔυɹɹిؾࣗಈंͷॆిεςʔγϣϯɹɹֶੜূɹɹࢦྠϗςϧͷϧʔϜΩʔɹɹεϚʔτϙελʔɹɹύεϙʔτɹɹλϒϨοτεϚʔτΥονɹɹମԹܭɹɹࣾһূɹɹΠϠϗϯɹɹ"OESPJE#FBNεϚʔτϑΥϯɹɹࣗಈվࡳػɹɹݸਓ൪߸ʢϚΠφϯόʔʣΧʔυɹɹFUD10
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$/FBS'JFME$PNNVOJDBUJPOʢۙڑແઢ௨৴ʣw ʮϞϊͱϞϊΛ͚ۙͮͯใΛΓऔΓ͢ΔΞϨʯw ඇ৮ͰใΛΓऔΓͰ͖Δ11
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 12/'$'PSVNIUUQTOGDGPSVNPSH
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$ͷʮͭͷϞʔυʯ13ΧʔυΤϛϡϨʔγϣϯϦʔμʔɾϥΠλʔϐΞɾπʔɾϐΞ ϫΠϠϨεॆి/'$5FDIOPMPHZ/'$'PSVNIUUQTOGDGPSVNPSHMFBSOOGDUFDIOPMPHZΛݩʹ࡞
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ΧʔυΤϛϡϨʔγϣϯ/'$ͷʮͭͷϞʔυʯΧʔυΤϛϡϨʔγϣϯϞʔυ14ηΩϡΞΤϨϝϯτํࣜΧʔυΤϛϡϨʔγϣϯϗετΧʔυΤϛϡϨʔγϣϯʢ)$&ʣ/'$5FDIOPMPHZ/'$'PSVNIUUQTOGDGPSVNPSHMFBSOOGDUFDIOPMPHZΛݩʹ࡞
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$ٕज़֓ཁw 3'*%ͷҰछw ൖૹɹɹɹ)'ଳʢ.)[ʣw ௨৴ڑɹɹDNʢ·ͨDNఔʣw ௨৴ɹɹLCQTʙLCQTɹɹLCQT·ͨLCQTw ిྗૹɹɹ࠷େ8ʢϫΠϠϨεॆిϞʔυʣ15/'$5FDIOPMPHZ/'$'PSVNIUUQTOGDGPSVNPSHMFBSOOGDUFDIOPMPHZΛݩʹ࡞
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ཧతڑ͕ൺֱత͍ͱ͖ʹ͑Δ௨৴16/'$ #MVFUPPUI23ίʔυόʔίʔυ*S%"ʢ֎ઢ௨৴ʣFUD
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.#MVFUPPUIWT/'$17w #MVFUPPUIw ௨৴͕͍w ௨৴Մೳͳཧతڑ͕͍w /'$w ࣄલͷϖΞϦϯά࡞ۀ͕ෆཁw ௨৴࣌ͷফඅిྗ͕ང͔ʹগͳ͍w গ͠ԕ͚͟Δͱଓ͕ΕΔ
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.23ίʔυɾόʔίʔυWT/'$18w 23ίʔυɾόʔίʔυw ҹ͢Δ͚ͩͰ͑Δw ΧϝϥͷͨΊͷௐ͕ඞཁw ϐϯτɾ໌Δ͞ɾःṭͷআڈw ҹͷσβΠϯΛ્w /'$w ͚ۙͮΕ௨৴Ͱ͖Δw ؒʹଟগͷͷ͕ࡏͬͯΑ͍w ใͷมߋ͕Մೳw ௨৴ͷͨΊͷ෦ʢίΠϧɾΞϯςφʣ͕ඞཁ
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.J04"QQʹ͓͚Δ/'$͕ΘΕ͍ͯΔ໘w "QQMF1BZʢίϯλΫτϨεܾࡁʣw 8BMMFUʹՃͨ͠ंͷ伴ϗςϧͷ෦ͷ伴Λ͏w "QQ$MJQίʔυw F,:$ɾຊਓ֬ೝw ిࢠϚωʔʢཧΧʔυʣͷߴɾར༻ཤྺΛ֬ೝ19
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./FBS'JFME$PNNVOJDBUJPOۙڑແઢ௨৴20
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./FBS'JFME$PNNVOJDBUJPOۙڑແઢ௨৴20͕ࣗ͜ΕΛͬͯ։ൃ͢Δ͜ͱແ͍ʜʜʁ
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./FBS'JFME$PNNVOJDBUJPOۙڑແઢ௨৴20͕ࣗ͜ΕΛͬͯ։ൃ͢Δ͜ͱແ͍ʜʜʁ͍ͬͨͳ͍ʂ
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$ΛͬͯԿ͔࡞Ζ͏ʂw ʢ/'$ͷͨΊ͚ͩͷ෦ʢΞϯςφͳͲʣ͕ೖ͍ͬͯΔඞཁ͕͋ΔͷͰʣίετ͕͔͔Δw ࠓ͜͜ʹ͍ΔΈͳ͞Μ͕͍࣋ͬͯΔJ1IPOFͷ΄΅શͯʹࡌࡁΈʢͷͣʣw ௨৴૬खͱͳΔΧʔυɾλάྨຕ͓ࡒʹೖ͍ͬͯΔʢͣʜʜʂʣw Ճίετ͔͔Βͳ͍ʂw ͕͍ࣗ࣋ͬͯΔϞϊͷதΛ͍ͯΈͨ͋͘Γ·ͤΜ͔ʁ21
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$ࠃࡍن֨ͰΦʔϓϯw *40*&$ʢ/'$*1ʣw *40*&$ʢ/'$*1ʣɹʹɹ/'$*1ɹʴɹ*40*&$ɹʴɹ*40*&$22
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 23ιχʔגࣜձࣾc'FMJ$Bc/'$ʹ͍ͭͯc/'$ͱ'FMJ$BͷؔIUUQTXXXTPOZDPKQ1SPEVDUTGFMJDB/'$SFMBUJPOIUNM
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 24ιχʔגࣜձࣾc'FMJ$Bc/'$ʹ͍ͭͯc/'$ͱ'FMJ$BͷؔIUUQTXXXTPOZDPKQ1SPEVDUTGFMJDB/'$SFMBUJPOIUNM
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ιχʔגࣜձࣾc'FMJ$Bc/'$ʹ͍ͭͯc/'$ͱ'FMJ$BͷؔIUUQTXXXTPOZDPKQ1SPEVDUTGFMJDB/'$SFMBUJPOIUNM҉߸ԽΛඞཁͱ͠ͳ͍ΦʔϓϯίϚϯυΛ༻͍ͨΞϓϦέʔγϣϯͷ߹ʹɺެ։͞Ε͍ͯΔن͚֨ͩͰ։ൃ͢Δ͜ͱ͕Ͱ͖·͢ɻ(PPHMFࣾͷ"OESPJEΞοϓϧࣾͷJ04ͳͲεϚʔτϑΥϯ͚04͕/'$ͷػೳΛαϙʔτ͓ͯ͠ΓɺҰൠͷํ͕։ൃ͞ΕͨిࢠϚωʔͷϏϡʔϫʔͳͲؚΊɺεϚʔτϑΥϯ͚ʹ͢Ͱʹ͍͔ͭ͘ͷ/'$ΞϓϦέʔγϣϯ͕ެ։͞Ε͍ͯ·͢ɻ25
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ιχʔגࣜձࣾc'FMJ$Bc/'$ʹ͍ͭͯc/'$ͱ'FMJ$BͷؔIUUQTXXXTPOZDPKQ1SPEVDUTGFMJDB/'$SFMBUJPOIUNM҉߸ԽΛඞཁͱ͠ͳ͍ΦʔϓϯίϚϯυΛ༻͍ͨΞϓϦέʔγϣϯͷ߹ʹɺެ։͞Ε͍ͯΔن͚֨ͩͰ։ൃ͢Δ͜ͱ͕Ͱ͖·͢ɻ(PPHMFࣾͷ"OESPJEΞοϓϧࣾͷJ04ͳͲεϚʔτϑΥϯ͚04͕/'$ͷػೳΛαϙʔτ͓ͯ͠ΓɺҰൠͷํ͕։ൃ͞ΕͨిࢠϚωʔͷϏϡʔϫʔͳͲؚΊɺεϚʔτϑΥϯ͚ʹ͢Ͱʹ͍͔ͭ͘ͷ/'$ΞϓϦέʔγϣϯ͕ެ։͞Ε͍ͯ·͢ɻ26
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ιχʔגࣜձࣾc'FMJ$Bc/'$ʹ͍ͭͯc/'$ͱ'FMJ$BͷؔIUUQTXXXTPOZDPKQ1SPEVDUTGFMJDB/'$SFMBUJPOIUNM҉߸ԽΛඞཁͱ͠ͳ͍ΦʔϓϯίϚϯυΛ༻͍ͨΞϓϦέʔγϣϯͷ߹ʹɺެ։͞Ε͍ͯΔن͚֨ͩͰ։ൃ͢Δ͜ͱ͕Ͱ͖·͢ɻ(PPHMFࣾͷ"OESPJEΞοϓϧࣾͷJ04ͳͲεϚʔτϑΥϯ͚04͕/'$ͷػೳΛαϙʔτ͓ͯ͠ΓɺҰൠͷํ͕։ൃ͞ΕͨిࢠϚωʔͷϏϡʔϫʔͳͲؚΊɺεϚʔτϑΥϯ͚ʹ͢Ͱʹ͍͔ͭ͘ͷ/'$ΞϓϦέʔγϣϯ͕ެ։͞Ε͍ͯ·͢ɻ27
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.$PSF/'$28
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 29
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 30
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$Λ༻͍ͨ"QQMFϓϥοτϑΥʔϜͷ"QQͷ։ൃ31
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$ͷΞϯςφΛࡌ͍ͯ͠ΔσόΠε32ը૾"QQMF8FCαΠτΑΓ
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$ͷΞϯςφΛࡌ͍ͯ͠ΔσόΠε33ը૾"QQMF8FCαΠτΑΓ
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 34$PSF/'$c"QQMF%FWFMPQFS%PDVNFOUBUJPOIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODPSFOGD
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 35$PSF/'$c"QQMF%FWFMPQFS%PDVNFOUBUJPOIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODPSFOGD
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.$PSF/'$ͷରw $PSF/'$Λ͑ΔͷJ04Ҏ߱w NBD04ɾUW04ɾXBUDI04Ͱ༻Ͱ͖ͳ͍w J04Ҏ͔߱ͭ/'$ΞϯςφΛੵΜͩJ1IPOFͷΈ36
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$ΞϯςφΛࡌͨ͠J1IPOFw J1IPOFɾ1MVTw J1IPOFTɾT1MVTw J1IPOFɾ1MVTw J1IPOFɾ1MVTw J1IPOF9w J1IPOF9㸑ɾ9Tɾ9T.BY37w J1IPOFɾ1SPɾ1SP.BYw J1IPOF4&ʢୈੈʣw J1IPOFNJOJɾɾ1SPɾ1SP.BYw J1IPOFNJOJɾɾ1SPɾ1SP.BYw J1IPOF4&ʢୈੈʣw J1IPOFɾ1MVTɾ1SPɾ1SP.BY
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$ΞϯςφΛࡌ͍ͯ͠ΔJ1IPOF$PSF/'$ͷػೳΛ͑ΔJ1IPOF38
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.$PSF/'$ͷػೳΛ͑ΔJ1IPOFw J1IPOFɾ1MVTw J1IPOFTɾT1MVTw J1IPOFɾ1MVTw J1IPOFɾ1MVTw J1IPOF9w J1IPOF9㸑ɾ9Tɾ9T.BY39w J1IPOFɾ1SPɾ1SP.BYw J1IPOF4&ʢୈੈʣw J1IPOFNJOJɾɾ1SPɾ1SP.BYw J1IPOFNJOJɾɾ1SPɾ1SP.BYw J1IPOF4&ʢୈੈʣw J1IPOFɾ1MVTɾ1SPɾ1SP.BY
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 40σόΠεػೳͷཁ݅αϙʔτ"QQMF%FWFMPQFSIUUQTEFWFMPQFSBQQMFDPNKQTVQQPSUSFRVJSFEEFWJDFDBQBCJMJUJFT
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$Λ༻͍ͨ"QQMFϓϥοτϑΥʔϜͷ"QQͷ։ൃJ1IPOFҎ߱ରԠͷJ04"QQ։ൃ41
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.λάσόΠεʢ/'$λάʣ42/'$λά
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.$PSF/'$ͰͰ͖Δ͜ͱɾͰ͖ͳ͍͜ͱ43
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$ͷʮͭͷϞʔυʯ44ΧʔυΤϛϡϨʔγϣϯϦʔμʔɾϥΠλʔϐΞɾπʔɾϐΞ ϫΠϠϨεॆి/'$5FDIOPMPHZ/'$'PSVNIUUQTOGDGPSVNPSHMFBSOOGDUFDIOPMPHZΛݩʹ࡞
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved./'$ͷʮͭͷϞʔυʯͱϑϨʔϜϫʔΫ45ΧʔυΤϛϡϨʔγϣϯϦʔμʔɾϥΠλʔϐΞɾπʔɾϐΞ ϫΠϠϨεॆి$PSF/'$1SPYJNJUZ3FBEFS1BTT,JU 8BMMFU ͳ͠ ͳ͠
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 46$PSF/'$c"QQMF%FWFMPQFS%PDVNFOUBUJPOIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODPSFOGD
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.$PSF/'$ͰͰ͖Δ͜ͱw /'$λά͔Β/%&'ͷσʔλΛಡΈऔΔʢJ04ʣw "QQ͕όοΫάϥϯυঢ়ଶͰ/'$λά͔Β/%&'ͷσʔλΛಡΈऔΔʢJ04ɺͨͩ͠J1IPOFɾ1MVTɾɾ1MVTɾ9ඇରԠʣw /'$λά/%&'ͷσʔλΛॻ͖ࠐΉʢJ04ʣw /'$λάʹಠࣗϑΥʔϚοτͷσʔλΛಡΈॻ͖͢ΔʢJ04ʣw 1"$&ʢ伴ڞ༗ར༻ΞΫηε੍ޚʣΛαϙʔτ͍ͯ͠Δλάͷݕग़ʢJ04ʣ47
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.$PSF/'$ͰͰ͖ͳ͍͜ͱ48ΧʔυΤϛϡϨʔγϣϯϦʔμʔɾϥΠλʔ$PSF/'$1SPYJNJUZ3FBEFS1BTT,JU 8BMMFUw Χʔυͷʮ;ΓʯΛ͢Δʢ1BTT,JUʣw 8BMMFUɾ"QQMF1BZͷಛݖw ʢΧʔυΛ͔ͯ͟͠ʣࢧ͍Λड͚͚Δʢ1SPYJNJUZ3FBEFSʣw l5BQUP1BZzͰ͔͑͠ͳ͍
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ࣄલʹܾΊ͓ͯ͘͜ͱࣄલʹௐ͓ࠪͯ͘͜͠ͱ49
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.औΓѻ͏/'$λά50/'$λάͷதͷσʔλܗࣜΛࣗͰܾΊΔ/'$λάͷதͷσʔλܗࣜطʹܾΊΒΕ͍ͯΔ
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ࣄલʹܾΊ͓ͯ͘͜ͱ/'$λάͷதͷσʔλܗࣜΛࣗͰܾΊΒΕΔ߹w σʔλܗࣜʮ/%&'ʯ͕͓͢͢Ίw /%&'ʢ/'$%BUB&YDIBOHF'PSNBUʣw /'$'PSVN͕ࡦఆw J04ɾ$PSF/'$Ͱ/%&'ಛผ۰w "QQ͕ϑΥΞάϥϯυঢ়ଶ͡Όͳͯ͘ಡΈऔΕΔ51
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ࣄલʹܾΊ͓ͯ͘͜ͱ/'$λάͷதͷσʔλܗࣜΛࣗͰܾΊΒΕΔ߹w /'$λάͷʮछྨʯʢҰ෦ʣw 5ZQF5BHʢ*40*&$ɹ.*'"3&6MUSBMJHIUʣw 5ZQF5BHʢ*40*&$ɹ+*49ɹ'FMJ$Bʣw 5ZQF5BHʢ*40*&$ɹ%&4'JSFʣw 5ZQF5BHʢ*40*&$ʣ52/'$5FDIOPMPHZIUUQTOGDGPSVNPSHMFBSOOGDUFDIOPMPHZ
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ࣄલʹௐ͓ࠪͯ͘͜͠ͱ/'$λάͷதͷσʔλܗ͕ࣜطʹܾ·͍ͬͯΔ߹w όΠφϦܗࣜʢData[Data]ʣͰใΛΓऔΓ͢ΔʢύʔεࣗͰߦ͏ʣw ༻͍Δ͜ͱʹͳΔʮ௨৴ٕज़ʢϓϩτίϧʣʯԿ͔ʁ53
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ࣄલʹௐ͓ࠪͯ͘͜͠ͱ/'$λάͷதͷσʔλܗ͕ࣜطʹܾ·͍ͬͯΔ߹w ௨৴ٕज़ʢϓϩτίϧʣw /'$"ʢ*40*&$ʣw /'$#ʢ*40*&$ʣw /'$'ʢ*40*&$ʣw /'$7ʢ*40*&$ʣ54
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 55"QQMFr4FQUFNCFS&WFOU:PV5VCFIUUQTXXXZPVUVCFDPNXBUDI W/4UYV@,[M
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 56"QQMFr4FQUFNCFS&WFOU:PV5VCFIUUQTXXXZPVUVCFDPNXBUDI W/4UYV@,[M
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 57"QQMFr4FQUFNCFS&WFOU:PV5VCFIUUQTXXXZPVUVCFDPNXBUDI W/4UYV@,[M
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 58"QQMFr4FQUFNCFS&WFOU:PV5VCFIUUQTXXXZPVUVCFDPNXBUDI W/4UYV@,[M
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 59݄ࡱӨ
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 60݄ࡱӨ૯লࢦఆ.*$,4
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 614VJDB1"4.0Λ"QQMFΥϨοτʹՃ͢Δ"QQMFαϙʔτ ຊIUUQTTVQQPSUBQQMFDPNKBKQ)5
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 624VJDB1"4.0Λ"QQMFΥϨοτʹՃ͢Δ"QQMFαϙʔτ ຊIUUQTTVQQPSUBQQMFDPNKBKQ)5J1IPOFͷ/'$ͷ্ଆʂഎ໘ͷ"QQMFϩΰͷ෦Ͱ͋Γ·ͤΜ
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.9DPEFϓϩδΣΫτͷઃఆ63
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.$BQBCJMJUZΛՃ9DPEFϓϩδΣΫτͷઃఆ64
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.&OUJUMFNFOUTΛՃ9DPEFϓϩδΣΫτͷઃఆ65
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.*OGPQMJTUʹΛՃ9DPEFϓϩδΣΫτͷઃఆ66
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ίʔσΟϯά67
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.࣮ͷྲྀΕw εΩϟϯͷͨΊͷηογϣϯΛ࡞Δw ηογϣϯΛ։࢝͢ΔʢJ04ଆͰΞΫγϣϯγʔτ͕දࣔ͞ΕΔʣw λάͷݕΛσϦήʔτͰड͚औΔw ಡΈॻ͖Λߦ͏w ηογϣϯΛऴྃ͢Δ68
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.εΩϟϯͷͨΊͷηογϣϯΛ࡞Δw NFCNDEFReaderSessionw NFCTagReaderSessionw NFCVASReaderSession69
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.εΩϟϯͷͨΊͷηογϣϯΛ࡞Δw NFCNDEFReaderSessionw NFCTagReaderSessionw NFCVASReaderSession70
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ηογϣϯΛ࡞Δ/%&'ܗࣜͷ߹71import CoreNFCclass MyNDEFReaderWriter {var session: NFCNDEFReaderSession?func beginScanning() {guard NFCNDEFReaderSession.readingAvailable else { return }}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ηογϣϯΛ࡞Δ/%&'ܗࣜͷ߹72import CoreNFCclass MyNDEFReaderWriter {var session: NFCNDEFReaderSession?func beginScanning() {guard NFCNDEFReaderSession.readingAvailable else { return }session = NFCNDEFReaderSession(delegate: self,queue: nil,invalidateAfterFirstRead: false)}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ηογϣϯΛ࡞Δ/%&'ܗࣜͷ߹73import CoreNFCclass MyNDEFReaderWriter {var session: NFCNDEFReaderSession?func beginScanning() {guard NFCNDEFReaderSession.readingAvailable else { return }session = NFCNDEFReaderSession(delegate: self,queue: nil,invalidateAfterFirstRead: false)session?.alertMessage = "Place the tag on a flat surface(avoid metallic surfaces) and rest you iPhone on the tag.”}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ηογϣϯΛ࡞Δ/%&'ܗࣜͷ߹74import CoreNFCclass MyNDEFReaderWriter {var session: NFCNDEFReaderSession?func beginScanning() {guard NFCNDEFReaderSession.readingAvailable else { return }session = NFCNDEFReaderSession(delegate: self,queue: nil,invalidateAfterFirstRead: false)session?.alertMessage = "Place the tag on a flat surface(avoid metallic surfaces) and rest you iPhone on the tag."session?.begin()}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͷ߹75extension MyNDEFReaderWriter: NFCNDEFReaderSessionDelegate {func readerSession(_ session: NFCNDEFReaderSession,didDetectNDEFs messages: [NFCNDEFMessage]) {// ...}func readerSession(_ session: NFCNDEFReaderSession,didDetect tags: [NFCNDEFTag]) {// ...}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͷ߹76extension MyNDEFReaderWriter: NFCNDEFReaderSessionDelegate {func readerSession(_ session: NFCNDEFReaderSession,didDetectNDEFs messages: [NFCNDEFMessage]) {let message = messages.first!// print(message.records)}func readerSession(_ session: NFCNDEFReaderSession,didDetect tags: [NFCNDEFTag]) {// ...}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͷ߹77extension MyNDEFReaderWriter: NFCNDEFReaderSessionDelegate {func readerSession(_ session: NFCNDEFReaderSession,didDetectNDEFs messages: [NFCNDEFMessage]) {let message = messages.first!// print(message.records)}func readerSession(_ session: NFCNDEFReaderSession,didDetect tags: [NFCNDEFTag]) {// ...}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͷ߹78extension MyNDEFReaderWriter: NFCNDEFReaderSessionDelegate {func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {Task {let tag = tags.first!try await session.connect(to: tag)// ಡΈऔΓlet message = try await tag.readNDEF()// print(message.records)// ॻ͖ࠐΈlet ndefMessage: NFCNDEFMessage = // ..try await tag.writeNDEF(ndefMessage)// ऴΘͬͨΒsession.alertMessage = "Done!"session.invalidate()// ࣦഊͨ͠Β// session.invalidate(errorMessage: "Error!")}}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͷ߹79extension MyNDEFReaderWriter: NFCNDEFReaderSessionDelegate {func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {Task {let tag = tags.first!try await session.connect(to: tag)// ಡΈऔΓlet message = try await tag.readNDEF()// print(message.records)// ॻ͖ࠐΈlet ndefMessage: NFCNDEFMessage = // ..try await tag.writeNDEF(ndefMessage)// ऴΘͬͨΒsession.alertMessage = "Done!"session.invalidate()// ࣦഊͨ͠Β// session.invalidate(errorMessage: "Error!")}}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͷ߹80extension MyNDEFReaderWriter: NFCNDEFReaderSessionDelegate {func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {Task {let tag = tags.first!try await session.connect(to: tag)// ಡΈऔΓlet message = try await tag.readNDEF()// print(message.records)// ॻ͖ࠐΈlet ndefMessage: NFCNDEFMessage = // ..try await tag.writeNDEF(ndefMessage)// ऴΘͬͨΒsession.alertMessage = "Done!"session.invalidate()// ࣦഊͨ͠Β// session.invalidate(errorMessage: "Error!")}}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.εΩϟϯͷͨΊͷηογϣϯΛ࡞Δw NFCNDEFReaderSessionw NFCTagReaderSessionw NFCVASReaderSession81
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ηογϣϯΛ࡞Δ/%&'ܗࣜͰͳ͍σʔλͷ߹82import CoreNFCclass MyTagReaderWriter: NSObject {var session: NFCTagReaderSession?func beginScanning() {guard NFCTagReaderSession.readingAvailable else { return }let pollingOption: NFCTagReaderSession.PollingOption = [.iso14443, // Type 2 Tag, Type 4 Tag (ISO/IEC 14443) (MIFARE) …etc..iso18092, // Type 3 Tag (ISO/IEC 18092, JIS X 6319-4) (FeliCa).iso15693, // Type 5 Tag (ISO/IEC 15693)]session = NFCTagReaderSession(pollingOption: pollingOption,delegate: self, queue: nil)session?.alertMessage = "Place the tag on a flat surface(avoid metallic surfaces) and rest you iPhone on the tag."session?.begin()}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ηογϣϯΛ࡞Δ/%&'ܗࣜͰͳ͍σʔλͷ߹83import CoreNFCclass MyTagReaderWriter: NSObject {var session: NFCTagReaderSession?func beginScanning() {guard NFCTagReaderSession.readingAvailable else { return }let pollingOption: NFCTagReaderSession.PollingOption = [.iso14443, // Type 2 Tag, Type 4 Tag (ISO/IEC 14443) (MIFARE) ...etc..iso18092, // Type 3 Tag (ISO/IEC 18092, JIS X 6319-4) (FeliCa).iso15693, // Type 5 Tag (ISO/IEC 15693)]session = NFCTagReaderSession(pollingOption: pollingOption,delegate: self, queue: nil)session?.alertMessage = "Place the tag on a flat surface(avoid metallic surfaces) and rest you iPhone on the tag."session?.begin()}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ηογϣϯΛ࡞Δ/%&'ܗࣜͰͳ͍σʔλͷ߹84import CoreNFCclass MyTagReaderWriter: NSObject {var session: NFCTagReaderSession?func beginScanning() {guard NFCTagReaderSession.readingAvailable else { return }let pollingOption: NFCTagReaderSession.PollingOption = [.iso14443, // Type 2 Tag, Type 4 Tag (ISO/IEC 14443) (MIFARE) ...etc..iso18092, // Type 3 Tag (ISO/IEC 18092, JIS X 6319-4) (FeliCa).iso15693, // Type 5 Tag (ISO/IEC 15693)]session = NFCTagReaderSession(pollingOption: pollingOption,delegate: self, queue: nil)session?.alertMessage = "Place the tag on a flat surface(avoid metallic surfaces) and rest you iPhone on the tag."session?.begin()}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ηογϣϯΛ࡞Δ/%&'ܗࣜͰͳ͍σʔλͷ߹85import CoreNFCclass MyTagReaderWriter: NSObject {var session: NFCTagReaderSession?func beginScanning() {guard NFCTagReaderSession.readingAvailable else { return }let pollingOption: NFCTagReaderSession.PollingOption = [.iso14443, // Type 2 Tag, Type 4 Tag (ISO/IEC 14443) (MIFARE) ...etc..iso18092, // Type 3 Tag (ISO/IEC 18092, JIS X 6319-4) (FeliCa).iso15693, // Type 5 Tag (ISO/IEC 15693)]session = NFCTagReaderSession(pollingOption: pollingOption,delegate: self, queue: nil)session?.alertMessage = "Place the tag on a flat surface(avoid metallic surfaces) and rest you iPhone on the tag."session?.begin()}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹86extension MyTagReaderWriter: NFCTagReaderSessionDelegate {func tagReaderSession(_ session: NFCTagReaderSession,didDetect tags: [NFCTag]) {Task {let tag = tags.first!// ...}}// ...}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹87extension MyTagReaderWriter: NFCTagReaderSessionDelegate {func tagReaderSession(_ session: NFCTagReaderSession,didDetect tags: [NFCTag]) {Task {let tag = tags.first!try await session.connect(to: tag)// ...}}// ...}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹88extension MyTagReaderWriter: NFCTagReaderSessionDelegate {func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {Task {let tag = tags.first!try await session.connect(to: tag)switch tag {case .feliCa(let feliCaTag): // Type 3 Tag (FeliCa)try await tagReader(session: session, didConnect: feliCaTag)case .iso7816(let iso7816Tag): // ISO/IEC 7816 ʹରԠͨ͠ Type 2 TagɺType 4 Tag ͳͲtry await tagReader(session: session, didConnect: iso7816Tag)case .iso15693(let iso15693Tag): // Type 5 Tagtry await tagReader(session: session, didConnect: iso15693Tag)case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)try await tagReader(session: session, didConnect: miFareTag)}}}// ...}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹89extension MyTagReaderWriter: NFCTagReaderSessionDelegate {func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {Task {let tag = tags.first!try await session.connect(to: tag)switch tag {case .feliCa(let feliCaTag): // Type 3 Tag (FeliCa)try await tagReader(session: session, didConnect: feliCaTag)case .iso7816(let iso7816Tag): // ISO/IEC 7816 ʹରԠͨ͠ Type 2 TagɺType 4 Tag ͳͲtry await tagReader(session: session, didConnect: iso7816Tag)case .iso15693(let iso15693Tag): // Type 5 Tagtry await tagReader(session: session, didConnect: iso15693Tag)case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)try await tagReader(session: session, didConnect: miFareTag)}}}// ...}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.'FMJ$Bw ຊw ަ௨ܥ*$Χʔυw ͓ళͰ͑ΔిࢠϚωʔw ߳ߓɾΠϯυωγΞͳͲΞδΞݍͰΘΕ͍ͯΔ90ιχʔגࣜձࣾc'FMJ$Bc๏ਓͷ͓٬༷cಋೖࣄྫIUUQTXXXTPOZDPKQ1SPEVDUTGFMJDBCVTJOFTTDBTFTUVEZ
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.'FMJ$Bw ෳͷʮγεςϜʯΛ࣋ͭ͜ͱ͕Ͱ͖Δw ຕͷཧλάͷதʹෳͷػೳΛ࣋ͯΔw γεςϜΛ۠ผ͢ΔͨΊͷʮγεςϜίʔυʯ91
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.'FMJ$Bͷதͷσʔλߏͬ͘͟Γͱͨ͠Πϝʔδ92'FMJ$BΤϦΞͳͲͷ֓೦Λলུw γεςϜίʔυαʔϏείʔυϒϩοΫw γεςϜίʔυΛબʢ1PMMJOHʣ͠ɺαʔϏεΛ༻͍ͯϒϩοΫʹΞΫηεw ϒϩοΫ͋ͨΓόΠτw Y'$ʢγεςϜίʔυʣw YʢαʔϏείʔυʣw YʢϒϩοΫʣw YʢϒϩοΫʣw YʢαʔϏείʔυʣw YʢϒϩοΫʣw YʢϒϩοΫʣw ộ
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.'FMJ$BγεςϜίʔυΛ*OGPQMJTUʹྻڍw J04"QQͰ͏'FMJ$BγεςϜίʔυΛ*OGPQMJTUʹྻڍ͓ͯ͘͠w ϫΠϧυΧʔυʢͯ͢ͷ'FMJ$BγεςϜίʔυΛ͏ʣෆՄ93
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.'FMJ$BγεςϜίʔυΛ*OGPQMJTUʹྻڍ94
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹95extension MyTagReaderWriter: NFCTagReaderSessionDelegate {func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {Task {let tag = tags.first!try await session.connect(to: tag)switch tag {case .feliCa(let feliCaTag): // Type 3 Tag (FeliCa)try await tagReader(session: session, didConnect: feliCaTag)case .iso7816(let iso7816Tag): // ISO/IEC 7816 ʹରԠͨ͠ Type 2 TagɺType 4 Tag ͳͲtry await tagReader(session: session, didConnect: iso7816Tag)case .iso15693(let iso15693Tag): // Type 5 Tagtry await tagReader(session: session, didConnect: iso15693Tag)case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)try await tagReader(session: session, didConnect: miFareTag)}}}// ...}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹95extension MyTagReaderWriter: NFCTagReaderSessionDelegate {func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {Task {let tag = tags.first!try await session.connect(to: tag)switch tag {case .feliCa(let feliCaTag): // Type 3 Tag (FeliCa)try await tagReader(session: session, didConnect: feliCaTag)case .iso7816(let iso7816Tag): // ISO/IEC 7816 ʹରԠͨ͠ Type 2 TagɺType 4 Tag ͳͲtry await tagReader(session: session, didConnect: iso7816Tag)case .iso15693(let iso15693Tag): // Type 5 Tagtry await tagReader(session: session, didConnect: iso15693Tag)case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)try await tagReader(session: session, didConnect: miFareTag)}}}// ...}*OGPQMJTUʹॻ͍ͨγεςϜίʔυY""""Y####'FMJ$Bλά͕͍࣋ͬͯΔγεςϜίʔυY%%%%Y&&&&
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹95extension MyTagReaderWriter: NFCTagReaderSessionDelegate {func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {Task {let tag = tags.first!try await session.connect(to: tag)switch tag {case .feliCa(let feliCaTag): // Type 3 Tag (FeliCa)try await tagReader(session: session, didConnect: feliCaTag)case .iso7816(let iso7816Tag): // ISO/IEC 7816 ʹରԠͨ͠ Type 2 TagɺType 4 Tag ͳͲtry await tagReader(session: session, didConnect: iso7816Tag)case .iso15693(let iso15693Tag): // Type 5 Tagtry await tagReader(session: session, didConnect: iso15693Tag)case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)try await tagReader(session: session, didConnect: miFareTag)}}}// ...}*OGPQMJTUʹॻ͍ͨγεςϜίʔυY""""Y####'FMJ$Bλά͕͍࣋ͬͯΔγεςϜίʔυY%%%%Y&&&&$PSF/'$ͷͲͷσϦήʔτϝιουݺΕͳ͍
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹ʢ'FMJ$Bʣ96extension MyTagReaderWriter {func tagReader(session: NFCTagReaderSession,didConnect feliCaTag: NFCFeliCaTag) async throws {let mode = try await feliCaTag.requestResponse()// ...session.alertMessage = "Done!"session.invalidate()}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹97extension MyTagReaderWriter: NFCTagReaderSessionDelegate {func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {Task {let tag = tags.first!try await session.connect(to: tag)switch tag {case .feliCa(let feliCaTag): // Type 3 Tag (FeliCa)try await tagReader(session: session, didConnect: feliCaTag)case .iso7816(let iso7816Tag): // ISO/IEC 7816 ʹରԠͨ͠ Type 2 TagɺType 4 Tag ͳͲtry await tagReader(session: session, didConnect: iso7816Tag)case .iso15693(let iso15693Tag): // Type 5 Tagtry await tagReader(session: session, didConnect: iso15693Tag)case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)try await tagReader(session: session, didConnect: miFareTag)}}}// ...}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.*40*&$w ΫϨδοτΧʔυw ύεϙʔτɾূ໌ূ98
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.*40*&$w "QQMJDBUJPO1SPUPDPM%BUB6OJUʢ"1%6ʣw λά্ͷΞϓϦέʔγϣϯͷࣝผࢠɹ"*%w J04"QQͰ͏"*%Λ*OGPQMJTUʹྻڍ͓ͯ͘͠99
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved."*%Λ*OGPQMJTUʹྻڍ100ܾࡁؔ࿈ͷ"*%ࢦఆͰ͖ͳ͍
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹101extension MyTagReaderWriter: NFCTagReaderSessionDelegate {func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {Task {let tag = tags.first!try await session.connect(to: tag)switch tag {case .feliCa(let feliCaTag): // Type 3 Tag (FeliCa)try await tagReader(session: session, didConnect: feliCaTag)case .iso7816(let iso7816Tag): // ISO/IEC 7816 ʹରԠͨ͠ Type 2 TagɺType 4 Tag ͳͲtry await tagReader(session: session, didConnect: iso7816Tag)case .iso15693(let iso15693Tag): // Type 5 Tagtry await tagReader(session: session, didConnect: iso15693Tag)case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)try await tagReader(session: session, didConnect: miFareTag)}}}// ...}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹101extension MyTagReaderWriter: NFCTagReaderSessionDelegate {func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {Task {let tag = tags.first!try await session.connect(to: tag)switch tag {case .feliCa(let feliCaTag): // Type 3 Tag (FeliCa)try await tagReader(session: session, didConnect: feliCaTag)case .iso7816(let iso7816Tag): // ISO/IEC 7816 ʹରԠͨ͠ Type 2 TagɺType 4 Tag ͳͲtry await tagReader(session: session, didConnect: iso7816Tag)case .iso15693(let iso15693Tag): // Type 5 Tagtry await tagReader(session: session, didConnect: iso15693Tag)case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)try await tagReader(session: session, didConnect: miFareTag)}}}// ...}*OGPQMJTUʹॻ͍ͨ"*%%/'$λά͕͍࣋ͬͯΔ"*%%
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹101extension MyTagReaderWriter: NFCTagReaderSessionDelegate {func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {Task {let tag = tags.first!try await session.connect(to: tag)switch tag {case .feliCa(let feliCaTag): // Type 3 Tag (FeliCa)try await tagReader(session: session, didConnect: feliCaTag)case .iso7816(let iso7816Tag): // ISO/IEC 7816 ʹରԠͨ͠ Type 2 TagɺType 4 Tag ͳͲtry await tagReader(session: session, didConnect: iso7816Tag)case .iso15693(let iso15693Tag): // Type 5 Tagtry await tagReader(session: session, didConnect: iso15693Tag)case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)try await tagReader(session: session, didConnect: miFareTag)}}}// ...}*OGPQMJTUʹॻ͍ͨ"*%%/'$λά͕͍࣋ͬͯΔ"*%%$PSF/'$ͷͲͷσϦήʔτϝιουݺΕͳ͍
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹ʢ*40ʣ102extension MyTagReaderWriter {func tagReader(session: NFCTagReaderSession,didConnect iso7816Tag: NFCISO7816Tag) async throws {let apdu = NFCISO7816APDU(instructionClass: 0x00, instructionCode: 0xB0,p1Parameter: 0x00, p2Parameter: 0x00,data: Data(), expectedResponseLength: 16)let (response, sw1, sw2) = try await iso7816Tag.sendCommand(apdu: apdu)// ...session.alertMessage = “Done!"session.invalidate()}}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουͰड͚औΔ/%&'ܗࣜͰͳ͍σʔλͷ߹103extension MyTagReaderWriter: NFCTagReaderSessionDelegate {func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {Task {let tag = tags.first!try await session.connect(to: tag)switch tag {case .feliCa(let feliCaTag): // Type 3 Tag (FeliCa)try await tagReader(session: session, didConnect: feliCaTag)case .iso7816(let iso7816Tag): // ISO/IEC 7816 ʹରԠͨ͠ Type 2 TagɺType 4 Tag ͳͲtry await tagReader(session: session, didConnect: iso7816Tag)case .iso15693(let iso15693Tag): // Type 5 Tagtry await tagReader(session: session, didConnect: iso15693Tag)case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)try await tagReader(session: session, didConnect: miFareTag)}}}// ...}
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.$PSF/'$Λͬͨ։ൃͷϙΠϯτw /'$λάʹΑͬͯಡΈऔΓࣦഊ͕ଓ͘ͱϩοΫ͞Εͯ͠·͏ͷ͕͋Δw ϩοΫ݊໘ͷݟ͕ͨมΘΔ͜ͱͳ͍ʢҹͳͷͰʣw ͨͩͦΕΛ/'$Λհͨ͠ػցͰಡΈऔΔ͜ͱ͕Ͱ͖ͳ͘ͳΔw ࣮ߦ৻ॏʹ104
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.$PSF/'$Λͬͨ։ൃͷϙΠϯτw $PSF/'$ͷ௨৴ηογϣϯ࠷େඵͷ੍࣌ؒݶ͕͋Δ105
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.$PSF/'$Λͬͨ։ൃͷϙΠϯτw #SFBLQPJOUΛࠩͯ͠σόοά͓͢͢Ί͠ͳ͍w Ұ࣌ఀࢭத͜ͷʮ࠷େඵͷ੍࣌ؒݶʯଘࡏ͍ͯ͠Δw QSJOUʹΑΔσόοά͕͓͢͢Ί106
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.$PSF/'$ͷ͕ͭ͜͜Β͍w J04ʹ͓͚ΔαʔυύʔςΟ"QQ͚ͷ/'$ͷ༷ɺ"OESPJEͱൺֱ͢Δͱେ੍͖͘ݶ͞Ε͍ͯΔw 'FMJ$BγεςϜίʔυ"*%Λ͋Β͔͡Ί੩తʹࢦఆ͓ͯ͘͠ඞཁw λάΛ͔͔ͯ͟͠ΒσϦήʔτϝιουʹͦͷใ͕ͬͯ͘Δ·Ͱʹ͕͔͔࣌ؒΔύλʔϯ͕͋Δ107
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.σϦήʔτϝιουʹͳ͔ͳ͔ใ͕͜ͳ͍'FMJ$Bͷྫw Y'&ͱ͍͏γεςϜίʔυͷΈΛ࣋ͬͨλάw Y'&Λʮ*UFNʯͷ࠷ޙʹهड़w ͦΕΑΓલʹʮ*UFNʯΛ૿͍ͯ͘͠108
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 109'FMJ$B͕͍͠ϑϧεΩϟϯෆՄೳޙฤʲJ04$PSF/'$ʳ2JJUBIUUQTRJJUBDPNUSFBTUSBJOJUFNTGCD
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.$PSF/'$ͷ͕ͭ͜͜Β͍w /'$ͷڍಈ͕ෆ҆ఆͳJ1IPOFͷػछ͕͋Δͱ͍͏w J1IPOFγϦʔζʜʁ110
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.$PSF/'$ͷ͕ͭ͜͜Β͍w ґવͱͯ͠ใ͕গͳ͍w ʮࣗͷ࣮ʯʮ$PSF/'$ʯͷͲ͕ͬͪѱ͍ͷ͔ෆ໌ͳͱ͖͕͋Δw ݕূ༻ʹ/'$ʢ'FMJ$BʣΛੵΜͩ"OESPJEΛ͓࣋ͬͯ͘ͱָw ͘͠8JOEPXT1$/'$ϦʔμʔϥΠλʔw /'$ͷίϚϯυ༷ࣗମͲͷϓϥοτϑΥʔϜͰڞ௨w "OESPJEͷίʔυʢ+BWBɾ,PUMJOʣൺֱతࢀߟʹͳΔ111
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ιχʔגࣜձࣾc'FMJ$Bc/'$ʹ͍ͭͯc/'$ͱ'FMJ$BͷؔIUUQTXXXTPOZDPKQ1SPEVDUTGFMJDB/'$SFMBUJPOIUNM҉߸ԽΛඞཁͱ͠ͳ͍ΦʔϓϯίϚϯυΛ༻͍ͨΞϓϦέʔγϣϯͷ߹ʹɺެ։͞Ε͍ͯΔن͚֨ͩͰ։ൃ͢Δ͜ͱ͕Ͱ͖·͢ɻ(PPHMFࣾͷ"OESPJEΞοϓϧࣾͷJ04ͳͲεϚʔτϑΥϯ͚04͕/'$ͷػೳΛαϙʔτ͓ͯ͠ΓɺҰൠͷํ͕։ൃ͞ΕͨిࢠϚωʔͷϏϡʔϫʔͳͲؚΊɺεϚʔτϑΥϯ͚ʹ͢Ͱʹ͍͔ͭ͘ͷ/'$ΞϓϦέʔγϣϯ͕ެ։͞Ε͍ͯ·͢ɻ112
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.͓·͚/'$ͱϦΞϧͷੜ׆Λ݁ͼ͚ͭΔຐ๏ͷΑ͏ͳͷ113
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ͦͷଞࢀߟࢿྉw $PSF/'$c"QQMF%FWFMPQFS%PDVNFOUBUJPOIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODPSFOGDw 1BTT,JU "QQMF1BZBOE8BMMFUc"QQMF%FWFMPQFS%PDVNFOUBUJPOIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOQBTTLJUw 1SPYJNJUZ3FBEFSc"QQMF%FWFMPQFS%PDVNFOUBUJPOIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOQSPYJNJUZSFBEFSw *$"0%PD.BDIJOF3FBEBCMF5SBWFM%PDVNFOUT &JHIUI&EJUJPO ɹ*OUFSOBUJPOBM$JWJM"WJBUJPO0SHBOJ[BUJPOw ӡస໔ڐূٴͼӡస໔ڐূ࡞γεςϜ༷ॻʢ༷ॻόʔδϣϯ൪߸ɿʣɹܯிަ௨ہӡస໔ڐ՝w ૯লిར༻ϗʔϜϖʔδʛిڥʛߴपར༻ઃඋͷ֓ཁIUUQTXXXUFMFTPVNVHPKQKTZTPUIFSTIJHIGSFw ιχʔגࣜձࣾ'FMJ$BΧʔυϢʔβʔζϚχϡΞϧൈਮ൛7FSTJPO114
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.ͦͷଞ໔ࣄ߲w ຊτʔΫͷ༰ɾεϥΠυʹهࡌ͞Ε͍ͯΔࣄ߲ɺҰൠʹެ։͞Ε͍ͯΔͷͱɺͦΕΒΛ༻͍ͯ։ൃΛߦͬͨൃදऀͷݟʹج͍ͮͨͷͰ͢ɻw ຊτʔΫͷ༰ɾεϥΠυʹهࡌ͞Ε͍ͯΔࣄ߲ɺ؆ུԽͷͨΊʹҰ෦ٕज़తʹਖ਼֬Ͱͳ͍දݱΛؚΜͰ͍Δ߹͕͋Γ·͢ɻw ຊτʔΫͷ༰ɾεϥΠυʹهࡌ͞Ε͍ͯΔࣄ߲ɺকདྷʹΘͨͬͯ༰Λอূ͢ΔͷͰ͋Γ·ͤΜɻw ຊτʔΫͷ༰ɾεϥΠυʹهࡌ͞Ε͍ͯΔձ໊ࣾɺ໊Ұൠʹ֤ࣾͷඪ·ͨొඪͰ͢ɻw ຊτʔΫͷ༰ɾεϥΠυʹهࡌ͞Ε͍ͯΔࣄ߲ɺຊτʔΫதʹڍ͛ΒΕͨձࣾɾஂମ͕ޙԉɾࢧԉ͍ͯ͠Δͷແ͘ɺൃදऀؚΊͦΕΒͱҰ͕ؔ͋Γ·ͤΜɻw ຊτʔΫͷ༰ɾεϥΠυΛࢀর͢Δ͜ͱʹΑͬͯੜͨ͡ଛʹ͍ͭͯɺൃදऀҰͷΛෛ͍·ͤΜɻ115
Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.)BQQZUBHSFBEJOHɹɹɹɹɹɹɹɹɹɹɹɹɹIUUQTUSFUKQɹ⏩ৄղ$PSF/'$116/'$Λ༻͍ͨJ04"QQ։ൃͷͯͼ͖iOSDC Japan 2022Day 1#iosdc #b