118 lines
4.2 KiB
Swift
118 lines
4.2 KiB
Swift
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: "")
|
||
}
|
||
}
|