运行Apple官方Nearby Interactions项目报错NISession()返回错误求助
NISession初始化失败排查思路
- 确认硬件与系统兼容性:iPhone 14搭载U1芯片,理论支持Nearby Interactions,但需确保系统版本在iOS 14.0及以上,建议使用正式版系统(避免测试版系统的兼容性bug)。
- 检查权限配置:
- 确认项目
Info.plist中已添加NSNearbyInteractionUsageDescription键,并填写清晰的权限说明文本(比如"需要使用Nearby Interactions功能检测附近设备")。 - 检查Xcode项目的Capabilities面板,确保Nearby Interactions开关已开启,避免配置缺失导致权限验证失败。
- 确认项目
- 验证硬件状态:确保设备的Wi-Fi、蓝牙处于开启状态(U1芯片依赖这两个模块),同时定位服务至少设置为"使用App期间允许"(部分场景下Nearby Interactions需要位置信息辅助)。
- 捕获详细错误日志:默认初始化无日志的话,手动添加错误捕获逻辑:
通过错误码可精准定位问题(比如let session = NISession() session.delegate = self // 实现NISessionDelegate方法获取错误详情 func session(_ session: NISession, didInvalidateWith error: Error) { print("NISession错误: \(error.localizedDescription)") if let niError = error as? NIError { print("NI错误码: \(niError.code.rawValue)") } }NIError.unauthorized对应权限不足,NIError.notSupported对应设备不支持)。
SwiftUI集成Nearby Interactions示例
以下是一个基础的SwiftUI集成示例,包含会话启停、权限检查、状态更新逻辑:
import SwiftUI import NearbyInteraction struct NearbyInteractionDemoView: View { @State private var sessionStatus = "未初始化" @State private var niSession: NISession? var body: some View { VStack(spacing: 24) { Text(sessionStatus) .font(.title2) .multilineTextAlignment(.center) Button("启动会话") { startNISession() } .buttonStyle(.borderedProminent) Button("停止会话") { stopNISession() } .buttonStyle(.bordered) } .padding() .onAppear(perform: checkDeviceSupport) } // 检查设备是否支持Nearby Interactions private func checkDeviceSupport() { NISession.isSupported { isSupported in DispatchQueue.main.async { sessionStatus = isSupported ? "设备支持,可启动会话" : "当前设备不支持Nearby Interactions" } } } // 启动NISession private func startNISession() { guard niSession == nil else { return } let newSession = NISession() newSession.delegate = sessionDelegate niSession = newSession sessionStatus = "会话已启动" // 获取本地DiscoveryToken(用于设备间识别) newSession.discoveryToken { token in if let token = token { print("本地DiscoveryToken: \(token)") // 可将token分享给其他设备进行交互 } } } // 停止并销毁NISession private func stopNISession() { niSession?.invalidate() niSession = nil sessionStatus = "会话已停止" } // 自定义Delegate处理会话事件 private var sessionDelegate: NISessionDelegateImpl { let delegate = NISessionDelegateImpl() delegate.statusHandler = { status in DispatchQueue.main.async { sessionStatus = status } } return delegate } } class NISessionDelegateImpl: NSObject, NISessionDelegate { var statusHandler: ((String) -> Void)? // 会话失效时触发 func session(_ session: NISession, didInvalidateWith error: Error) { let errorInfo = "会话失效: \(error.localizedDescription)" statusHandler?(errorInfo) if let niError = error as? NIError { print("NI错误码: \(niError.code.rawValue)") } } // 附近设备更新时触发 func session(_ session: NISession, didUpdate nearbyObjects: [NINearbyObject]) { guard let object = nearbyObjects.first else { return } let distance = object.distance ?? -1 let direction = object.direction ?? -1 statusHandler?("发现设备: 距离\(String(format: "%.2f", distance))m,方向\(String(format: "%.2f", direction))°") } } struct NearbyInteractionDemoView_Previews: PreviewProvider { static var previews: some View { NearbyInteractionDemoView() } }
这个示例涵盖了核心功能逻辑,你可以在此基础上扩展设备配对、距离监测等业务场景。
内容的提问来源于stack exchange,提问作者texasRanger009
相关产品推荐
相关产品推荐

