前言
當我們在實作Cortana Skill的時候, 我們可以將雲上的資料回傳給Cortana 並且顯示在Canvas上 來跟使用者互動但實務上, 有些情況因為Canvas本身的限制, 所以需要再刻一個負責前端的UWP來顯示Skill回傳的資料
以下即介紹如透過實作UWP的 Deep link使之與 Cortana 互動
UWP的部分
設定Protocol
右鍵 Package.appxmanifest 選擇 View Code加入
<Extensions> <uap:Extension Category="windows.protocol"> <uap:Protocol Name="YOUR_URL"> <uap:DisplayName>"YOUR_NAME"</uap:DisplayName> </uap:Protocol> </uap:Extension> </Extensions>
YOUR_URL = skill.mytest.clien
YOUR_NAME = mytest
複寫OnActivated
當程式被Cortana叫起來時, 這個函式會被執行
複寫它, 使之將頁面切換至相應的頁面
var protocolArgs = args as ProtocolActivatedEventArgs; rootFrame.Navigate(typeof(Views.ListPhotos), protocolArgs.Uri.Query);
如範例所示, 我們會將頁面導向到 Views.ListPhotos
Views.ListPhotos複寫OnNavigatedTo
讓我們在導向至這個頁面的時候, 可以先去載入相關資料
protected override async void OnNavigatedTo(NavigationEventArgs e) { var query = e.Parameter as string; await vm.LoadPhotos(query); }
Cortana
Skill 的部分還蠻簡單的, 基本上只要將指定的UWP的URI, 封裝在ChannelData中的action裡面, 並且將type指定為LaunchUri action = new
{
type = "LaunchUri",
uri = $"skill.mytest.client:?{Uri.EscapeUriString(query.Trim())}"
}
當Cortana收到如上所示的回傳資料時, 就會去執行UWP
var reply = context.MakeMessage(); reply.Text = text; reply.Speak = speak; reply.ChannelData = JObject.FromObject( new { action = new
{
type = "LaunchUri",
uri = $"skill.mytest.client:?{Uri.EscapeUriString(query.Trim())}"
}
});
await context.PostAsync(replyMessage);
留言
張貼留言