之后启动电话并返回应用程序 - Xamarin

时间:2016-02-09 16:02:12

标签: c# ios xamarin

在我的Xamarin应用程序中,用户点击某个按钮后我想打个电话然后返回我的应用程序(理想情况下是代码中的同一个地方)。

这样的事情:

async Task button_click()
{
     string s = "200-345-6789";
     // await Device.OpenUri("tel:" + s); // can't await this
     ShowAlert("The number " + s + " was called");
}

最初我尝试过Device.OpenUri,但这不是等待的。

在Android上,StartActivityWithResult对我来说效果很好。我定义了TaskCompletionSource,以ActionCall的意图启动活动,并在OnActivityResult函数内部将我的任务标记为已完成,这将流返回到原始函数。

但在iOS上,我找不到类似的东西。你会建议什么?

3 个答案:

答案 0 :(得分:2)

注意:这是一个常见的Xamarin iOS异步uri模式,并不会将其声称为我自己的模式,因为它在多个OSS库中使用:

public Task<bool> LaunchUriAsync(Uri uri)
{
    var completion = new TaskCompletionSource<bool>();
    var sharedApp = UIApplication.SharedApplication;
    sharedApp.BeginInvokeOnMainThread(() =>
        {
            try
            {
                var url = NSUrl.FromString(uri.ToString()) ?? new NSUrl(uri.Scheme, uri.Host, uri.LocalPath);
                var result = sharedApp.CanOpenUrl(url) && sharedApp.OpenUrl(url);
                completion.SetResult(result);
            }
            catch (Exception exception)
            {
                completion.SetException(exception);
            }
        });
    return completion.Task;
}

示例:

await LaunchUriAsync(new Uri("mailto:demo@example.com"));
await LaunchUriAsync(new Uri("tel:555-555-5555"));
await LaunchUriAsync(new Uri("https://www.google.com"));
await LaunchUriAsync(new Uri("sms:555-555-5555"));

答案 1 :(得分:1)

在搞了几个小时之后,我找到了解决方案 - 所以我想我会把它发布给其他人以获益。 我所做的是模拟与Android OnActivityResult类似的东西。 在我的AppDelegate类中,我定义了一个从其OnActivated函数触发的事件。 现在,在我的函数内部,我订阅了这个事件,传递给我定义的代理TaskCompletionSource。然后我打电话给Device.OpenUri("tel:" + phoneNum)。拨打电话,结束后用户返回我的应用,AppDelegate.OnActivated触发我的活动,我的代表被呼叫,我可以通过拨打SetResult将我的任务标记为已完成。这使await这个功能成为可能。

答案 2 :(得分:0)

您可以使用telprompt:<phone-number>方案,这会在通话结束后将用户返回到您的应用。

只有一句话,这个计划并没有得到Apple的正式支持,所以他们可能会删除它。

在iOS上拨打号码的方法只有两种tel:<phone-number>telprompt:<phone-number>。没有别的办法。