单击“接受呼叫”时应用程序未打开(后台或终止状态应用程序)

问题描述 投票:0回答:1

我使用这个插件 flutter_callkit_incoming 在 android 和 ios 中配置通知来电通知。安卓运行良好。 IOS 我很好地收到了通知。我面临的唯一问题是当我接听电话时,它不会在 IOS 中自动打开应用程序。 当我手动打开应用程序时,它开始通话。但理想情况下,它应该在单击接受呼叫时启动应用程序。

注意:我在 WidgetsBinding.instance.addPostFrameCallback 中添加了 checkAndNavigationCallingPage()

我确信我错过了一些配置参数。我正在使用最新的库。下面是我来自 AppDelegate.swift 的代码

请帮我解决这个问题。

import UIKit
import Flutter
import flutter_local_notifications
import flutter_callkit_incoming
import CallKit
import AVFAudio
import PushKit

@main
@objc class AppDelegate: FlutterAppDelegate, PKPushRegistryDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
      // This is required to make any communication available in the action isolate.
      FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in
        GeneratedPluginRegistrant.register(with: registry)
      }
      
      // Added as per documentation of flutter local notification package
      if #available(iOS 10.0, *) {
        UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
      }
      
      GeneratedPluginRegistrant.register(with: self)

              
      //Setup VOIP (flutter_callkit_incomming)
      let mainQueue = DispatchQueue.main
      let voipRegistry: PKPushRegistry = PKPushRegistry(queue: mainQueue)
      voipRegistry.delegate = self
      voipRegistry.desiredPushTypes = [PKPushType.voIP]
      
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

   // As per flutter_callkit_incomming Start ///////////////////

    
    // Handle updated push credentials
    func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) {
        print(credentials.token)
        let deviceToken = credentials.token.map { String(format: "%02x", $0) }.joined()
        print(deviceToken)
        //Save deviceToken to your server
        SwiftFlutterCallkitIncomingPlugin.sharedInstance?.setDevicePushTokenVoIP(deviceToken)
    }
    
    func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) {
        print("didInvalidatePushTokenFor")
        SwiftFlutterCallkitIncomingPlugin.sharedInstance?.setDevicePushTokenVoIP("")
    }
    
    // Handle incoming pushes
    func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
        print("didReceiveIncomingPushWith")
        guard type == .voIP else { return }
        
        // Require by
        let id = payload.dictionaryPayload["id"] as? String ?? UUID().uuidString
        let nameCaller = (payload.dictionaryPayload["params"] as? [String: Any])? ["body"] as? String ?? ""
        let appName = (payload.dictionaryPayload["params"] as? [String: Any])? ["title"] as? String ?? ""
        // Phone number/Email/Any
        let handle = payload.dictionaryPayload["handle"] as? String ?? "generic"
        //Video call or audio call
        let isVideo = payload.dictionaryPayload["isVideo"] as? Int ?? 1
        //duration of ring
        let duration = payload.dictionaryPayload["duration"] as? Int ?? 30000
        // ringtone
        let ringtonePath = payload.dictionaryPayload["ringtonePath"] as? String ?? "system_ringtone_default"
        var args: NSDictionary = ["id": id, "nameCaller": nameCaller, "appName": appName, "handle": handle, "type": isVideo, "duration": duration, "ringtonePath": ringtonePath]
        let data = flutter_callkit_incoming.Data(args: args)
        data.extra =  payload.dictionaryPayload["params"] as? NSDictionary ?? [:]
        data.iconName = ""
        data.type = 1;
        print(data);
        SwiftFlutterCallkitIncomingPlugin.sharedInstance?.showCallkitIncoming(data, fromPushKit: true)
        
        //Make sure call completion()
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            completion()
        }
    }

   ///// as per flutter_callkit_incomming END //////
}

下面是git链接:

https://github.com/hiennguyen92/flutter_callkit_incoming/issues/605

ios flutter notifications apple-push-notifications callkit
1个回答
0
投票

我将 endCall 和 endAllCalls 函数移至实际通话结束处,现在可以使用了。我遇到的问题是因为它在 Android 上运行而不是在 IOS 上运行。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.