You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI开发Apple Watch应用能否调用iPhone相机扫描QR-Code登录

Apple Watch 扫码登录(调用iPhone相机)实现方案

watchOS 没有提供直接唤起iPhone相机的系统级API,跨设备调用能力全部基于WatchConnectivity框架实现,完整实现流程如下:

  • 基础能力配置
    iPhone端与Watch端都需要在应用启动时初始化并激活WCSession,保证两端通信链路可用,核心初始化代码:
    import WatchConnectivity
    
    class WCSessionManager: NSObject, WCSessionDelegate {
        static let shared = WCSessionManager()
        private override init() {
            super.init()
            guard WCSession.isSupported() else { return }
            WCSession.default.delegate = self
            WCSession.default.activate()
        }
    
        func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {}
        
        #if os(iOS)
        func sessionDidBecomeInactive(_ session: WCSession) {}
        func sessionDidDeactivate(_ session: WCSession) {}
        #endif
    }
    
  • Watch端发起扫码请求
    用户点击Watch端登录页的扫码按钮时,先校验WCSession连通状态,确认iPhone可通信后发送扫码指令,等待iPhone端回传扫码结果:
    // Watch端扫码触发逻辑
    func triggerPhoneScan() {
        guard WCSession.default.isReachable else {
            // 自行实现iPhone未连接的提示逻辑
            return
        }
        WCSession.default.sendMessage(
            ["requestType": "qrLoginScan"],
            replyHandler: { res in
                guard let authToken = res["authToken"] as? String else { return }
                DispatchQueue.main.async {
                    // 拿到凭证后执行Watch端登录逻辑
                    self.completeLogin(token: authToken)
                }
            },
            errorHandler: { err in
                // 自行实现通信失败的错误提示
            }
        )
    }
    
  • iPhone端响应请求,完成扫码回传
    iPhone端监听WCSession的消息回调,收到扫码请求后:若应用在前台直接拉起自定义QR码扫描页(可用AVFoundation实现扫码能力,或调用系统ImagePicker限制媒体类型为二维码);若应用在后台可触发本地通知引导用户点击打开应用扫码。识别到有效登录凭证后,直接通过消息回调的replyHandler把结果回传给Watch端即可:
    // iPhone端消息监听逻辑
    func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
        guard let type = message["requestType"] as? String, type == "qrLoginScan" else {
            replyHandler([:])
            return
        }
        DispatchQueue.main.async {
            // 拉起扫码页,识别完成后回调结果
            self.showQRScanPage { scanResult in
                replyHandler(["authToken": scanResult])
            }
        }
    }
    

注意事项:

  1. 禁止使用私有URL Scheme尝试直接跳转系统相机,该类实现会被App Store审核驳回
  2. 跨设备消息收发必须保证WCSession处于激活且可达状态,建议在UI上实时展示两端连接状态,避免用户点击无响应
  3. 如果应用最低适配watchOS 7及以上版本,也可以直接在Watch端基于AVCaptureSession实现本地扫码,无需唤起iPhone,缺点是Watch端取景范围小,远距离扫码体验较差

内容的提问来源于stack exchange,提问作者Pjaks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:18:21