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
相关产品推荐
相关产品推荐

