關于iphone accessory的理解
以下部分轉載自<iphone應用編程指南>
和配件進行通訊
在iPhone OS 3.0及之后的系統上,External Accessory框架(ExternalAccessory.framework
)提供了一種管道機制,使應用程序可以和iPhone或iPod touch設備的配件進行通訊。通過這種管道,應用程序開發者可以將配件級別的功能集成到自己的程序中。
請注意:下面部分將向您展示iPhone應用程序如何連接配件。如果您有興趣成為iPhone或iPod touch配件的開發者,可以在http://developer.apple.com網站上找到相應的信息。
為了使用External Accessory框架的接口,您必須將ExternalAccessory.framework
加入到Xcode工程,并連接到相應的目標中。此外,還需要在相應的源代碼文件的頂部包含一個#import <ExternalAccessory/ExternalAccessory.h>
語句,才能訪問該框架的類和頭文件。有關如何為工程添加框架的更多信息,請參見Xcode工程管理指南中的工程中的文件部分;有關External Accessory框架中類的一般信息,請參見External Accessory框架參考。
配件的基礎
在和配件進行通訊之前,需要與配件的制造商緊密合作,理解配件提供的服務。制造商必須在配件的硬件中加入顯式的支持,才能和iPhone OS進行通訊。作為這種支持的一部分,配件必須支持至少一種命令協議,也就是支持一種定制的通訊模式,使配件和應用程序之間可以進行數據傳輸。蘋果并不維護一個協議的注冊表,支持何種協議及是否使用其他制造商支持的定制或標準協議是由制造商自行決定的。
作為和配件制造商通訊的一部分,您必須找出給定的配件支持什么協議。為了避免名字空間發生沖突,協議的名稱由反向的DNS字符串來指定,形式是com.apple.myProtocol
。這使得每個配件制造商都可以根據自己的需要定義協議,以支持不同的配件產品線。
應用程序通過打開一個使用指定協議的會話來和配件進行通訊。打開會話的方法是創建一個EASession
類的實例,該類中包含NSInputStream
和NSOutputStream
對象,可以和配件進行通訊。通過這些流對象,應用程序可以向配件發送未經加工的數據包,以及接收來自配件的類似數據包。因此,您必須按照期望的協議來理解每個數據包的格式。
聲明應用程序支持的協議
能夠和配件通訊的應用程序應該在其Info.plist
文件中聲明支持的協議,使系統知道在相應的配件接入時,該應用程序可以被啟動。如果當前沒有應用程序可以支持接入的配件,系統可以選擇啟動App Store并指向支持該設備的應用程序。
為了聲明支持的協議,您必須在應用程序的Info.plist
文件中包含UISupportedExternalAccessoryProtocols
鍵。該鍵包含一個字符串數組,用于標識應用程序支持的通訊協議。您的應用程序可以在這個列表中以任意順序包含任意數量的協議。系統并不使用這個列表來確定應用程序應該選擇哪個協議,而只是用它來確定應用程序是否能夠和相應的配件進行通訊。您的代碼需要在開始和配件進行對話時選擇適當的通訊協議。
在運行時連接配件
在配件接入系統并做好通訊準備之前,通過External Accessory框架無法看到配件。當配件變為可見時,您的應用程序就可以獲取相應的配件對象,然后用其支持的一或多個協議打開會話。
共享的EAAccessoryManager
對象為應用程序尋找與之通訊的配件提供主入口點。該類包含一個已經接入的配件對象的數組,您可以對其進行枚舉,看看是否存在應用程序支持的配件。EAAccessory
對象中的絕大多數信息(比如名稱、制造商、和型號信息)都只是用于顯示。如果您要確定應用程序是否可以連接一個配件,必須看配件的協議,確認應用程序是否支持其中的某個協議。
請注意:多個配件對象支持同一協議是可能的。如果發生這種情況,您的代碼必須負責選擇使用哪個配件對象。
對于給定的配件對象,每次只能有一個指定協議的會話。EAAccessory
對象的protocolStrings
屬性包含一個字典,字典的鍵是配件支持的協議。如果您試圖用一個已經在使用的協議創建會話,External Accessory框架就會產生錯誤。
程序清單8-1展示了如何檢查接入配件的列表并從中取得應用程序支持的第一個配件。它為指定的協議創建一個會話,并對會話的輸入和輸出流進行配置。在這個方法返回會話對象時,已經完成和配件的連接,并可以開始發送和接收數據了。
程序清單8-1 創建和配件的通訊會話
在配置好輸入輸出流之后,最好一步就是處理和流相關的數據了。程序清單8-2展示了在委托方法中處理流事件的基本代碼結構。清單中的方法可以響應來自配件輸入輸出流的事件。當配件向應用程序發送數據時,事件發生表示有數據可供讀取;類似地,當配件準備好接收應用程序數據時,也通過事件來表示(當然,您并不一定要等到這個事件發生才向流寫出數據,應用程序也可以調用流的hasBytesAvailable
方法來確認配件是否還能夠接收數據)。有關流及如何處理流事件的更多信息,請參見Cocoa流編程指南。
程序清單8-2 處理流事件
監控與配件有關的事件
當配件接入或斷開時,External Accessory框架都可以發送通告。但是這些通告并不自動發送,如果您的應用程序感興趣,必須調用EAAccessoryManager類的registerForLocalNotifications方法來顯式請求。當配件接入、認證、并準備好和應用程序進行交互時,框架可以發出一個EAAccessoryDidConnectNotification
通告;而當配件斷開時,框架則可以發送一個EAAccessoryDidDisconnectNotification
通告。您可以通過缺省的NSNotificationCenter
來注冊接收這些通告。兩種通告都包含受影響的配件的信息。
除了通過缺省的通告中心接收通告之外,當前正在和配件進行交互的應用程序可以為相應的EAAccessory
對象分配一個委托,使它在發生變化的時候得到通知。委托對象必須遵循EAAccessoryDelegate
協議,該協議目前包含名為accessoryDidDisconnect:
的可選方法,您可以通過這個方法來接收配件斷開通告,而不需要事先配置通告觀察者。
有關如何注冊接收通告的更多信息,請參見Cocoa通告編程主題。
posted on 2011-10-09 14:47 Khan 閱讀(3501) 評論(0) 編輯 收藏 引用 所屬分類: GCC/G++ 、跨平臺開發 、周邊技術