From cfa494b602c3611241383503a4278ebba495868f Mon Sep 17 00:00:00 2001 From: uncor3 Date: Wed, 25 Feb 2026 07:57:29 +0000 Subject: [PATCH] feat(servicemanager): add revealDeveloperModeOptionInUI method to expose developer mode option in UI --- src/servicemanager.cpp | 52 ++++++++++++++++++++++++++++++++++-------- src/servicemanager.h | 3 ++- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/servicemanager.cpp b/src/servicemanager.cpp index 8d07428..9f48934 100644 --- a/src/servicemanager.cpp +++ b/src/servicemanager.cpp @@ -341,7 +341,33 @@ ServiceManager::takeScreenshot(const iDescriptorDevice *device, }); } -// requires iOS 17+ +IdeviceFfiError * +ServiceManager::revealDeveloperModeOptionInUI(const iDescriptorDevice *device) +{ + return executeOperation( + device, [device]() -> IdeviceFfiError * { + AmfiClientHandle *amfi = nullptr; + IdeviceFfiError *err = amfi_connect(device->provider, &amfi); + if (err != NULL) { + qDebug() << "Failed to connect to AMFI service:" << err->message + << "Code:" << err->code; + return err; + } + + err = amfi_reveal_developer_mode_option_in_ui(amfi); + if (err != NULL) { + qDebug() << "Failed to reveal developer mode option in UI." + << err->message << "Code:" << err->code; + } else { + qDebug() << "Developer mode option revealed in UI."; + } + + amfi_client_free(amfi); + return err; + }); +} + +// requires iOS 17+ and no passcode set on device IdeviceFfiError *ServiceManager::enableDevMode(const iDescriptorDevice *device) { return executeOperation( @@ -356,13 +382,6 @@ IdeviceFfiError *ServiceManager::enableDevMode(const iDescriptorDevice *device) return err; } qDebug() << "Developer mode option revealed in UI."; - // // Enable developer mode (triggers reboot) - err = amfi_accept_developer_mode(amfi); - if (err != NULL) { - qDebug() << "Failed to accept developer mode." - << err->message << "Code:" << err->code; - return err; - } err = amfi_enable_developer_mode(amfi); @@ -371,8 +390,23 @@ IdeviceFfiError *ServiceManager::enableDevMode(const iDescriptorDevice *device) << err->message << "Code:" << err->code; return err; } + + amfi_client_free(amfi); + err = amfi_connect(device->provider, &amfi); + if (err != NULL) { + qDebug() + << "Failed to reconnect:" << err->message << err->code; + return err; + } + + err = amfi_accept_developer_mode(amfi); + if (err != NULL) { + qDebug() << "Failed to accept developer mode." + << err->message << "Code:" << err->code; + return err; + } + qDebug() << "Developer mode enabled, device will reboot."; - // // After reboot, accept developer mode } return err; }); diff --git a/src/servicemanager.h b/src/servicemanager.h index 3c2f65f..96f790c 100644 --- a/src/servicemanager.h +++ b/src/servicemanager.h @@ -304,7 +304,8 @@ public: takeScreenshot(const iDescriptorDevice *device, ScreenshotrClientHandle *screenshotrClient, ScreenshotData *screenshot); - + static IdeviceFfiError * + revealDeveloperModeOptionInUI(const iDescriptorDevice *device); static IdeviceFfiError *enableDevMode(const iDescriptorDevice *device); };