import UIKit import Flutter import FirebaseCore import GoogleMaps import CoreLocation @main @objc class AppDelegate: FlutterAppDelegate { let locationManager = CLLocationManager() override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { // تحميل Google Maps API Key في خيط خلفي DispatchQueue.global(qos: .background).async { if let config = self.loadConfig(), let apiKey = config["APIKey"] as? String { DispatchQueue.main.async { GMSServices.provideAPIKey(apiKey) } } } // تهيئة Firebase FirebaseApp.configure() GeneratedPluginRegistrant.register(with: self) // التأكد من أن الجهاز غير مخترق قبل تشغيل التطبيق if SecurityChecks.isDeviceCompromised() { showSecurityAlert() return false } // تهيئة قنوات الاتصال مع Flutter setupMethodChannel() // ضبط مدير الموقع لمتابعة تغييرات الأذونات locationManager.delegate = self locationManager.requestWhenInUseAuthorization() // طلب الأذونات فقط عند الحاجة return super.application(application, didFinishLaunchingWithOptions: launchOptions) } // MARK: - تهيئة القناة بين Swift و Flutter func setupMethodChannel() { guard let controller = window?.rootViewController as? FlutterViewController else { return } let channel = FlutterMethodChannel(name: "com.sefer_driver/security", binaryMessenger: controller.binaryMessenger) channel.setMethodCallHandler { call, result in switch call.method { case "isNativeRooted": result(SecurityChecks.isDeviceCompromised()) default: result(FlutterMethodNotImplemented) } } } // MARK: - عرض تنبيه عند اكتشاف جهاز مخترق func showSecurityAlert() { guard let rootVC = UIApplication.shared.keyWindow?.rootViewController else { exit(0) } let alert = UIAlertController( title: "Security Warning".localized, message: "Compromised device detected. Exiting.".localized, preferredStyle: .alert ) alert.addAction(UIAlertAction(title: "OK".localized, style: .destructive) { _ in self.obfuscatedExit() }) if #available(iOS 15.0, *) { alert.popoverPresentationController?.sourceView = rootVC.view alert.popoverPresentationController?.sourceRect = CGRect(x: rootVC.view.bounds.midX, y: rootVC.view.bounds.midY, width: 0, height: 0) alert.popoverPresentationController?.permittedArrowDirections = [] alert.presentationController?.delegate = self if let presentationController = alert.presentationController as? UISheetPresentationController { presentationController.detents = [.medium()] presentationController.preferredCornerRadius = 20 presentationController.prefersEdgeAttachedInCompactHeight = true presentationController.prefersGrabberVisible = false } } rootVC.present(alert, animated: true, completion: nil) } // MARK: - إخفاء عملية الخروج بطريقة مشفرة func obfuscatedExit() { let selector = NSSelectorFromString(String(format: "%@%@", "ex", "it:")) if responds(to: selector) { perform(selector, with: 0) } } // MARK: - تحميل مفاتيح API بطريقة آمنة func loadConfig() -> [String: Any]? { guard let path = Bundle.main.path(forResource: "Config", ofType: "plist"), let config = NSDictionary(contentsOfFile: path) as? [String: Any] else { return nil } return config } } // MARK: - التعامل مع أذونات الموقع بطريقة آمنة extension AppDelegate: CLLocationManagerDelegate { func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { if #available(iOS 14.0, *) { let status = manager.authorizationStatus switch status { case .authorizedWhenInUse, .authorizedAlways: print("Authorization granted") case .denied, .restricted: print("Authorization denied") case .notDetermined: manager.requestWhenInUseAuthorization() @unknown default: break } } else { // لنظام iOS 13 وما قبله، نستخدم الطريقة القديمة let status = CLLocationManager.authorizationStatus() switch status { case .authorizedWhenInUse, .authorizedAlways: print("Authorization granted") case .denied, .restricted: print("Authorization denied") case .notDetermined: manager.requestWhenInUseAuthorization() @unknown default: break } } } } // MARK: - منع إغلاق التنبيهات الأمنية extension AppDelegate: UIAdaptivePresentationControllerDelegate { func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { return false } } // MARK: - دعم الترجمة للنصوص extension String { var localized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") } }