了解External Accessory Framework

最近看到MFI配件的app,需要External Accessory Framework框架。

說(shuō)起來(lái),我大概在13年底就接觸了這玩意,只不過(guò)當(dāng)時(shí)這個(gè)框架有些類是私有API。當(dāng)時(shí)是基于硬件單片機(jī)和CoreBluetooth的研究,如果你做相關(guān)的關(guān)于USB之類的東西,例如Lightning等,就必須得到蘋(píng)果授權(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è)備的通道。開(kāi)發(fā)者可以通過(guò)它來(lái)開(kāi)發(fā)連接配件的app。

配件可以通過(guò)30pin、藍(lán)牙、USB的方式連接iOS設(shè)備。

  1. 它包含三個(gè)類:
    EAAccessory
    代表了一個(gè)單例的硬件配件對(duì)象。
    EAAccessoryManager
    管理所有連接到iPhone的配件。
    EASession
    定義了iPhone app與外部配件的連接和通道。

  2. 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來(lái)處理:
    
    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
 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];     // 防止斷開(kāi)連接后重連不同配件
        _accessory = [accessory retain];  
        [_protocolString release];
        _protocolString = [protocolString copy];
}
這段代碼可以用在配件連接設(shè)備后來(lái)創(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,無(wú)效的連接,通過(guò)與connectionID的比較,可以嘗試重連配件或者提示用戶斷開(kāi)配件重新連接設(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è)類,方便多了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容