$30 off During Our Annual Pro Sale. View Details »

詳解 Core NFC - NFC を用いた iOS App 開発のてびき / Demystify Core NFC - A guide to iOS App Dev using NFC

詳解 Core NFC - NFC を用いた iOS App 開発のてびき / Demystify Core NFC - A guide to iOS App Dev using NFC

詳解 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

treastrain / Tanaka Ryoga

September 11, 2022
Tweet

More Decks by treastrain / Tanaka Ryoga

Other Decks in Technology

Transcript

  1. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    USFBTUSBJO5BOBLB3ZPHB
    ৄղ$PSF/'$
    1
    /'$Λ༻͍ͨJ04"QQ։ൃͷͯͼ͖
    iOSDC Japan 2022
    Day 1
    #iosdc #b

    View Slide

  2. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    "CPVUNF
    USFBTUSBJO5BOBLB3ZPHB
    2
    4XJGU J04 XBUDI04 $PSF/'$
    044
    ɹɹJU`TNZNPUIFSUPOHVF
    ɹɹٱ͠ͿΓʹ+BWB4DSJQUʢ("4ʣΛॻ͍ͨΒTXJUDIจͷ
    ɹɹ֤DBTFઅʹCSFBLΛೖΕ๨Ε͍ͯ͢͜͝ͱʹͳͬͨ!
    ɹɹɹɹɹɹɹɹɹɹ!USFBTUSBJOɹɹIUUQTUSFUKQ


    %F/"$P -UE
    ɹɹJ04"QQ%FWFMPQFSʢ"QSJM$VSSFOUʣ

    View Slide

  3. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$
    3

    View Slide

  4. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 4
    /'$8JLJQFEJBIUUQTKBXJLJQFEJBPSHXJLJ/'$ɹ$$#:4"

    View Slide

  5. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 5
    /'$8JLJQFEJBIUUQTKBXJLJQFEJBPSHXJLJ/'$ɹ$$#:4"

    View Slide

  6. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 6
    /'$8JLJQFEJBIUUQTKBXJLJQFEJBPSHXJLJ/'$ɹ$$#:4"

    View Slide

  7. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /FBS'JFME$PNNVOJDBUJPO
    ۙڑ཭ແઢ௨৴
    7

    View Slide

  8. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 8
    "QQMFr88%$,FZOPUF:PV5VCFIUUQTXXXZPVUVCFDPNXBUDI WOK9H@//J$"

    View Slide

  9. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 9
    ೔ຊͰJ1IPOF΍"QQMF8BUDIͷ4VJDB΍1"4.0Λ࢖͏"QQMFαϙʔτ ೔ຊ
    IUUQTTVQQPSUBQQMFDPNKBKQ)5

    View Slide

  10. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ೖؗূɹɹަ௨ܥ*$ΧʔυɹɹύʔΩϯάϝʔλʔɹɹॅຽجຊ୆ாΧʔυ
    ϞόΠϧ΢ΥϨοτɹɹσϏοτΧʔυɹɹػثͷϖΞϦϯάɹɹϨδܾࡁ୺຤
    ࣗಈंͷ伴ɹɹӡస໔ڐূɹɹϨϯλϧࣗసंɹɹΫϨδοτΧʔυɹɹ஫ࣹث
    ϋʔυ΢ΣΞηΩϡϦςΟτʔΫϯɹɹεϚʔτΧʔυɹɹ঎඼ɾࡏݿ؅ཧλά
    ϓϦϖΠυΧʔυɹɹిؾࣗಈंͷॆిεςʔγϣϯɹɹֶੜূɹɹࢦྠ
    ϗςϧͷϧʔϜΩʔɹɹεϚʔτϙελʔɹɹύεϙʔτɹɹλϒϨοτ
    εϚʔτ΢ΥονɹɹମԹܭɹɹࣾһূɹɹΠϠϗϯɹɹ"OESPJE#FBN
    εϚʔτϑΥϯɹɹࣗಈվࡳػɹɹݸਓ൪߸ʢϚΠφϯόʔʣΧʔυɹɹFUD
    10

    View Slide

  11. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$
    /FBS'JFME$PNNVOJDBUJPOʢۙڑ཭ແઢ௨৴ʣ
    w ʮϞϊͱϞϊΛ͚ۙͮͯ৘ใΛ΍ΓऔΓ͢ΔΞϨʯ
    w ඇ઀৮Ͱ৘ใΛ΍ΓऔΓͰ͖Δ
    11

    View Slide

  12. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 12
    /'$'PSVNIUUQTOGDGPSVNPSH

    View Slide

  13. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$ͷʮͭͷϞʔυʯ
    13
    Χʔυ
    ΤϛϡϨʔγϣϯ
    Ϧʔμʔɾ
    ϥΠλʔ
    ϐΞɾπʔɾϐΞ ϫΠϠϨεॆి
    /'$5FDIOPMPHZ/'$'PSVNIUUQTOGDGPSVNPSHMFBSOOGDUFDIOPMPHZΛݩʹ࡞੒

    View Slide

  14. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    Χʔυ
    ΤϛϡϨʔγϣϯ
    /'$ͷʮͭͷϞʔυʯ
    ΧʔυΤϛϡϨʔγϣϯϞʔυ
    14
    ηΩϡΞΤϨϝϯτํࣜΧʔυΤϛϡϨʔγϣϯ
    ϗετΧʔυΤϛϡϨʔγϣϯʢ)$&ʣ
    /'$5FDIOPMPHZ/'$'PSVNIUUQTOGDGPSVNPSHMFBSOOGDUFDIOPMPHZΛݩʹ࡞੒

    View Slide

  15. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$ٕज़֓ཁ
    w 3'*%ͷҰछ
    w ൖૹ೾ɹɹɹ୹೾)'ଳʢ.)[ʣ
    w ௨৴ڑ཭ɹɹ໿DNʢ·ͨ͸DNఔ౓ʣ
    w ௨৴଎౓ɹɹLCQTʙLCQTɹɹLCQT·ͨ͸LCQT
    w ిྗ఻ૹɹɹ࠷େ8ʢϫΠϠϨεॆిϞʔυʣ
    15
    /'$5FDIOPMPHZ/'$'PSVNIUUQTOGDGPSVNPSHMFBSOOGDUFDIOPMPHZΛݩʹ࡞੒

    View Slide

  16. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ෺ཧతڑ཭͕ൺֱత୹͍ͱ͖ʹ࢖͑Δ௨৴
    16
    /'$ #MVFUPPUI
    23ίʔυ
    όʔίʔυ
    *S%"
    ʢ੺֎ઢ௨৴ʣ
    FUD

    View Slide

  17. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    #MVFUPPUIWT/'$
    17
    w #MVFUPPUI
    w ௨৴଎౓͕଎͍
    w ௨৴Մೳͳ෺ཧతڑ཭͕௕͍
    w /'$
    w ࣄલͷϖΞϦϯά࡞ۀ͕ෆཁ
    w ௨৴࣌ͷফඅిྗ͕ང͔ʹগͳ͍
    w গ͠ԕ͚͟Δͱ઀ଓ͕੾ΕΔ

    View Slide

  18. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    23ίʔυɾόʔίʔυWT/'$
    18
    w 23ίʔυɾόʔίʔυ
    w ҹ࡮͢Δ͚ͩͰ࢖͑Δ
    w ΧϝϥͷͨΊͷௐ੔͕ඞཁ
    w ϐϯτɾ໌Δ͞ɾःṭ෺ͷআڈ
    w ҹ࡮෺ͷσβΠϯΛ્֐
    w /'$
    w ͚ۙͮΕ͹௨৴Ͱ͖Δ
    w ؒʹଟগͷ΋ͷ͕ࡏͬͯ΋Α͍
    w ৘ใͷมߋ͕Մೳ
    w ௨৴ͷͨΊͷ෦඼
    ʢίΠϧɾΞϯςφʣ͕ඞཁ

    View Slide

  19. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    J04"QQʹ͓͚Δ/'$͕࢖ΘΕ͍ͯΔ৔໘
    w "QQMF1BZʢίϯλΫτϨεܾࡁʣ
    w 8BMMFUʹ௥Ճͨ͠ंͷ伴΍ϗςϧͷ෦԰ͷ伴Λ࢖͏
    w "QQ$MJQίʔυ
    w F,:$ɾຊਓ֬ೝ
    w ిࢠϚωʔʢ෺ཧΧʔυʣͷ࢒ߴɾར༻ཤྺΛ֬ೝ
    19

    View Slide

  20. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /FBS'JFME$PNNVOJDBUJPO
    ۙڑ཭ແઢ௨৴
    20

    View Slide

  21. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /FBS'JFME$PNNVOJDBUJPO
    ۙڑ཭ແઢ௨৴
    20

    ࣗ෼͕͜ΕΛ࢖ͬͯ
    ։ൃ͢Δ͜ͱ͸ແ͍ʜʜʁ

    View Slide

  22. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /FBS'JFME$PNNVOJDBUJPO
    ۙڑ཭ແઢ௨৴
    20

    ࣗ෼͕͜ΕΛ࢖ͬͯ
    ։ൃ͢Δ͜ͱ͸ແ͍ʜʜʁ
    ΋͍ͬͨͳ͍ʂ

    View Slide

  23. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$Λ࢖ͬͯԿ͔࡞Ζ͏ʂ
    w ʢ/'$ͷͨΊ͚ͩͷ෦඼ʢΞϯςφͳͲʣ͕ೖ͍ͬͯΔඞཁ͕͋ΔͷͰʣ
    ίετ͕͔͔Δ
    w ࠓ͜͜ʹ͍ΔΈͳ͞Μ͕
    ͍࣋ͬͯΔJ1IPOFͷ΄΅શͯʹ౥ࡌࡁΈʢͷ͸ͣʣ
    w ௨৴૬खͱͳΔΧʔυɾλάྨ΋ຕ͸͓ࡒ෍ʹೖ͍ͬͯΔʢ͸ͣʜʜʂʣ
    w ௥Ճίετ͸͔͔Βͳ͍ʂ
    w ࣗ෼͕͍࣋ͬͯΔϞϊͷத਎Λ೷͍ͯΈͨ͋͘Γ·ͤΜ͔ʁ
    21

    View Slide

  24. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$͸ࠃࡍن֨ͰΦʔϓϯ
    w *40*&$ʢ/'$*1ʣ
    w *40*&$ʢ/'$*1ʣ
    ɹʹɹ/'$*1ɹʴɹ*40*&$ɹʴɹ*40*&$
    22

    View Slide

  25. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 23
    ιχʔגࣜձࣾc'FMJ$Bc/'$ʹ͍ͭͯc/'$ͱ'FMJ$Bͷؔ܎IUUQTXXXTPOZDPKQ1SPEVDUTGFMJDB/'$SFMBUJPOIUNM

    View Slide

  26. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 24
    ιχʔגࣜձࣾc'FMJ$Bc/'$ʹ͍ͭͯc/'$ͱ'FMJ$Bͷؔ܎IUUQTXXXTPOZDPKQ1SPEVDUTGFMJDB/'$SFMBUJPOIUNM

    View Slide

  27. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ιχʔגࣜձࣾc'FMJ$Bc/'$ʹ͍ͭͯc/'$ͱ'FMJ$Bͷؔ܎
    IUUQTXXXTPOZDPKQ1SPEVDUTGFMJDB/'$SFMBUJPOIUNM
    ҉߸ԽΛඞཁͱ͠ͳ͍ΦʔϓϯίϚϯυΛ༻͍ͨΞϓϦ
    έʔγϣϯͷ৔߹ʹ͸ɺެ։͞Ε͍ͯΔن͚֨ͩͰ։ൃ
    ͢Δ͜ͱ͕Ͱ͖·͢ɻ(PPHMFࣾͷ"OESPJE΍Ξοϓϧ
    ࣾͷJ04ͳͲεϚʔτϑΥϯ޲͚04͕/'$ͷػೳΛα
    ϙʔτ͓ͯ͠ΓɺҰൠͷํ͕։ൃ͞ΕͨిࢠϚωʔͷϏ
    ϡʔϫʔͳͲ΋ؚΊɺεϚʔτϑΥϯ޲͚ʹ͢Ͱʹ͍͘
    ͔ͭͷ/'$ΞϓϦέʔγϣϯ͕ެ։͞Ε͍ͯ·͢ɻ
    25

    View Slide

  28. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ιχʔגࣜձࣾc'FMJ$Bc/'$ʹ͍ͭͯc/'$ͱ'FMJ$Bͷؔ܎
    IUUQTXXXTPOZDPKQ1SPEVDUTGFMJDB/'$SFMBUJPOIUNM
    ҉߸ԽΛඞཁͱ͠ͳ͍ΦʔϓϯίϚϯυΛ༻͍ͨΞϓϦ
    έʔγϣϯͷ৔߹ʹ͸ɺެ։͞Ε͍ͯΔن͚֨ͩͰ։ൃ
    ͢Δ͜ͱ͕Ͱ͖·͢ɻ(PPHMFࣾͷ"OESPJE΍Ξοϓϧ
    ࣾͷJ04ͳͲεϚʔτϑΥϯ޲͚04͕/'$ͷػೳΛα
    ϙʔτ͓ͯ͠ΓɺҰൠͷํ͕։ൃ͞ΕͨిࢠϚωʔͷϏ
    ϡʔϫʔͳͲ΋ؚΊɺεϚʔτϑΥϯ޲͚ʹ͢Ͱʹ͍͘
    ͔ͭͷ/'$ΞϓϦέʔγϣϯ͕ެ։͞Ε͍ͯ·͢ɻ
    26

    View Slide

  29. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ιχʔגࣜձࣾc'FMJ$Bc/'$ʹ͍ͭͯc/'$ͱ'FMJ$Bͷؔ܎
    IUUQTXXXTPOZDPKQ1SPEVDUTGFMJDB/'$SFMBUJPOIUNM
    ҉߸ԽΛඞཁͱ͠ͳ͍ΦʔϓϯίϚϯυΛ༻͍ͨΞϓϦ
    έʔγϣϯͷ৔߹ʹ͸ɺެ։͞Ε͍ͯΔن͚֨ͩͰ։ൃ
    ͢Δ͜ͱ͕Ͱ͖·͢ɻ(PPHMFࣾͷ"OESPJE΍Ξοϓϧ
    ࣾͷJ04ͳͲεϚʔτϑΥϯ޲͚04͕/'$ͷػೳΛα
    ϙʔτ͓ͯ͠ΓɺҰൠͷํ͕։ൃ͞ΕͨిࢠϚωʔͷϏ
    ϡʔϫʔͳͲ΋ؚΊɺεϚʔτϑΥϯ޲͚ʹ͢Ͱʹ͍͘
    ͔ͭͷ/'$ΞϓϦέʔγϣϯ͕ެ։͞Ε͍ͯ·͢ɻ
    27

    View Slide

  30. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    $PSF/'$
    28

    View Slide

  31. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 29

    View Slide

  32. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 30

    View Slide

  33. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$Λ༻͍ͨ
    "QQMFϓϥοτϑΥʔϜͷ"QQͷ։ൃ
    31

    View Slide

  34. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$ͷΞϯςφΛ౥ࡌ͍ͯ͠ΔσόΠε
    32
    ঎඼ը૾͸"QQMF8FCαΠτΑΓ

    View Slide

  35. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$ͷΞϯςφΛ౥ࡌ͍ͯ͠ΔσόΠε
    33
    ঎඼ը૾͸"QQMF8FCαΠτΑΓ

    View Slide

  36. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 34
    $PSF/'$c"QQMF%FWFMPQFS%PDVNFOUBUJPOIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODPSFOGD

    View Slide

  37. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 35
    $PSF/'$c"QQMF%FWFMPQFS%PDVNFOUBUJPOIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODPSFOGD

    View Slide

  38. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    $PSF/'$ͷର৅
    w $PSF/'$Λ࢖͑Δͷ͸J04Ҏ߱
    w NBD04ɾUW04ɾXBUDI04Ͱ͸࢖༻Ͱ͖ͳ͍
    w J04Ҏ͔߱ͭ/'$ΞϯςφΛੵΜͩJ1IPOFͷΈ
    36

    View Slide

  39. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$ΞϯςφΛ౥ࡌͨ͠J1IPOF
    w J1IPOFɾ1MVT
    w J1IPOFTɾT1MVT
    w J1IPOFɾ1MVT
    w J1IPOFɾ1MVT
    w J1IPOF9
    w J1IPOF9㸑ɾ9Tɾ9T.BY
    37
    w J1IPOFɾ1SPɾ1SP.BY
    w J1IPOF4&ʢୈੈ୅ʣ
    w J1IPOFNJOJɾɾ1SPɾ1SP.BY
    w J1IPOFNJOJɾɾ1SPɾ1SP.BY
    w J1IPOF4&ʢୈੈ୅ʣ
    w J1IPOFɾ1MVTɾ1SPɾ1SP.BY

    View Slide

  40. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$ΞϯςφΛ౥ࡌ͍ͯ͠ΔJ1IPOF

    $PSF/'$ͷػೳΛ࢖͑ΔJ1IPOF

    38

    View Slide

  41. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    $PSF/'$ͷػೳΛ࢖͑ΔJ1IPOF
    w J1IPOFɾ1MVT
    w J1IPOFTɾT1MVT
    w J1IPOFɾ1MVT
    w J1IPOFɾ1MVT
    w J1IPOF9
    w J1IPOF9㸑ɾ9Tɾ9T.BY
    39
    w J1IPOFɾ1SPɾ1SP.BY
    w J1IPOF4&ʢୈੈ୅ʣ
    w J1IPOFNJOJɾɾ1SPɾ1SP.BY
    w J1IPOFNJOJɾɾ1SPɾ1SP.BY
    w J1IPOF4&ʢୈੈ୅ʣ
    w J1IPOFɾ1MVTɾ1SPɾ1SP.BY

    View Slide

  42. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 40
    σόΠεػೳͷཁ݅αϙʔτ"QQMF%FWFMPQFSIUUQTEFWFMPQFSBQQMFDPNKQTVQQPSUSFRVJSFEEFWJDFDBQBCJMJUJFT

    View Slide

  43. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$Λ༻͍ͨ
    "QQMFϓϥοτϑΥʔϜͷ"QQͷ։ൃ
    J1IPOFҎ߱ରԠͷJ04"QQ։ൃ
    41

    View Slide

  44. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    λάσόΠεʢ/'$λάʣ
    42
    /'$λά

    View Slide

  45. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    $PSF/'$Ͱ
    Ͱ͖Δ͜ͱɾͰ͖ͳ͍͜ͱ
    43

    View Slide

  46. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$ͷʮͭͷϞʔυʯ
    44
    Χʔυ
    ΤϛϡϨʔγϣϯ
    Ϧʔμʔɾ
    ϥΠλʔ
    ϐΞɾπʔɾϐΞ ϫΠϠϨεॆి
    /'$5FDIOPMPHZ/'$'PSVNIUUQTOGDGPSVNPSHMFBSOOGDUFDIOPMPHZΛݩʹ࡞੒

    View Slide

  47. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$ͷʮͭͷϞʔυʯͱϑϨʔϜϫʔΫ
    45
    Χʔυ
    ΤϛϡϨʔγϣϯ
    Ϧʔμʔɾ
    ϥΠλʔ
    ϐΞɾπʔɾϐΞ ϫΠϠϨεॆి
    $PSF/'$
    1SPYJNJUZ3FBEFS
    1BTT,JU 8BMMFU
    ͳ͠ ͳ͠

    View Slide

  48. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    /'$ͷʮͭͷϞʔυʯͱϑϨʔϜϫʔΫ
    45
    Χʔυ
    ΤϛϡϨʔγϣϯ
    Ϧʔμʔɾ
    ϥΠλʔ
    ϐΞɾπʔɾϐΞ ϫΠϠϨεॆి
    $PSF/'$
    1SPYJNJUZ3FBEFS
    1BTT,JU 8BMMFU
    ͳ͠ ͳ͠

    View Slide

  49. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 46
    $PSF/'$c"QQMF%FWFMPQFS%PDVNFOUBUJPOIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODPSFOGD

    View Slide

  50. 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

    View Slide

  51. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    $PSF/'$ͰͰ͖ͳ͍͜ͱ
    48
    Χʔυ
    ΤϛϡϨʔγϣϯ
    Ϧʔμʔɾ
    ϥΠλʔ
    $PSF/'$
    1SPYJNJUZ3FBEFS
    1BTT,JU 8BMMFU

    w Χʔυͷʮ;ΓʯΛ͢Δʢ1BTT,JUʣ
    w 8BMMFUɾ"QQMF1BZͷಛݖ
    w ʢΧʔυΛ͔ͯ͟͠ʣࢧ෷͍Λ
    ड͚෇͚Δʢ1SPYJNJUZ3FBEFSʣ
    w l5BQUP1BZzͰ͔͠࢖͑ͳ͍

    View Slide

  52. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ࣄલʹܾΊ͓ͯ͘͜ͱ
    ࣄલʹௐ͓ࠪͯ͘͜͠ͱ
    49

    View Slide

  53. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    औΓѻ͏/'$λά
    50
    /'$λάͷதͷσʔλܗࣜΛ
    ࣗ෼ͰܾΊΔ
    /'$λάͷதͷσʔλܗࣜ͸
    طʹܾΊΒΕ͍ͯΔ

    View Slide

  54. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ࣄલʹܾΊ͓ͯ͘͜ͱ
    /'$λάͷதͷσʔλܗࣜΛࣗ෼ͰܾΊΒΕΔ৔߹
    w σʔλܗࣜ͸ʮ/%&'ʯ͕͓͢͢Ί
    w /%&'ʢ/'$%BUB&YDIBOHF'PSNBUʣ
    w /'$'PSVN͕ࡦఆ
    w J04ɾ$PSF/'$Ͱ͸/%&'͸ಛผ଴۰
    w "QQ͕ϑΥΞάϥ΢ϯυঢ়ଶ͡Όͳͯ͘΋ಡΈऔΕΔ
    51

    View Slide

  55. 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

    View Slide

  56. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ࣄલʹௐ͓ࠪͯ͘͜͠ͱ
    /'$λάͷதͷσʔλܗ͕ࣜطʹܾ·͍ͬͯΔ৔߹
    w όΠφϦܗࣜʢData΍[Data]ʣͰ৘ใΛ΍ΓऔΓ͢Δ
    ʢύʔε΋ࣗ෼Ͱߦ͏ʣ
    w ༻͍Δ͜ͱʹͳΔʮ௨৴ٕज़ʢϓϩτίϧʣʯ͸Կ͔ʁ
    53

    View Slide

  57. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ࣄલʹௐ͓ࠪͯ͘͜͠ͱ
    /'$λάͷதͷσʔλܗ͕ࣜطʹܾ·͍ͬͯΔ৔߹
    w ௨৴ٕज़ʢϓϩτίϧʣ
    w /'$"ʢ*40*&$ʣ
    w /'$#ʢ*40*&$ʣ
    w /'$'ʢ*40*&$ʣ
    w /'$7ʢ*40*&$ʣ
    54

    View Slide

  58. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 55
    "QQMFr4FQUFNCFS&WFOU:PV5VCFIUUQTXXXZPVUVCFDPNXBUDI W/4UYV@,[M

    View Slide

  59. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 56
    "QQMFr4FQUFNCFS&WFOU:PV5VCFIUUQTXXXZPVUVCFDPNXBUDI W/4UYV@,[M

    View Slide

  60. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 57
    "QQMFr4FQUFNCFS&WFOU:PV5VCFIUUQTXXXZPVUVCFDPNXBUDI W/4UYV@,[M

    View Slide

  61. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 58
    "QQMFr4FQUFNCFS&WFOU:PV5VCFIUUQTXXXZPVUVCFDPNXBUDI W/4UYV@,[M

    View Slide

  62. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 59
    ೥݄೔ࡱӨ

    View Slide

  63. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 60
    ೥݄೔ࡱӨ
    ૯຿লࢦఆ.*$,4

    View Slide

  64. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 61
    4VJDB΍1"4.0Λ"QQMF΢ΥϨοτʹ௥Ճ͢Δ"QQMFαϙʔτ ೔ຊ
    IUUQTTVQQPSUBQQMFDPNKBKQ)5

    View Slide

  65. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 62
    4VJDB΍1"4.0Λ"QQMF΢ΥϨοτʹ௥Ճ͢Δ"QQMFαϙʔτ ೔ຊ
    IUUQTTVQQPSUBQQMFDPNKBKQ)5
    J1IPOFͷ/'$͸୺຤ͷ্ଆʂ
    എ໘ͷ"QQMFϩΰͷ෦෼Ͱ͸͋Γ·ͤΜ

    View Slide

  66. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    9DPEFϓϩδΣΫτͷઃఆ
    63

    View Slide

  67. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    $BQBCJMJUZΛ௥Ճ
    9DPEFϓϩδΣΫτͷઃఆ
    64

    View Slide

  68. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    &OUJUMFNFOUTΛ௥Ճ
    9DPEFϓϩδΣΫτͷઃఆ
    65

    View Slide

  69. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    *OGPQMJTUʹ஋Λ௥Ճ
    9DPEFϓϩδΣΫτͷઃఆ
    66

    View Slide

  70. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ίʔσΟϯά
    67

    View Slide

  71. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ࣮૷ͷྲྀΕ
    w εΩϟϯͷͨΊͷηογϣϯΛ࡞Δ
    w ηογϣϯΛ։࢝͢Δ
    ʢJ04ଆͰΞΫγϣϯγʔτ͕දࣔ͞ΕΔʣ
    w λάͷݕ஌ΛσϦήʔτͰड͚औΔ
    w ಡΈॻ͖Λߦ͏
    w ηογϣϯΛऴྃ͢Δ
    68

    View Slide

  72. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    εΩϟϯͷͨΊͷηογϣϯΛ࡞Δ
    w NFCNDEFReaderSession
    w NFCTagReaderSession
    w NFCVASReaderSession
    69

    View Slide

  73. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    εΩϟϯͷͨΊͷηογϣϯΛ࡞Δ
    w NFCNDEFReaderSession
    w NFCTagReaderSession
    w NFCVASReaderSession
    70

    View Slide

  74. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ηογϣϯΛ࡞Δ
    /%&'ܗࣜͷ৔߹
    71
    import CoreNFC
    class MyNDEFReaderWriter {
    var session: NFCNDEFReaderSession?
    func beginScanning() {
    guard NFCNDEFReaderSession.readingAvailable else { return }
    }
    }

    View Slide

  75. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ηογϣϯΛ࡞Δ
    /%&'ܗࣜͷ৔߹
    72
    import CoreNFC
    class MyNDEFReaderWriter {
    var session: NFCNDEFReaderSession?
    func beginScanning() {
    guard NFCNDEFReaderSession.readingAvailable else { return }
    session = NFCNDEFReaderSession(
    delegate: self,
    queue: nil,
    invalidateAfterFirstRead: false
    )
    }
    }

    View Slide

  76. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ηογϣϯΛ࡞Δ
    /%&'ܗࣜͷ৔߹
    73
    import CoreNFC
    class 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.”
    }
    }

    View Slide

  77. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ηογϣϯΛ࡞Δ
    /%&'ܗࣜͷ৔߹
    74
    import CoreNFC
    class 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()
    }
    }

    View Slide

  78. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͷ৔߹
    75
    extension MyNDEFReaderWriter: NFCNDEFReaderSessionDelegate {
    func readerSession(_ session: NFCNDEFReaderSession,
    didDetectNDEFs messages: [NFCNDEFMessage]) {
    // ...
    }
    func readerSession(_ session: NFCNDEFReaderSession,
    didDetect tags: [NFCNDEFTag]) {
    // ...
    }
    }

    View Slide

  79. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͷ৔߹
    76
    extension MyNDEFReaderWriter: NFCNDEFReaderSessionDelegate {
    func readerSession(_ session: NFCNDEFReaderSession,
    didDetectNDEFs messages: [NFCNDEFMessage]) {
    let message = messages.first!
    // print(message.records)
    }
    func readerSession(_ session: NFCNDEFReaderSession,
    didDetect tags: [NFCNDEFTag]) {
    // ...
    }
    }

    View Slide

  80. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͷ৔߹
    77
    extension MyNDEFReaderWriter: NFCNDEFReaderSessionDelegate {
    func readerSession(_ session: NFCNDEFReaderSession,
    didDetectNDEFs messages: [NFCNDEFMessage]) {
    let message = messages.first!
    // print(message.records)
    }
    func readerSession(_ session: NFCNDEFReaderSession,
    didDetect tags: [NFCNDEFTag]) {
    // ...
    }
    }

    View Slide

  81. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͷ৔߹
    78
    extension 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!")
    }
    }
    }

    View Slide

  82. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͷ৔߹
    79
    extension 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!")
    }
    }
    }

    View Slide

  83. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͷ৔߹
    80
    extension 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!")
    }
    }
    }

    View Slide

  84. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    εΩϟϯͷͨΊͷηογϣϯΛ࡞Δ
    w NFCNDEFReaderSession
    w NFCTagReaderSession
    w NFCVASReaderSession
    81

    View Slide

  85. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ηογϣϯΛ࡞Δ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    82
    import CoreNFC
    class 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()
    }
    }

    View Slide

  86. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ηογϣϯΛ࡞Δ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    83
    import CoreNFC
    class 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()
    }
    }

    View Slide

  87. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ηογϣϯΛ࡞Δ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    84
    import CoreNFC
    class 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()
    }
    }

    View Slide

  88. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ηογϣϯΛ࡞Δ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    85
    import CoreNFC
    class 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()
    }
    }

    View Slide

  89. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    86
    extension MyTagReaderWriter: NFCTagReaderSessionDelegate {
    func tagReaderSession(_ session: NFCTagReaderSession,
    didDetect tags: [NFCTag]) {
    Task {
    let tag = tags.first!
    // ...
    }
    }
    // ...
    }

    View Slide

  90. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    87
    extension MyTagReaderWriter: NFCTagReaderSessionDelegate {
    func tagReaderSession(_ session: NFCTagReaderSession,
    didDetect tags: [NFCTag]) {
    Task {
    let tag = tags.first!
    try await session.connect(to: tag)
    // ...
    }
    }
    // ...
    }

    View Slide

  91. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    88
    extension 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 Tag
    try await tagReader(session: session, didConnect: iso15693Tag)
    case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)
    try await tagReader(session: session, didConnect: miFareTag)
    }
    }
    }
    // ...
    }

    View Slide

  92. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    89
    extension 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 Tag
    try await tagReader(session: session, didConnect: iso15693Tag)
    case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)
    try await tagReader(session: session, didConnect: miFareTag)
    }
    }
    }
    // ...
    }

    View Slide

  93. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    'FMJ$B
    w ೔ຊ
    w ަ௨ܥ*$Χʔυ
    w ͓ళͰ࢖͑ΔిࢠϚωʔ
    w ߳ߓɾΠϯυωγΞͳͲΞδΞݍͰ࢖ΘΕ͍ͯΔ
    90
    ιχʔגࣜձࣾc'FMJ$Bc๏ਓͷ͓٬༷cಋೖࣄྫIUUQTXXXTPOZDPKQ1SPEVDUTGFMJDBCVTJOFTTDBTFTUVEZ

    View Slide

  94. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    'FMJ$B
    w ෳ਺ͷʮγεςϜʯΛ࣋ͭ͜ͱ͕Ͱ͖Δ
    w ຕͷ෺ཧλάͷதʹෳ਺ͷػೳΛ࣋ͯΔ
    w γεςϜΛ۠ผ͢ΔͨΊͷʮγεςϜίʔυʯ
    91

    View Slide

  95. 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 ộ

    View Slide

  96. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    'FMJ$BγεςϜίʔυΛ*OGPQMJTUʹྻڍ
    w J04"QQͰ࢖͏'FMJ$BγεςϜίʔυΛ*OGPQMJTUʹྻڍ͓ͯ͘͠
    w ϫΠϧυΧʔυʢ͢΂ͯͷ'FMJ$BγεςϜίʔυΛ࢖͏ʣ͸ෆՄ
    93

    View Slide

  97. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    'FMJ$BγεςϜίʔυΛ*OGPQMJTUʹྻڍ
    94

    View Slide

  98. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    95
    extension 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 Tag
    try await tagReader(session: session, didConnect: iso15693Tag)
    case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)
    try await tagReader(session: session, didConnect: miFareTag)
    }
    }
    }
    // ...
    }

    View Slide

  99. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    95
    extension 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 Tag
    try 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&&&&

    View Slide

  100. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    95
    extension 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 Tag
    try 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/'$ͷ
    ͲͷσϦήʔτϝιου΋
    ݺ͹Εͳ͍

    View Slide

  101. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹ʢ'FMJ$Bʣ
    96
    extension MyTagReaderWriter {
    func tagReader(session: NFCTagReaderSession,
    didConnect feliCaTag: NFCFeliCaTag) async throws {
    let mode = try await feliCaTag.requestResponse()
    // ...
    session.alertMessage = "Done!"
    session.invalidate()
    }
    }

    View Slide

  102. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    97
    extension 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 Tag
    try await tagReader(session: session, didConnect: iso15693Tag)
    case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)
    try await tagReader(session: session, didConnect: miFareTag)
    }
    }
    }
    // ...
    }

    View Slide

  103. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    *40*&$
    w ΫϨδοτΧʔυ
    w ύεϙʔτɾ਎෼ূ໌ূ
    98

    View Slide

  104. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    *40*&$
    w "QQMJDBUJPO1SPUPDPM%BUB6OJUʢ"1%6ʣ
    w λά্ͷΞϓϦέʔγϣϯͷࣝผࢠɹ"*%
    w J04"QQͰ࢖͏"*%Λ*OGPQMJTUʹྻڍ͓ͯ͘͠
    99

    View Slide

  105. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    "*%Λ*OGPQMJTUʹྻڍ
    100
    ܾࡁؔ࿈ͷ"*%͸ࢦఆͰ͖ͳ͍

    View Slide

  106. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    101
    extension 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 Tag
    try await tagReader(session: session, didConnect: iso15693Tag)
    case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)
    try await tagReader(session: session, didConnect: miFareTag)
    }
    }
    }
    // ...
    }

    View Slide

  107. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    101
    extension 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 Tag
    try 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ʹॻ͍ͨ
    "*%

    %
    /'$λά͕͍࣋ͬͯΔ
    "*%

    %

    View Slide

  108. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    101
    extension 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 Tag
    try 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/'$ͷ
    ͲͷσϦήʔτϝιου΋
    ݺ͹Εͳ͍

    View Slide

  109. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹ʢ*40ʣ
    102
    extension 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()
    }
    }

    View Slide

  110. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουͰड͚औΔ
    /%&'ܗࣜͰ͸ͳ͍σʔλͷ৔߹
    103
    extension 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 Tag
    try await tagReader(session: session, didConnect: iso15693Tag)
    case .miFare(let miFareTag): // Type 2 TagɺType 4 Tag (MIFARE)
    try await tagReader(session: session, didConnect: miFareTag)
    }
    }
    }
    // ...
    }

    View Slide

  111. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    $PSF/'$Λ࢖ͬͨ։ൃͷϙΠϯτ
    w /'$λάʹΑͬͯ͸
    ಡΈऔΓࣦഊ͕ଓ͘ͱϩοΫ͞Εͯ͠·͏΋ͷ͕͋Δ
    w ϩοΫ݊໘ͷݟͨ໨͕มΘΔ͜ͱ͸ͳ͍ʢҹ࡮ͳͷͰʣ
    w ͨͩͦΕΛ/'$Λհͨ͠ػցͰಡΈऔΔ͜ͱ͕Ͱ͖ͳ͘ͳΔ
    w ࣮ߦ͸৻ॏʹ
    104

    View Slide

  112. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    $PSF/'$Λ࢖ͬͨ։ൃͷϙΠϯτ
    w $PSF/'$ͷ௨৴ηογϣϯ͸࠷େඵͷ੍࣌ؒݶ͕͋Δ
    105

    View Slide

  113. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    $PSF/'$Λ࢖ͬͨ։ൃͷϙΠϯτ
    w #SFBLQPJOUΛࠩͯ͠σόοά͸͓͢͢Ί͠ͳ͍
    w Ұ࣌ఀࢭத΋͜ͷʮ࠷େඵͷ੍࣌ؒݶʯ͸ଘࡏ͍ͯ͠Δ
    w QSJOUʹΑΔσόοά͕͓͢͢Ί
    106

    View Slide

  114. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    $PSF/'$ͷ͕ͭ͜͜Β͍
    w J04ʹ͓͚ΔαʔυύʔςΟ"QQ޲͚ͷ/'$ͷ࢓༷͸ɺ"OESPJEͱൺֱ
    ͢Δͱେ੍͖͘ݶ͞Ε͍ͯΔ
    w 'FMJ$BγεςϜίʔυ΍"*%Λ͋Β͔͡Ί੩తʹࢦఆ͓ͯ͘͠ඞཁ
    w λάΛ͔͔ͯ͟͠ΒσϦήʔτϝιουʹ
    ͦͷ৘ใ͕౉ͬͯ͘Δ·Ͱʹ͕͔͔࣌ؒΔύλʔϯ͕͋Δ
    107

    View Slide

  115. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    σϦήʔτϝιουʹͳ͔ͳ͔৘ใ͕͜ͳ͍
    'FMJ$Bͷྫ
    w Y'&ͱ͍͏γεςϜίʔυͷΈΛ࣋ͬͨλά
    w Y'&Λʮ*UFNʯͷ࠷ޙʹهड़
    w ͦΕΑΓ΋લʹʮ*UFNʯΛ૿΍͍ͯ͘͠
    108

    View Slide

  116. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 109
    'FMJ$B͕஗͍͠ϑϧεΩϟϯ΋ෆՄೳޙฤʲJ04$PSF/'$ʳ2JJUBIUUQTRJJUBDPNUSFBTUSBJOJUFNTGCD

    View Slide

  117. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. 109
    'FMJ$B͕஗͍͠ϑϧεΩϟϯ΋ෆՄೳޙฤʲJ04$PSF/'$ʳ2JJUBIUUQTRJJUBDPNUSFBTUSBJOJUFNTGCD

    View Slide

  118. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    $PSF/'$ͷ͕ͭ͜͜Β͍
    w /'$ͷڍಈ͕ෆ҆ఆͳJ1IPOFͷػछ͕͋Δͱ͍͏੠΋
    w J1IPOFγϦʔζʜʁ
    110

    View Slide

  119. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    $PSF/'$ͷ͕ͭ͜͜Β͍
    w ґવͱͯ͠৘ใ͕গͳ͍
    w ʮࣗ෼ͷ࣮૷ʯʮ$PSF/'$ʯͷͲ͕ͬͪѱ͍ͷ͔ෆ໌ͳͱ͖͕͋Δ
    w ݕূ༻ʹ/'$ʢ'FMJ$BʣΛੵΜͩ"OESPJE୺຤Λ͓࣋ͬͯ͘ͱָ
    w ΋͘͠͸8JOEPXT1$/'$ϦʔμʔϥΠλʔ
    w /'$ͷίϚϯυ࢓༷ࣗମ͸ͲͷϓϥοτϑΥʔϜͰ΋ڞ௨
    w "OESPJEͷίʔυʢ+BWBɾ,PUMJOʣ΋ൺֱతࢀߟʹͳΔ
    111

    View Slide

  120. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ιχʔגࣜձࣾc'FMJ$Bc/'$ʹ͍ͭͯc/'$ͱ'FMJ$Bͷؔ܎
    IUUQTXXXTPOZDPKQ1SPEVDUTGFMJDB/'$SFMBUJPOIUNM
    ҉߸ԽΛඞཁͱ͠ͳ͍ΦʔϓϯίϚϯυΛ༻͍ͨΞϓϦ
    έʔγϣϯͷ৔߹ʹ͸ɺެ։͞Ε͍ͯΔن͚֨ͩͰ։ൃ
    ͢Δ͜ͱ͕Ͱ͖·͢ɻ(PPHMFࣾͷ"OESPJE΍Ξοϓϧ
    ࣾͷJ04ͳͲεϚʔτϑΥϯ޲͚04͕/'$ͷػೳΛα
    ϙʔτ͓ͯ͠ΓɺҰൠͷํ͕։ൃ͞ΕͨిࢠϚωʔͷϏ
    ϡʔϫʔͳͲ΋ؚΊɺεϚʔτϑΥϯ޲͚ʹ͢Ͱʹ͍͘
    ͔ͭͷ/'$ΞϓϦέʔγϣϯ͕ެ։͞Ε͍ͯ·͢ɻ
    112

    View Slide

  121. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ͓·͚
    /'$͸୺຤ͱϦΞϧͷੜ׆Λ݁ͼ͚ͭΔຐ๏ͷΑ͏ͳ΋ͷ
    113

    View Slide

  122. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ͦͷଞ
    ࢀߟࢿྉ
    w $PSF/'$c"QQMF%FWFMPQFS%PDVNFOUBUJPOIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODPSFOGD
    w 1BTT,JU "QQMF1BZBOE8BMMFU
    c"QQMF%FWFMPQFS%PDVNFOUBUJPOIUUQTEFWFMPQFSBQQMFDPN
    EPDVNFOUBUJPOQBTTLJU
    w 1SPYJNJUZ3FBEFSc"QQMF%FWFMPQFS%PDVNFOUBUJPOIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPO
    QSPYJNJUZSFBEFS
    w *$"0%PD.BDIJOF3FBEBCMF5SBWFM%PDVNFOUT &JHIUI&EJUJPO
    ɹ*OUFSOBUJPOBM$JWJM
    "WJBUJPO0SHBOJ[BUJPO
    w ӡస໔ڐূٴͼӡస໔ڐূ࡞੒γεςϜ౳࢓༷ॻʢ࢓༷ॻόʔδϣϯ൪߸ɿʣɹܯ࡯ிަ௨ہӡస໔ڐ՝
    w ૯຿লి೾ར༻ϗʔϜϖʔδʛి೾؀ڥʛߴप೾ར༻ઃඋͷ֓ཁIUUQTXXXUFMFTPVNVHPKQKTZTPUIFST
    IJHIGSF
    w ιχʔגࣜձࣾ'FMJ$BΧʔυϢʔβʔζϚχϡΞϧൈਮ൛7FSTJPO
    114

    View Slide

  123. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    ͦͷଞ
    ໔੹ࣄ߲
    w ຊτʔΫͷ಺༰ɾεϥΠυʹهࡌ͞Ε͍ͯΔࣄ߲͸ɺҰൠʹެ։͞Ε͍ͯΔ΋ͷͱɺͦΕΒΛ༻͍ͯ։ൃΛ
    ߦͬͨൃදऀͷ஌ݟʹج͍ͮͨ΋ͷͰ͢ɻ
    w ຊτʔΫͷ಺༰ɾεϥΠυʹهࡌ͞Ε͍ͯΔࣄ߲͸ɺ؆ུԽͷͨΊʹҰ෦ٕज़తʹਖ਼֬Ͱ͸ͳ͍දݱΛؚΜ
    Ͱ͍Δ৔߹͕͋Γ·͢ɻ
    w ຊτʔΫͷ಺༰ɾεϥΠυʹهࡌ͞Ε͍ͯΔࣄ߲͸ɺকདྷʹΘͨͬͯ಺༰Λอূ͢Δ΋ͷͰ͸͋Γ·ͤΜɻ
    w ຊτʔΫͷ಺༰ɾεϥΠυʹهࡌ͞Ε͍ͯΔձ໊ࣾɺ੡඼໊౳͸Ұൠʹ֤ࣾͷ঎ඪ·ͨ͸ొ࿥঎ඪͰ͢ɻ
    w ຊτʔΫͷ಺༰ɾεϥΠυʹهࡌ͞Ε͍ͯΔࣄ߲͸ɺຊτʔΫதʹڍ͛ΒΕͨձࣾɾஂମ౳͕ޙԉɾࢧԉ౳͠
    ͍ͯΔ΋ͷ͸ແ͘ɺൃදऀ΋ؚΊͦΕΒͱ͸Ұ੾ؔ܎͕͋Γ·ͤΜɻ
    w ຊτʔΫͷ಺༰ɾεϥΠυΛࢀর͢Δ͜ͱʹΑͬͯੜͨ͡ଛ֐౳ʹ͍ͭͯɺൃදऀ͸Ұ੾ͷ੹೚Λෛ͍·ͤ
    Μɻ
    115

    View Slide

  124. Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved.
    )BQQZUBHSFBEJOHɹɹɹɹɹɹɹɹɹɹɹɹɹIUUQTUSFUKQɹ⏩
    ৄղ$PSF/'$
    116
    /'$Λ༻͍ͨJ04"QQ։ൃͷͯͼ͖
    iOSDC Japan 2022
    Day 1
    #iosdc #b

    View Slide