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
Synchronized iPhones, Again!
Search
Tachibana Kaoru
September 21, 2020
Technology
1.7k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Synchronized iPhones, Again!
iOSDC 2020
https://fortee.jp/iosdc-japan-2020/proposal/3a9b496e-8745-4d1d-8952-8ac45a42ca8a
Tachibana Kaoru
September 21, 2020
More Decks by Tachibana Kaoru
See All by Tachibana Kaoru
GeoLocationAnchor and MKTileOverlay
toyship
0
400
Custom Group Activities
toyship
3
1.5k
ARKit4.pdf
toyship
1
2.3k
Custom Gesture Recognizer on iOS
toyship
3
1.5k
HEVC Video with Alpha Channel
toyship
1
1.3k
RealityKit & Reality Composer
toyship
3
690
ARKit3
toyship
4
7.6k
UIViewPropertyAnimator and Easing
toyship
2
1.2k
Synchronized iPhones!
toyship
3
5k
Other Decks in Technology
See All in Technology
完全自律ロボットを作りたくて、先に開発を自律させた話(ROS Japan UG #63 LT)
rryz09
0
500
クラウド上のデータ復旧で見落としがちな制約: 医療系 SaaS の BCP 設計から得た教訓
kakehashi
PRO
0
3.4k
地域 SRE コミュニティ最前線 / SRE NEXT 2026 Discussion Night Track C
muziyoshiz
0
210
Making sense of Google’s agentic dev tools
glaforge
1
190
SRE依存からの脱却 運用を開 発チームへ移す、 フルサイ クル開 発体制の実践
joooee0000
0
2.7k
ゼロをイチにする仕事が終わったあと
smasato
0
340
AI Agent SaaS を支える自社仮想化基盤への挑戦と実運用 / ai-agent-saas-virtualization
flatt_security
2
3.8k
SREとQA 二人三脚で進めるSLO運用/sre-qa-slo
sugitak
0
460
LLM/Agent評価:トップ営業の発言を「正解」にする 〜暗黙的正解による評価を営業資産に変える〜
takkuhiro
1
210
ソニー銀行におけるビジネスアジリティ向上のためのクラウドシフト戦略
srenext
0
160
しくみを学んで使いこなそう GitHub Copilot app
torumakabe
2
230
タスクの複雑さでモデルを選ぶ ── Thompson Samplingで動かす“トークン/コスト最適化
satohy0323
0
310
Featured
See All Featured
Optimizing for Happiness
mojombo
378
71k
How to Talk to Developers About Accessibility
jct
2
340
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
180
エンジニアに許された特別な時間の終わり
watany
107
250k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Why Our Code Smells
bkeepers
PRO
340
58k
Music & Morning Musume
bryan
47
7.3k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
340
Tell your own story through comics
letsgokoyo
1
990
Transcript
Synchronized iPhones, Again! iOSDC 2020 @TachibanaKaoru
Aboud Me @TachibanaKaoru ϑϦʔϥϯε iOS ΤϯδχΞ ຊϦΞϧΞόλʔͰొஃ͠·͢ɻ
ࠓͷ͓ ͨ͘͞ΜͷiPhone Λಉظ͢Δɻ
iPhoneͷಉظ ಉظͱ ͳΜΒ͔ͷωοτϫʔΫΛհͨ͠ঢ়ଶͰɺෳͷ͕ಉ͡ಈ͖Λ͢ Δ͜ͱɻ
DEMO
None
લఏ݅ ʢ̍ʣ͕20~30 ʢ̎ʣωοτϫʔΫʹґଘ͠ͳ͍ ʢ̏ʣࣗಈతͳάϧʔϐϯά ʢ̐ʣ༗ػతͳάϧʔϐϯά
લఏ݅ ʢ̍ʣ͕20~30 ٕज़తқΛߟྀ વ iPhone iPadʹݶΓ·͢ɻ
લఏ݅ ʢ̎ʣωοτϫʔΫʹґଘ͠ͳ͍ ܞଳճઢWiFi͕ͳͯ͘ಈ࡞͢Δɻ ͦͷ͋ͨΓͷެԂͰΩϟϯϓͰࢁͷ্Ͱେৎɻ αʔόʔϨεͰಈ࡞
લఏ݅ ʢ̏ʣࣗಈతͳάϧʔϐϯά ΞϓϦΛىಈ͢ΔͱࣗಈతʹάϧʔϓΛܗ͢Δɻ ʮˎˎͷάϧʔϓʹࢀՃ͠·͔͢ʁʯͱ͔ฉ͔ͳ͍ɻ Ϣʔβʔ͕खಈͰొ͢Δ͜ͱͳ͘ɺࣗಈͰଓ͢Δɻ
લఏ݅ ʢ̐ʣ༗ػతͳάϧʔϐϯά άϧʔϓʹ్த͔ΒͰࢀՃͰ͖Δ Ͳͷϝϯόʔ͕ͯ͠ɺάϧʔϓ͕γʔϜϨεʹܧଓ͢Δɻ
Demo Movie ߹ܭ35ͷiPhoneͷө૾͕ಉ ظ͢ΔσϞө૾Ͱ͕͢……
Demo Movie ͝ΊΜͳ͍͞ɻ ͜ΕARͰ͢ɻ
Demo Movie Reality Composer File + Xcode Ͱߏͨ͠AR ΞϓϦ Ͱ͢ɻ
RealityComposer Appleͷ3Dฤूπʔϧ 3DΦϒδΣΫτͷஔΞχϝʔγϣϯ ͷઃఆͳͲ͕ՄೳͰ͢ɻ ෳࡶͳϞσϦϯάͰ͖·ͤΜ͕ɺ͙͢ ͑ΔेछྨͷϞσϧؚ͕·Ε͍ͯ·͢ɻ ؆୯ͳARɾ3DΞϓϦΛͭ͘Δͷʹదͯ͠ ͍·͢ɻ
RealityComposerͱXcodeͷ࿈ܞ RealityComposerଆ͔ΒXcodeͷΞΫγϣϯΛىಈɻ Xcode͔ΒRealityComposerଆNotificationΛૹ৴ɻ ʢInterfaceBuilderͰIBActionΛఆٛ͠ɺͦͷActionதΛ࣮͢Δͷͱࣅ ͍ͯ·͢ɻʣ Notification Action
VideoMaterial iOS14.0Ҏ߱ͰɺRealityComposerͰɺಈըΛ࠶ੜ͢ΔVideoMaterial Λ ͏͜ͱ͕Ͱ͖·͢ɻ ମͷද໘Ͱ͖ͳө૾Λ࠶ੜ͢Δ͜ͱ͕Ͱ͖·͢ɻ
Demo Movie App RealityComposer Ͱɺ35ݸͷࠇ͍ϓ ϨʔτͷΦϒδΣΫτΛ࡞ɻ RealityCopomserଆͰɺBehaviorΛઃఆ ͠ɺͲΕ͔ΛClickͨ͠ΒXcodeଆͷ Action͕ىಈ͢ΔΑ͏ʹ͍ͯ͠·͢ɻ
Demo Movie App XcodeଆͷActionͰɺ͋Β͔͡ ΊࡱӨͯ͋ͬͨ͠ಈըΛηο τͨ͠VideoMaterialΛࠇ͍ϓ ϨʔτΦϒδΣΫτʹͷͤͯ ͍·͢ɻ
VideoMaterial ͷੜ var videoMaterial: VideoMaterial? if let url = Bundle.main.url(forResource:
"movie", withExtension: "mp4"){ let item = AVPlayerItem(asset: AVAsset(url: url)) let player = AVPlayer(playerItem: item) videoMaterial = VideoMaterial(avPlayer: player) }
VideoMaterialͷEntityͷՃ boxAnchor.actions.addMovieToiPhone.onAction = { entity in self.videoMaterial?.avPlayer?.play() let thinBox =
MeshResource.generateBox( width: 0.125, height: 0.01, depth: 0.065) let screenEntity = ModelEntity( mesh: thinBox, materials: [self.videoMaterial!]) entity?.addChild(screenEntity) }
Demo Movie App ӈͷө૾ͰARΞϓϦͰ࣮ݱ ͠·͕ͨ͠ɺ͜Εͱಉ͜͡ͱ Λ࣮ࡍͷͱ࣮ࡍͷΞϓϦ ͰͬͯΈΑ͏ɺͱ͍͏ͷ͕ ࠓͷ͓Ͱ͢ɻ ͜ͷϓϨθϯͷऴΘΓʹɺ ຊͷΞϓϦΛಈ࡞ͤͨ͞σ
ϞΛ͓ݟͤ͠·͢ɻ
લఏ݅ ʢ̍ʣ͕20~30 ʢ̎ʣωοτϫʔΫʹґଘ͠ͳ͍ ʢ̏ʣࣗಈతͳάϧʔϐϯά ʢ̐ʣ༗ػతͳάϧʔϐϯά
લఏ݅ ʢ̍ʣ͕20~30 ʢ̎ʣωοτϫʔΫʹґଘ͠ͳ͍ ʢ̏ʣࣗಈతͳάϧʔϐϯά ʢ̐ʣ༗ػతͳάϧʔϐϯά
Plan A : Core Bluetooth ۙڑແઢͱ͍͑Bluetooth पғͷແઢঢ়گʹґଘͤͣʹɺؒͰ௨৴Λ͢Δ͜ͱ͕Ͱ͖·͢ ͜ΕͰάϧʔϐϯάΛߦͬͯΈ·͢ɻ
Grouping with CoreBT CBCentral CBPeripheral CBCentral CBCentral CBCentral
Grouping with CoreBT Core BluetoothͰ̍ηογϣϯͷͷ্ݶ͕͋Γ·͢ɻ ڥσόΠεʹΑΔ͕ɺ͍͍ͩͨ̐ʙ̑͘Β͍ɻ ʢલఏ݅̍ΛΫϦΞͰ͖·ͤΜʣ
Plan B : Core BT & Core BT Core Bluetooth
ͰෳηογϣϯΛߟ͑ͯΈ·͠ΐ͏
Double Session ?
Double Session ?
Sessions in Core Bluetooth Core Bluetooth Ͱɺ1ϓϩηε͋ͨΓԼهͷηογϣϯ͔࣋ͯ͠ͳ͍ Peripheralͱͯ͠ͷηογϣϯ : 1
Centralͱͯ͠ͷηογϣϯ : 1
Double Session
Double Session ͜ͷ Peripheralͱ CentralΛ͔ͶΔɻ
Double Session ͜ͷߏ͕ಈ͚ 20ఔͷάϧʔ ϓ͕࡞Ͱ͖Δ ͣ……ɻ
࣮ͯ͠Έ·ͨ͠ɻ
Double Session πϦʔߏͷά ϧʔϓܗͰ͖ ͨͷͷɺඇৗʹ ෆ҆ఆ
Ͳ͏͠Α͏……ɻ
ͦͷλΠϛϯάͰ88%$
ωοτϫʔΫϥϘͰ૬ஊͯ͠Έ·ͨ͠
Plan C : Multipeer Connectivity ʮ ……ͬͯײ͡ͰωοτϫʔΫΛ࡞Γ͍ͨΜ͚ͩͲ͍͍Ҋ͋Δʁʯ : ͦΕͳΒ Multiplier
Connectivity͕͍͍Αʂ
Plan C : Multipeer Connectivity Multipeer ConnectivityɺωοτϫʔΫϨΠϠʔͱͯ͠Bluetooth·ͨ peer to peer
WiFiΛ͍ͬͯ·͢ɻ
Multipeer Connectivity Apple Engineer ʹΑΔͱɺݱࡏͰ΄ͱΜͲͷͰ peer to peer WiFi Λ͍ͬͯΔͦ͏ɻ
1ηογϣϯ͋ͨΓͷެশ̓ʙ̔ ෳͷηογϣϯΛ࣋ͭ͜ͱ͕Ͱ͖Δɻ
Single session network
Double session network
Double Session with MC ࣮ͯ͠Έͨͱ͜Ζɺ̎ͭͷηογϣϯͰ҆ఆͨ͠௨৴Λߦ͏͜ͱ͕Ͱ ͖·ͨ͠ɻ
લఏ݅ ʢ̍ʣ͕20~30 ʢ̎ʣωοτϫʔΫʹґଘ͠ͳ͍ ʢ̏ʣࣗಈతͳάϧʔϐϯά ʢ̐ʣ༗ػతͳάϧʔϐϯά
લఏ݅ ʢ̍ʣ͕20~30 ʢ̎ʣωοτϫʔΫʹґଘ͠ͳ͍ ʢ̏ʣࣗಈతͳάϧʔϐϯά ʢ̐ʣ༗ػతͳάϧʔϐϯά
MultipeerConnectivity Network ֤ɺଓ༻ͷ unique ͳ Peer IDΛੜ͠·͢ɻ(MCPeerID) ֤ɺMCNearbyServiceAdvertiserͰɺपғʹΞυόλΠζΛ͠·͢ɻ MCNearbyServiceBrowserΛ͏ͱɺपғͷΞυόλΠζΛ͍ͯ͠Δ Λൃݟ͢Δ͜ͱ͕Ͱ͖·͢ɻ
A͔ΒɺBଓ͢Δ߹ʹɺηογϣϯΛ࡞͠ɺInvitation ΛA͔ΒBૹ৴͢ΔɻB͕InvitationΛड͢Δͱηογϣϯཱ͕͢Δɻ
ΞυόλΠζ /// पғAdvertise͠·͢ɻ var advertiser: MCNearbyServiceAdvertiser? advertiser = MCNearbyServiceAdvertiser( ɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹpeer:
myID, discoveryInfo: ["DeviceName":deviceName], serviceType: serviceID) advertiser?.delegate = self advertiser?.startAdvertisingPeer() BEWFSUJTJOH
पғͷͷ୳ࡧ /// BrowserΛ࡞͠ɺपғͷΛ୳ࡧ͠·͢ɻ var serviceBrowser: MCNearbyServiceBrowser? serviceBrowser = MCNearbyServiceBrowser(peer: myPeer,
serviceType: serviceID) serviceBrowser?.delegate = self serviceBrowser?.startBrowsingForPeers() /// delegateͰݟ͚ͭͨΛ֬ೝ͢Δ͜ͱ͕Ͱ͖·͢ɻ func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) { } BEWFSUJTJOH CSPXTJOH
ଞͷͷଓ serviceBrowser?.invitePeer(peer, to: session, withContext: nil, timeout: 10.0) BEWFSUJTJOH CSPXTJOH
TFOE JOWJUBUJPO
Ϧʔμʔ͔ΒInvitationΛૹΔ
None
Ͳͷ͕Ϧʔμʔʁ
Ϧʔμʔͷܾఆ PeerID Λ Random ͳ Int PeerID ͷେখͰϦʔμʔΛܾఆ
ىಈʜʜ
֤ࣗ*%ΛऔಘɺΞυόλΠζ
पғͷͷ*%Λ୳ࡧ͠ɺʮʯ ͕ϦʔμʔͰ͋ΔͱΘ͔Δ पғͷͷ*%Λ୳ࡧ͠ɺ͕ࣗ
ϦʔμʔͰ͋ΔͱΘ͔Δɻ
ͭͷηογϣϯΛ࡞Γɺͦ ΕͧΕ*OWJUBUJPOΛૹ৴
session A session
B
લఏ݅ ʢ̍ʣ͕20~30 ʢ̎ʣωοτϫʔΫʹґଘ͠ͳ͍ ʢ̏ʣࣗಈతͳάϧʔϐϯά ʢ̐ʣ༗ػతͳάϧʔϐϯά
લఏ݅ ʢ̍ʣ͕20~30 ʢ̎ʣωοτϫʔΫʹґଘ͠ͳ͍ ʢ̏ʣࣗಈతͳάϧʔϐϯά ʢ̐ʣ༗ػతͳάϧʔϐϯά
άϧʔϓܗޙͷΠϕϯτ ৽ͨͳͷࢀՃ άϧʔϓ͔Βͷͷ
৽ͨͳͷࢀՃ ϦʔμʔΑΓऑ͍ ϦʔμʔΑΓڧ͍
ϦʔμʔΑΓऑ͍ͷࢀՃ session A
session B
ϦʔμʔΑΓڧ͍ͷࢀՃ session A
session B
ϦʔμʔΑΓڧ͍ͷࢀՃ طଘͷηογϣϯΛ
͍ͬͨΜऴྃ
ϦʔμʔΑΓڧ͍ͷࢀՃ ࠶ɺपғͷͷ
୳ࡧΛߦ͏ɻ
ϦʔμʔΑΓڧ͍ͷࢀՃ
ϦʔμʔΑΓڧ͍ͷࢀՃ ৽ͨͳηογϣϯͷ࡞
άϧʔϓ͔Βͷͷ ϦʔμʔҎ֎͕ Ϧʔμʔ͕
ϦʔμʔҎ֎ͷͷ ϦʔμʔҎ֎͕
ϦʔμʔҎ֎ͷͷ ϦʔμʔҎ֎͕ͯ͠ ηογϣϯܧଓ͢Δ
Ϧʔμʔͷ Ϧʔμʔ͕
Ϧʔμʔͷ Ϧʔμʔ͕͢Δͱ ೋͭͷηογϣϯʹଐ͢Δ͕ͳ͘ͳͬͯ͠·͏ ͨΊɺωοτϫʔΫ͕ܧଓͰ͖ͳ͍
session A session
B
session A session B
༗ػతͳάϧʔϐϯά ͜ΕͰԼهͷΠϕϯτͷͯ͢ʹରԠ͠ɺࣗݾ৫Խ͢Δάϧʔϐϯάͱ ͳΓ·ͨ͠ɻ ϦʔμʔΑΓऑ͍ͷࢀՃ ϦʔμʔΑΓڧ͍ͷࢀՃ Ϧʔμʔͷ ϦʔμʔҎ֎ͷͷ
άϧʔϐϯάͷલఏ݅ ʢ̍ʣ͕20~30 ʢ̎ʣωοτϫʔΫʹґଘ͠ͳ͍ ʢ̏ʣࣗಈతͳάϧʔϐϯά ʢ̐ʣ༗ػతͳάϧʔϐϯά
ʢຊͷʣDEMO
None
άϧʔϐϯάશମͷΠϕϯτઃܭ ࣮ࡍͷάϧʔϐϯάॲཧʹɺ៛ີͳάϧʔϓશମઃܭ͕ඞཁ MultipeerConnectivityͷෳηογϣϯͷΠϕϯτͷϋϯυϦϯά ͯ͢ͷͷϢʔβʔೖྗͷϋϯυϦϯά ͦͷଞγεςϜΠϕϯτ
άϧʔϐϯάશମͷΠϕϯτઃܭ άϧʔϓશମͷΠϕϯτϧʔϓΛϦʔμʔͰઃܭ͠ɺ௨ৗͷΠϕϯτ ϧʔϓͱผʹཧ͢Δ͜ͱ͕·͍͠ɻ
Ԡ༻
MCͷ double session Ͱ Eternal Network
MCͷ double session Ͱ Tree Network 73 iPhones!
iPhone 73 iPhone 11 ͷ࠷҆Ϟσϧ 74,800ԁʢ੫ผʣ 73ͩͱɺ੫ࠐΈͰ̒̌̌ສ̒̐̐̌ԁ ࢿ͕ۚू·ͬͨΒݺΜͰ͍ͩ͘͞ɻ
·ͱΊ MultiPeer ConnectivityͷෳηογϣϯΛ׆༻͢Δ͜ͱʹΑΓɺଟͷΛ ಉظ͢Δ͜ͱ͕Ͱ͖·͢ɻ ࣗݾ৫Խ͢ΔάϧʔϐϯάઃܭΛߦ͏߹ʹηογϣϯͷͷࢀՃɾ ॲཧʹҙ͢Δඞཁ͕͋Γ·͢ɻ ARΛ͏ͱৗੜ׆ͷதͰͷΞϓϦར༻ DEMO Λ؆୯ʹ࡞Ε·͢ɻ ϦΞϧΞόλʔͰͷొஃݟͨΑΓͣͬͱϋʔυͰ͢ɻࢎܽʹͳΓͦ͏Ͱ
͢ɻ͓͢͢Ί͠·ͤΜɻ