feat: استيراد كود سيرو إلى تريبز (سيرو @ecfe7568) — بلا تعديل

قرار المالك 2026-07-27: باك إند سيرو PHP هو المعتمد، وتطبيقاته المجرّبة
ميدانياً تحل محل إعادة البناء المؤرشفة. سيرو نفسه لم يُمسّ.

الخريطة:
  backend · payment_server · loction_server · ride_server ·
  passenger_server · docker · dashboard · stress_test  → الجذر
  siro_rider  → apps/rider          siro_driver  → apps/driver
  siro_admin  → dashboards/admin    siro_service → dashboards/service
  android_bot → apps/android_bot    socialBot    → apps/socialBot

نُسخ المتعقَّب في git سيرو فقط عبر `git archive` (3,198 ملفاً / ~169 م.ب)
لا `cp -r` — فاستُثنيت مخلفات البناء تلقائياً. بلا أي تعديل محتوى عمداً:
كل ما يلي يصير فرقاً مقروءاً مقابل المصدر.

لم يُستورد وسببه: siromove.com (الموقع التسويقي يبقى marketing/ في تريبز،
سيرو فيه 8 ملفات) · docs و planning (تريبز له docs/ الخاص) · deploy.sh
(ليس نشراً على سيرفر بل `git add . && git push origin --all` — فخّ في
مستودع آخر) · transit_dashboard (بانتظار قرار مصير backend-transit و
dashboards/transit-web).

⚠️ لا يبني بعد — ثلاثة نواقص متوقعة ومقصودة:
1. `.env` و `lib/env/env.g.dart` غير متعقَّبين في سيرو (أسرار لكل مستأجر):
   كل تطبيق فلاتر يحتاج .env خاصاً ثم توليد env.g.dart بـ build_runner.
2. إعدادات Firebase (9 ملفات google-services.json و GoogleService-Info.plist)
   يستبعدها .gitignore تريبز — ولكل مستأجر مشروع Firebase خاص أصلاً.
3. apps/driver في سيرو يشير إلى `../../Intaleq/packages/get` خارج المستودع →
   يجب ضمّ الحزم داخله أسوة بـ apps/rider.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hamza-Ayed
2026-07-27 05:14:13 +03:00
co-authored by Claude Opus 5
parent 9909d9b4c1
commit 4d8414c96b
3198 changed files with 766859 additions and 0 deletions
+34
View File
@@ -0,0 +1,34 @@
**/dgph
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>16.1</string>
</dict>
</plist>
+2
View File
@@ -0,0 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"
+2
View File
@@ -0,0 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
+60
View File
@@ -0,0 +1,60 @@
platform :ios, '16.5' # This is often set in the generated Podfile section
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_ios_podfile_setup
target 'Runner' do
use_frameworks! :linkage => :static
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
# Set your project's deployment target.
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '16.1'
# Fix for "non-modular header" issues with some pods.
config.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
# Fix for Swift 6 concurrency errors in Xcode 16
config.build_settings['SWIFT_STRICT_CONCURRENCY'] = 'minimal'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
'PERMISSION_CONTACTS=1',
'PERMISSION_LOCATION=1',
'PERMISSION_MICROPHONE=1',
'PERMISSION_NOTIFICATIONS=1',
'PERMISSION_CAMERA=1',
'PERMISSION_PHOTOS=1',
]
end
end
end
+353
View File
@@ -0,0 +1,353 @@
PODS:
- app_links (7.0.0):
- Flutter
- audio_session (0.0.1):
- Flutter
- connectivity_plus (0.0.1):
- Flutter
- device_info_plus (0.0.1):
- Flutter
- Firebase/Auth (12.14.0):
- Firebase/CoreOnly
- FirebaseAuth (~> 12.14.0)
- Firebase/CoreOnly (12.14.0):
- FirebaseCore (~> 12.14.0)
- Firebase/Messaging (12.14.0):
- Firebase/CoreOnly
- FirebaseMessaging (~> 12.14.0)
- firebase_auth (6.5.2):
- Firebase/Auth (= 12.14.0)
- firebase_core
- Flutter
- firebase_core (4.10.0):
- Firebase/CoreOnly (= 12.14.0)
- Flutter
- firebase_messaging (16.3.0):
- Firebase/Messaging (= 12.14.0)
- firebase_core
- Flutter
- FirebaseAppCheckInterop (12.14.0)
- FirebaseAuth (12.14.0):
- FirebaseAppCheckInterop (~> 12.14.0)
- FirebaseAuthInterop (~> 12.14.0)
- FirebaseCore (~> 12.14.0)
- FirebaseCoreExtension (~> 12.14.0)
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
- GoogleUtilities/Environment (~> 8.1)
- GTMSessionFetcher/Core (< 6.0, >= 3.4)
- RecaptchaInterop (~> 101.0)
- FirebaseAuthInterop (12.14.0)
- FirebaseCore (12.14.0):
- FirebaseCoreInternal (~> 12.14.0)
- GoogleUtilities/Environment (~> 8.1)
- GoogleUtilities/Logger (~> 8.1)
- FirebaseCoreExtension (12.14.0):
- FirebaseCore (~> 12.14.0)
- FirebaseCoreInternal (12.14.0):
- "GoogleUtilities/NSData+zlib (~> 8.1)"
- FirebaseInstallations (12.14.0):
- FirebaseCore (~> 12.14.0)
- GoogleUtilities/Environment (~> 8.1)
- GoogleUtilities/UserDefaults (~> 8.1)
- PromisesObjC (~> 2.4)
- FirebaseMessaging (12.14.0):
- FirebaseCore (~> 12.14.0)
- FirebaseInstallations (~> 12.14.0)
- GoogleDataTransport (~> 10.1)
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
- GoogleUtilities/Environment (~> 8.1)
- GoogleUtilities/Reachability (~> 8.1)
- GoogleUtilities/UserDefaults (~> 8.1)
- nanopb (~> 3.30910.0)
- Flutter (1.0.0)
- flutter_app_group_directory (0.0.1):
- Flutter
- flutter_contacts (0.0.1):
- Flutter
- flutter_local_notifications (0.0.1):
- Flutter
- flutter_secure_storage_darwin (10.0.0):
- Flutter
- FlutterMacOS
- flutter_tts (0.0.1):
- Flutter
- flutter_webrtc (1.4.0):
- Flutter
- WebRTC-SDK (= 144.7559.01)
- geolocator_apple (1.2.0):
- Flutter
- FlutterMacOS
- GoogleDataTransport (10.1.0):
- nanopb (~> 3.30910.0)
- PromisesObjC (~> 2.4)
- GoogleUtilities/AppDelegateSwizzler (8.1.2):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- GoogleUtilities/Privacy
- GoogleUtilities/Environment (8.1.2):
- GoogleUtilities/Privacy
- GoogleUtilities/Logger (8.1.2):
- GoogleUtilities/Environment
- GoogleUtilities/Privacy
- GoogleUtilities/Network (8.1.2):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Privacy
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (8.1.2)":
- GoogleUtilities/Privacy
- GoogleUtilities/Privacy (8.1.2)
- GoogleUtilities/Reachability (8.1.2):
- GoogleUtilities/Logger
- GoogleUtilities/Privacy
- GoogleUtilities/UserDefaults (8.1.2):
- GoogleUtilities/Logger
- GoogleUtilities/Privacy
- GTMSessionFetcher/Core (5.3.0)
- image_cropper (0.0.4):
- Flutter
- TOCropViewController (~> 2.8.0)
- image_picker_ios (0.0.1):
- Flutter
- just_audio (0.0.1):
- Flutter
- FlutterMacOS
- live_activities (0.0.1):
- Flutter
- local_auth_darwin (0.0.1):
- Flutter
- FlutterMacOS
- location (0.0.1):
- Flutter
- MapLibre (6.19.1)
- maplibre_gl (0.25.0):
- Flutter
- MapLibre (= 6.19.1)
- nanopb (3.30910.0):
- nanopb/decode (= 3.30910.0)
- nanopb/encode (= 3.30910.0)
- nanopb/decode (3.30910.0)
- nanopb/encode (3.30910.0)
- native_geofence (1.0.0):
- Flutter
- package_info_plus (0.4.5):
- Flutter
- permission_handler_apple (9.4.8):
- Flutter
- PromisesObjC (2.4.1)
- quick_actions_ios (0.0.1):
- Flutter
- RecaptchaInterop (101.0.0)
- record_ios (1.2.1):
- Flutter
- sensors_plus (0.0.1):
- Flutter
- share_plus (0.0.1):
- Flutter
- sqflite_darwin (0.0.4):
- Flutter
- FlutterMacOS
- TOCropViewController (2.8.0)
- url_launcher_ios (0.0.1):
- Flutter
- vibration (3.0.0):
- Flutter
- video_player_avfoundation (0.0.1):
- Flutter
- FlutterMacOS
- wakelock_plus (0.0.1):
- Flutter
- WebRTC-SDK (144.7559.01)
- webview_flutter_wkwebview (0.0.1):
- Flutter
- FlutterMacOS
DEPENDENCIES:
- app_links (from `.symlinks/plugins/app_links/ios`)
- audio_session (from `.symlinks/plugins/audio_session/ios`)
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- firebase_auth (from `.symlinks/plugins/firebase_auth/ios`)
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- Flutter (from `Flutter`)
- flutter_app_group_directory (from `.symlinks/plugins/flutter_app_group_directory/ios`)
- flutter_contacts (from `.symlinks/plugins/flutter_contacts/ios`)
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- flutter_secure_storage_darwin (from `.symlinks/plugins/flutter_secure_storage_darwin/darwin`)
- flutter_tts (from `.symlinks/plugins/flutter_tts/ios`)
- flutter_webrtc (from `.symlinks/plugins/flutter_webrtc/ios`)
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`)
- image_cropper (from `.symlinks/plugins/image_cropper/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- just_audio (from `.symlinks/plugins/just_audio/darwin`)
- live_activities (from `.symlinks/plugins/live_activities/ios`)
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
- location (from `.symlinks/plugins/location/ios`)
- maplibre_gl (from `.symlinks/plugins/maplibre_gl/ios`)
- native_geofence (from `.symlinks/plugins/native_geofence/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
- record_ios (from `.symlinks/plugins/record_ios/ios`)
- sensors_plus (from `.symlinks/plugins/sensors_plus/ios`)
- share_plus (from `.symlinks/plugins/share_plus/ios`)
- sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- vibration (from `.symlinks/plugins/vibration/ios`)
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
- webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/darwin`)
SPEC REPOS:
trunk:
- Firebase
- FirebaseAppCheckInterop
- FirebaseAuth
- FirebaseAuthInterop
- FirebaseCore
- FirebaseCoreExtension
- FirebaseCoreInternal
- FirebaseInstallations
- FirebaseMessaging
- GoogleDataTransport
- GoogleUtilities
- GTMSessionFetcher
- MapLibre
- nanopb
- PromisesObjC
- RecaptchaInterop
- TOCropViewController
- WebRTC-SDK
EXTERNAL SOURCES:
app_links:
:path: ".symlinks/plugins/app_links/ios"
audio_session:
:path: ".symlinks/plugins/audio_session/ios"
connectivity_plus:
:path: ".symlinks/plugins/connectivity_plus/ios"
device_info_plus:
:path: ".symlinks/plugins/device_info_plus/ios"
firebase_auth:
:path: ".symlinks/plugins/firebase_auth/ios"
firebase_core:
:path: ".symlinks/plugins/firebase_core/ios"
firebase_messaging:
:path: ".symlinks/plugins/firebase_messaging/ios"
Flutter:
:path: Flutter
flutter_app_group_directory:
:path: ".symlinks/plugins/flutter_app_group_directory/ios"
flutter_contacts:
:path: ".symlinks/plugins/flutter_contacts/ios"
flutter_local_notifications:
:path: ".symlinks/plugins/flutter_local_notifications/ios"
flutter_secure_storage_darwin:
:path: ".symlinks/plugins/flutter_secure_storage_darwin/darwin"
flutter_tts:
:path: ".symlinks/plugins/flutter_tts/ios"
flutter_webrtc:
:path: ".symlinks/plugins/flutter_webrtc/ios"
geolocator_apple:
:path: ".symlinks/plugins/geolocator_apple/darwin"
image_cropper:
:path: ".symlinks/plugins/image_cropper/ios"
image_picker_ios:
:path: ".symlinks/plugins/image_picker_ios/ios"
just_audio:
:path: ".symlinks/plugins/just_audio/darwin"
live_activities:
:path: ".symlinks/plugins/live_activities/ios"
local_auth_darwin:
:path: ".symlinks/plugins/local_auth_darwin/darwin"
location:
:path: ".symlinks/plugins/location/ios"
maplibre_gl:
:path: ".symlinks/plugins/maplibre_gl/ios"
native_geofence:
:path: ".symlinks/plugins/native_geofence/ios"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
permission_handler_apple:
:path: ".symlinks/plugins/permission_handler_apple/ios"
quick_actions_ios:
:path: ".symlinks/plugins/quick_actions_ios/ios"
record_ios:
:path: ".symlinks/plugins/record_ios/ios"
sensors_plus:
:path: ".symlinks/plugins/sensors_plus/ios"
share_plus:
:path: ".symlinks/plugins/share_plus/ios"
sqflite_darwin:
:path: ".symlinks/plugins/sqflite_darwin/darwin"
url_launcher_ios:
:path: ".symlinks/plugins/url_launcher_ios/ios"
vibration:
:path: ".symlinks/plugins/vibration/ios"
video_player_avfoundation:
:path: ".symlinks/plugins/video_player_avfoundation/darwin"
wakelock_plus:
:path: ".symlinks/plugins/wakelock_plus/ios"
webview_flutter_wkwebview:
:path: ".symlinks/plugins/webview_flutter_wkwebview/darwin"
SPEC CHECKSUMS:
app_links: a754cbec3c255bd4bbb4d236ecc06f28cd9a7ce8
audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
Firebase: 7cc10425300768ec86292688af5cb228f0604bde
firebase_auth: d4091ec40b52cc2ea56171ea521c30b388844acb
firebase_core: 383e19b49a08df5d7a6cf5017616de6a357ed7af
firebase_messaging: ab03d6090864c0fb8136521231df6a66cb13be49
FirebaseAppCheckInterop: f123c0261a7b46f060e98fc2961651f1ac68f384
FirebaseAuth: 01a77d472aec77ec008141e7d859d1b9cb8dc2cf
FirebaseAuthInterop: 63056ef7f9602e79a8f8d756d4cb35f38e2927c3
FirebaseCore: 4939b340b9c598dc1f965d68f8fe57e630b65407
FirebaseCoreExtension: ee3e3697acea1062288b1900bcdcab4d59ab93b4
FirebaseCoreInternal: 090369a5fffd7423cf88006ab4d2ccc2173a8db9
FirebaseInstallations: 7cdc919e29dc54306edeffdbdc1eed1a40d7d1e7
FirebaseMessaging: 4803888ce3002188f24e19faa8d2326261538426
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_app_group_directory: 55b5362007d1c0cb45dc1dd1e94f67d615f45a6b
flutter_contacts: 5383945387e7ca37cf963d4be57c21f2fc15ca9f
flutter_local_notifications: a5a732f069baa862e728d839dd2ebb904737effb
flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23
flutter_tts: 35ac3c7d42412733e795ea96ad2d7e05d0a75113
flutter_webrtc: ec91d94b484ad49cf191ef93413f64a40ffd3b4c
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
GoogleUtilities: 766ace00c6b10d8148408f329d10c4f051931850
GTMSessionFetcher: 127211aeec0b1e904fc49f4f6f895dcc535b0ecf
image_cropper: 64567491beea6cd1bc4b11948e2babb590de5826
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed
live_activities: 4dfa736d0736e1c77866a2f9c056a76513cc9e7b
local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb
location: 155caecf9da4f280ab5fe4a55f94ceccfab838f8
MapLibre: 7f24faba45439f80ccb0f83393c29fa32cb81952
maplibre_gl: a2114567cbd1065866614fbd34dfb75ab782aaa2
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
native_geofence: 653ba9ea1aa7ff9b9a62a883b00d8df14d2945f6
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
permission_handler_apple: 92d754bbaa7361d436db2d6c3c1c2a0fdcec462e
PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273
quick_actions_ios: 500fcc11711d9f646739093395c4ae8eec25f779
RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba
record_ios: 980fd386a97a35987d0fce3dfda4b26a38c90f4c
sensors_plus: 3c3bac724a2128c895623e03efd82cf0e94fd8e8
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
TOCropViewController: 797deaf39c90e6e9ddd848d88817f6b9a8a09888
url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
vibration: ca8104a8875b9c493e15b21b04e456befd0ff6eb
video_player_avfoundation: 3453f792138786248960ca029747fcd9f318ef52
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
WebRTC-SDK: ab9b5319e458c2bfebdc92b3600740da35d5630d
webview_flutter_wkwebview: 8ebf4fded22593026f7dbff1fbff31ea98573c8d
PODFILE CHECKSUM: 0ae238984c6e7aa969e949a5874ab41e6db33de4
COCOAPODS: 1.16.2
@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,35 @@
{
"images" : [
{
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "logo_siro.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "logo_siro 1.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "logo_siro 2.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.widgetkit-extension</string>
</dict>
</dict>
</plist>
@@ -0,0 +1,84 @@
//
// RideWidget.swift
// RideWidget
//
// Created by Hamza Aleghwairyeen on 26/02/2026.
//
import WidgetKit
import SwiftUI
struct Provider: TimelineProvider {
func placeholder(in context: Context) -> SimpleEntry {
SimpleEntry(date: Date(), emoji: "😀")
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
let entry = SimpleEntry(date: Date(), emoji: "😀")
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
var entries: [SimpleEntry] = []
// Generate a timeline consisting of five entries an hour apart, starting from the current date.
let currentDate = Date()
for hourOffset in 0 ..< 5 {
let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
let entry = SimpleEntry(date: entryDate, emoji: "😀")
entries.append(entry)
}
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
}
// func relevances() async -> WidgetRelevances<Void> {
// // Generate a list containing the contexts this widget is relevant in.
// }
}
struct SimpleEntry: TimelineEntry {
let date: Date
let emoji: String
}
struct RideWidgetEntryView : View {
var entry: Provider.Entry
var body: some View {
VStack {
Text("Time:")
Text(entry.date, style: .time)
Text("Emoji:")
Text(entry.emoji)
}
}
}
struct RideWidget: Widget {
let kind: String = "RideWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
if #available(iOS 17.0, *) {
RideWidgetEntryView(entry: entry)
.containerBackground(.fill.tertiary, for: .widget)
} else {
RideWidgetEntryView(entry: entry)
.padding()
.background()
}
}
.configurationDisplayName("My Widget")
.description("This is an example widget.")
}
}
#Preview(as: .systemSmall) {
RideWidget()
} timeline: {
SimpleEntry(date: .now, emoji: "😀")
SimpleEntry(date: .now, emoji: "🤩")
}
@@ -0,0 +1,20 @@
//
// RideWidgetBundle.swift
// RideWidget
//
// Created by Hamza Aleghwairyeen on 26/02/2026.
//
import WidgetKit
import SwiftUI
@main
struct RideWidgetBundle: WidgetBundle {
var body: some Widget {
RideWidget() // الويدجت العادية
RideWidgetLiveActivity() // ← هذا السطر ضروري وغالبًا ناقص!
}
}
@@ -0,0 +1,54 @@
//
// RideWidgetControl.swift
// RideWidget
//
// Created by Hamza Aleghwairyeen on 26/02/2026.
//
import AppIntents
import SwiftUI
import WidgetKit
struct RideWidgetControl: ControlWidget {
var body: some ControlWidgetConfiguration {
StaticControlConfiguration(
kind: "com.siro.siro_rider.RideWidget",
provider: Provider()
) { value in
ControlWidgetToggle(
"Start Timer",
isOn: value,
action: StartTimerIntent()
) { isRunning in
Label(isRunning ? "On" : "Off", systemImage: "timer")
}
}
.displayName("Timer")
.description("A an example control that runs a timer.")
}
}
extension RideWidgetControl {
struct Provider: ControlValueProvider {
var previewValue: Bool {
false
}
func currentValue() async throws -> Bool {
let isRunning = true // Check if the timer is running
return isRunning
}
}
}
struct StartTimerIntent: SetValueIntent {
static let title: LocalizedStringResource = "Start a timer"
@Parameter(title: "Timer is running")
var value: Bool
func perform() async throws -> some IntentResult {
// Start / stop the timer based on `value`.
return .result()
}
}
@@ -0,0 +1,200 @@
import ActivityKit
import WidgetKit
import SwiftUI
// 1️⃣ Attributes (كما هو مع Plugin: ContentState فارغ والقراءة من AppGroup)
struct LiveActivitiesAppAttributes: ActivityAttributes, Identifiable {
public typealias LiveDeliveryData = ContentState
public struct ContentState: Codable, Hashable { }
var id = UUID()
}
// 2️⃣ Prefix helper
extension LiveActivitiesAppAttributes {
func prefixedKey(_ key: String) -> String {
return "\(id)_\(key)"
}
}
// 3️⃣ Shared App Group
let sharedDefault = UserDefaults(suiteName: "group.com.Siro.siro")!
@available(iOS 16.1, *)
struct RideWidgetLiveActivity: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: LiveActivitiesAppAttributes.self) { context in
// ===== Read from shared defaults =====
let status = sharedDefault.string(forKey: context.attributes.prefixedKey("status")) ?? "waiting"
let driverName = sharedDefault.string(forKey: context.attributes.prefixedKey("driverName")) ?? "السائق"
let carDetails = sharedDefault.string(forKey: context.attributes.prefixedKey("carDetails")) ?? ""
let etaText = sharedDefault.string(forKey: context.attributes.prefixedKey("etaText")) ?? "--"
let progressRaw = sharedDefault.double(forKey: context.attributes.prefixedKey("progress"))
// Clamp progress (0..1)
let progress = min(max(progressRaw, 0.0), 1.0)
// ===== Production Lock Screen UI (White background) =====
ZStack {
RoundedRectangle(cornerRadius: 18)
.fill(Color.white)
VStack(alignment: .leading, spacing: 12) {
// Header
HStack(alignment: .center, spacing: 10) {
// App icon badge (clean)
ZStack {
RoundedRectangle(cornerRadius: 10)
.fill(Color.black.opacity(0.04))
.frame(width: 38, height: 38)
Image("SiroIcon")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 26, height: 26)
}
VStack(alignment: .leading, spacing: 3) {
Text(status == "waiting" ? "السائق في الطريق إليك" : "الرحلة جارية")
.font(.headline)
.foregroundColor(.black)
Text("\(driverName) • \(carDetails)")
.font(.subheadline)
.foregroundColor(.gray)
.lineLimit(1)
}
Spacer()
Text(etaText)
.font(.title2)
.bold()
.foregroundColor(.green)
.minimumScaleFactor(0.7)
}
// Progress bar with big car
GeometryReader { geometry in
let barHeight: CGFloat = 10
let carSize: CGFloat = 26
let usableWidth = max(0, geometry.size.width - carSize)
let x = min(max(0, usableWidth * CGFloat(progress)), usableWidth)
ZStack(alignment: .leading) {
RoundedRectangle(cornerRadius: 6)
.fill(Color.black.opacity(0.08))
.frame(height: barHeight)
RoundedRectangle(cornerRadius: 6)
.fill(Color.green)
.frame(width: max(0, geometry.size.width * CGFloat(progress)),
height: barHeight)
// Car marker (bigger + slightly above the bar)
Image(systemName: "car.side.fill")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: carSize, height: carSize)
.foregroundColor(.black)
.background(
Circle()
.fill(Color.white)
.frame(width: carSize + 8, height: carSize + 8)
.shadow(color: Color.black.opacity(0.12), radius: 4, x: 0, y: 2)
)
.offset(x: x, y: -10)
}
}
.frame(height: 34)
// Footer micro status (optional but production-ish)
HStack(spacing: 6) {
Circle()
.fill(status == "waiting" ? Color.orange : Color.green)
.frame(width: 8, height: 8)
Text(status == "waiting" ? "بانتظار وصول السائق" : "أنت الآن في الرحلة")
.font(.caption)
.foregroundColor(.gray)
Spacer()
}
}
.padding(.horizontal, 14)
.padding(.vertical, 14)
}
.padding(.horizontal, 8)
} dynamicIsland: { context in
// ===== Read again for dynamic island =====
let status = sharedDefault.string(forKey: context.attributes.prefixedKey("status")) ?? "waiting"
let driverName = sharedDefault.string(forKey: context.attributes.prefixedKey("driverName")) ?? "السائق"
let carDetails = sharedDefault.string(forKey: context.attributes.prefixedKey("carDetails")) ?? ""
let etaText = sharedDefault.string(forKey: context.attributes.prefixedKey("etaText")) ?? "--"
let progressRaw = sharedDefault.double(forKey: context.attributes.prefixedKey("progress"))
let progress = min(max(progressRaw, 0.0), 1.0)
return DynamicIsland {
DynamicIslandExpandedRegion(.leading) {
HStack(spacing: 6) {
Image("SiroIcon")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 20, height: 20)
.clipShape(RoundedRectangle(cornerRadius: 5))
Image(systemName: "car.side.fill")
.foregroundColor(.green)
}
}
DynamicIslandExpandedRegion(.trailing) {
VStack(alignment: .trailing, spacing: 2) {
Text(etaText)
.font(.headline)
.foregroundColor(.green)
Text(status == "waiting" ? "قادم إليك" : "جاري")
.font(.caption)
.foregroundColor(.gray)
}
}
DynamicIslandExpandedRegion(.center) {
VStack(spacing: 4) {
Text(status == "waiting" ? "السائق في الطريق" : "الرحلة جارية")
.font(.subheadline)
ProgressView(value: progress)
.progressViewStyle(.linear)
}
}
DynamicIslandExpandedRegion(.bottom) {
Text("\(driverName) • \(carDetails)")
.font(.caption)
.foregroundColor(.gray)
.lineLimit(1)
}
} compactLeading: {
Image("SiroIcon")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 18, height: 18)
.clipShape(RoundedRectangle(cornerRadius: 4))
} compactTrailing: {
Text(etaText)
.font(.caption2)
.minimumScaleFactor(0.7)
} minimal: {
Image(systemName: "car.side.fill")
.foregroundColor(.green)
}
}
}
}
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.Siro.siro</string>
</array>
</dict>
</plist>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1510"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "331C8080294A63A400263BE5"
BuildableName = "RunnerTests.xctest"
BlueprintName = "RunnerTests"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
enableGPUValidationMode = "1"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
@@ -0,0 +1,197 @@
//
// SecurityChecks.m
// Runner
//
// Created by Hamza Aleghwairyeen on 12/03/2025.
//
#import <Foundation/Foundation.h>
#import "SecurityChecks.h"
#import <sys/stat.h>
#include <dlfcn.h>
#import <sys/sysctl.h>
#include <mach-o/dyld.h> // For _dyld_image_count and _dyld_get_image_name
#include <unistd.h> // for fork()
#include <sys/socket.h> //for socket, connect
#include <netinet/in.h> // for sockaddr_in
#include <arpa/inet.h> // for inet_pton
@implementation SecurityChecks
+ (BOOL)isDeviceJailbroken {
// (Same jailbreak checks as before - from previous responses)
// 1. Check for common jailbreak files
NSArray *jailbreakPaths = @[
@"/Applications/Cydia.app",
// #if !TARGET_IPHONE_SIMULATOR
// @"/bin/bash",
// #endif
@"/Library/MobileSubstrate/MobileSubstrate.dylib",
@"/bin/bash",
@"/usr/sbin/sshd",
@"/etc/apt",
@"/private/var/lib/apt/",
@"/private/var/tmp/cydia.log",
];
for (NSString *path in jailbreakPaths) {
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
NSLog(@"Jailbreak file detected: %@", path);
return YES;
}
}
// 2. Check if we can write outside the sandbox (a strong indicator)
NSError *error = nil;
NSString *testPath = @"/private/jailbreaktest.txt";
[@"test" writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (!error) {
// If we can write, it's jailbroken. Remove the file immediately.
[[NSFileManager defaultManager] removeItemAtPath:testPath error:nil];
NSLog(@"Sandbox write test indicates jailbreak.");
return YES;
}
//3: Check for existence of the symbolic link /Applications.
struct stat s;
if (lstat("/Applications", &s) == 0) {
if (S_ISLNK(s.st_mode)) {
NSLog(@"Symbolic link /Applications exists, jailbroken");
return YES;
}
}
//4:Check for dyld Libraries
uint32_t count = _dyld_image_count();
for (uint32_t i = 0 ; i < count ; ++i) {
const char *dyld = _dyld_get_image_name(i);
if (strstr(dyld, "MobileSubstrate") != NULL || strstr(dyld, "libcycript") != NULL) {
NSLog(@"Suspicious dyld library found: %s", dyld);
return YES;
}
}
//5 Check if fork() is available. Sandboxed apps should not be able to call fork().
#if !TARGET_IPHONE_SIMULATOR // Don't run this on the simulator
int pid = fork();
if (pid == 0)
{
//in child, exit immediately to avoid crashing.
exit(0);
} else if (pid > 0)
{
NSLog(@"Fork available. Likely jailbroken.");
return YES; // Fork succeeded; likely jailbroken
}
#endif
return NO; // No jailbreak indicators found
}
+ (BOOL)isDebuggerAttached {
int mib[4];
struct kinfo_proc info;
size_t size = sizeof(info);
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PID;
mib[3] = getpid();
sysctl(mib, 4, &info, &size, NULL, 0);
return (info.kp_proc.p_flag & P_TRACED) != 0;
}
// Check for Frida's default port
+ (BOOL)isFridaListeningOnDefaultPort {
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
return NO; // Couldn't create socket
}
struct sockaddr_in sa;
memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = htons(27042); // Default Frida port
inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr);
if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) {
NSLog(@"Frida default port (27042) is open.");
close(sock);
return YES;
}
close(sock);
return NO;
}
+ (BOOL)isFridaDetected {
int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };
size_t length;
struct kinfo_proc *procs, *proc;
sysctl(name, 3, NULL, &length, NULL, 0);
procs = malloc(length);
sysctl(name, 3, procs, &length, NULL, 0);
for (proc = procs; (char *)proc < (char *)procs + length; proc++) {
if (strstr(proc->kp_proc.p_comm, "frida") != NULL) {
free(procs);
return YES;
}
}
free(procs);
return NO;
}
// Check for loaded dylibs that indicate Frida
+(BOOL) checkForFridaDylib{
uint32_t count = _dyld_image_count();
for (uint32_t i = 0 ; i < count ; ++i) {
const char *dyld = _dyld_get_image_name(i);
if (strstr(dyld, "FridaGadget") != NULL) { // Look for FridaGadget
NSLog(@"FridaGadget dylib found: %s", dyld);
return YES;
}
}
return NO;
}
// Check process name
+ (BOOL)checkProcessName {
NSString* processName = [[NSProcessInfo processInfo] processName];
if ([processName containsString:@"Frida"]) {
return YES;
}
return NO;
}
// A combined check for jailbreak and Frida
+ (BOOL)isDeviceCompromised {
if ([SecurityChecks isDeviceJailbroken]) {
return YES;
}
if ([SecurityChecks isFridaListeningOnDefaultPort]) {
return YES;
}
if ([SecurityChecks checkForFridaDylib]) {
return YES;
}
if([SecurityChecks checkProcessName]){
return YES;
}
// if ([SecurityChecks isDebuggerAttached]) {
// return YES;
// }
// if ([SecurityChecks isFridaDetected]) {
// return YES;
// }
return NO;
}
@end
@@ -0,0 +1,197 @@
//
// SecurityChecks.m
// Runner
//
// Created by Hamza Aleghwairyeen on 12/03/2025.
//
#import <Foundation/Foundation.h>
#import "SecurityChecks.h"
#import <sys/stat.h>
#include <dlfcn.h>
#import <sys/sysctl.h>
#include <mach-o/dyld.h> // For _dyld_image_count and _dyld_get_image_name
#include <unistd.h> // for fork()
#include <sys/socket.h> //for socket, connect
#include <netinet/in.h> // for sockaddr_in
#include <arpa/inet.h> // for inet_pton
@implementation SecurityChecks
+ (BOOL)isDeviceJailbroken {
// (Same jailbreak checks as before - from previous responses)
// 1. Check for common jailbreak files
NSArray *jailbreakPaths = @[
@"/Applications/Cydia.app",
// #if !TARGET_IPHONE_SIMULATOR
// @"/bin/bash",
// #endif
@"/Library/MobileSubstrate/MobileSubstrate.dylib",
@"/bin/bash",
@"/usr/sbin/sshd",
@"/etc/apt",
@"/private/var/lib/apt/",
@"/private/var/tmp/cydia.log",
];
for (NSString *path in jailbreakPaths) {
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
NSLog(@"Jailbreak file detected: %@", path);
return YES;
}
}
// 2. Check if we can write outside the sandbox (a strong indicator)
NSError *error = nil;
NSString *testPath = @"/private/jailbreaktest.txt";
[@"test" writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (!error) {
// If we can write, it's jailbroken. Remove the file immediately.
[[NSFileManager defaultManager] removeItemAtPath:testPath error:nil];
NSLog(@"Sandbox write test indicates jailbreak.");
return YES;
}
//3: Check for existence of the symbolic link /Applications.
struct stat s;
if (lstat("/Applications", &s) == 0) {
if (S_ISLNK(s.st_mode)) {
NSLog(@"Symbolic link /Applications exists, jailbroken");
return YES;
}
}
//4:Check for dyld Libraries
uint32_t count = _dyld_image_count();
for (uint32_t i = 0 ; i < count ; ++i) {
const char *dyld = _dyld_get_image_name(i);
if (strstr(dyld, "MobileSubstrate") != NULL || strstr(dyld, "libcycript") != NULL) {
NSLog(@"Suspicious dyld library found: %s", dyld);
return YES;
}
}
//5 Check if fork() is available. Sandboxed apps should not be able to call fork().
#if !TARGET_IPHONE_SIMULATOR // Don't run this on the simulator
int pid = fork();
if (pid == 0)
{
//in child, exit immediately to avoid crashing.
exit(0);
} else if (pid > 0)
{
NSLog(@"Fork available. Likely jailbroken.");
return YES; // Fork succeeded; likely jailbroken
}
#endif
return NO; // No jailbreak indicators found
}
+ (BOOL)isDebuggerAttached {
int mib[4];
struct kinfo_proc info;
size_t size = sizeof(info);
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PID;
mib[3] = getpid();
sysctl(mib, 4, &info, &size, NULL, 0);
return (info.kp_proc.p_flag & P_TRACED) != 0;
}
// Check for Frida's default port
+ (BOOL)isFridaListeningOnDefaultPort {
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
return NO; // Couldn't create socket
}
struct sockaddr_in sa;
memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = htons(27042); // Default Frida port
inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr);
if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) {
NSLog(@"Frida default port (27042) is open.");
close(sock);
return YES;
}
close(sock);
return NO;
}
+ (BOOL)isFridaDetected {
int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };
size_t length;
struct kinfo_proc *procs, *proc;
sysctl(name, 3, NULL, &length, NULL, 0);
procs = malloc(length);
sysctl(name, 3, procs, &length, NULL, 0);
for (proc = procs; (char *)proc < (char *)procs + length; proc++) {
if (strstr(proc->kp_proc.p_comm, "frida") != NULL) {
free(procs);
return YES;
}
}
free(procs);
return NO;
}
// Check for loaded dylibs that indicate Frida
+(BOOL) checkForFridaDylib{
uint32_t count = _dyld_image_count();
for (uint32_t i = 0 ; i < count ; ++i) {
const char *dyld = _dyld_get_image_name(i);
if (strstr(dyld, "FridaGadget") != NULL) { // Look for FridaGadget
NSLog(@"FridaGadget dylib found: %s", dyld);
return YES;
}
}
return NO;
}
// Check process name
+ (BOOL)checkProcessName {
NSString* processName = [[NSProcessInfo processInfo] processName];
if ([processName containsString:@"Frida"]) {
return YES;
}
return NO;
}
// A combined check for jailbreak and Frida
+ (BOOL)isDeviceCompromised {
if ([SecurityChecks isDeviceJailbroken]) {
return YES;
}
if ([SecurityChecks isFridaListeningOnDefaultPort]) {
return YES;
}
if ([SecurityChecks checkForFridaDylib]) {
return YES;
}
if([SecurityChecks checkProcessName]){
return YES;
}
// if ([SecurityChecks isDebuggerAttached]) {
// return YES;
// }
// if ([SecurityChecks isFridaDetected]) {
// return YES;
// }
return NO;
}
@end
+110
View File
@@ -0,0 +1,110 @@
import UIKit
import Flutter
import FirebaseCore
import native_geofence
@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
// --- 1. تسجيل callback الإضافات للخلفية (مطلوب لـ native_geofence) ---
NativeGeofencePlugin.setPluginRegistrantCallback { registry in
GeneratedPluginRegistrant.register(with: registry)
}
// --- 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.siro.siro_rider/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)
}
}
}
// --- الامتدادات (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: "")
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 936 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

@@ -0,0 +1,158 @@
{
"images": [
{
"size": "20x20",
"idiom": "iphone",
"filename": "40.png",
"scale": "2x"
},
{
"size": "20x20",
"idiom": "iphone",
"filename": "60.png",
"scale": "3x"
},
{
"size": "29x29",
"idiom": "iphone",
"filename": "29.png",
"scale": "1x"
},
{
"size": "29x29",
"idiom": "iphone",
"filename": "58.png",
"scale": "2x"
},
{
"size": "29x29",
"idiom": "iphone",
"filename": "87.png",
"scale": "3x"
},
{
"size": "40x40",
"idiom": "iphone",
"filename": "80.png",
"scale": "2x"
},
{
"size": "40x40",
"idiom": "iphone",
"filename": "120.png",
"scale": "3x"
},
{
"size": "57x57",
"idiom": "iphone",
"filename": "57.png",
"scale": "1x"
},
{
"size": "57x57",
"idiom": "iphone",
"filename": "114.png",
"scale": "2x"
},
{
"size": "60x60",
"idiom": "iphone",
"filename": "120.png",
"scale": "2x"
},
{
"size": "60x60",
"idiom": "iphone",
"filename": "180.png",
"scale": "3x"
},
{
"size": "20x20",
"idiom": "ipad",
"filename": "20.png",
"scale": "1x"
},
{
"size": "20x20",
"idiom": "ipad",
"filename": "40.png",
"scale": "2x"
},
{
"size": "29x29",
"idiom": "ipad",
"filename": "29.png",
"scale": "1x"
},
{
"size": "29x29",
"idiom": "ipad",
"filename": "58.png",
"scale": "2x"
},
{
"size": "40x40",
"idiom": "ipad",
"filename": "40.png",
"scale": "1x"
},
{
"size": "40x40",
"idiom": "ipad",
"filename": "80.png",
"scale": "2x"
},
{
"size": "50x50",
"idiom": "ipad",
"filename": "50.png",
"scale": "1x"
},
{
"size": "50x50",
"idiom": "ipad",
"filename": "100.png",
"scale": "2x"
},
{
"size": "72x72",
"idiom": "ipad",
"filename": "72.png",
"scale": "1x"
},
{
"size": "72x72",
"idiom": "ipad",
"filename": "144.png",
"scale": "2x"
},
{
"size": "76x76",
"idiom": "ipad",
"filename": "76.png",
"scale": "1x"
},
{
"size": "76x76",
"idiom": "ipad",
"filename": "152.png",
"scale": "2x"
},
{
"size": "83.5x83.5",
"idiom": "ipad",
"filename": "167.png",
"scale": "2x"
},
{
"size": "1024x1024",
"idiom": "ios-marketing",
"filename": "1024.png",
"scale": "1x"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

@@ -0,0 +1,5 @@
# Launch Screen Assets
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "icon_share.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "icon_support.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "icon_user.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "icon_wallet.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
</resources>
</document>
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>APIKey</key>
<string>AIzaSyDdqkLMCrqjVrn7XmadIqynyoBa7P27OeM</string>
</dict>
</plist>
+12
View File
@@ -0,0 +1,12 @@
//
// Constants1.swift
// Runner
//
// Created by Hamza Aleghwairyeen on 20/02/2025.
//
import Foundation
struct Constants {
static let googleMapsAPIKey = "AIzaSyD0a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q"
}
+107
View File
@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Siro Rider</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Siro Rider</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>siromove.com</string>
<key>CFBundleURLSchemes</key>
<array>
<string>com.googleusercontent.apps.1086900987150-9jv4oa8l3t23d54lrf27c1d22tbt9i6d</string>
<string>siromove</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>FirebaseAppDelegateProxyEnabled</key>
<string>NO</string>
<key>FlutterDeepLinkingEnabled</key>
<true/>
<key>GMSApiKey</key>
<string>YOUR_API_KEY</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>googlechromes</string>
<string>comgooglemaps</string>
<string>whatsapp</string>
</array>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>This app requires access to your camera in order to scan QR codes and capture images
for uploading and access to connect to a call.</string>
<key>NSContactsUsageDescription</key>
<string>This app requires contacts access to function properly.</string>
<key>NSFaceIDUsageDescription</key>
<string>Use Face ID to securely authenticate payment accounts.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This app needs access to your location to provide you with the best ride experience.
Your location data will be used to find the nearest available cars and connect you with
the closest captain for efficient and convenient rides.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>This app needs access to location.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs access to your location to provide you with the best ride experience.
Your location data will be used to find the nearest available cars and connect you with
the closest captain for efficient and convenient rides.</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app requires access to your microphone to record audio, allowing you to add
voice recordings to your photos and videos and access to connect to a call.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app requires access to the photo library to upload pictures.</string>
<key>NSSupportsLiveActivities</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>location</string>
<string>remote-notification</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>
@@ -0,0 +1,25 @@
//
// JailbreakDetection.swift
// Runner
//
// Created by Hamza Aleghwairyeen on 15/02/2025.
//
import Foundation
class JailbreakDetection {
static func isJailbroken() -> Bool {
let paths = [
"/Applications/Cydia.app",
"/Library/MobileSubstrate/MobileSubstrate.dylib",
"/usr/sbin/sshd",
"/etc/apt"
]
for path in paths {
if FileManager.default.fileExists(atPath: path) {
return true
}
}
return false
}
}
@@ -0,0 +1,59 @@
//
// KeychainHelper.swift
// Runner
//
// Created by Hamza Aleghwairyeen on 12/03/2025.
//
import Foundation
import Security
class KeychainHelper {
static let shared = KeychainHelper()
private init() {}
// حفظ البيانات في Keychain
func save(key: String, value: String) {
let data = value.data(using: .utf8)!
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecValueData as String: data,
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
SecItemDelete(query as CFDictionary) // حذف أي قيمة قديمة بنفس المفتاح
SecItemAdd(query as CFDictionary, nil) // إضافة القيمة الجديدة
}
// استرجاع البيانات من Keychain
func get(key: String) -> String? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecReturnData as String: kCFBooleanTrue!,
kSecMatchLimit as String: kSecMatchLimitOne
]
var dataTypeRef: AnyObject?
let status = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
guard status == errSecSuccess, let data = dataTypeRef as? Data else {
return nil
}
return String(data: data, encoding: .utf8)
}
// حذف البيانات من Keychain
func delete(key: String) {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key
]
SecItemDelete(query as CFDictionary)
}
}
@@ -0,0 +1,2 @@
#import "GeneratedPluginRegistrant.h"
#import "SecurityChecks.h"
+20
View File
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.applesignin</key>
<array>
<string>Default</string>
</array>
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:intaleqapp.com</string>
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.Siro.siro</string>
</array>
</dict>
</plist>
+24
View File
@@ -0,0 +1,24 @@
//
// SecurityChecks.h
// Runner
//
// Created by Hamza Aleghwairyeen on 12/03/2025.
//
//#ifndef SecurityChecks_h
//#define SecurityChecks_h
//
//
//#endif /* SecurityChecks_h */
// SecurityChecks.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h> // Import UIKit
@interface SecurityChecks : NSObject
+ (BOOL)isDeviceCompromised; // Combined check
@end
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,10 @@
//
// Localizable.strings
// Runner
//
// Created by Hamza Aleghwairyeen on 12/03/2025.
//
"Security Warning" = "تحذير أمني";
"Compromised device detected. Exiting." = "تم اكتشاف جهاز مُخترق. جارٍ الخروج.";
"OK" = "موافق";
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,12 @@
import Flutter
import UIKit
import XCTest
class RunnerTests: XCTestCase {
func testExample() {
// If you add code to the Runner application, consider adding tests here.
// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
}
}