从后台调用调用

本文关键字:调用 后台 | 更新日期: 2023-09-27 17:55:51

我正在尝试扩展我当前的应用程序(公司内部电话簿),以便能够通过我们运营商的总机转接电话。这个过程是人A打电话给我。然后,我可以"寄存"呼叫并呼叫另一个同事,然后再次拨打号码 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();
        }
    }

这将提示用户拨打此号码(因为 afaik u 无法在没有提示的情况下发起呼叫?

现在,当完成此操作时,计时器启动(基于设置)以启动对数字 4 的第三次调用。这是电话公司总机用于将电话呼叫配对在一起的号码。

我们将应用置于内部状态 3(由于拨出呼叫而有意暂停的应用)

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);
    }   
}

从后台调用调用

不确定我是否正确理解了您的问题。但通常,所有 UI 线程调用都必须在 UI 线程(应用的主线程)上完成。如果你有一个工作线程,你必须将 UI 调用委托给 UI 线程,如果不这样做,会导致调用似乎被忽略(事实上,它被忽略了:))。

若要从任何其他线程调用 UI 线程,请使用 InvokeOnMainThread 函数。这是在所有 NSObject 派生类上实现的方法。

这。InvokeOnMainThread (delegate {//do your stuff here} );

希望这有帮助。

这在当前的iOS结构中是无法解决的。