25-3/18/1

This commit is contained in:
Hamza-Ayed
2025-03-18 13:54:27 +03:00
parent 6e77dec65f
commit 153d2f64c0
1307 changed files with 9505 additions and 528 deletions

155
ios/Runner/AppDelegate.swift Normal file → Executable file
View File

@@ -2,61 +2,158 @@ import UIKit
import Flutter
import FirebaseCore
import GoogleMaps
import CoreLocation // استيراد CoreLocation لتحديث الموقع
import CoreLocation
@main
@objc class AppDelegate: FlutterAppDelegate, CLLocationManagerDelegate {
var locationManager: CLLocationManager?
@objc class AppDelegate: FlutterAppDelegate {
let locationManager = CLLocationManager()
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GMSServices.provideAPIKey(Constants.googleMapsAPIKey)
// تحميل 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 JailbreakDetection.isJailbroken() {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.showJailbreakAlert()
}
// التأكد من أن الجهاز غير مخترق قبل تشغيل التطبيق
if SecurityChecks.isDeviceCompromised() {
showSecurityAlert()
return false
}
// تفعيل تحديث الموقع فور تشغيل التطبيق
// startLocationUpdates()
// تهيئة قنوات الاتصال مع Flutter
setupMethodChannel()
// ضبط مدير الموقع لمتابعة تغييرات الأذونات
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization() // طلب الأذونات فقط عند الحاجة
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
func startLocationUpdates() {
locationManager = CLLocationManager()
locationManager?.delegate = self
locationManager?.desiredAccuracy = kCLLocationAccuracyBest
locationManager?.allowsBackgroundLocationUpdates = true
locationManager?.pausesLocationUpdatesAutomatically = false
// MARK: - تهيئة القناة بين Swift و Flutter
func setupMethodChannel() {
guard let controller = window?.rootViewController as? FlutterViewController else {
return
}
locationManager?.requestAlwaysAuthorization() // طلب إذن الموقع
locationManager?.startUpdatingLocation() // بدء التحديث
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)
}
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
print("📍 Location updated: \(location.coordinate.latitude), \(location.coordinate.longitude)")
}
func showJailbreakAlert() {
guard let rootVC = UIApplication.shared.keyWindow?.rootViewController else { return }
// MARK: - عرض تنبيه عند اكتشاف جهاز مخترق
func showSecurityAlert() {
guard let rootVC = UIApplication.shared.keyWindow?.rootViewController else {
exit(0)
}
let alert = UIAlertController(
title: "تحذير أمني",
message: "تم اكتشاف أن جهازك يحتوي على جيلبريك. لا يمكن تشغيل التطبيق على هذا الجهاز.",
title: "Security Warning".localized,
message: "Compromised device detected. Exiting.".localized,
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "إنهاء التطبيق", style: .destructive) { _ in
exit(0)
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: "")
}
}