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;