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
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
410
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.7k
UIViewPropertyAnimator and Easing
toyship
2
1.2k
Synchronized iPhones!
toyship
3
5.1k
Other Decks in Technology
See All in Technology
Claude Teamプランの コスト最適化を考える
rfdnxbro
0
580
マイナンバーカード本人確認の実装比較(OAuth/OIDC Numa (Immersion) Workshop 2026) / 20260825 numa-12
oidfj
PRO
0
180
AI駆動開発はどこまで来たのか? ファインディの最新実態調査で読み解く現在地 Devin Con Tokyo
akiratom
1
680
Kiro5兄弟のいまどきのセキュリティ基礎知識
kentapapa
0
140
AI・HPC開発を支えるGPU環境の新しい選択肢 液冷GPUシステム「AquSys」の取り組み
gpuunite_official
0
240
RapidCopy2 Matrix I/Oエンジンによるファイルコピーソフトウェアの設計と実装
kengosawa2
1
400
サービス内で複数のOP・ASを連鎖させる(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
180
DDDのエッセンスを取り入れたAIでの開発
ak2ie
1
220
8bit CPU 2026
koba789
7
2.8k
現場回帰したデータエンジニアが考える AI 時代のキャリア開発 / Career Development in the Age of AI Perspectives from a Hands-on Data Engineer
medley
0
330
作って理解するCoding Agent 〜フレームワークに頼らないピュア Python での実装〜
takapy
4
1.2k
:syncing_time:
sksat
2
730
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
432
67k
4 Signs Your Business is Dying
shpigford
187
23k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Docker and Python
trallard
47
4.1k
Designing for Timeless Needs
cassininazir
1
450
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
How to build a perfect <img>
jonoalderson
1
5.9k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
430
How STYLIGHT went responsive
nonsquared
100
6.2k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
340
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 Λ؆୯ʹ࡞Ε·͢ɻ ϦΞϧΞόλʔͰͷొஃݟͨΑΓͣͬͱϋʔυͰ͢ɻࢎܽʹͳΓͦ͏Ͱ
͢ɻ͓͢͢Ί͠·ͤΜɻ