仅检测到来电的CallStateDisconnected,而非来自我的应用程序的呼叫。

12

如果我从我的应用程序发起呼叫,则无法检测到通话结束(状态为CallStateDisconnected)。但是,如果我的应用程序处于活动状态时接收到呼叫,我可以检测到该状态。当呼叫从我的应用程序开始时,我还会两三次接收到状态CTCallStateDialing。这在iOS5下曾经有效,但在iOS6中出现了问题。

我的应用程序代理代码:

 self.callCenter = [[CTCallCenter alloc] init];
self.callCenter.callEventHandler = ^(CTCall* call) {

    // anounce that we've had a state change in our call center
    NSDictionary *dict = [NSDictionary dictionaryWithObject:call.callState forKey:@"callState"]; //BREAKPOINT HERE

    [[NSNotificationCenter defaultCenter] postNotificationName:@"CTCallStateDidChange" object:self userInfo:dict]; 

};
奇怪的是,如果我在callEventHandler块中设置断点并在调用完成后恢复执行,则可以正确获取CallStateDisconnected。然后我在我的视图控制器中订阅通知,并在接收到它们时执行此代码:
- (void)ctCallStateDidChange1:(NSNotification *)notification
 {
  NSString *call = [[notification userInfo] objectForKey:@"callState"];


if ([call isEqualToString:CTCallStateDisconnected])
{
    NSLog(@"Call has been disconnected");

}
else if([call isEqualToString:CTCallStateDialing])
{

    NSLog(@"Call start");
}
else if ([call isEqualToString:CTCallStateConnected])
{
    NSLog(@"Call has just been connected");
}
else if([call isEqualToString:CTCallStateIncoming])
{
    NSLog(@"Call is incoming");
}
else
{
    NSLog(@"None");
}

}

我从我的应用程序中这样发起电话:

        UIWebView *callWebview = [[UIWebView alloc] init];
        [self.view addSubview:callWebview];
        NSURL *telURL = [NSURL URLWithString:number];
        [callWebview loadRequest:[NSURLRequest requestWithURL:telURL]];

我还记录了应用程序状态,然后获得 - (void)applicationDidBecomeActive:(UIApplication *)application

在我开始通话之后,我进入- (void)applicationDidEnterBackground:(UIApplication *)application

通话结束后返回到- (void)applicationDidBecomeActive:(UIApplication *)application。

DidBecomeActive在通话发生之后、进入后台之前被调用,这很奇怪吗?


它仍然可以在iOS 5上运行,我刚试过了,并且看到了“呼叫开始”和“呼叫已断开”的信息。appDelegate状态转换也都很合理。明天才能在iOS 6上尝试。 - emrys57
如果您明天能在iOS6上尝试一下,那将非常有帮助。谢谢。 - DixieFlatline
当您在没有断点的情况下运行它时,与有断点时记录的内容有何不同?我知道如果您等到调用完成后才恢复,则应用程序仅接收单个更新(在此情况下为通话断开连接),否则您将获得所有更新。如果没有断点,您只是一直收到“呼叫开始”,还是什么都没有?除了断开连接状态,您是否会收到所有通知? - Metabble
只有在没有断点的情况下才记录“调用开始”,而在执行暂停(断点)期间停止调用时,记录“调用开始”和“通话已断开”。 - DixieFlatline
1个回答

6
以下是iOS 5手机的日志记录:
2012-12-02 22:00:00.252 TestPhone[2297:707] didFinishLaunchingWithOptions:
2012-12-02 22:00:00.352 TestPhone[2297:707] applicationDidBecomeActive:
2012-12-02 22:00:06.708 TestPhone[2297:707] applicationWillResignActive:
2012-12-02 22:00:10.582 TestPhone[2297:1c03] Call start
2012-12-02 22:00:11.016 TestPhone[2297:707] applicationDidBecomeActive:
2012-12-02 22:00:12.536 TestPhone[2297:707] applicationWillResignActive:
2012-12-02 22:00:12.564 TestPhone[2297:707] applicationDidEnterBackground:
2012-12-02 22:00:36.543 TestPhone[2297:707] applicationWillEnterForeground:
2012-12-02 22:00:36.769 TestPhone[2297:707] applicationDidBecomeActive:
2012-12-02 22:00:36.840 TestPhone[2297:2e07] Call has been disconnected
2012-12-02 22:00:36.854 TestPhone[2297:707] applicationWillResignActive:
2012-12-02 22:00:49.885 TestPhone[2297:707] applicationDidBecomeActive:

这是来自iOS 6手机的日志:

2012-12-03 06:27:55.401 TestPhone[7734:907] didFinishLaunchingWithOptions:
2012-12-03 06:27:55.462 TestPhone[7734:907] applicationDidBecomeActive:
2012-12-03 06:28:01.396 TestPhone[7734:907] applicationWillResignActive:
2012-12-03 06:28:04.345 TestPhone[7734:907] applicationDidBecomeActive:
2012-12-03 06:28:04.401 TestPhone[7734:1803] Call start
2012-12-03 06:28:05.824 TestPhone[7734:907] applicationWillResignActive:
2012-12-03 06:28:05.826 TestPhone[7734:907] applicationDidEnterBackground:
2012-12-03 06:28:17.318 TestPhone[7734:907] applicationWillEnterForeground:
2012-12-03 06:28:17.329 TestPhone[7734:907] applicationDidBecomeActive:

“断开连接”的消息刚刚消失了。(这不是答案,只是一个观察结果。)
这是我使用的代码。我在xcode中创建了一个单视图应用程序,在xib中创建了一个单个按钮,这是我的整个UIViewController:
- (void)viewDidLoad {
    [super viewDidLoad];
    self.callCenter = [[CTCallCenter alloc] init];
    self.callCenter.callEventHandler = ^(CTCall* myCall) {
        NSString *call = myCall.callState;
        if ([call isEqualToString:CTCallStateDisconnected])
            NSLog(@"Call has been disconnected");
        else if([call isEqualToString:CTCallStateDialing]) 
            NSLog(@"Call start");
        else if ([call isEqualToString:CTCallStateConnected])
            NSLog(@"Call has just been connected");
        else if([call isEqualToString:CTCallStateIncoming])
            NSLog(@"Call is incoming");
        else
            NSLog(@"None");
    };
}

- (IBAction)callButtonPressed:(id)sender {
    NSString *number = @"tel:01234567890";
    UIWebView *callWebview = [[UIWebView alloc] init];
    callWebview.frame = self.view.frame;    
    [self.view addSubview:callWebview];
    NSURL *telURL = [NSURL URLWithString:number];
    [callWebview loadRequest:[NSURLRequest requestWithURL:telURL]];
}
@end

而在22:00:36.854时出现的消息是由于手机弹出了一个“您的剩余信用额度为…”窗口所致。 - emrys57
感谢您的观察。我的ios6手机也是如此。这是iOS6的错误吗?应该向苹果报告吗? - DixieFlatline
是的,那似乎不正确。我将您的代码变体添加到了我的答案中。如果有帮助,请随时将其发送给苹果。 - emrys57
1
@DixieFlatline,你收到任何回复了吗? - Gal
是的,昨天我收到了这个:这是对Bug ID#12796040的跟进。该错误已被标记为重复项。该问题正在原始Bug ID#12522984下跟踪,该ID也列在您的错误报告的相关问题部分中。要检查原始错误报告的状态,请访问关闭的重复错误报告的问题详细信息视图的相关问题部分。 - DixieFlatline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接