Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Synchronized iPhones, Again!
Tachibana Kaoru
September 21, 2020
Technology
2
1k
Synchronized iPhones, Again!
iOSDC 2020
https://fortee.jp/iosdc-japan-2020/proposal/3a9b496e-8745-4d1d-8952-8ac45a42ca8a
Tachibana Kaoru
September 21, 2020
Tweet
Share
More Decks by Tachibana Kaoru
See All by Tachibana Kaoru
GeoLocationAnchor and MKTileOverlay
toyship
0
150
Custom Group Activities
toyship
3
880
ARKit4.pdf
toyship
1
1.7k
Custom Gesture Recognizer on iOS
toyship
3
940
HEVC Video with Alpha Channel
toyship
1
750
RealityKit & Reality Composer
toyship
3
330
ARKit3
toyship
5
6.5k
UIViewPropertyAnimator and Easing
toyship
2
690
Synchronized iPhones!
toyship
3
3.7k
Other Decks in Technology
See All in Technology
PCL (Point Cloud Library)の基本となぜ点群処理か_2023年_第2版.pdf
cvmlexpertguide
0
160
20230121_BuriKaigi
oyakata2438
0
180
ラズパイとGASで加湿器の消し忘れをLINEでリマインド&操作
minako__ph
0
150
創業1年目のスタートアップでAWSコストを抑えるために取り組んでいること / How to Keep AWS Costs Down at a Startup
yuj1osm
3
2.1k
目指せCoverage100%! AutoScale環境におけるSavings Plans購入戦略 / JAWS-UG_SRE_Coverage
taishin
0
500
ECテックカンファレンス2023 EC事業部のモバイル開発2023
tatsumi0000
0
300
ユーザーテストガイドライン VERSION 2.0
kouzoukaikaku
0
1.3k
あつめたデータをどう扱うか
skrb
2
160
マイクロサービス宣言から8年 振り返りとこれから / Eight Years After the Microservices Declaration A Look Back and A Look Ahead
eisuke
2
150
開発者と協働できるメトリクスダッシュボードを作ろう!/SRE Lounge 2023
lmi
2
460
【NGK2023S】 ノードエディタ形式の画像処理ツール「Image-Processing-Node-Editor」
kazuhitotakahashi
0
280
Stripe / Okta Customer Identity Cloud(旧Auth0) の採用に至った理由 〜モリサワの SaaS 戦略〜
tomuro
0
130
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
217
21k
How New CSS Is Changing Everything About Graphic Design on the Web
jensimmons
214
12k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
152
13k
GitHub's CSS Performance
jonrohan
1020
430k
Statistics for Hackers
jakevdp
785
210k
Designing with Data
zakiwarfel
91
4.2k
The Straight Up "How To Draw Better" Workshop
denniskardys
226
130k
Principles of Awesome APIs and How to Build Them.
keavy
117
15k
Building Adaptive Systems
keathley
27
1.3k
Teambox: Starting and Learning
jrom
124
7.9k
Code Reviewing Like a Champion
maltzj
508
38k
Ruby is Unlike a Banana
tanoku
93
9.5k
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 Λ؆୯ʹ࡞Ε·͢ɻ ϦΞϧΞόλʔͰͷొஃݟͨΑΓͣͬͱϋʔυͰ͢ɻࢎܽʹͳΓͦ͏Ͱ
͢ɻ͓͢͢Ί͠·ͤΜɻ