How can I find out whether the user pressed the Call or the Cancel button when making a call from my app?

前端 未结 6 396
梦谈多话
梦谈多话 2020-12-05 20:48

I need to return to my app after making a call from my app, so I use this code:

NSURL *url = [NSURL URLWithString:@\"telprompt://123-4567-890\"]; 
[[UIApplic         


        
6条回答
  •  眼角桃花
    2020-12-05 21:18

    Here is an iOS 10+ solution for Swift 4.2, tested with iOS 12 that detects both the Cancel and the Call button.

    Don't forget to import CallKit and conform your class to CXCallObserverDelegate!

    let callObserver = CXCallObserver()
    
    var didDetectOutgoingCall = false
    
    func showCallAlert() {
        guard let url = URL(string: "tel:+36201234567"),
            UIApplication.shared.canOpenURL(url) else {
                return
        }
    
        callObserver.setDelegate(self, queue: nil)
    
        didDetectOutgoingCall = false
    
        //we only want to add the observer after the alert is displayed,
        //that's why we're using asyncAfter(deadline:)
        UIApplication.shared.open(url, options: [:]) { [weak self] success in
            if success {
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
                    self?.addNotifObserver()
                }
            }
        }
    }
    
    func addNotifObserver() {
        let selector = #selector(appDidBecomeActive)
        let notifName = UIApplication.didBecomeActiveNotification
        NotificationCenter.default.addObserver(self, selector: selector, name: notifName, object: nil)
    }
    
    @objc func appDidBecomeActive() {
        //if callObserver(_:callChanged:) doesn't get called after a certain time,
        //the call dialog was not shown - so the Cancel button was pressed
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in
            if !(self?.didDetectOutgoingCall ?? true) {
                print("Cancel button pressed")
            }
        }
    }
    
    func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
        if call.isOutgoing && !didDetectOutgoingCall {
            didDetectOutgoingCall = true
    
            print("Call button pressed")
        }
    }
    

提交回复
热议问题