天天看點

iOS開發之ExternalAccessory架構的應用

 ExternalAccessory架構用來對外設進行管理,iOS外設通常是通過MFI認證的外部裝置,可以通過藍牙進行連接配接,也可以使用lighting端口進行連接配接。

     EAAccessoryManager類用來對外設進行管理,其中屬性方法如下:

@interface EAAccessoryManager : NSObject

// 擷取單例對象

+ (EAAccessoryManager *)sharedAccessoryManager;

// 打開藍牙外設搜尋清單

- (void)showBluetoothAccessoryPickerWithNameFilter:(nullable NSPredicate *)predicate completion:(nullable EABluetoothAccessoryPickerCompletion)completion;

// 注冊本地通知 當外設連接配接狀态變化後會觸發通知

- (void)registerForLocalNotifications;

// 取消通知的注冊

- (void)unregisterForLocalNotifications;

// 所有連接配接的外設清單

@property (nonatomic, readonly) NSArray<EAAccessory *> *connectedAccessories;

@end

如果注冊了本地通知,則可以監聽下面兩個通知:

EAAccessoryDidConnectNotification     // 外設已經連接配接的通知

EAAccessoryDidDisconnectNotification  // 外設斷開連接配接的通知

   EAAccessory是外設對象,其中定義了外設的相關資訊,如下:

@interface EAAccessory : NSObject

// 是否已經連接配接

@property(nonatomic, readonly, getter=isConnected) BOOL connected;

// 連接配接ID

@property(nonatomic, readonly) NSUInteger connectionID;

// 制造商

@property(nonatomic, readonly) NSString *manufacturer;

// 外設名稱

@property(nonatomic, readonly) NSString *name;

// 模式編碼

@property(nonatomic, readonly) NSString *modelNumber;

// 序列号

@property(nonatomic, readonly) NSString *serialNumber;

// 固件版本

@property(nonatomic, readonly) NSString *firmwareRevision;

// 硬體版本

@property(nonatomic, readonly) NSString *hardwareRevision;

// 接口類型

@property(nonatomic, readonly) NSString *dockType;

// 協定清單

@property(nonatomic, readonly) NSArray<NSString *> *protocolStrings;

// 代理

@property(nonatomic, assign, nullable) id<EAAccessoryDelegate> delegate;

@protocol EAAccessoryDelegate <NSObject>

@optional

// 外設斷開連接配接時調用

- (void)accessoryDidDisconnect:(EAAccessory *)accessory;

     需要注意,與外設進行通訊需要指定對應的協定,首先,需要在iOS應用的info.plist檔案中添加如下鍵來指定此應用要互動的外設協定:

具體的外設協定需要檢視外設的說明文檔。

EASession類用來進行外設互動,解析如下:

@interface EASession : NSObject

// 指定外設和協定來建立會話對象

- (nullable instancetype)initWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocolString;

// 外設對象

@property (nonatomic, readonly, nullable) EAAccessory *accessory;

// 協定

@property (nonatomic, readonly, nullable) NSString *protocolString;

// 輸入流 用來向外設發送資料

@property (nonatomic, readonly, nullable) NSInputStream *inputStream;

// 輸出流 用來接收外設發送的資料

@property (nonatomic, readonly, nullable) NSOutputStream *outputStream;

     EAWiFiUnconfiguredAccessoryBrowser類用來浏覽未配置的WIFI外設:

@interface EAWiFiUnconfiguredAccessoryBrowser : NSObject

// 初始化方法

- (instancetype)initWithDelegate:(nullable id<EAWiFiUnconfiguredAccessoryBrowserDelegate>)delegate queue:(nullable dispatch_queue_t)queue;

@property (weak, nonatomic, nullable) id<EAWiFiUnconfiguredAccessoryBrowserDelegate> delegate;

// 未配置的外設

@property (readonly, copy, atomic) NSSet<EAWiFiUnconfiguredAccessory *> *unconfiguredAccessories;

// 開始進行搜尋

- (void)startSearchingForUnconfiguredAccessoriesMatchingPredicate:(nullable NSPredicate *)predicate;

// 結束搜尋

- (void)stopSearchingForUnconfiguredAccessories;

// 對外設進行配置

- (void)configureAccessory:(EAWiFiUnconfiguredAccessory *)accessory withConfigurationUIOnViewController:(UIViewController *)viewController;

@protocol EAWiFiUnconfiguredAccessoryBrowserDelegate <NSObject>

// 搜尋狀态改變後調用的回調

/*

typedef NS_ENUM(NSInteger, EAWiFiUnconfiguredAccessoryBrowserState)

{

   EAWiFiUnconfiguredAccessoryBrowserStateWiFiUnavailable = 0,  // WIFI不可用

   EAWiFiUnconfiguredAccessoryBrowserStateStopped,              // 停止

   EAWiFiUnconfiguredAccessoryBrowserStateSearching,            // 搜尋中

   EAWiFiUnconfiguredAccessoryBrowserStateConfiguring,          // 配置中

};

*/

- (void)accessoryBrowser:(EAWiFiUnconfiguredAccessoryBrowser *)browser didUpdateState:(EAWiFiUnconfiguredAccessoryBrowserState)state;

// 發現了未配置的外設

- (void)accessoryBrowser:(EAWiFiUnconfiguredAccessoryBrowser *)browser didFindUnconfiguredAccessories:(NSSet<EAWiFiUnconfiguredAccessory *> *)accessories;

// 移除了未配置的外設

- (void)accessoryBrowser:(EAWiFiUnconfiguredAccessoryBrowser *)browser didRemoveUnconfiguredAccessories:(NSSet<EAWiFiUnconfiguredAccessory *> *)accessories;

// 完成配置

- (void)accessoryBrowser:(EAWiFiUnconfiguredAccessoryBrowser *)browser didFinishConfiguringAccessory:(EAWiFiUnconfiguredAccessory *)accessory withStatus:(EAWiFiUnconfiguredAccessoryConfigurationStatus)status;

EAWiFiUnconfiguredAccessory對象描述WIFI外設,如下:

@interface EAWiFiUnconfiguredAccessory : NSObject

// 名稱

@property(copy, nonatomic, readonly) NSString *name;

// 裝置商

@property(copy, nonatomic, readonly) NSString *manufacturer;

// 模式

@property(copy, nonatomic, readonly) NSString *model;

// WIFI的SSID

@property(copy, nonatomic, readonly) NSString *ssid;

// 硬體位址

@property(copy, nonatomic, readonly) NSString *macAddress;

//屬性

typedef NS_OPTIONS(NSUInteger, EAWiFiUnconfiguredAccessoryProperties)

   EAWiFiUnconfiguredAccessoryPropertySupportsAirPlay  = (1 << 0),

   EAWiFiUnconfiguredAccessoryPropertySupportsAirPrint = (1 << 1),

   EAWiFiUnconfiguredAccessoryPropertySupportsHomeKit  = (1 << 2)

@property(readonly, nonatomic, readonly) EAWiFiUnconfiguredAccessoryProperties properties;

繼續閱讀