//
// ARUserAuth.swift
// XRSandbox
//
// Created by Andy Wyatt on 3/15/26.
//
import SwiftUI
import RealityKit
import ARKit
import AVFoundation
import CoreMotion
public struct ARUserAuth {
public static var isAvailableAndAuthorizedByUser: Bool {
guard ARWorldTrackingConfiguration.isSupported else { return false }
return hasCameraAuthorization && hasMotionAuthorization
}
public static var hasCameraAuthorization: Bool {
let authStatus = AVCaptureDevice.authorizationStatus(for: .video)
if authStatus == .notDetermined {
requestUserAuthorizationForCamera()
}
return authStatus == .authorized
}
public static func requestUserAuthorizationForCamera() {
print("ARUserAuth: Camera access not determined, requesting user authorization")
AVCaptureDevice.requestAccess(for: .video) { granted in
if granted {
print("ARUserAuth: App access to Camera authorized by user")
// since these are modal popups, request Motion & Fitness only after Camera access granted
if coreMotionAuthorizationStatus == .notDetermined {
print("ARUserAuth: Motion & Fitness access not determined, requesting user authorization")
self.requestUserAuthorizationForMotion()
}
} else {
print("ARUserAuth: App access to Camera denied by user")
}
}
}
public static var coreMotionAuthorizationStatus: CMAuthorizationStatus {
//TODO: is this the best way to get this?
return CMPedometer.authorizationStatus()
}
public static var hasMotionAuthorization: Bool {
let authStatus = coreMotionAuthorizationStatus
return authStatus == .authorized
}
public static func requestUserAuthorizationForMotion() {
CMMotionActivityManager().queryActivityStarting(from: .now, to: .now, to: .main) { activity, error in
// shows the permission prompt if no authorization
print("ARUserAuth: App access to Motion & Fitness authorized by user")
}
}
}
Topic:
Graphics & Games
SubTopic:
RealityKit
Tags: