我正在尝试扩展我当前的应用程序(内部公司电话簿),以便能够通过我们的运营商的交换机转发呼叫。这个过程是一个人打电话给我。然后,我可以“停放”呼叫并呼叫另一个同事并再次拨打号码4以连接a和同事。但是当我在脑海中完成代码处理时,我意识到这可能是不可能的。因为发生的事情是人员A电话,我打开我的应用程序并选择一个人。应用程序启动呼叫,然后应用程序暂停到后台模式。
我如何继续让应用程序(暂停时)发起第三次拨打号码4,而无需再次激活应用程序?从我的测试我可以看到应用程序发送调试的东西,但当试图做UI的东西,例如打开浏览器,它不会通过。当有正在进行的通话时,它甚至可能吗?或者电话是否会采取活动并压制所有应用程序?
我希望在此之前能够对此进行一些快速的输入,然后花费无用的时间来实现它,甚至可能无法实现。
编辑:添加了一些代码示例。
首先,用户按联系簿中的一行。
public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
Console.WriteLine("Initiate Call to Contact");
NSUrl url = new NSUrl("tel:" + _items.Contacts[indexPath.Row].Number);
if (!UIApplication.SharedApplication.OpenUrl(url))
{
var av = new UIAlertView("Not supported"
, "Scheme 'tel:' is not supported on this device"
, null
, "Ok thanks"
, null);
av.Show();
}
}
会提示用户拨打这个号码(因为如果没有提示你就不能发起呼叫?
现在,当完成此操作时,计时器启动(基于设置)以启动对第4号的第3次呼叫。这是电话公司总机用于将电话呼叫组合在一起的号码。
我们将应用程序置于内部状态3(由于拨出电话而意图暂停app)
public partial class AppDelegate : UIApplicationDelegate
{
int ourTask;
public override void DidEnterBackground (UIApplication application)
{
Console.WriteLine("Entered Background!");
ourTask = application.BeginBackgroundTask(delegate {
if(ourTask != 0) {
application.EndBackgroundTask(ourTask);
ourTask = 0;
}
});
new System.Action(delegate {
if(_state == 3) {
BeginInvokeOnMainThread( delegate {
Console.WriteLine("Code queued");
if(UIDevice.CurrentDevice.IsMultitaskingSupported) {
Thread.Sleep(10000);
NSUrl url = new NSUrl("tel:" + 4);
if (!UIApplication.SharedApplication.OpenUrl(url))
{
Console.WriteLine("Not supported!");
}
Console.WriteLine("Invoke Finished!");
}
application.BeginInvokeOnMainThread(delegate {
if(ourTask != 0) {
application.EndBackgroundTask(ourTask);
ourTask = 0;
Console.WriteLine("App Ended!");
}
});
});
}
}).BeginInvoke(null,null);
}
}
答案 0 :(得分:1)
不确定我是否正确理解您的问题。但一般来说,所有UI线程调用必须在UI线程(应用程序的主线程)上完成。如果你有一个工作线程,你必须将UI调用委托给UI线程,否则会导致调用被忽略(实际上,它被忽略:))。 p>
要从任何其他线程调用UI线程,请使用InvokeOnMainThread函数。这是在所有NSObject派生类上实现的方法。
this.InvokeOnMainThread(委托{//在这里做你的东西});
希望这有帮助。
答案 1 :(得分:0)
对于当前的iOS结构,这是无法解决的。