[ios]启动 EASession 失败 — — EAAccessory 没有Protocol

我工作的 iOS app 与蓝牙 2.1 进行通信。它变为活动状态时,应用程序将连接到 BT。它正常工作如果 app 转入后台运行,并且再次成为活动的。

但我只注意到一个问题:

如果 BT 模块电源关闭,应用程序将得到通知哪里我做以下:

  - (void)accessoryDidDisconnect:(EAAccessory *)accessory
   
{
       
NSLog(@"EAController::accessoryDidDisconnect:");
        _selectedAccessory
= nil;
       
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"Lost connection. " delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
       
[alert show];
       
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
       
[defaults setBool:YES forKey:@"Lost Communication"];
       
[self closeSession];
   
}

然后我打开模块电源回来,转到设置蓝牙,-> 将 BT 模块连接到积极,iPhone (来自回背景)、 EASession 能不能启动:

if (_session == nil)
   
{
       
NSLog(@"EAController::openSession");
       
[_selectedAccessory setDelegate:self];
        _session
= [[EASession alloc] initWithAccessory:[self selectedAccessory] forProtocol:_protocolString];

       
if (_session)
       
{
                   
// Set up delegate........
       
}
       
else
       
{
           
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
           
[defaults setBool:NO forKey:Unit_Has_Connection_UserDefault_Key];
           
NSLog(@"creating session failed");
       
}
   
}

启动 _accessoryList 和 _selectedAccessory:

_accessoryList = [[NSMutableArray alloc] initWithArray:[[EAAccessoryManager sharedAccessoryManager] connectedAccessories]];
_selectedAccessory
= [_accessoryList objectAtIndex:0];

我发现了 _accessoryList,我使用的配件,但它是"协议"是空的。

$12 = 0x1dd58050 <__NSArrayI 0x1dd58050>(
<EAAccessory: 0x1dd1dce0> {
  connected
:YES
  connectionID
:XXX
  name
: XXX
  manufacturer
: XXX
  modelNumber
: XXX
  serialNumber
:
  firmwareRevision
: XXX
  hardwareRevision
: XXX
  macAddress
: XXX
  protocols
: (
)
 
delegate: (null)
}
)

如果我杀了应用程序并重新启动,它正常工作。

任何人都不会知道如何解决这个问题吗?

这一问题是类似于这一个,但在不同情况下发生,那问题的答案似乎并不解决我的问题。

解决方法 1:

天后寻找解决方案的终于解决了这个问题 (或者我希望解决了它。。我张贴我的答案在这里所以如果有人有同样的问题可以有个主意。

你永远不能相信 EAAccessoryManager,它可能会有鬼魂配件。使用下面的命令所以启动 _accessoryList 总是不起作用。

_accessoryList = [[NSMutableArray alloc] initWithArray:[[EAAccessoryManager sharedAccessoryManager] connectedAccessories]];

如果您启动 accessoryList 鬼配件,肯定不能成功启动 EASession。

正确的方法是使用 EAAccessory 通知,这样的回答中所述,但它不是说如何做到这一点的详细信息。

首先,您需要创建后的两个通知:

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(accessoryConnected:) name:EAAccessoryDidConnectNotification object:nil];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(accessoryDisconnected:) name:EAAccessoryDidConnectNotification object:nil];

[[EAAccessoryManager sharedAccessoryManager]registerForLocalNotifications];

然后在 accessoryConnected 和 accessoryDisconnected,你可以做以下。

- (void)accessoryConnected:(NSNotification *)notification
{
   
NSLog(@"EAController::accessoryConnected");

   
EAAccessory *connectedAccessory = [[notification userInfo] objectForKey:EAAccessoryKey];
   
[[self accessoryList] addObject:connectedAccessory];
   
if ([_accessoryList count])
   
{
        _selectedAccessory
= [_accessoryList objectAtIndex:0];
       
NSArray *protocolStrings = [_selectedAccessory protocolStrings];
       
if ([protocolStrings count]) {
           
self.protocolString = [protocolStrings objectAtIndex:0];
           
[self openSession];
       
}
   
}
}


- (void)accessoryDisconnected:(NSNotification *)notification
{
   
EAAccessory *disconnectedAccessory = [[notification userInfo] objectForKey:EAAccessoryKey];

   
int disconnectedAccessoryIndex = 0;
   
for(EAAccessory *accessory in [self accessoryList]) {
       
if ([disconnectedAccessory connectionID] == [accessory connectionID]) {
           
break;
       
}
        disconnectedAccessoryIndex
++;
   
}

   
if (disconnectedAccessoryIndex < [[self accessoryList] count]) {
       
[[self accessoryList ] removeObjectAtIndex:disconnectedAccessoryIndex];
   
} else {
       
NSLog(@"could not find disconnected accessory in accessory list");
   
}
   
NSLog(@"_accessory did disconnect: %@",_accessoryList);

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值