當用戶在多個windows設備上使用應用時,我們希望用戶的某些設置和數據可以在多個之間共享,比如我們新版本中收藏的文章。通常情況下要實現這種功能,我們可能需要自己弄個服務器或者使用onedrive等網站來存放文件,但是對於我們這種小型的應用有點過了,額外增加了代碼和維護的工作。這種時候使用windows roaming就是一個比較方便的選擇。
所謂的漫游數據,MSDN上是這樣介紹的:
Windows 8 可在用戶設備之間自動傳輸某些應用數據。應用開發人員無需再執行費力的工作。漫游應用數據為最終用戶提供使用多台設備(例如辦公電腦和家用平板電腦)的卓越應用體驗
Windows應用在安裝時,系統會為設置和文件等應用數據提供它自己的用戶數據存儲(因為windows上可能使用不同的賬號登陸,所以這個存儲需要按用戶分開),大概分為4種,具體參見MSDN。
本地當前設備上存在的數據將在雲中備份。
漫游存在於用戶安裝了該應用的所有設備上的數據。
臨時可由系統在任何時刻刪除的數據。
localcache
僅存在於當前設備上的持久數據。
其中漫游(roaming)就是我們需要的,可以漫游的數據分為兩種:設置和文件。而我們只需要負責寫入內容就可以了,其他的都由系統控制(甚至可以在網絡異常之后自動重試,為我們省下很多時間和代碼啊)。
漫游設置:
設置是Windows提供的key-value存儲空間,使用方法和字典差不多,但需要注意的是可存儲的類型,只支持大部分運行時(runtime)的類型,自定義的類型就不要想了。
// 對於不需要同步的設置項,使用LocalSettings // ApplicationDataContainer local = Windows.Storage.ApplicationData.Current.LocalSettings; // 需要同步的使用RoamingSettings,兩種setting的使用是一樣的 ApplicationDataContainer roaming = Windows.Storage.ApplicationData.Current.RoamingSettings; roaming.Values["key"] = "漫游的設置";
漫游文件:
當設置不能滿足需求的時候,我們可以將內容寫入文件,並存放在漫游文件夾。
// 漫游文件夾 var roamingFolder = Windows.Storage.ApplicationData.Current.RoamingFolder; // 在漫游文件夾內創建一個文件, var file = await roamingFolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists); // 寫入內容 awaitFileIO.WriteTextAsync(file, "需要同步的內容");
以上就是使用漫游的代碼,這樣只要用戶使用同一個賬號登陸設備,並安裝了同一個版本的應用(注意:必須是同一版本的),那么這些數據就會被系統同步。
效果如下:
windows 端:
windows phone 端:
漫游雖然很方便,但它的使用是有限制的。
Windows的應用數據漫游有大小限制(應該是100KB, 雖然MSDN上沒有明確給出具體數值,但是這個值應該是和設備無關的,即使不一樣我們也應該選擇最小的作為基准。。),具體可以通過使用Windows.Storage.ApplicationData.Current.RoamingStorageQuota來獲得,單位是KB。
使用模擬器測試的同學需要注意了,在模擬器上這個值返回的是0。。。
如果超過了這個限制,數據就不會被漫游了。因為這個限制,我們需要謹慎的選擇存儲的內容(希望以后可以提高這個限制,有點不夠用啊。。),盡量選擇必要的應用設置和小文件。
因為漫游的本身就不是為了及時同步設計的,所以會造成應用的數據不一致的情況,就是說你在手機上保存了一個文件,不一定被立刻同步到其他設備上,這個時間是由系統決定(也和網絡有關),所以對時間有要求的同學可以繞路了。。對於這點MSDN上有詳細的說明:
Windows 會隨機漫游應用數據,不會保證即時同步。如果用戶脫機或位於高延遲網絡中,則漫游可能會明顯延遲。請勿構建需要即時同步的 UI。 如果你的應用頻繁更改信息(例如,歌曲或電影中的最新位置),則請勿對此數據使用漫游應用數據功能。而選取較不頻繁但仍可提供良好用戶體驗的表示 – 例如,當前播放的歌曲、當前播放的電影章節等。
我們的已經發布的應用和代碼可以在下面找到:
Windows Phone Store App link:
http://www.windowsphone.com/zh-cn/store/app/博客園-uap/500f08f0-5be8-4723-aff9-a397beee52fc
Windows Store App link:
http://apps.microsoft.com/windows/zh-cn/app/c76b99a0-9abd-4a4e-86f0-b29bfcc51059
GitHub open source link:
https://github.com/MS-UAP/cnblogs-UAP
MSDN Sample Code:
https://code.msdn.microsoft.com/CNBlogs-Client-Universal-477943ab