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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Akio Itaya
August 20, 2024
Programming
490
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
42
How to stabilize UI tests using XCTest
akkeylab
0
180
Bringing Spatial Web to E-Commerce
akkeylab
0
95
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
430
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
OS アップデート対応の取り組み方がもっと共有されてほしい
andpad
0
100
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
240
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
180
はてなアカウント基盤 State of the Union
cockscomb
1
1.1k
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
130
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
800
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
6.6k
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
420
スマートグラスで並列バイブコーディング
hyshu
0
270
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
770
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
15
8k
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
620
Featured
See All Featured
How to Talk to Developers About Accessibility
jct
2
270
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
160
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
460
Statistics for Hackers
jakevdp
799
230k
From π to Pie charts
rasagy
0
220
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
740
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
380
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
400
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
250
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
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 !!