这让我疯了......我以前工作得很好,不知道发生了什么变化.我通过蓝牙连接到专有的公司设备,它有auth芯片和(正如我所说)之前一切都很好.
我的iPad和配件都显示它们彼此连接.然而,当我尝试在我的应用程序中与设备通信时,大多数时候EAAccessoryManager甚至都找不到它......但偶尔我可以连接.是什么赋予了?
-(void)scanForDevice
{
NSArray *accList = [[EAAccessoryManager sharedAccessoryManager] connectedAccessories];
// This is ZERO every time...even though iPad and device both indicate connection.
DLog(@"accList count: %i", accList.count);
for (EAAccessory *accessory in accList)
{
for (NSString* protocolString in accessory.protocolStrings) {
if ([protocolString isEqualToString:[redacted]]) {
[self connectToAccessory:accessory];
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
ETA:我已经连接了一个按钮来调用showBluetoothAccessoryPicker ...方法在应用程序中显示蓝牙选择器.这导致了更多的混乱.iPad告诉我的配件我已经连接到(在设置中)显示在选择器中.单击它时,控制台输出如下:
2014-04-01 16:48:00.324 Subview[3438:60b] BTM: attempting to connect to service 0x00000080 on device [redacted] 00:07:80:73:06:01
2014-04-01 16:48:02.497 Subview[3438:60b] BTM: connection to service 0x00000080 on device [redacted] 00:07:80:73:06:01 …Run Code Online (Sandbox Code Playgroud) 我有一个连接到附件的应用程序,当我断开附件时,我创建的EASession是为了与附件通信泄漏.
当附件连接时,我收到通知,并检查EAAccessoryManager的附件集合,以查找具有使用某种协议的特定名称的附件.当我发现这个时,我使用代码为该附件创建了一个EASession对象:
-(void) openSession
{
... // finds accessory object
if (accessory)
{
[self closeSession];
session = [EASession alloc];
NSLog(@"alloc :: session retainCount: %i", session.retainCount);
[session initWithAccessory:accessory forProtocol:SmokeSignalsProtocolName];
NSLog(@"init :: session retainCount: %i", session.retainCount);
[[session inputStream] open];
[[session outputStream] open];
... // other logic (pump run loop, etc..)
}
}
-(void) closeSession
{
if (session)
{
[[session inputStream] close];
[[session outputStream] close];
[session release], session = nil;
}
}
Run Code Online (Sandbox Code Playgroud)
通常我在一行上有alloc和init,但我发现(将其分离出来)是alloc给出了+1保留计数(正如你所期望的那样)但是我iniWithAccessory:forProtocol:给它+3保留计数当我只会期望来自init方法的+2 retainCount.
泄漏仪器似乎也支持这一点:

一步一步看看泄漏仪器:
[???Accessory openSession] …我[UIScreen screens]在iOS 5.0.1中看到奇怪的行为,我们在崩溃时登录Flurry.有时[UIScreen screens]会返回一个空数组.我们的应用程序通过EAAccessory框架实现对外部附件的支持.这种行为是完全出乎意料的,因为即使Apple的文档说从该方法返回的数组总是包含至少一个条目.
根据iOS6以后的EAAccessoryManager类参考使用showBluetoothAccessoryPickerWithNameFilter,我们可以显示一个附件选择器,它将帮助用户连接外部附件,包括iAP over Bluetooth唯一ID.
现在我们想要以编程方式连接该列表中的一个外部附件.
我们需要您的支持.
我们如何以编程方式连接手机范围内的任何外部设备?
如何在没有用户交互的情况下以编程方式连接任何外部设备?
我们如何以编程方式获得用户手机范围内的外部设备列表?
我们如何获得范围内但未连接的外部设备的EAAccessory对象列表?
我们可以在NSUserDefaults中存储EAAccessory对象吗?如果是的话,我们怎么做?由于EAAccessory EAAccessory未实现encodeWithCoder和initWithCoder方法,因此它不允许将其存储到NSUserDefaults中.
使用BTLE我们可以解决这个问题,但我们想要BT Classic中的解决方案.
我在Apple网站上发现:
还提供支持以唤醒先前未自动连接的配对附件.
这对我来说很有用,因为用户在启动应用程序之前不需要每次都进行配对.
我提到了EAAccessory Manager API,但似乎没有这样的调用.
任何人都可以提供有关此主题的更多参考资料,我该如何去做?
我最近开始使用这种EAAccessoryManager showBluetoothAccessoryPickerWithNameFilter方法,以便在我们的应用程序启动时连接到我们的MFI蓝牙配件(如果它还没有连接).我遇到了以下情况:
EAAccessoryDidConnectNotification在用户通过按"取消"取消附件选择器之前,应用程序不会收到.在我上面已经解释的情况下,即使我们连接到我们定义的附件NSPredicate,选择器也会挂起,我们不会收到附件已连接的通知,直到调用拾取器的完成块为止.用户有点陷入困境.
我们正在运行iOS 7.1.1并已针对7.1和7.0进行了测试.
任何帮助,将不胜感激.这是一些显示我所看到的日志:
2014-04-28 12:03:48.028 App[508:60b] BTM: attaching to BTServer
2014-04-28 12:03:48.262 App[508:60b] BTM: setting pairing enabled
2014-04-28 12:03:55.578 App[508:60b] BTM: attempting to connect to service 0x00000001 on device "Accessory-10" 00:07:80:79:92:8D
2014-04-28 12:03:55.966 App[508:60b] BTM: connection to service 0x00000001 on device "Accessory-10" 00:07:80:79:92:8D succeeded
2014-04-28 12:03:55.991 App[508:60b] BTM: attempting to connect to service 0x00000080 on device "Accessory-10" 00:07:80:79:92:8D
2014-04-28 12:03:56.024 App[508:60b] BTM: connection to service 0x00000080 …Run Code Online (Sandbox Code Playgroud) 我有一个iOS应用程序.我可以成功连接到我的配对EAAccessory(蓝牙经典).我能够从通过EAAccessory对象公开的设备中提取信息.我注意到的一件事是配对设备的名称(在我的设置 - >蓝牙 - >我的设备列表中)与我的EAAccessory对象公开的设备名称不匹配.我觉得这很奇怪.
有没有办法通过我的iOS应用程序获取设备的实际名称(来自"设置"页面的名称)?
如Apple文档中所示,可以通过EAAccessory Framework进行与认证附件(由Apple认证)的通信.但我有点困惑,因为有些帖子告诉我它也可以通过CoreBluetooth制作.
我还读到CoreBlueTooth仅受iOS 5支持,iPhone 4S可以与外部附件通信.
问题是"我应该同时使用CoreBluetooth和EAAccessory Framework(我认为在这种情况下我将不得不测试设备模型和iOS版本的组合)或者EAAccessory Framework是否足够? ".
eaaccessory ×8
ios ×7
bluetooth ×5
accessory ×1
ipad ×1
memory-leaks ×1
swift ×1
uiscreen ×1
xcode ×1