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

EAAccessoryManager connectedAccessories返回空数组(热敏打印机场景)

解决方案:iOS应用重启后无法发现已连接热敏打印机的问题

以下是针对你遇到的场景,在应用层面可实施的修复方案:

  • 强制触发配件重新扫描
    不要仅依赖connectedAccessories的缓存结果,主动调用扫描方法让系统重新同步配件状态,即使iOS设置里显示已连接也需要这一步:

    // 在应用启动或打印前执行扫描
    NSSet *targetProtocols = [NSSet setWithObject:@"你的打印机协议字符串"];
    EAAccessoryManager *manager = [EAAccessoryManager sharedAccessoryManager];
    [manager startSearchingForAccessoriesWithProtocols:targetProtocols];
    
    // 扫描启动后等待1秒再查询结果(根据实际情况调整等待时长)
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSArray *availableAccessories = manager.connectedAccessories;
        // 筛选目标打印机并处理
    });
    
    // 扫描完成后记得停止,避免资源消耗
    [manager stopSearchingForAccessories];
    
  • 监听配件连接状态通知
    注册系统通知实时获取配件状态变化,替代单次查询的方式,确保能捕捉到重启后配件的连接状态:

    // 在初始化模块(如AppDelegate或打印工具类)中注册通知
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center addObserver:self
               selector:@selector(handleAccessoryConnected:)
                   name:EAAccessoryDidConnectNotification
                 object:nil];
    [center addObserver:self
               selector:@selector(handleAccessoryDisconnected:)
                   name:EAAccessoryDidDisconnectNotification
                 object:nil];
    
    // 实现通知回调
    - (void)handleAccessoryConnected:(NSNotification *)note {
        EAAccessory *accessory = note.userInfo[EAAccessoryKey];
        // 校验配件协议是否匹配目标打印机,再进行连接处理
    }
    
  • 应用退出时清理会话资源
    在应用即将终止时,主动关闭所有已打开的EASession并释放资源,避免系统认为配件仍被你的应用占用:

    - (void)applicationWillTerminate:(UIApplication *)application {
        if (self.activePrintSession) {
            [self.activePrintSession close];
            self.activePrintSession = nil;
        }
    }
    
  • 重置配件管理器状态(极端场景)
    如果上述方法无效,可尝试通过注销再重新注册通知的方式重置管理器状态:

    EAAccessoryManager *manager = [EAAccessoryManager sharedAccessoryManager];
    [manager unregisterForLocalNotifications];
    [manager registerForLocalNotifications];
    
    NSSet *targetProtocols = [NSSet setWithObject:@"你的打印机协议字符串"];
    [manager startSearchingForAccessoriesWithProtocols:targetProtocols];
    

额外注意:请再次确认Info.plist中UISupportedExternalAccessoryProtocols数组里的协议字符串,与打印机实际使用的协议完全一致(包括大小写和格式)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:35:15