最近看到MFI配件的app黍瞧,需要External Accessory Framework框架莽鸿。
說起來,我大概在13年底就接觸了這玩意查乒,只不過當(dāng)時(shí)這個(gè)框架有些類是私有API。當(dāng)時(shí)是基于硬件單片機(jī)和CoreBluetooth的研究郁竟,如果你做相關(guān)的關(guān)于USB之類的東西玛迄,例如Lightning等,就必須得到蘋果授權(quán)認(rèn)證了棚亩。
那么什么是External Accessory Framework憔晒?
這里引用了Apple Developer內(nèi)的原文:
The External Accessory framework
(ExternalAccessory.framework) provides a conduit for communicating with accessories attached to any iOS-based device. App developers can use this conduit to integrate accessory-level features into their apps.
意思簡(jiǎn)單理解就是:
External Accessory Framework提供了配件連接iOS設(shè)備的通道。開發(fā)者可以通過它來開發(fā)連接配件的app。
配件可以通過30pin、藍(lán)牙追驴、USB的方式連接iOS設(shè)備。
它包含三個(gè)類:
EAAccessory
代表了一個(gè)單例的硬件配件對(duì)象从撼。
EAAccessoryManager
管理所有連接到iPhone的配件。
EASession
定義了iPhone app與外部配件的連接和通道。-
EAAccessory類
EAAccessory類的屬性: 1) Boolean connected read-only 配件是否連接iPhone的標(biāo)志 @property (nonatomic, readonly, getter = isConnected) BOOL connected 2) NSUInteger connectionID read-only 連接設(shè)備的配件唯一標(biāo)識(shí) @property (nonatomic, readonly) NSUInteger connectionID EAAccessory Framework提供了可用配件的列表低零,所以要用NSArray來處理: for (EAAccessory *accessory in _accessoryList) { if ([disconnectedAccessory connectionID] == [accessory connectionID]) { break; } disconnectedAccessoryIndex++;6 }
id delegate 定義了接收配件狀態(tài)變化的notifications的對(duì)象
定義一個(gè)accController類
@interface accController : NSObject {
EAAccessory *_accessory;
EASession *_session;
NSString *_protocolString;
}- (void)accessoryDidDisconnect : (EAAccessory *)accessory;
@end
- (void)accessoryDidDisconnect : (EAAccessory *)accessory;
4) NSString firmwareRevision read-only 固件版本信息婆翔,注意兼容性
@property (nonatomic, readonly) NSString *firmwareRevision
5) NNString hardwareRevision read-only 硬件版本信息,同上
@property (nonatomic, readonly) NSString *hardwareRevison
6) NSString manufacturer read-only 配件所屬公司
@property (nonatomic, readonly) NSString *manufacturer
7) NSString modelNumber read-only 配件設(shè)備號(hào)
@property (nonatomic, readonly) NSString *modelNumber
8) NSString name read-only 配件名稱掏婶,反饋給用戶連接了正確的配件
@property (nonatomic, readonly) NSString *name
9) NSArray protocolStrings read-only protocols的名稱啃奴,注意,跟connectionID對(duì)應(yīng)雄妥,所以是一個(gè)NSArray的對(duì)象
@property (nonatomic, readonly) NSArray *protocolStrings
代碼示例:
- (void)setupAccessoryController : (EAAccessory *)accessory withProtocolString : (NSString *)protocolString {
[_accessory release]; // 防止斷開連接后重連不同配件
_accessory = [accessory retain];
[_protocolString release];
_protocolString = [protocolString copy];
}
這段代碼可以用在配件連接設(shè)備后來創(chuàng)建一個(gè)accessory controller對(duì)象最蕾。
調(diào)用的方法:
[accessoryController setupAccessoryController : _selectedAccessory withProtocolString : [[_selectedAccessory protocolStrings] objectAtIndex : 0]]; // 只能連接一個(gè)設(shè)備
10) NSString serialNumber read-only 連接的配件序列號(hào),每個(gè)配件唯一
@property (nonatomic, readonly) NSString *serialNumber
EAAccessory類中的常量:
EAConnectionIDNone 實(shí)質(zhì)為0老厌,無效的連接瘟则,通過與connectionID的比較,可以嘗試重連配件或者提示用戶斷開配件重新連接設(shè)備枝秤。
這第一個(gè)類EAAccessory就先了解到這里醋拧。
// 為協(xié)議創(chuàng)建了session、并為session配置輸入輸出流淀弹。在返回session對(duì)象的時(shí)候丹壕,應(yīng)用已經(jīng)連接到外設(shè)并且準(zhǔn)備收發(fā)數(shù)據(jù)。
- (EASession *)openSessionForProtocol:(NSString *)protocolString {
NSArray *accessories = [[EAAccessoryManager sharedAccessoryManager] connectedAccessories];
EAAccessory *accessory = nil;
EASession *session = nil;
for (EAAccessory *obj in accessories) {
if ([[obj protocolStrings] containsObject:protocolString]) {
accessory = obj;
break;
}
}
if (accessory) {
session = [[EASession alloc] initWithAccessory:accessory forProtocol:protocolString];
if (session) {
[[session inputStream] setDelegate:self];
[[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[[session inputStream] open];
[[session outputStream] setDelegate:self];
[[session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[[session outputStream] open];
}
}
return session;
}
// Handle communications from the streams.
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
switch (eventCode) {
case NSStreamEventHasBytesAvailable:
// Process the incoming
break;
case NSStreamEventHasSpaceAvailable:
// Send the next queued command.
default:
break;
}
}
EAWiFiUnconfiguredAccessory和EAWiFiUnconfiguredAccessoryBrowser類是iOS8之后才有的薇溃。之前研究的時(shí)候是基于iOS6和iOS7菌赖,所以那時(shí)候基本上拿不到MFI認(rèn)證的東西,現(xiàn)在有了這兩個(gè)類痊焊,方便多了。