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
510
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
Building a Meta Ray-Ban display app
akkeylab
0
190
What If Your App Could Debug Itself?
akkeylab
0
96
How to stabilize UI tests using XCTest
akkeylab
0
210
Bringing Spatial Web to E-Commerce
akkeylab
0
110
Learn CPU architecture with Assembly
akkeylab
1
2.2k
Porting a visionOS App to Android XR
akkeylab
0
1.2k
How to handle 3D content on Android XR
akkeylab
0
260
Create a website using Spatial Web
akkeylab
0
440
How to build visionOS apps using Windows
akkeylab
0
240
Other Decks in Programming
See All in Programming
Deep dive into the select statement (GopherCon UK)
jespino
0
170
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
270
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
110
ソフトウェアラスタライザ
fadis
1
790
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
360
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
160
不幸な GC
chencmd
0
890
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
4
1.1k
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
260
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
スマート反転とウェブアクセシビリティ
camiha
0
140
Featured
See All Featured
Speed Design
sergeychernyshev
33
2.1k
We Have a Design System, Now What?
morganepeng
55
8.3k
Darren the Foodie - Storyboard
khoart
PRO
3
3.9k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
690
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
400
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
510
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
510
Designing for Performance
lara
611
70k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
76k
Color Theory Basics | Prateek | Gurzu
gurzu
0
460
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
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 !!