ExternalAccessory框架

本文介绍了ExternalAccessory框架,用于与Lightning接口或蓝牙2.1设备连接和通信。主要内容包括EAAccessory、EAAccessoryManager和EASession等关键类的使用,设备连接的监测,协议识别,数据传输的实现,以及调试和Debug的方法。
摘要由CSDN通过智能技术生成

这个框架能做什么

顾名思义:External:外部的;Accessory:配件。应该是和外部设备相关的一个框架。

ExternalAccessory框架,就是可以用来和Lightning接口的硬件,或者蓝牙(2.1)设备进行连接、通讯的这么一个框架。(当然,也可以和30-pin接口的硬件连接、通讯——不过现在几乎没有这种接口的设备了吧~)

就是你现在有一个Lightning耳机(iPhone7, 7Plus的耳机~),或者有一个蓝牙2.1的音箱,你要写一个App去控制这些设备,你要选用的框架,就是ExternalAccessory。

比如我前公司,帮美国公司代工的一款蓝牙2.1的音箱,写了一个App进行控制(灯光、音效);还有现在公司,做Lightning设备的App,用来对耳机进行简单的控制、固件升级。这都需要用到ExternalAccessory框架。

框架简介

ExternalAccessory框架的主要功能,就是提供一个管道,让外围设备可以和基于iOS系统的设备进行通讯。

主要的几个类:

  • EAAccessory:表示你连接的设备。

  • EAAccessoryManager:有一个重要的属性connectedAccessories,用来获取已经连接上手机的设备。

  • EASession:这个类主要用来建立通道,让App和设备可以进行数据的传输(发送和接收)

设备的连接

其实设备的连接、断开,都是系统自动完成的。

EAAccessoryManager类中有一个属性connectedAccessories(一个array),里面就已经包含了所有已经连接的外围设备(EAAccessory对象)。像什么设备名称、制造厂商、硬件型号、固件型号等等信息,都可以在EAAccessory对象中拿得到。

但是,ExternalAccessory框架,并不会自动帮你监控设备的断开、连接状态。如果你想拿到设备连接、断开的回调,则需要手动敲一些代码了:

拿到连接、断开的回调

需要注册通告,即调用EAAccessoryManager的方法registerForLocalNotifications。

当有硬件连接,ExternalAccessory框架就会发送EAAccessoryDidConnectNotification这个通告,当有硬件断开连接,就会发出EAAccessoryDidDisconnectNotification通告。所以,要监听、接收这两个通告。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 注册通告
[[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications];
 
// 监听EAAccessoryDidConnectNotification通告(有硬件连接就会回调Block)
[[NSNotificationCenter defaultCenter] addObserverForName:EAAccessoryDidConnectNotification
                                                   object:nil
                                                    queue:nil
                                               usingBlock:^(NSNotification * _Nonnull note) {
 
                                                   // 从已经连接的外设中查找我们的设备(根据协议名称来查找)
                                                   [self searchOurAccessory];
}];
 
[[NSNotificationCenter defaultCenter] addObserverForName:EAAccessoryDidDisconnectNotification
                                                   object:nil
                                                    queue:nil
                                               usingBlock:^(NSNotification * _Nonnull note) {
                                                   // Do something what you want
}];

此外,硬件断开连接,除了通告回调,框架还提供了Delegate的回调方式,遵守EAAccessoryDelegate协议,并实现accessoryDidDisconnect:这个可选方法(这个协议中的唯一一个方法),也可以拿到硬件断开连接的回调。(好奇怪,Apple为什么单单只弄这么一个方法?)

识别硬件

好了,我们知道硬件连接进行了,那怎么知道是不是我们的硬件呢?

苹果公司将这个能识别硬件身份的东东叫做「协议」。本质上就是一个字符串,一个由反向域名组成的字符串,例如om.apple.myProtocol。

而这个协议(字符串)的定义,是由硬件的生产厂商定义的,所以App开发人员,要和厂商沟通拿到这部分的资料。

所以我们要做几件事件:

  • 导入框架(这个不用说了吧~)#import

  • 在Info.plist中,增加UISupportedExternalAccessoryProtocols这个key,然后值赋为协议名称(就是那个反向域名字符串)。(其实是一个array,所以这里可以支持多个协议,不分顺序)

  • 在硬件已经连接的回调中,遍历所有已经连接的设备,根据协议名称找到自己的硬件(实现上述代码的searchOurAccessory方法):

1
2
3
4
5
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值