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
How to build visionOS apps using Persona
Search
Akio Itaya
August 20, 2024
Programming
480
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
How to build visionOS apps using Persona
iOS Engineer Meetup in Money Forward
https://moneyforward.connpass.com/event/323008
Akio Itaya
August 20, 2024
More Decks by Akio Itaya
See All by Akio Itaya
What If Your App Could Debug Itself?
akkeylab
0
32
How to stabilize UI tests using XCTest
akkeylab
0
170
Bringing Spatial Web to E-Commerce
akkeylab
0
90
Learn CPU architecture with Assembly
akkeylab
1
2.1k
Porting a visionOS App to Android XR
akkeylab
0
1.2k
How to handle 3D content on Android XR
akkeylab
0
240
Create a website using Spatial Web
akkeylab
0
420
How to build visionOS apps using Windows
akkeylab
0
220
Summary - Introducing enterprise APls for visionOS
akkeylab
0
580
Other Decks in Programming
See All in Programming
AI時代のUIはどこへ行く?その2!
yusukebe
19
6.7k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
310
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
290
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
340
oxlintはeslint/typescript-eslintを置き換えられるのか
shomafujita
2
320
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
4.2k
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
120
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
230
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
830
RTSPクライアントを自作してみた話
simotin13
0
490
CSC307 Lecture 17
javiergs
PRO
0
310
AI駆動開発で崩れていくコードベースを立て直す
kyoko_nr_nr
1
440
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Being A Developer After 40
akosma
91
590k
Deep Space Network (abreviated)
tonyrice
0
160
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
130
Become a Pro
speakerdeck
PRO
31
6k
Agile that works and the tools we love
rasmusluckow
331
21k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
280
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Designing for Timeless Needs
cassininazir
1
250
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
150
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Transcript
AKKEY / AKIO ITAYA తͳ visionOS ΞϓϦ։ൃज़ iOS Engineer Meetup
in Money Forward Persona Λ׆༻
Apple Vision Pro ઐ༻ Ξόλʔػೳ Persona
Persona Anywhere
Persona Viewer
Persona & Camera AVFoundation Persona
Persona & Camera AVFoundation ARKit Persona Main Camera visionOS 2
final class PersonaProvider: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate { private let session =
AVCaptureSession() private override init() { super.init() guard let device = AVCaptureDevice.systemPreferredCamera, let input = try? AVCaptureDeviceInput(device: device) else { return } #if targetEnvironment(simulator) #else session.addInput(input) #endif } }
final class PersonaProvider: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate { private let session =
AVCaptureSession() private override init() { super.init() guard let device = AVCaptureDevice.systemPreferredCamera, let input = try? AVCaptureDeviceInput(device: device) else { return } #if targetEnvironment(simulator) #else session.addInput(input) #endif } }
None
None
final class PersonaProvider: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate { private let session =
AVCaptureSession() private override init() { super.init() guard let device = AVCaptureDevice.systemPreferredCamera, let input = try? AVCaptureDeviceInput(device: device) else { return } #if targetEnvironment(simulator) #else session.addInput(input) #endif let output = AVCaptureVideoDataOutput() output.setSampleBufferDelegate(self, queue: DispatchQueue(label: "camera_queue")) session.addOutput(output) } }
final class PersonaProvider: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate { private let session =
AVCaptureSession() private override init() { super.init() guard let device = AVCaptureDevice.systemPreferredCamera, let input = try? AVCaptureDeviceInput(device: device) else { return } #if targetEnvironment(simulator) #else session.addInput(input) #endif let output = AVCaptureVideoDataOutput() output.setSampleBufferDelegate(self, queue: DispatchQueue(label: "camera_queue")) session.addOutput(output) } func captureOutput(_ output: AVCaptureOutput, didOutput: CMSampleBuffer, from: AVCaptureConnection) { guard let imageBuffer = CMSampleBufferGetImageBuffer(didOutput) else { return } let ciImage = CIImage(cvImageBuffer: imageBuffer) let uiImage = UIImage(ciImage: ciImage) } }
Multipeer Connectivity Multipeer Connectivity Framework
final class SessionContainer: NSObject, ObservableObject { private let session =
MCSession(peer: peerId) private let nearbyServiceBrowser = MCNearbyServiceBrowser(peer: peerId, serviceType: serviceType) override init() { super.init() session.delegate = self nearbyServiceBrowser.delegate = self } } extension SessionContainer: MCNearbyServiceBrowserDelegate { } extension SessionContainer: MCSessionDelegate { }
final class SessionContainer: NSObject, ObservableObject { private let session =
MCSession(peer: peerId) private let nearbyServiceBrowser = MCNearbyServiceBrowser(peer: peerId, serviceType: serviceType) override init() { super.init() session.delegate = self nearbyServiceBrowser.delegate = self } } extension SessionContainer: MCNearbyServiceBrowserDelegate { func browser(_ browser: MCNearbyServiceBrowser, foundPeer: MCPeerID, withDiscoveryInfo: [String: String]?) { browser.invitePeer(foundPeer, to: session, withContext: nil, timeout: 30) } } extension SessionContainer: MCSessionDelegate { }
final class SessionContainer: NSObject, ObservableObject { private let session =
MCSession(peer: peerId) private let nearbyServiceBrowser = MCNearbyServiceBrowser(peer: peerId, serviceType: serviceType) private var selectedPeer: MCPeerID? override init() { super.init() session.delegate = self nearbyServiceBrowser.delegate = self } } extension SessionContainer: MCNearbyServiceBrowserDelegate { func browser(_ browser: MCNearbyServiceBrowser, foundPeer: MCPeerID, withDiscoveryInfo: [String: String]?) { browser.invitePeer(foundPeer, to: session, withContext: nil, timeout: 30) } } extension SessionContainer: MCSessionDelegate { func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) { selectedPeer = session.connectedPeers.first } }
final class SessionContainer: NSObject, ObservableObject { private let session =
MCSession(peer: peerId) private let nearbyServiceBrowser = MCNearbyServiceBrowser(peer: peerId, serviceType: serviceType) private var selectedPeer: MCPeerID? override init() { super.init() session.delegate = self nearbyServiceBrowser.delegate = self PersonaProvider.shared.updateFrame = { [weak self] image in if let self, let selectedPeer, let data = image.jpegData(compressionQuality: quality) { try? session.send(data, toPeers: [selectedPeer], with: .reliable) } } } } extension SessionContainer: MCNearbyServiceBrowserDelegate { func browser(_ browser: MCNearbyServiceBrowser, foundPeer: MCPeerID, withDiscoveryInfo: [String: String]?) { browser.invitePeer(foundPeer, to: session, withContext: nil, timeout: 30) } } extension SessionContainer: MCSessionDelegate { func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) { selectedPeer = session.connectedPeers.first } }
Thank you !!