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

运行Apple官方Nearby Interactions项目报错NISession()返回错误求助

NISession初始化失败排查思路
  • 确认硬件与系统兼容性:iPhone 14搭载U1芯片,理论支持Nearby Interactions,但需确保系统版本在iOS 14.0及以上,建议使用正式版系统(避免测试版系统的兼容性bug)。
  • 检查权限配置:
    1. 确认项目Info.plist中已添加NSNearbyInteractionUsageDescription键,并填写清晰的权限说明文本(比如"需要使用Nearby Interactions功能检测附近设备")。
    2. 检查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:46:14