TL;DR: обнаружение события завершения вызова из фона Пожалуйста, ознакомьтесь с приведенным ниже вопросом:
Возможно ли обнаружить/получить событие для состояния вызова в IOS 10 с использованием Swift из состояния фона. В более ранних версиях была 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 минут) или когда экран заблокирован. Я чувствую, что я почти там, но что-то не хватает. Также подумайте, что это не правильный способ сделать это, или должен быть лучший (быстрый/IOS стандарт) способ сделать это. Пожалуйста, предложите. Уже потеряли 50 пунктов награды:)