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
980
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
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
120
AlarmKitで明後日起きれるアラームアプリを作る
trickart
0
350
Xcode MCPでスクリーンショット撮りを90%自動化する
trickart
0
170
日本語でもいい感じに改行したい!! / Split Japanese sentence for UILabel and SwiftUI Text
trickart
3
4.2k
Other Decks in Technology
See All in Technology
enechainの内製セルフサービスプラットフォーム
hiyosi
0
140
Reactの設計論
uhyo
7
1.5k
Microsoft 365 Copilot chat -tekoälypalvelun tietosuojaongelmat
hponka
0
550
Sigmaユーザーのための有用リソース一挙公開 & Sigmaで使えるMCP #sigma_ucj /useful-resources-for-sigma-computing-users-and-mcps-with-sigma
shinyaa31
0
160
Snowflakeのコスト最適化を支えるアーキテクチャ設計
ktatsuya
0
670
AI 駆動 Terraform 開発/SRE_BizReach_MIXI_2
visional_engineering_and_design
2
1.9k
KPIだけでは評価できないプロダクトが考えるべき Evalsという第二の評価系 / Beyond KPIs: Evals as a Second Evaluation Framework for Products #PdEConf
aki_iinuma
4
3.7k
Driving AI Adoption Using In-House GPUs to Serve Qwen
po3rin
2
470
Nav2、Nav3 ... はたまた自作?〜 作って理解する Nav3 の設計意図 〜 / Nav2, Nav3 ... or Build Your Own? — Understanding Nav3's design intent by building it from scratch
yanzm
0
260
「重なり」は迎える側がつくる ― 人もAIエージェントも歓迎するプロダクトエンジニアリング ―
go0517go
PRO
0
270
推論の観測、できていますか? 〜 Google Cloud Gemini Enterprise Agent Platformで 3つの Gemini モデルを実測して踏んだ、評価の罠 〜
shukob
PRO
0
180
20260903 Tokyo Jazug Night #62 | Azure エンジニアよ、 その環境は本当にセキュアか?
olivia_0707
1
640
Featured
See All Featured
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
400
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
770
AI: The stuff that nobody shows you
jnunemaker
PRO
9
980
Practical Orchestrator
shlominoach
191
12k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
570
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
370
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
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