21

我正在尝试创建一个应用程序,该应用程序将向类似呼叫中心的列表中的优先级 1 联系人发起呼叫。

然后,如果那个联系人没有接听(让我们忘记这里的答录机的整个问题),我想呼叫优先级 2 的联系人,依此类推,直到其中一个接听或我用尽了我的名单。

这可能吗?

我尝试了以下方法:

  1. 挂钩CTCallCenter.CallEventHandler事件,并检查 and 的呼叫状态CTCallStateConnectedCTCallStateDisconnected我让它响应呼叫断开的事实,没有连接,然后尝试像我第一次那样发起另一个呼叫,但是第二次尝试只是坐下来死在水里。
  2. 覆盖该DidEnterBackground方法,并定期检查CTCall.CallState属性,基本上再次尝试响应从未连接过的断开连接,但这似乎也不起作用

我还尝试在检测到断开状态后在尝试下一次拨号之前添加一个短暂的延迟(1 秒、2.5 秒和 10 秒),以允许电话应用程序在中止呼叫后“稳定下来”,这并没有改变任何东西。

4

5 回答 5

7

我认为这在电话的目的地更好地解决。我要么让电话公司配置“跟我来”服务,使用 Twilio 或其他一些第 3 方服务(如前所述),或者使用 Asterisk 之类的东西配置我自己的 PBX Asterisk 包括配置“跟我来”类型的能力行为)。它为您提供了更多的灵活性和控制力,即使您确实找到了一种在 iOS 中本地执行此操作的方法。

话虽如此,我确实让它在 iOS 中工作,假设如下:

  1. 您的应用发起呼叫。
  2. 打开电话应用程序,拨打号码,然后断开连接。
  3. 用户明确返回到您的应用程序。如果您在应用程序后台运行时设法获取事件,我想知道更多:-)。
  4. 将控制权返回给您的应用后,将发送电话事件并启动新呼叫。

我的 UIApplicationDelegate didFinishLaunchingWithOptions 方法中有以下代码片段:

// In appdelegate header, ct is declared as @property (strong, nonatomic) CTCallCenter *ct; 
self.ct = [[CTCallCenter alloc] init];
self.ct.callEventHandler = ^(CTCall *call) {
    if (call.callState == CTCallStateConnected) {
        // do some state management to track the call
    } else if (call.callState == CTCallStateDisconnected) {
        // check that this is the expected call and setup the
        // new phone number
        NSURL *telURL = [NSURL URLWithString:myNewNumberURL];
        [application openURL:telURL];    
    }     
};

这将拨打新电话。我正在使用 iOS 5 SDK;在 iPhone 4s 上测试。

编辑

使用与 UIWebView 不同的本机代码中的电话后返回到应用程序行为作为起点,我已经设法让它工作。请注意,为了清楚起见,我已经强调了内存管理。假设您在调用完成后使用 Web 视图技术返回您的应用程序,请在调用完成块中尝试以下操作:

else if (call.callState == CTCallStateDisconnected) {
    // check that this is the expected call and setup the
    // new phone number
    NSURL *telURL = [NSURL URLWithString:myNewNumberURL];
    dispatch_async(dispatch_get_main_queue(), ^{
        UIWebView *callWebview = [[UIWebView alloc] init]  ;
        [self.window.rootViewController.view addSubview:callWebview];
        [callWebview loadRequest:[NSURLRequest requestWithURL:telURL]]; 
        // and now callWebView sits around until the app is killed....so don't follow this to the letter.  
    });
}

但是,这也可能无法完全满足您的需求。用户将收到有关每个呼叫请求的警报,从而提供取消呼叫的机会。

于 2012-01-27T23:23:08.287 回答
0

您可以使用http://labs.twilio.com/twimlets/findme。您可以让应用程序呼叫一个 Twilio 号码,它可以使用 findme 按顺序呼叫所有号码。

于 2012-01-16T18:42:46.623 回答
0

我没有深入研究它,但 Deutsche Telekom SDK 可能包含您正在关注的内容:

http://www.developergarden.com/fileadmin/microsites/ApiProject/Dokumente/Dokumentation/ObjectiveC-SDK-2.0/en/interface_voice_call_service.html

我真的不确定(目前没有时间真正看它) - 我只记得我在某处读到他们有一个应该也处理呼叫管理的 iOS SDK,所以我发布此处的链接供您查找(并希望告诉我们它是否有效)。

于 2012-05-13T10:50:43.433 回答
0
#pragma mark -
#pragma mark Call Handler Notification
-(void)notificationCallHandler {

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callReceived:) name:CTCallStateIncoming object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callEnded:) name:CTCallStateDisconnected object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callConnected:) name:CTCallStateConnected object:nil];

}
-(void)callEnded:(NSNotification*)notification {
     NSLog(@"callEnded");

}

-(void)callReceived:(NSNotification*)notification {
     NSLog(@"callReceived");
}
-(void)callConnected:(NSNotification*)notification {
     NSLog(@"callConnected");
}

愿这对你有帮助

于 2012-05-16T12:56:59.440 回答
0

如果您想在应用程序处于后台时设置一个新呼叫,我看不到任何适当的方法,一个 lil hack 可能是获取位置更新(因为您可以在应用程序处于后台时获取位置更新)和自动定位服务当新的位置数据到达时唤醒您的应用程序,并为您可以执行一些代码的应用程序提供少量时间,在此期间您可以开始一个新的调用。

您可以在此处进一步阅读:在此链接位置感知编程指南
中搜索“启动重大更改位置服务” ,并阅读代码块之后编写的段落。

于 2012-05-17T14:01:27.757 回答