简述:如何在后台检测通话结束事件 请看下面问题的更新:
是否可以使用Swift在IOS 10中从后台状态检测/获取呼叫状态事件。在早期版本中有一个CORE Telephony API,但现在似乎已经被弃用。
我看到了CallKit Api,但它说它是针对基于VOIP的呼叫的。我需要获取普通CDMA/GSM呼叫的状态,而不是基于VOIP的呼叫,并在通话结束时向服务器发送通知。我不需要访问任何可能涉及隐私的数据点,只需要一个通话结束的事件,然后我的应用程序将成为后台应用程序并启动。就这样。有关如何执行此操作的任何指针吗?
更新:使用CallKit Api,我能够获取呼叫状态,尽管无法区分VOIP和普通GSM呼叫。我可以处理这个问题。我还通过以下方法获得了本地通知。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
application.beginBackgroundTask(withName: "showN", expirationHandler:nil)
return true
}
extension AppDelegate: CXCallObserverDelegate {
func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
if call.hasEnded == true {
print("Disconnected")
let trigger = UNTimeIntervalNotificationTrigger(timeInterval:60,repeats:false)
let identifier = "MyCallLocalNotification"
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
center.add(request, withCompletionHandler: { (error) in
if let error = error{
print(error)
}
})
Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(AppDelegate.showN), userInfo: nil, repeats: false)
print("Done")
}
if call.isOutgoing == true && call.hasConnected == false {
print("Dialing")
}
if call.isOutgoing == false && call.hasConnected == false && call.hasEnded == false {
print("Incoming")
}
if call.hasConnected == true && call.hasEnded == false {
print("Connected")
}
}
}
并且函数showN如下:
func showN(){
let identifier = "MyCallLocalNotification"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval:1,repeats:false)
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
center.add(request, withCompletionHandler: { (error) in
if let error = error{
print(error)
}
})
然而(正如预期的那样),当应用程序在后台运行了很长时间(超过3分钟)或屏幕被锁定时,这种方法就不起作用了。我感觉我已经接近成功,但还是缺少一些东西。我认为这不是一个适当的方法,或者必须有更好的(swift / IOS标准)方法来解决这个问题。请提供建议。已经失去了50点赏金 :)