Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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ʣ

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. /FBS'JFME$PNNVOJDBUJPO ۙڑ཭ແઢ௨৴ 20  ࣗ෼͕͜ΕΛ࢖ͬͯ ։ൃ͢Δ͜ͱ͸ແ͍ʜʜʁ

Slide 22

Slide 22 text

Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. /FBS'JFME$PNNVOJDBUJPO ۙڑ཭ແઢ௨৴ 20  ࣗ෼͕͜ΕΛ࢖ͬͯ ։ൃ͢Δ͜ͱ͸ແ͍ʜʜʁ ΋͍ͬͨͳ͍ʂ

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

Copyright © 2022 treastrain / Tanaka RyogaɹAll rights reserved. /'$ΞϯςφΛ౥ࡌ͍ͯ͠ΔJ1IPOF  $PSF/'$ͷػೳΛ࢖͑ΔJ1IPOF  38

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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Ͱ͔͠࢖͑ͳ͍

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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 ) } }

Slide 76

Slide 76 text

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.” } }

Slide 77

Slide 77 text

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() } }

Slide 78

Slide 78 text

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]) { // ... } }

Slide 79

Slide 79 text

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]) { // ... } }

Slide 80

Slide 80 text

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]) { // ... } }

Slide 81

Slide 81 text

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!") } } }

Slide 82

Slide 82 text

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!") } } }

Slide 83

Slide 83 text

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!") } } }

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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() } }

Slide 86

Slide 86 text

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() } }

Slide 87

Slide 87 text

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() } }

Slide 88

Slide 88 text

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() } }

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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) // ... } } // ... }

Slide 91

Slide 91 text

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) } } } // ... }

Slide 92

Slide 92 text

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) } } } // ... }

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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 ộ

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

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) } } } // ... }

Slide 99

Slide 99 text

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&&&&

Slide 100

Slide 100 text

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/'$ͷ ͲͷσϦήʔτϝιου΋ ݺ͹Εͳ͍

Slide 101

Slide 101 text

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() } }

Slide 102

Slide 102 text

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) } } } // ... }

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

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) } } } // ... }

Slide 107

Slide 107 text

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ʹॻ͍ͨ "*%  % /'$λά͕͍࣋ͬͯΔ "*%  %

Slide 108

Slide 108 text

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/'$ͷ ͲͷσϦήʔτϝιου΋ ݺ͹Εͳ͍

Slide 109

Slide 109 text

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() } }

Slide 110

Slide 110 text

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) } } } // ... }

Slide 111

Slide 111 text

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

Slide 112

Slide 112 text

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

Slide 113

Slide 113 text

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

Slide 114

Slide 114 text

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

Slide 115

Slide 115 text

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

Slide 116

Slide 116 text

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

Slide 117

Slide 117 text

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

Slide 118

Slide 118 text

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

Slide 119

Slide 119 text

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

Slide 120

Slide 120 text

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

Slide 121

Slide 121 text

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

Slide 122

Slide 122 text

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

Slide 123

Slide 123 text

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

Slide 124

Slide 124 text

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