import UIKit import Flutter import FirebaseCore import GoogleMaps @main @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { // --- 1. تهيئة خرائط جوجل --- // يتأكد من وجود ملف Config.plist ويقرأ المفتاح منه if let config = loadConfig(), let apiKey = config["APIKey"] as? String { GMSServices.provideAPIKey(apiKey) } // --- 2. تهيئة Firebase --- FirebaseApp.configure() // --- 3. فحص الأمان قبل تشغيل الواجهة الرئيسية --- // ملاحظة: هذا يعتمد على وجود ملفات SecurityChecks في مشروعك if SecurityChecks.isDeviceCompromised() { showSecurityAlert() return false // يمنع إكمال تشغيل التطبيق } // --- 4. إعداد قناة الاتصال مع فلاتر --- setupMethodChannel() GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } // --- دالة إعداد قناة الاتصال مع تعديل الاسم --- func setupMethodChannel() { guard let controller = window?.rootViewController as? FlutterViewController else { return } // !! تعديل مهم جداً: تم تغيير اسم القناة ليتوافق مع اسم تطبيقك الجديد let channel = FlutterMethodChannel(name: "com.Intaleq.intaleq/security", binaryMessenger: controller.binaryMessenger) channel.setMethodCallHandler { call, result in switch call.method { case "isNativeRooted": // يتم إرجاع نتيجة فحص الأمان مباشرة result(SecurityChecks.isDeviceCompromised()) default: result(FlutterMethodNotImplemented) } } } // --- كل الدوال المساعدة من الكود القديم تم نسخها كما هي --- 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.presentationController?.delegate = self } rootVC.present(alert, animated: true, completion: nil) } func obfuscatedExit() { let selector = NSSelectorFromString(String(format: "%@%@", "ex", "it:")) if responds(to: selector) { perform(selector, with: 0) } } func loadConfig() -> [String: Any]? { guard let path = Bundle.main.path(forResource: "Config", ofType: "plist"), let config = NSDictionary(contentsOfFile: path) as? [String: Any] else { fatalError("Couldn't find Config.plist file. Please add it to your project.") } return config } } // --- الامتدادات (Extensions) من الكود القديم --- // لمنع إغلاق نافذة التنبيه extension AppDelegate: UIAdaptivePresentationControllerDelegate { func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { return false } func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController) { // لا تفعل شيئاً عند محاولة الإغلاق } } // لسهولة الترجمة extension String { var localized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") } }