你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> 構建AppleWatch應用(iOS App與WatchKit Extension的數據通信)

構建AppleWatch應用(iOS App與WatchKit Extension的數據通信)

編輯:IOS開發基礎

1.jpg

NSUserDefaults

NSUserDefaults是快速共享信息的途徑。它適合存儲各種快速訪問和計算的小型數據,比如用戶名與檔案信息。如果希望使用UserDefaults,請用於靜態數據這樣用戶不必考慮數值的變化。

你需要設定App Group來讓設備通過共享容器來實現數據共享,確保手表擴展和ios target都已如此設置。基本上就是針對兩個設備創建一個統一的App Group標識符。如果需要刪除它,可以以類似的方法進行。

你可以通過之前創建的App Group名來使用defaults,基本上就是為特定的key鍵值設置對象。在iPhone上,用戶輸入了文本,保存,文本就存到了應用共享的UserDefaults裡。在Watch上,你可以從AppGroup得到defaults然後進行手表顯示內容的更新。

// on the iPhone app
letdefaults=NSUserDefaults(suiteName:"group.com.natashatherobot.userdefaults")
    letkey="userInput"
    
    overridefuncviewDidLoad(){
        super.viewDidLoad()
        textLabel.text=defaults?.stringForKey(key)??"Type Something..."
    }
    @IBActionfunconSaveTap(sender:AnyObject){
        
        letsharedText=textField.text
        
        textLabel.text=sharedText
        
        defaults?.setObject(sharedText,forKey:key)
        defaults?.synchronize()
    }
// WatchKit
classInterfaceController:WKInterfaceController{
    @IBOutletweakvartextLabel:WKInterfaceLabel!
    
    letdefaults=NSUserDefaults(suiteName:
        "group.com.natashatherobot.userdefaults")
    
    varuserInput:String?{
        defaults?.synchronize()
        returndefaults?.stringForKey("userInput")
    }

NSFileCoordinator

對更大型的數據來說,NSFileCoordinator是管理應用和watch擴展的共享空間裡文件的方式之一。對於有限列表的內容它很合適,同時也適用於圖像文件。

下面的例子是個簡單的代辦事項列表app,在手機上增加任務然後暑假傳輸到WatchKit擴展並在手表上顯示。你的視圖控制器需要遵循NSFilePresenter協議,除了實現兩個必需方法,其它不是很關鍵。FilePresenter協議有一個item URL,就是填你的AppGroup標識符的地方。通過URL,你在對應目錄建立一個文件。有必要的話你也可以通過操作隊列來控制多線程訪問。

另外,presentedItemDidChange這個代理方法,在FilePresenter裡通知你是否一個對象發生了改變,來讓你更新app數據而無需用戶手動刷新。

然而這裡還是有個關於NSFileCoordinator與NSFilePresenter 的bug而不方便在擴展裡使用。具體可參見Natasha的網站。

在代辦事項數組裡利用FileCoordinator寫入一個文件,可以通過讀寫文件以實現打包和解包事項的數據到事項數組,接下來可以依據文件裡的事項數據計算生成表格。需要注意的是如果你設計了刪除功能,而watch擴展和iPhone應用都能修改文件,會遇到線程同步的麻煩。

// iPhone app
    privatefuncsaveTodoItem(todoItem:String){
            
            // write item into the todo items array
            ifletpresentedItemURL=presentedItemURL{
                
                fileCoordinator.coordinateWritingItemAtURL(presentedItemURL,options:nil,error:nil)
                    {[unownedself](newURL)->Voidin
                        
                        self.todoItems.insert(todoItem,atIndex:0)
                        
                        letdataToSave=NSKeyedArchiver.archivedDataWithRootObject(self.todoItems)
                        letsuccess=dataToSave.writeToURL(newURL,atomically:true)
                }
            }
        }
// in the Watch
// MARK: Populate Table From File Coordinator
    
    privatefuncfetchTodoItems(){
        
        letfileCoordinator=NSFileCoordinator()
        
        ifletpresentedItemURL=presentedItemURL{
            
            fileCoordinator.coordinateReadingItemAtURL(presentedItemURL,options:nil,error:nil)
                {[unownedself](newURL)->Voidin
                    
                    ifletsavedData=NSData(contentsOfURL:newURL){
                        self.todoItems=NSKeyedUnarchiver.unarchiveObjectWithData(savedData)as[String]
                        self.populateTableWithTodoItems(self.todoItems)
                    }
            }
        }
    }

Frameworks

“If the code appears more than once, it probably belongs in a framework.(如果代碼出現超過一次,應該考慮能否放到框架裡)”

-WWDC 2014, Building Modern Frameworks

框架對於業務邏輯、CoreData、可重用UI組件來說很棒。就像WWDC裡說的那樣,你可以將重復代碼放到框架裡。在FileCoordinator的例子裡,我們獲取和讀寫文件的代碼出現了兩次,可以把它們提取到一個framework框架裡。建立框架很簡單:建立新target,選擇Cocoa Touch framework,然後命名。它會在你的iOS應用裡自動鏈接,因此也不要忘了在WatchKit擴展裡進行鏈接。

關鍵的一點,特別是對於Swift語言來說,應該把框架認作一個API。它需要聲明為公共的(public),因為這是iOS應用和watchkit擴展共用的接口。因此如果你在建立對象類,確保public關鍵字也加上了。這樣在手機和手表應用裡你導入了框架就可以訪問任何公共內容。

importWatchKit
importMySharedDataLayer
classInterfaceController:WKInterfaceController{
    @IBOutletweakvarfavoriteThingsLabel:WKInterfaceLabel!
    
    overridefuncawakeWithContext(context:AnyObject?){
        super.awakeWithContext(context)
        
        letmyFavoriteThings=MySharedData().myFavoriteThings
        
        letfavoriteThingsString=", ".join(myFavoriteThings)
        favoriteThingsLabel.setText("My favorite things are \(favoriteThingsString)")
    }
}

Keychain Sharing

鑰匙鏈共享是針對更高安全性要求的數據的。UserDefaults提供的安全性不滿足時,你可以用鑰匙鏈共享來保障信息安全及跨擴展的共享能力。

WatchKit目前的一個大問題是沒有認證機制。蘋果提供了KeychainIteamWrapper的示例,但API太老不支持ARC。我推薦使用這個版本https://gist.github.com/dhoerl/1170641,它基於ARC並有清晰的接口。

根據問題是如何通過access group初始化KeychainItemWrapper。與AppGroup的概念類似,設備之間有共享空間。你在iOS和WatchKit擴展中都需要鑰匙鏈來訪問用戶數據。通過鍵值存儲體系,你設定用戶名和密碼並用同一個標識符建立同一類型的keychain項。這個例子裡僅展示了當用戶填好用戶名密碼時WatchKit擴展展示數據的這一工作過程。

// iPhone app
@IBActionfunconSaveTap(sender:AnyObject){
        
        letusername=usernameTextField.text
        letpassword=passwordTextField.text
        
        letkeychainItem=KeychainItemWrapper(identifier:"SharingViaKeychain",accessGroup:"W6GNU64U6Q.com.natashatherobot.SharingViaKeychain")
        
// WatchKit extension
letkeychainItem=KeychainItemWrapper(identifier:"SharingViaKeychain",accessGroup:"W6GNU64U6Q.com.natashatherobot.SharingViaKeychain")
        
        
        letpasswordData=keychainItem.objectForKey(kSecValueData)asNSData
        letpassword=NSString(data:passwordData,encoding:NSUTF8StringEncoding)
        
        letusername=keychainItem.objectForKey(kSecAttrAccount)as?String
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved