Как запустить приложение или интерфейс входящего звонка, когда я получаю тихое push-уведомление в приложении для iOS? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь создать приложение, которое запускает приложение или интерфейс входящего вызова при получении уведомления в режиме без вывода сообщений.

В настоящее время у меня работают уведомления, и я могу отправить уведомление и распечататьпротоколировать при получении уведомления

Эта функция упрощает получение уведомлений:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void){
    print("Enitre message \(userInfo)")

    let state: UIApplication.State = application.applicationState
    switch state {
    case UIApplication.State.active:
        print("State: App is active")
    case UIApplication.State.inactive:
        print("State: App is inactive")
    case UIApplication.State.background:
        print("State: App is running in the background")
    default:
        print("State: Unknown")
    }
    completionHandler(UIBackgroundFetchResult.newData)
}

Можно ли открыть приложение или интерфейс входящего вызова в этой функции?

1 Ответ

0 голосов
/ 14 февраля 2019

Первая регистрация для VOIP-уведомлений в

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        requestPushKit()
        return true
}

Импорт набора вызовов

import CallKit

Регистрация Push-набора

fileprivate func requestPushKit() {
        let voipRegistry = PKPushRegistry(queue: DispatchQueue.main)
        voipRegistry.delegate = self
        voipRegistry.desiredPushTypes = [.voIP]
}

Делегаты VOIP (Push Kit)

extension AppDelegate: PKPushRegistryDelegate {

    func pushRegistry( registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {

        if type == PKPushType.voIP {
            let tokenParts = pushCredentials.token.map { data -> String in
                return String(format: "%02.2hhx", data)
            }

            let tokenString = tokenParts.joined()

            print(tokenString)

        }
    }

    func pushRegistry( registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) {

    }

  func pushRegistry( registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type:PKPushType, completion: @escaping () -> Void) {

        if type == PKPushType.voIP {
            self.incomingCall()
        }
    }

    func pushRegistry( registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {
        if type == PKPushType.voIP {
            self.incomingCall()
        }
    }

}

Вызов метода входящего вызова

fileprivate func defaultConfig() -> CXProviderConfiguration{
        let config = CXProviderConfiguration(localizedName: "My App")
        config.includesCallsInRecents = true
        config.supportsVideo = true
        config.maximumCallGroups = 5
        config.maximumCallsPerCallGroup = 10
//        config.iconTemplateImageData = UIImagePNGRepresentation(UIImage(named: "pizza")!)
//        config.ringtoneSound = "ringtone.caf" 

        return config
    }


func incomingCall(){
        let provider = CXProvider(configuration: defaultConfig())
        provider.setDelegate(self, queue: nil)
        let update = CXCallUpdate()
        update.remoteHandle = CXHandle(type: .generic, value: "Pete Za")
        update.hasVideo = true
        provider.reportNewIncomingCall(with: UUID(), update: update, completion: { error in })
    }

И методы делегата набора вызова

extension AppDelegate : CXProviderDelegate {

    func providerDidReset( provider: CXProvider) {

    }

    func providerDidBegin( provider: CXProvider) {

    }

    func provider( provider: CXProvider, perform action: CXAnswerCallAction) {
        action.fulfill()
    }

    func provider( provider: CXProvider, perform action: CXEndCallAction) {
        action.fulfill()
    }

    func provider( provider: CXProvider, perform action: CXStartCallAction) {

    }

    func provider( provider: CXProvider, perform action: CXSetHeldCallAction) {

    }

    func provider( provider: CXProvider, timedOutPerforming action: CXAction) {

    }

    func provider( provider: CXProvider, perform action: CXPlayDTMFCallAction) {

    }

    func provider( provider: CXProvider, perform action: CXSetGroupCallAction) {

    }

    func provider( provider: CXProvider, perform action: CXSetMutedCallAction) {

    }

//    func provider(_ provider: CXProvider, execute transaction: CXTransaction) -> Bool {
//
//    }
}

Тем не менее, если вам что-то требуется, сообщите нам об этом.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...