Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Synchronized iPhones, Again!
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
420
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
700
ARKit3
toyship
4
7.7k
UIViewPropertyAnimator and Easing
toyship
2
1.2k
Synchronized iPhones!
toyship
3
5.1k
Other Decks in Technology
See All in Technology
BedrockとLambdaで作る リアルタイム進行型推理ゲーム
kawametho
0
190
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
2
300
IoTデバイスを繋げるプロトコルMatterをAndroidで使用する方法
harutiro
0
120
AI Made Us Faster at Solving the Wrong Problems
marceloancelmo
0
160
DAMOS - The Smart Cruise Control for RAM
ennael
PRO
1
130
AI駆動開発、viviONの1年 ── うまくいったこと・いかなかったこと
vivion
0
240
営業オントロジーの作り方と、エージェントからの辿り方 ── ナレッジワークの現場から
kworkdev
PRO
1
260
SREでアラート疲れを 解決しよう!
kairim0
1
200
LLM機能を自作して分かるSnowflake Cortex AIの強み
nayuts
0
290
サーバーフルコンピューティング?AWS Lambda
iwatatomoya
1
240
並行性の問題を防げ!実践トランザクション入門
occhi
0
260
検証フェーズはAIの回答を判断するための学習機会
toru_kubota
2
500
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
550
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
580
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
570
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
560
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
310
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
550
Side Projects
sachag
456
43k
Faster Mobile Websites
deanohume
310
32k
BBQ
matthewcrist
89
10k
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 Λ؆୯ʹ࡞Ε·͢ɻ ϦΞϧΞόλʔͰͷొஃݟͨΑΓͣͬͱϋʔυͰ͢ɻࢎܽʹͳΓͦ͏Ͱ
͢ɻ͓͢͢Ί͠·ͤΜɻ