25-3/18/1
This commit is contained in:
155
ios/Runner/AppDelegate.swift
Normal file → Executable file
155
ios/Runner/AppDelegate.swift
Normal file → Executable 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: "")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user