Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
External Accessory入門
Search
Trickart
September 02, 2023
Technology
960
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
External Accessory入門
iOSDC2023発表資料
Trickart
September 02, 2023
More Decks by Trickart
See All by Trickart
AlarmKitで明後日起きれるアラームアプリを作る
trickart
0
310
Xcode MCPでスクリーンショット撮りを90%自動化する
trickart
0
160
日本語でもいい感じに改行したい!! / Split Japanese sentence for UILabel and SwiftUI Text
trickart
3
4.2k
Other Decks in Technology
See All in Technology
トヨタ⽣産⽅式(TPS)⼊⾨
recruitengineers
PRO
3
840
AIエージェントを前提としたプラットフォーム エンジニアリング:GKEで作るAgent-Ready Golden Path
legalontechnologies
PRO
2
240
Bits Agent Builder の⼊⾨と活⽤事例
nulabinc
PRO
0
140
『三匹の子ぶた』から学ぶネットワークセキュリティの昔と今 / Network Security: Then and Now Through the Lens of The Three Little Pigs
nttcom
1
6k
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4.9k
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
1
580
事業価値と Engineering 2026年度版
recruitengineers
PRO
49
24k
Service Connect 上のサービスに ECS Service の外側から到達できなかった話
ota1022
1
250
サイバー捜査員研修(後半)
nomizone
1
880
モノリス Rails でも日中に rails db:migrate を走らせたい! / Daytime rails db:migrate on Monolithic Rails!
euglena1215
4
580
SO-101×VLAによる3色キューブのピック&プレース
abeja
0
200
FPGAが実現する遠方宇宙の高空間分解能天体撮影 -大型地上望遠鏡の視力を補正する「補償光学」とは?-
komei_mt
0
250
Featured
See All Featured
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
540
For a Future-Friendly Web
brad_frost
183
10k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
470
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Darren the Foodie - Storyboard
khoart
PRO
3
3.6k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.6k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
790
Statistics for Hackers
jakevdp
799
230k
Transcript
USJDLBSU &YUFSOBM"DDFTTPSZೖ ެࣜ'SBNFXPSLΛͬͯϨγʔτϓϦϯλʔΛ੍ޚ͢Δʂ
ಥવͰ͕͢ Έͳ͞Μ
'SBNFXPSL ͬͯ·͔͢ʁ "QQMFϓϥοτϑΥʔϜ͚ͷͷ
ΞϓϦ։ൃʹ͔ܽͤͳ͍'SBNFXPSLͨͪ "QQMFެࣜͷ'SBNFXPSL͚ͩͰͨ͘͞Μ w 'PVOEBUJPO w 6*,JU w "QQ,JU w 4XJGU6*
w $PNCJOF w FUDʜ
ΞϓϦ։ൃʹ͔ܽͤͳ͍'SBNFXPSLͨͪ "QQMFެࣜ'SBNFXPSLԿݸ͋ΔͰ͠ΐ͏ʁ w "ݸ w #ݸ w $ݸ
ݸʂ ਖ਼ղ$
w 5FDIOPMPHJFTϖʔδ w IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOUFDIOPMPHJFT w 'SBNFXPSL͕ͨ͘͞Μ w ࠓճ͓͢Δ'SBNFXPSLͦͷҰͭ ΞϓϦ։ൃʹ͔ܽͤͳ͍ 'SBNFXPSLͨͪ
&YUFSOBM'SBNFXPSLͱʁ w "QQMF͕ϦϦʔε͢Δ'SBNFXPSLͷҰͭ w ͦͷ໊ͷ௨Γ֎෦ΞΫηαϦͱ௨৴͢Δࣄ͕Ͱ͖Δ w ରԠ͢Δ֎෦ΞΫηαϦ-JHIUOJOH#MVFUPPUIଓ ͷΞΫηαϦ w ࣮ϐϯ%PDLίωΫλଓʹରԠ͍ͯ͠Δ
ରԠ͢Δ#MVFUPPUI#MVFUPPUI#3ɻ#MVFUPPUI-PX&OFSHZ$PSF#MVFUPPUI͕ରԠɻ
w ͦͷ໊ͷ௨ΓϨγʔτΛҹ͢ ΔϓϦϯλʔ w αʔϚϧϓϦϯλʔͱݺΕΔ w จࣈਤܗΛҹͰ͖Δ ੍ޚ͢Δͷ ϨγʔτϓϦϯλʔ Ҿ༻IUUQTTUBSNKQXQDPOUFOUVQMPBETNDQSJOU@KQH
8IZSFDFJQUQSJOUFS w ͕ࣗϢϏϨδͱ͍͏104ϨδΞϓϦاۀʹۈΊͯΔ͔Β w ݸਓͰೖखՄೳ w ωοτ௨ൢͰߪೖՄೳ ສԁ ɻϑϦϚΞϓϦͰதݹग़͞Ε͍ͯΔ w
ൺֱత؆୯ʹ༷ॻ͕ೖखՄೳ w ௨৴σʔλྔ͕গͳ͘୯७ͰɺجຊతʹσʔλΛૹΔ͚ͩͰ͍͍
·ͣ४උ w J04ΞϓϦͷϓϩδΣΫτΛ࡞Δ w *OGPQMJTUʹҎԼͷ߲Λهड़͢ Δ w 6*4VQQPSUFE&YUFSOBM"DDFTTPSZ1SPUPDPMT w ػثͱͷ௨৴ϓϩτίϧ
w ϕϯμʔ͝ͱʹҟͳΔ ૣ࡞Δ
ૣ࡞Δ ίʔυΛॻ͍͍ͯ͘&""DDFTTPSZ w ֎෦ΞΫηαϦ&""DDFTTPSZΫϥεͰද͞ΕΔ w ଓࡁΈͷΞΫηαϦ&""DDFTTPSZ.BOBHFSͷDPOOFDUFE"DDFTTPSJFT ϓϩύςΟʹ֨ೲ͞Ε͍ͯΔ w ෳͷΞΫηαϦ͕͋Δ߹NPEFM/VNCFSQSPUPDPM4USJOHTϓϩύςΟ ΛΈͯఆ
ૣ࡞Δ ίʔυΛॻ͍͍ͯ͘&"4FTTJPO w ௨৴ηογϣϯͷ&"4FTTJPOΛ։࢝͢Δ w JOJUʹ௨৴͍ͨ͠&""DDFTTPSZͱQSPUPDPM4USJOHΛ͢ for accessory in EAAccessoryManager.shared().connectedAccessories
{ guard accessory.protocolStrings.contains("jp.star-m.starpro") else { continue } let session = EASession(accessory: accessory, forProtocol: "jp.star-m.starpro") }
ૣ࡞Δ ίʔυΛॻ͍͍ͯ͘&"4FTTJPO w &"4FTTJPOJOQVU4USFBNͱPVUQVU4USFBNΛ͍࣋ͬͯΔ w JOQVU4USFBN͔ΒσʔλΛಡΈग़ͯ͠ड৴ w PVUQVU4USFBNʹσʔλΛॻ͖ࠐΜͰૹ৴ w 4USFBNʹEFMFHBUFΛͯ͠3VO-PPQʹεέδϡʔϧͯ͠։͘
guard let session = EASession(accessory: accessory, forProtocol: protocolString), let outputStream = session.outputStream else { return nil } outputStream.delegate = self outputStream.schedule(in: .current, forMode: .default) outputStream.open()
ૣ࡞Δ ίʔυΛॻ͍͍ͯ͘ /4 4USFBN w 4USFBNੲͳ͕Βͷ/44USFBN w 0VUQVU4USFBNʹ6OTBGF1PJOUFS6*OUͱͯ͠όΠτྻΛ͢ // "0"ͱ͚ͩҹࣈͯ͠վߦ͠ϖʔύʔΧοτ͢Δ
var bytes: [UInt8] = [0x30, 0x0e, 0x0a, 0x1b, 0x64, 0x03] let length = outputStream.write(&bytes, maxLength: bytes.count) if length < 0 { print("error!") } else if length == 0 { print("full.") } else { if length != bytes.count { print("write data was split.") } // ॻ͖ࠐΜͩσʔλͷআ bytes = Array(bytes.dropFirst(length)) }
ૣ࡞Δ ίʔυΛॻ͍͍ͯ͘จࣈҹ w ελʔਫ਼ີϓϦϯλʔ4UBS13/5ͱ͍͏ϑΥʔϚοτ w 4IJGU+*4ͷςΩετͱ"4$**ͷ੍ޚจࣈͰఆٛ͞Ε੍ͨޚίϚϯυ͔ΒͳΔ w ຊޠͷςΩετҹՄೳʂ let hello
= Array("͜ΜʹͪɺiOSDC 2023!".data(using: .shiftJIS)!) var bytes: [UInt8] = hello + [0x0e, 0x0a, 0x1b, 0x64, 0x03] let length = outputStream.write(&bytes, maxLength: bytes.count)
ૣ࡞Δ ίʔυΛॻ͍͍ͯ͘ը૾ҹ w ը૾Λҹͯ͠ΈΔ w ͪΐͬͱσʔλྔଟ͍ͷͰ֓ཁ͚ͩ w ന͔ࠇ͔ͷϞϊΫϩը૾ w XJEUIͱIFJHIUΛϔομʹͯ͋͠ͱ
CJUͣͭന GBMTF ͔ࠇ USVF ͔ͷσʔλ Λ٧Ί͍ͯ͘
ΞϓϦͷϦϦʔεͱ1SPEVDU1MBO*% 11*% ݸਓͰΞϓϦΛϦϦʔε͢Δͷ͍͔͠ʜ w &YUFSOBM"DDFTTPSZΛͬͨΞϓϦΛϦϦʔε͢Δʹ11*%͕ඞཁ w 11*%༻͍ͨ͠ΞΫηαϦͷϕϯμʔʹґཔͯ͠औಘ͢Δඞཁ͕͋Δ w ΞΫηαϦϕϯμʔΣϒαΠτͰϑΥʔϜΛ༻ҙ͍ͯ͠Δ͕ձ໊ࣾͳͲΛ ٻΊΒΕΔ߹ଟ͍
w ݸਓͷΞϓϦΛରԠͯ͘͠ΕΔϕϯμʔ͕͋Δͷ͔ෆ໌ w खݩͰσόοάϏϧυͰ༡Ϳʹͳ͍
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ ࢀߟ w IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOFYUFSOBMBDDFTTPSZ w IUUQTEFWFMPQFSBQQMFDPNMJCSBSZBSDIJWFGFBUVSFEBSUJDMFT &YUFSOBM"DDFTTPSZ15*OUSPEVDUJPO*OUSPEVDUJPOIUNMBQQMF@SFG EPDVJE51 w IUUQTEFWFMPQFSBQQMFDPNMJCSBSZBSDIJWFEPDVNFOUBUJPO$PDPB
$PODFQUVBM4USFBNT4USFBNTIUNMBQQMF@SFGEPDVJEJ αϯϓϧίʔυ IUUQTHJUIVCDPNUSJDLBSU&YUFSOBM"DDFTTPSZ1SJOUFS4BNQMF