博客園客戶端UAP開發隨筆 -- 搭建App之間的橋梁


開發Windows Phone應用的同學們應該都注意到了,Windows Phone 為了安全性,對應用的限制還是比較多的。我記得一位360的同學很無奈的說:WP太安全了,我們這些做WP上360衛士的基本上沒啥可做的。但是當WP360那個App出來后,還是有很多用戶安裝了呢,盡管真的對安全沒什么太大的幫助,但是對用戶了解自己的手機的使用情況還是有幫助的。其中一位用戶的評價是:從android到PC,我一直用360, 所以在WP上我也用。呵呵,粉絲啊!具體有什么用其實他也不關心鐵粉而已。

扯遠了!回到這篇隨筆的主題吧:我們的應用只能訪問自己的文件夾以及有限的公用文件夾,而無法進入別的應用的文件夾,這就是所謂的Sandbox。那么我們如果希望調用它們呢?那也還是有方法的。

今天我們就來介紹下app間調用的2種主要方法:

Protocol調用

簡單的說就是用Windows.System.launcher類,通過一個形如"mailto:ms-uap@outlook.com" 這樣由protocol前綴mailto,冒號,以及一個字符串組成的uri,調用注冊了protocol 前綴(這里是mailto)的應用,將整個uri傳給它處理的過程。

比如這段代碼:

await Launcher.LaunchUriAsync(new Uri("mailto:ms-uap@outlook.com"));

運行以后就會調起我們的郵件應用給ms-uap@outlook.com這個郵件賬號發郵件:

是不是很簡單?

當然,這只是調用了系統的應用。我們也可以調用注冊了相應protocol前綴的第三方應用,更可以自己注冊一個protocol前綴來給別的應用調用哦。

那么如何注冊呢?

雙擊我們應用的Package.appxmanifest文件,在 聲明 面板中選擇協議,點擊添加:

一般情況下只要在名稱上填寫我們希望注冊的protocol前綴就可以了。這個前綴最好是我們的應用專用的,比如cnbloguap。另外在Windows和Windows Phone平台上,protocol前綴是有些限制的。比如在Windows Phone上,即使我們的應用注冊了 mailto 的protocol前綴,系統也依然會自動調用系統的郵件應用。詳細的情況可以參見https://msdn.microsoft.com/zh-CN/library/windows/apps/xaml/hh779670。注冊好protocol前綴之后我們的應用就可以被通過形如"cnbloguap:xxxx"的uri調用了。

那么要如何處理調用我們應用的uri呢?

這就需要我們在App.xaml.cs中override "OnActivated" 這個方法了。代碼如下:

protected async override void OnActivated(IActivatedEventArgs args)

{

if(args.Kind == ActivationKind.Protocol)

{

ProtocolActivatedEventArgs protocolArgs = args as ProtocolActivatedEventArgs;

// TODO: Handle URI activation

// The received URI is eventArgs.Uri.AbsoluteUri

}

}

通過protocolArgs.Uri 就可以取到完整的"cnbloguap:xxxx"的uri。接下來如何處理都是隨心所欲啦。

這里需要注意的是,最好加一下"OnLaunched"方法的啟動app部分的代碼,不然應用處理完uri就直接退出啦。可以參考一下msdn上的例子:https://code.msdn.microsoft.com/windowsapps/Association-Launching-535d2cec/,在這個例子中將這部分代碼提取成了CreateRootFrame這個方法。

文件調用

如果我們需要在應用間傳送的信息比較多的話,protocol調用就有些不方便了。那么文件調用就能派上用場了。

比如有這樣一個場景,我們通過應用下載了一首歌myFavorite.mp3,放在了music目錄,想立刻聽一聽。

那么就可以在我們的代碼中加入下面的片段:

var music = await KnownFolders.MusicLibrary.GetFileAsync("myFavorite.mp3");

await Launcher.LaunchFileAsync(music);

系統就會自動調用音樂播放器來播放這首歌啦。不過有一點需要注意的是當播放器播放過一次這首歌以后,我們有段時間訪問這個MP3文件都會報錯T.T

同protocol調用一樣,我們也可以注冊自己的文件類型。

還是在Package.appxmanifest文件中的 聲明 面板,選擇文件類型關聯,點擊添加:

填入名稱和文件類型,這樣系統在遇到.cnblogFile后綴的文件都會調用我們的app來處理了。當然系統還是有些保留后綴文件名的,參見https://msdn.microsoft.com/zh-CN/library/windows/apps/xaml/hh779669

當然我們還需要得到相應的文件,這就需要在App.xaml.cs中override "OnFileActivated" 這個方法了,代碼如下:

protected override void OnFileActivated(FileActivatedEventArgs args)

{

foreach(StorageFile argFile in args.Files)

{

//處理相應文件

}

}

這樣我們就可以從args的Files屬性中得到傳給我們的文件列表,接下來可以按我們的需求處理它們。OnFileActivated 方法中也應該添加 "OnLaunched"方法的啟動app部分的代碼。

在上面提到的例子https://code.msdn.microsoft.com/windowsapps/Association-Launching-535d2cec/ 中也可以看到文件調用的使用。

不一樣的調用

LaunchFileAsync和LaunchUriAsync方法都有帶LauncherOptions的重載。可以參見例子中的使用以及https://msdn.microsoft.com/zh-cn/library/windows/apps/windows.system.launcheroptions.aspx 的說明。

 

分享代碼,改變世界!

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM