Files
driver_tripz/ios/Runner/AppDelegate.swift
Hamza-Ayed 153d2f64c0 25-3/18/1
2025-03-18 13:54:27 +03:00

160 lines
5.8 KiB
Swift
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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: "")
}
}