2014年8月31日 星期日

Store Apps 自訂 URI 與 File Association

Windows Phone 8.1 在前幾天終於推出開發者預覽版,雖然 8.0 的裝置全部都可以升級,但 8.1 與 8.0 仍然是差異不小且不相容的兩個框架,在建立 Windows Phone 8.1 專案時除了原先的 Siliverlight 之外,還可以選擇 Store Apps ( XAML App ) 專案,這個 SDK 就如它的名稱一樣,是與 Windows 8.1 的 Store Apps 最接近的,也因為架構不同,某些 API 的使用也和撰寫 Windows Phone 8.0 時有差異,這裡記錄 Store Apps 在 Windows Phone 及 Windows 上如何實現自訂 Protocol 及指定開啟特定的 File Type。

在以前曾經寫過一篇如何在 Windows Phone 8.0 上建立 URI Association 的文章:URI Association on Windows Phone 8.0,這篇文章在仍然可用,但如果在建立專案時選擇的是 Store Apps 時,方法是不太一樣的,甚至專案內連 WMAppManifest.xml 也找不到。

首先利用 Visual Studio 2013 選擇 Store Apps 並建立 Universal Apps 專案,可以發現同一個 Solution 底下有三個 Poject 分別是 Windows 8.1、Windows Phone 8.1 及 Shared 專案,專案的功用就和名稱所表示的一樣,Shared 專案為兩個平台的應用程式所共用的 Library,這裡先不討論 Shared 專案需注意的細節。

新舊框架的 Association 設定方法都算簡單,但對於開發者來說,新框架的靈活性與行為要比舊框架正常得多,新的 Store Apps 不論在 Windows 8.1 還是 Windows Phone 8.1 上都不再是強制導到某一個 Page 去,而是在 Application Class 內由固定的 Delegate Function 收到後,自已指定負責的 Model 去處理或乎略,所以應該盡可能的將 SDK 轉換至 Store Apps 上,對於應用程式的流程一定會有正面的幫助。

首先開啟 Windows 8.1 與 Phone 8.1 專案的 Package.appxmanifest 檔案,如果使用 Default Editor 可以在 Declarations 中,於左側選擇 File Type Associations 與 Protocl 加入,也可以使用 XML Editor 開啟後,在 Applications 中的 Extensions 加入兩個 Extension 如下。

<Applications>
  <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="AssociationPratice.Windows.App">
    <m2:VisualElements DisplayName="AssociationPratice.Windows" Square150x150Logo="Assets\Logo.png" Square30x30Logo="Assets\SmallLogo.png" Description="AssociationPratice.Windows" ForegroundText="light" BackgroundColor="#464646">
      <m2:SplashScreen Image="Assets\SplashScreen.png" />
    </m2:VisualElements>
    <Extensions>
      <Extension Category="windows.protocol">
        <Protocol Name="ascii" />
      </Extension>
      <Extension Category="windows.fileTypeAssociation">
        <FileTypeAssociation Name=".ascii">
          <SupportedFileTypes>
            <FileType>.ascii</FileType>
          </SupportedFileTypes>
        </FileTypeAssociation>
      </Extension>
    </Extensions>
  </Application>
</Applications>


加入後在應用程式第一次執行時,即會自動在作業系統中註冊 Registry 達到效果,可以建立一個檔案為 file.ascii 測試是否會開啟自己的應用程式,也可以利用 ascii://open 之類的 URI 來開啟應用程式,而應用程式內在透過 File 與 URI 啟動的入口位於 Application 中,必須 override OnActivated 與 OnFileActivated 兩個 Method 如下示範。

protected override void OnActivated(IActivatedEventArgs args)
{
    base.OnActivated(args);
    if (args.Kind == ActivationKind.Protocol)
    {
        ProtocolActivatedEventArgs protocolArgs = args as ProtocolActivatedEventArgs;
        // 下行會輸出 URI :: ascii://login_user_ascii
        Debug.WriteLine(String.Format("URI :: {0}", protocolArgs.Uri));
    }
}

protected override void OnFileActivated(FileActivatedEventArgs args)
{
    base.OnFileActivated(args);
    foreach (var item in args.Files)
    {
        // 下行會輸出 File :: C:\Users\Ascii\Desktop\file.ascii
        Debug.WriteLine(String.Format("File :: {0}", item.Path.ToString()));
    }
}



沒有留言:

張貼留言