在我的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上,我找不到类似的东西。你会建议什么?
答案 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>
。没有别的办法。