我们有MFI认可的配件设备.我们的协议假定在UART模式下从附件读取连续读数.它在iOS 7.1之前完美运行,但在iOS 7.1上测试之后它无法正常工作.
在ATS测试套件日志中,我们可以看到成功的eap记录和一些由iPhone激活的AccessoryDataTransfer.
我们可以使用EADemo重现问题.EADSessionController在一些显示/关闭循环后停止读取数据.
只有杀死EADemo并重新启动才能让我们读取一些数据.
配置:
iPhone 4和更新版(iOS 7.0),任何iPod(iOS 6.x) - OK
iPhone 4s,iPhone 5(iOS7.1) - 失败
iOS 7.1中的EA框架会发生什么?
我正在编写一个iOS应用程序,用于与迷你mPlay Drumi MP18B(小型蓝牙扬声器)进行通信。据我所知,showBluetoothAccessoryPickerWithNameFilter仅显示将协议字符串添加到Info.plist的“支持的外部附件协议”键中的设备。因此,我需要将此协议字符串添加到列表中。
在哪里可以找到该设备的协议字符串?互联网上任何地方都有设备支持的协议列表吗?大多数制造商并未在其技术规格中提及此信息。
Apple在文档中引用此协议字符串(或ID):
选择器仅显示在扩展查询响应中包括基于蓝牙的iAP唯一ID的蓝牙设备。
我需要做一个能够判断我当前是否连接到经典蓝牙设备的应用程序(实际上,它将是蓝牙车载设备).
我的第一步是告诉当前连接的经典蓝牙设备是什么.我不能使用CoreBluetooth因为它只适用于LE.我尝试使用外部附件框架.
这是代码(一个按钮启动方法):
- (IBAction)startMethodGetConnected:(id)sender {
NSLog(@"button taped");
// Get the number of accessories connected
NSUInteger NumberOfAccessoriesConnected = [[EAAccessoryManager sharedAccessoryManager].connectedAccessories count];
//Display the number
NSLog(@"number of accessories connected : %d", NumberOfAccessoriesConnected);
}
Run Code Online (Sandbox Code Playgroud)
当iPhone连接到蓝牙键盘和蓝牙耳机时我试过了.在这两种情况下,控制台都会显示该数字为0.
如何显示正确的数字?
我正在使用蓝牙的外部硬件设备我收到此错误,我无法获得蓝牙的许可,它工作到iOS9但我不知道为什么这种改变会影响iOS10?
错误:
[CoreBluetooth] API MISUSE:没有恢复标识符,但委托实现了centralManager:willRestoreState:方法.不支持恢复
2016-09-17无法找到"com.apple.private.externalaccessory.showallaccessories"权利
更新:
我在这里看到了这个错误 https://forums.developer.apple.com/thread/61646
我猜这是与 相关的后台模式ExternalAccessory.framework。
但是有关外部附件的文档说:“如果您的应用程序在附件通知到达时在后台暂停,则该通知将被放入队列中。当您的应用程序再次开始运行(无论是在前台还是后台)时,队列中的通知发送到您的应用程序。通知也会尽可能地合并和过滤,以消除任何不相关的事件。例如,如果在您的应用程序暂停时连接了配件并随后断开连接,您的应用程序最终将不会收到任何发生此类事件的指示.”。
这意味着外部配件通信将排队直到应用程序进入前台模式,但其他后台模式(如 )Location在Bluetooth LE后台模式下实时工作。所以我怀疑只是排队是唯一能做的事情。是不是真的?
我有一个Apple兼容的蓝牙设备.
现在,我正在尝试在应用程序中获取该设备的MAC地址.是否可以借助Apples"外部附件框架"获取蓝牙设备的MAC地址?
我听说不可能以正常方式获取MAC地址,但我不明白"外部附件框架"是否足以决定是否可以使用此框架.
我一直在尝试使用RN-42通过蓝牙2.1从设备读取数据.该设备与iPhone或iPad Mini配对,数据流短暂流动,但iOS和BT模块在几秒钟内(小于10)断开连接(取消配对).该设备输出的数据为5-10kB/s,完全符合蓝牙规范.我还注意到的一点是,当我运行函数NSInputStream,[NSInputStream read:maxLength:]时,返回的字节数总是158或更少.应用程序和硬件不会崩溃,但蓝牙只是取消配对.
即使断开连接,设备仍然会向RN42发送数据,从而降低了电子设备问题的可能性.此设置在Android设备上也可以完美运行.我可以在没有任何断开连接或崩溃的情况下流式传输数据.
我尝试过的事情......
有一点可行的是减慢数据传输速度(即小于5kB/s),因为它允许iOS和BT模块在断开连接之前保持连接并传输更长时间的数据.
#define EAD_INPUT_BUFFER_SIZE 1024
/**
* Stream delegate
*/
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
switch (eventCode) {
[... other cases ...]
case NSStreamEventHasBytesAvailable:
{
uint8_t buf[EAD_INPUT_BUFFER_SIZE];
unsigned int len = 0;
len = [(NSInputStream *)aStream read:buf maxLength:EAD_INPUT_BUFFER_SIZE];
if(len) {
// Read successful, process data
} else {
// Fail
}
break;
}
default:
break;
}
}
/**
* Stream delegate with polling (for better or worse)
*/
[...]
case NSStreamEventHasBytesAvailable: …Run Code Online (Sandbox Code Playgroud) 我查看了有关此的 Apple 文档,根据我的理解,在将正确的协议添加到 Info.plist 后,它似乎应该启动相应的应用程序?
能够与外部附件通信的应用程序应在 Info.plist 文件中声明它们支持的协议。声明对特定协议的支持可以让系统知道在连接该附件时可以启动您的应用程序。如果没有应用程序支持所连接的配件,系统可能会选择启动App Store并指出支持的应用程序。
我已经这样做了,但是当我插入配件时没有任何反应。否则该应用程序与配件配合得很好。
我知道这是可能的,因为我见过其他配件可以做到这一点,但无法弄清楚我做错了什么或缺少什么。任何帮助将不胜感激。
谢谢。
我正在使用被称为showBluetoothAccessoryPickerWithNameFilter:completion:外部附件框架的一部分的方法.它只返回iPhone找到的蓝牙设备,你可以选择一个连接到它.
如果我使用这个参数:showBluetoothAccessoryPickerWithNameFilter:nil completion:nil,它返回所有设备,但你可以使用NSPredicate(Filter参数)指定它应返回的设备.所以我尝试创建这样的谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self CONTAINS MyString"];
[[EAAccessoryManager sharedAccessoryManager] showBluetoothAccessoryPickerWithNameFilter:predicate completion:nil]
Run Code Online (Sandbox Code Playgroud)
但是当我运行应用程序时,会出现以下错误:
class不是键值MyString的键值编码兼容.
我认为问题是self谓词中的单词,因为在这种情况下self意味着当前类的实例.我对吗?如果我想只获取名称中包含MyString的设备,我该如何编写谓词?感谢你们.
我的问题是下一个>我必须从外部附件接收数据并保存到一个大的NSData,每次我收到一个流我必须将其复制NSData到另一个:
CompleteNSData = NSDataTx1 + NSDataTx2 + NSDataTx3;
Run Code Online (Sandbox Code Playgroud)
最后向用户显示整个信息.
ios ×8
bluetooth ×2
iphone ×2
objective-c ×2
ios10 ×1
ios7.1 ×1
mfi ×1
nsdata ×1
nspredicate ×1
nsstream ×1