IOS Ich habe die Benachrichtigung sehr gut erhalten. Das einzige Problem, mit dem ich konfrontiert bin, ist, dass die App unter IOS nicht automatisch geöffnet wird, wenn ich den Anruf annehme.
Wenn ich die App manuell öffne, wird der Anruf gestartet. Aber im Idealfall sollte die App beim Klicken auf „Anruf annehmen“ gestartet werden.
Hinweis: Ich habe checkAndNavigationCallingPage() in WidgetsBinding.instance.addPostFrameCallback hinzugefügt
Ich bin mir sicher Ich habe einige Konfigurationsparameter übersehen. Ich verwende die neueste Bibliothek. Unten ist mein Code von AppDelegate.swift
Bitte helfen Sie mir bei der Lösung dieses Problems.
Code: Select all
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 //////
}
https://github.com/hiennguyen92/flutter ... issues/605