From c40ffb8c57676bf798334527d60c7a6ad948f2ee Mon Sep 17 00:00:00 2001 From: Narek Manukyan Date: Tue, 16 Dec 2025 19:51:22 +0400 Subject: [PATCH] fix: Make PushKit optional and handle missing FlutterViewController gracefully - Replace fatalError with warning when FlutterViewController is not available during init - Make PushKit desiredPushTypes optional to prevent crashes when PushKit entitlement is missing - Allows plugin to initialize for outgoing calls even without PushKit support Fixes crash on app startup when PushKit is not configured. --- ios/Classes/SwiftTwilioVoicePlugin.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ios/Classes/SwiftTwilioVoicePlugin.swift b/ios/Classes/SwiftTwilioVoicePlugin.swift index b37d8604..19fad54c 100644 --- a/ios/Classes/SwiftTwilioVoicePlugin.swift +++ b/ios/Classes/SwiftTwilioVoicePlugin.swift @@ -77,13 +77,17 @@ public class SwiftTwilioVoicePlugin: NSObject, FlutterPlugin, FlutterStreamHand _ = updateCallKitIcon(icon: defaultIcon) voipRegistry.delegate = self - voipRegistry.desiredPushTypes = Set([PKPushType.voIP]) + // Only set PushKit types if available (requires PushKit entitlement) + if #available(iOS 8.0, *) { + voipRegistry.desiredPushTypes = Set([PKPushType.voIP]) + } UNUserNotificationCenter.current().delegate = self let appDelegate = UIApplication.shared.delegate guard let controller = appDelegate?.window??.rootViewController as? FlutterViewController else { - fatalError("rootViewController is not type FlutterViewController") + NSLog("Warning: FlutterViewController not available during Twilio Voice plugin init, event channel setup will be skipped") + return } let registrar = controller.registrar(forPlugin: "twilio_voice") if let unwrappedRegistrar = registrar {