【问题标题】:iPhone, call another phone number in response to the first not answering?iPhone,拨打另一个电话号码以响应第一个不接听?
【发布时间】:2012-02-01 19:38:06
【问题描述】:

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

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

这可能吗?

我尝试了以下方法:

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

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

【问题讨论】:

  • 您可以考虑通过 Twilio 号码执行此操作。他们有这种流程的示例代码。
  • 我肯定会更多地关注 Twilio,但粗略的一看告诉我这不是我想要的。目前,呼叫必须来自我的电话并转到优先级为 1 的呼叫者,以便他/她看到是我。另外,这个应用程序会被其他人安装,并且让这些人都设置他们自己的twilio帐户不在这个应用程序的范围内(如果我在这里理解有问题,请纠正我。)
  • 我知道这可能是一个很长的机会,但您是否尝试在一段时间后使用[self performSelector:<#(SEL)#> withObject:<#(id)#> afterDelay:<#(NSTimeInterval)#>] 发送您的第二个呼叫@ 使用 iOS 有一段时间向我展示了您通常必须在延迟后发送事件(特别是在您切换到手机视图的情况下需要 UI 动画)。
  • 这听起来像是您会使用 Google Voice 来做的事情。 google.com/googlevoice/about.html

标签: iphone ios core-telephony


【解决方案1】:

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

【讨论】:

  • 请阅读我在问题上留下的评论,以回应使用 Twilio。
  • 我没看到,但是我认为你误解了 Twilio 是什么,它是一个 api,所以只有你必须注册
  • 所以使用该应用程序的人不必拥有帐户,只有构建该应用程序的我必须?
【解决方案2】:

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

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

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

我的 UIApplicationDelegate didFinishLaunchingWithOptions 方法中有以下 sn-p 代码:

// 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 上测试。

编辑

Return to app behavior after phone call different in native code than 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.  
    });
}

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

【讨论】:

  • 不幸的是,这也不符合我们的标准,但我认为现在(尤其是)你和其他人已经充分强调了我们得出的相同结论,这确实是不可能的(或轻松完成)。我们有一些想法可以使用,但我们的标准是完全无人参与的第二次呼叫(即没有手动接受或返回应用程序),不涉及第三方服务(如 Twilio 或类似服务)。我要接受这个答案不是因为它解决了它,而是因为它表明这很可能是不可能的。感谢您的帮助。
  • 也可以使用 [[UIApplication sharedApplication] openURL:@"telprompt:0123456789"];获得与 Web 视图解决方法相同的行为(提示并在调用后返回到您的应用程序)。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:
    #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");
    }
    

    希望对你有帮助

    【讨论】:

    • 不,因为我已经对这些做出了反应,但是由于电话应用程序接管,我的应用程序已经在后台,我怀疑当我在后台时我可以建立一个新电话.
    • developer.apple.com/library/ios/#documentation/… 我认为在后台该块不会响应,而是在它变为活动时该块将响应较早的调用(根据苹果文档)。
    【解决方案5】:

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

    你可以在这里进一步阅读:
    在此链接Location Aware programming guide 中搜索“启动重大变化定位服务” ,并阅读代码块之后写的段落。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 2022-10-21
      相关资源
      最近更新 更多