Uriプロトコルで別アプリとデータの送受信を行う – LaunchUriForResultsAsync

Uriプロトコル

WindowsAppは、前からUriプロトコルでアプリから、別のアプリを起動できますが、Windows10 UWPから、Uriプロトコルによるアプリ間のデータのやりとりを行うことができるようになりました。

 

今回は2つのアプリを作ります。

呼び出される側は、Uriプロトコルによる起動を設定します。

マニフェストファイルの宣言タブからプロトコルを追加し、名前を「receiveapp」とします。

ProtocolResultApp.xamlという起動されたあと返信する値を設定するページをつくります。

<StackPanel Orientation="Vertical" Margin="0">
    <TextBlock x:Name="textBlock" TextWrapping="Wrap" Text="返信値"/>
    <TextBox x:Name="textBox" TextWrapping="Wrap" Text="TextBox" />
    <Button x:Name="button" Content="Button" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="200" Click="button_Click"/>
</StackPanel>

コードビハインドはこのようにします。

ProtocolForResultsOperationのReportCompletedDataメソッドを実行すると、起動されたアプリは終了し、起動元に結果が返ります。

public sealed partial class ProtocolResultPage : Page
{
    public ProtocolResultPage()
    {
        this.InitializeComponent();
    }

    private ProtocolForResultsOperation operation;
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        //起動された時のパラメータを渡す
        var arg = e.Parameter as ProtocolForResultsActivatedEventArgs;
        operation = arg.ProtocolForResultsOperation;
    }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        //返信値をセットする
        var text = textBox.Text;
        var data = new ValueSet();
        if (data.ContainsKey("MyData"))
        {
            data["MyData"] = text;
        }
        else
        {
            data.Add("MyData",text);
        }
        //呼び出し元に結果を返す
        operation.ReportCompleted(data);
    }
}

App.xaml.csではOnActivatedメソッドをオーバーライドし、プロトコル起動したときにProtocolResultPageにNavigateします。

protected override void OnActivated(IActivatedEventArgs args)
{
    base.OnActivated(args);

    if (args.Kind == ActivationKind.ProtocolForResults)
    {
        Frame rootFrame = Window.Current.Content as Frame;

        rootFrame = new Frame();
        Window.Current.Content = rootFrame;

        var protcolArgs = args as ProtocolForResultsActivatedEventArgs;
        rootFrame.Navigate(typeof(ProtocolResultPage),protcolArgs);
        Window.Current.Activate();
    }

}

最後に、起動されるアプリのFamilyNameを取得しておきます。

このAPIを叩くことで取得できます。

Package.Current.Id.FamilyName;

 

続いて起動元のアプリを作ります。

起動元のアプリでLaunchUriForResultsAsyncでデータを提供してくれるアプリを起動し、データが帰ってきたらデータを表示します。

var option = new LauncherOptions();

//起動先のPackage.Current.Id.FamilyName;で取得できる値を設定する
option.TargetApplicationPackageFamilyName = "*********";
var result = await Launcher.LaunchUriForResultsAsync(new Uri("receiveapp://"),option);
if (result.Status == LaunchUriStatus.Success&&result.Result!=null)
{
    var data = result.Result["MyData"].ToString();
    var dialog = new MessageDialog(data);
    await dialog.ShowAsync();
}

 

呼び出し元アプリから、呼び出し先アプリを起動するとデータを入れることができます。

データを入れたら起動先アプリでボタンを押すことで起動元にデータを返すことができます。

 

今回のサンプルコードを公開しています。

UriReceiveProtocolSample.zip

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.