iPhone,拨打另一个电话号码回应第一个不回答?

我试图创build一个应用程序,将启动一个呼叫优先级1联系人在呼叫中心般的名单。

那么,如果那个联系人没有回答(让我们忘记这里的答题机的全部问题),我想打电话给优先级2的联系人,等等,直到他们中的一个回答,或者我耗尽了我的名单。

这可能吗?

我已经尝试了以下内容:

  1. 挂钩到CTCallCenter.CallEventHandler事件,并检查呼叫状态为CTCallStateConnectedCTCallStateDisconnected ,我得到它响应的事实,该呼叫断开,没有连接,然后尝试启动另一个电话,像我做的第一次,但这第二次尝试只是坐在水中死亡。
  2. 重写DidEnterBackground方法,并定期检查CTCall.CallState属性,基本上再次试图响应从未连接的断开连接,但这似乎不工作

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

我认为这个问题在电话的目的地得到解决。 我要么电话公司configuration一个“跟我来”的服务,使用Twilio或其他第三方服务(如已经build议),或configuration我自己的PBX使用像Asterisk (Asterisk包括configuration“跟我来”types行为)。 它为您提供了更多的灵活性和控制力,即使您在iOS中find了本地化的方法。

话虽如此,我确实得到这个在iOS工作,假设如下:

  1. 您的应用程序启动电话。
  2. 手机应用程序被打开,拨打号码,并断开连接。
  3. 用户明确返回到您的应用程序。 如果您在devise应用程序时遇到事件,我想了解更多:-)。
  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上testing。

编辑

在使用本机代码调用不同于UIWebView的电话后,返回到应用程序的行为作为一个起点,我设法让这个工作。 请注意,为了清晰起见,我已经在内存pipe理上进行了调整 假设您在调用完成后使用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. }); } 

但是,这可能不会给你想要的。 用户将收到每个通话请求的提醒,提供取消通话的机会。

你可以使用http://labs.twilio.com/twimlets/findme 。 你可以让应用程序调用Twilio号码,它可以使用findme按顺序调用所有的号码。

我没有深入研究,但德国电信的SDK可能包含你正在寻找的东西:

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

我真的不知道(现在没有时间真正看它) – 我只记得我曾经在某个地方看过他们有一个iOS SDK,它也可以处理呼叫pipe理,所以我发布了链接在这里为您找出(并希望告诉我们,如果它的作品)。

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

愿这能帮助你

如果你想设置一个新的电话,而应用程序是在后台,我没有看到任何正确的方式,一个律黑客可能,得到位置更新(因为你可以得到位置更新,而应用程序在后台),和位置服务自动当新的位置数据到达时唤醒你的应用程序,并且在你可以执行某些代码的应用程序中给予less量时间,那时你可以开始一个新的调用。

你可以在这里进一步阅读:
在这个链接位置感知编程指南中search这个“启动重大更改位置服务”,并阅读在代码块之后写入的段落。