Merge pull request #35 from wjywbs/remove-app
Fixes #35 - Add uninstall feature.
This commit is contained in:
commit
f7283216ef
@ -453,6 +453,8 @@ typedef int (*am_device_install_application_callback)(CFDictionaryRef, int);
|
|||||||
mach_error_t AMDeviceInstallApplication(service_conn_t socket, CFStringRef path, CFDictionaryRef options, am_device_install_application_callback callback, void *user);
|
mach_error_t AMDeviceInstallApplication(service_conn_t socket, CFStringRef path, CFDictionaryRef options, am_device_install_application_callback callback, void *user);
|
||||||
mach_error_t AMDeviceTransferApplication(service_conn_t socket, CFStringRef path, CFDictionaryRef options, am_device_install_application_callback callbackj, void *user);
|
mach_error_t AMDeviceTransferApplication(service_conn_t socket, CFStringRef path, CFDictionaryRef options, am_device_install_application_callback callbackj, void *user);
|
||||||
|
|
||||||
|
int AMDeviceSecureUninstallApplication(int unknown0, struct am_device *device, CFStringRef bundle_id, int unknown1, void *callback, int callback_arg);
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
/* ----------------------------------------------------------------------------
|
||||||
* Semi-private routines
|
* Semi-private routines
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
|
71
ios-deploy.c
71
ios-deploy.c
@ -125,7 +125,7 @@ int AMDeviceSecureInstallApplication(int zero, AMDeviceRef device, CFURLRef url,
|
|||||||
int AMDeviceMountImage(AMDeviceRef device, CFStringRef image, CFDictionaryRef options, void *callback, int cbarg);
|
int AMDeviceMountImage(AMDeviceRef device, CFStringRef image, CFDictionaryRef options, void *callback, int cbarg);
|
||||||
mach_error_t AMDeviceLookupApplications(AMDeviceRef device, CFDictionaryRef options, CFDictionaryRef *result);
|
mach_error_t AMDeviceLookupApplications(AMDeviceRef device, CFDictionaryRef options, CFDictionaryRef *result);
|
||||||
|
|
||||||
bool found_device = false, debug = false, verbose = false, unbuffered = false, nostart = false, detect_only = false, install = true;
|
bool found_device = false, debug = false, verbose = false, unbuffered = false, nostart = false, detect_only = false, install = true, uninstall = false;
|
||||||
bool interactive = true;
|
bool interactive = true;
|
||||||
char *app_path = NULL;
|
char *app_path = NULL;
|
||||||
char *device_id = NULL;
|
char *device_id = NULL;
|
||||||
@ -813,6 +813,42 @@ void launch_debugger(AMDeviceRef device, CFURLRef url) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CFStringRef get_bundle_id(CFURLRef app_url)
|
||||||
|
{
|
||||||
|
if (app_url == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
CFURLRef url = CFURLCreateCopyAppendingPathComponent(NULL, app_url, CFSTR("Info.plist"), false);
|
||||||
|
|
||||||
|
if (url == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
CFReadStreamRef stream = CFReadStreamCreateWithFile(NULL, url);
|
||||||
|
CFRelease(url);
|
||||||
|
|
||||||
|
if (stream == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
CFPropertyListRef plist = NULL;
|
||||||
|
if (CFReadStreamOpen(stream) == TRUE) {
|
||||||
|
plist = CFPropertyListCreateWithStream(NULL, stream, 0,
|
||||||
|
kCFPropertyListImmutable, NULL, NULL);
|
||||||
|
}
|
||||||
|
CFReadStreamClose(stream);
|
||||||
|
CFRelease(stream);
|
||||||
|
|
||||||
|
if (plist == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
const void *value = CFDictionaryGetValue(plist, CFSTR("CFBundleIdentifier"));
|
||||||
|
CFStringRef bundle_id = NULL;
|
||||||
|
if (value != NULL)
|
||||||
|
bundle_id = CFRetain(value);
|
||||||
|
|
||||||
|
CFRelease(plist);
|
||||||
|
return bundle_id;
|
||||||
|
}
|
||||||
|
|
||||||
void handle_device(AMDeviceRef device) {
|
void handle_device(AMDeviceRef device) {
|
||||||
if (found_device) return; // handle one device only
|
if (found_device) return; // handle one device only
|
||||||
CFStringRef found_device_id = AMDeviceCopyDeviceIdentifier(device);
|
CFStringRef found_device_id = AMDeviceCopyDeviceIdentifier(device);
|
||||||
@ -841,7 +877,29 @@ void handle_device(AMDeviceRef device) {
|
|||||||
|
|
||||||
CFRelease(relative_url);
|
CFRelease(relative_url);
|
||||||
|
|
||||||
|
if (uninstall) {
|
||||||
|
printf("------ Uninstall phase ------\n");
|
||||||
|
|
||||||
|
CFStringRef bundle_id = get_bundle_id(url);
|
||||||
|
if (bundle_id == NULL) {
|
||||||
|
printf("Error: Unable to get bundle id from package %s\n Uninstall failed\n", app_path);
|
||||||
|
} else {
|
||||||
|
AMDeviceConnect(device);
|
||||||
|
assert(AMDeviceIsPaired(device));
|
||||||
|
assert(AMDeviceValidatePairing(device) == 0);
|
||||||
|
assert(AMDeviceStartSession(device) == 0);
|
||||||
|
|
||||||
|
assert(AMDeviceSecureUninstallApplication(0, device, bundle_id, 0, NULL, 0) == 0);
|
||||||
|
|
||||||
|
assert(AMDeviceStopSession(device) == 0);
|
||||||
|
assert(AMDeviceDisconnect(device) == 0);
|
||||||
|
|
||||||
|
printf("[ OK ] Uninstalled package with bundle id %s\n", CFStringGetCStringPtr(bundle_id, CFStringGetSystemEncoding()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(install) {
|
if(install) {
|
||||||
|
printf("------ Install phase ------\n");
|
||||||
printf("[ 0%%] Found device (%s), beginning install\n", CFStringGetCStringPtr(found_device_id, CFStringGetSystemEncoding()));
|
printf("[ 0%%] Found device (%s), beginning install\n", CFStringGetCStringPtr(found_device_id, CFStringGetSystemEncoding()));
|
||||||
|
|
||||||
AMDeviceConnect(device);
|
AMDeviceConnect(device);
|
||||||
@ -929,6 +987,7 @@ void usage(const char* app) {
|
|||||||
" -v, --verbose enable verbose output\n"
|
" -v, --verbose enable verbose output\n"
|
||||||
" -m, --noinstall directly start debugging without app install (-d not required)\n"
|
" -m, --noinstall directly start debugging without app install (-d not required)\n"
|
||||||
" -p, --port <number> port used for device, default: 12345 \n"
|
" -p, --port <number> port used for device, default: 12345 \n"
|
||||||
|
" -r, --uninstall uninstall the app before install (do not use with -m; app cache and data are cleared) \n"
|
||||||
" -V, --version print the executable version \n",
|
" -V, --version print the executable version \n",
|
||||||
app);
|
app);
|
||||||
}
|
}
|
||||||
@ -953,11 +1012,12 @@ int main(int argc, char *argv[]) {
|
|||||||
{ "version", no_argument, NULL, 'V' },
|
{ "version", no_argument, NULL, 'V' },
|
||||||
{ "noinstall", no_argument, NULL, 'm' },
|
{ "noinstall", no_argument, NULL, 'm' },
|
||||||
{ "port", required_argument, NULL, 'p' },
|
{ "port", required_argument, NULL, 'p' },
|
||||||
|
{ "uninstall", no_argument, NULL, 'r' },
|
||||||
{ NULL, 0, NULL, 0 },
|
{ NULL, 0, NULL, 0 },
|
||||||
};
|
};
|
||||||
char ch;
|
char ch;
|
||||||
|
|
||||||
while ((ch = getopt_long(argc, argv, "VmcdvunIi:b:a:t:g:x:p:", longopts, NULL)) != -1)
|
while ((ch = getopt_long(argc, argv, "VmcdvunrIi:b:a:t:g:x:p:", longopts, NULL)) != -1)
|
||||||
{
|
{
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'm':
|
case 'm':
|
||||||
@ -1000,6 +1060,9 @@ int main(int argc, char *argv[]) {
|
|||||||
case 'p':
|
case 'p':
|
||||||
port = atoi(optarg);
|
port = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
case 'r':
|
||||||
|
uninstall = 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
return exitcode_error;
|
return exitcode_error;
|
||||||
@ -1020,10 +1083,6 @@ int main(int argc, char *argv[]) {
|
|||||||
timeout = 5;
|
timeout = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!detect_only) {
|
|
||||||
printf("------ Install phase ------\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (app_path) {
|
if (app_path) {
|
||||||
assert(access(app_path, F_OK) == 0);
|
assert(access(app_path, F_OK) == 0);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user