如何确定应用程序是从电话呼叫返回还是从后台恢复?

3

我使用以下代码从我的应用程序发起电话:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"telprompt://XXXXXXXXXX"]];

当用户结束通话后,默认的苹果提供的电话应用程序进入后台,我的应用程序恢复焦点。这是自动完成的。

现在这里是我想要的: 我想每次(仅限于)用户从通话返回时调用一个方法。

我试图从applicationWillEnterForeground:applicationDidBecomeActive: 调用此方法,但这些回调在其他时候被触发,例如从后台状态启动应用程序(这不是我想要的)。

我希望确定我的应用程序是从后台状态启动还是从电话通话返回,以便在前者中执行某个任务而不是后者。 有什么建议吗?

----编辑----

这是我最终的实现方式:

请参见:CallStateDisconnected only detected for incoming calls, not for calls made from my app

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [self listenForCalls];
}

- (void)listenForCalls {

    self.callCenter = [[CTCallCenter alloc] init];
    self.callCenter.callEventHandler = ^(CTCall* myCall) {
        NSString *call = myCall.callState;
        if([call isEqualToString:CTCallStateDialing]) {
              //do ur stuff
        }
    };
}
2个回答

2

可以使用 CTCall 的 callState 属性来实现这一点。 - NSExplorer

1
为什么不保存一个标志,指示您的应用程序向用户发送了电话呼叫。当您的应用程序变为活动状态时,如果设置了该标志,请执行从电话呼叫返回方法。
例如:
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"DidStartPhoneCall"];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"telprompt://XXXXXXXXXX"]];

然后就像这样,
-(void)applicationDidBecomeActive {
    BOOL activeFromCall = [[NSUserDefaults standardUserDefaults] objectForKey:"DidStartPhoneCall"]
    if(activeFromCall && [activeFromCall boolValue] == YES) {
     // do your method 
    }
    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"DidStartPhoneCall"]; // reste flag
}

2
这正是我一直在做的事情。但是这种方法存在一个问题。每次调用openURL:方法进行呼叫时,用户都会收到一个警告视图,其中他可以选择“呼叫”或“取消”。如果用户取消了呢?在这种情况下,在启动openURL:方法之前将“DidStartPhoneCall”标志设置为YES是不正确的,对吧?因此,在这种情况下,这种方法行不通。 - NSExplorer
或许只有在 openUrl 方法返回 YES 时才设置标志? - thelaws
1
返回YES,包括“取消”和“呼叫” :( - NSExplorer
嗯,有点棘手!如果他们按下“呼叫”按钮,您的应用程序是否会收到applicationWillEnterBackground通知(或类似通知)?那么这可以通过2个标志来实现。 - thelaws
1
是的...如果用户不回来,只是关闭了应用程序,下次应用程序启动时,您将确定它是否像电话后那样回来。 - holex

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