commit
12334f8ddf
80
README.md
80
README.md
@ -1,38 +1,62 @@
|
||||
ios-deploy
|
||||
==========
|
||||
Install and debug iPhone apps without using Xcode. Designed to work on unjailbroken devices.
|
||||
Install and debug iOS apps without using Xcode. Designed to work on un-jailbroken devices.
|
||||
|
||||
## Requirements
|
||||
|
||||
* Mac OS X. Tested on Snow Leopard only.
|
||||
* You need to have a valid iPhone development certificate installed.
|
||||
* Xcode must be installed, along with the SDK for your iOS version.
|
||||
* Mac OS X. Tested on 10.10 Yosemite and iOS 8.1
|
||||
* You need to have a valid iOS development certificate installed.
|
||||
* Xcode 6.1 should be installed
|
||||
|
||||
## Usage
|
||||
|
||||
Usage: ./ios-deploy [OPTION]...
|
||||
-d, --debug launch the app in GDB after installation
|
||||
-i, --id <device_id> the id of the device to connect to
|
||||
-c, --detect only detect if the device is connected
|
||||
-b, --bundle <bundle.app> the path to the app bundle to be installed
|
||||
-a, --args <args> command line arguments to pass to the app when launching it
|
||||
-t, --timeout <timeout> number of seconds to wait for a device to be connected
|
||||
-u, --unbuffered don't buffer stdout
|
||||
-g, --gdbargs <args> extra arguments to pass to GDB when starting the debugger
|
||||
-x, --gdbexec <file> GDB commands script file
|
||||
-n, --nostart do not start the app when debugging
|
||||
-I, --noninteractive start in non interactive mode (quit when app crashes or exits)
|
||||
-L, --justlaunch just launch the app and exit lldb
|
||||
-v, --verbose enable verbose output
|
||||
-m, --noinstall directly start debugging without app install (-d not required)
|
||||
-p, --port <number> port used for device, default: 12345
|
||||
-r, --uninstall uninstall the app before install (do not use with -m; app cache and data are cleared)
|
||||
-1, --bundle_id <bundle id> specify bundle id for list and upload
|
||||
-l, --list list files
|
||||
-o, --upload <file> upload file
|
||||
-2, --to <target pathname> use together with upload file. specify target for upload
|
||||
-V, --version print the executable version
|
||||
|
||||
Usage: ios-deploy [OPTION]...
|
||||
-d, --debug launch the app in GDB after installation
|
||||
-i, --id <device_id> the id of the device to connect to
|
||||
-c, --detect only detect if the device is connected
|
||||
-b, --bundle <bundle.app> the path to the app bundle to be installed
|
||||
-a, --args <args> command line arguments to pass to the app when launching it
|
||||
-t, --timeout <timeout> number of seconds to wait for a device to be connected
|
||||
-u, --unbuffered don't buffer stdout
|
||||
-n, --nostart do not start the app when debugging
|
||||
-I, --noninteractive start in non interactive mode (quit when app crashes or exits)
|
||||
-L, --justlaunch just launch the app and exit lldb
|
||||
-v, --verbose enable verbose output
|
||||
-m, --noinstall directly start debugging without app install (-d not required)
|
||||
-p, --port <number> port used for device, default: 12345
|
||||
-r, --uninstall uninstall the app before install (do not use with -m; app cache and data are cleared)
|
||||
-1, --bundle_id <bundle id> specify bundle id for list and upload
|
||||
-l, --list list files
|
||||
-o, --upload <file> upload file
|
||||
-w, --download download app tree
|
||||
-2, --to <target pathname> use together with up/download file/tree. specify target
|
||||
-V, --version print the executable version
|
||||
|
||||
## Examples
|
||||
|
||||
The commands below assume that you have an app called `my.app` with bundle id `bundle.id`. Substitute where necessary.
|
||||
|
||||
// deploy and debug your app to a connected device
|
||||
ios-deploy --debug --bundle my.app
|
||||
|
||||
// deploy and launch your app to a connected device, but quit the debugger after
|
||||
ios-deploy --justlaunch --debug --bundle my.app
|
||||
|
||||
// deploy and launch your app to a connected device, quit when app crashes or exits
|
||||
ios-deploy --noninteractive --debug --bundle my.app
|
||||
|
||||
// Upload a file to your app's Documents folder
|
||||
ios-deploy --bundle_id 'bundle.id' --upload test.txt --to Documents/test.txt
|
||||
|
||||
// Download your app's Documents, Library and tmp folders
|
||||
ios-deploy --bundle_id 'bundle.id' --download --to MyDestinationFolder
|
||||
|
||||
// List the contents of your app's Documents, Library and tmp folders
|
||||
ios-deploy --bundle_id 'bundle.id' --list
|
||||
|
||||
// deploy and debug your app to a connected device, uninstall the app first
|
||||
ios-deploy --uninstall --debug --bundle my.app
|
||||
|
||||
## Demo
|
||||
|
||||
* The included demo.app represents the minimum required to get code running on iOS.
|
||||
@ -41,7 +65,7 @@ Install and debug iPhone apps without using Xcode. Designed to work on unjailbro
|
||||
|
||||
## Notes
|
||||
|
||||
* With some modifications, it may be possible to use this without Xcode installed; however, you would need a copy of the relevant DeveloperDiskImage.dmg (included with Xcode). GDB would also run slower as symbols would be downloaded from the device on-the-fly.
|
||||
* With some modifications, it may be possible to use this without Xcode installed; however, you would need a copy of the relevant DeveloperDiskImage.dmg (included with Xcode). lldb would also run slower as symbols would be downloaded from the device on-the-fly.
|
||||
|
||||
|
||||
## Listing Device Ids
|
||||
|
38
ios-deploy.c
38
ios-deploy.c
@ -16,7 +16,7 @@
|
||||
#include <netinet/tcp.h>
|
||||
#include "MobileDevice.h"
|
||||
|
||||
#define APP_VERSION "1.3.0"
|
||||
#define APP_VERSION "1.3.2"
|
||||
#define PREP_CMDS_PATH "/tmp/fruitstrap-lldb-prep-cmds-"
|
||||
#define LLDB_SHELL "lldb -s " PREP_CMDS_PATH
|
||||
/*
|
||||
@ -1163,7 +1163,12 @@ void read_dir(service_conn_t afcFd, afc_connection* afc_conn_p, const char* dir,
|
||||
char *key, *val;
|
||||
int not_dir = 0;
|
||||
|
||||
AFCFileInfoOpen(afc_conn_p, dir, &afc_dict_p);
|
||||
unsigned int code = AFCFileInfoOpen(afc_conn_p, dir, &afc_dict_p);
|
||||
if (code != 0) {
|
||||
// there was a problem reading or opening the file to get info on it, abort
|
||||
return;
|
||||
}
|
||||
|
||||
while((AFCKeyValueRead(afc_dict_p,&key,&val) == 0) && key && val) {
|
||||
if (strcmp(key,"st_ifmt")==0) {
|
||||
not_dir = strcmp(val,"S_IFDIR");
|
||||
@ -1443,6 +1448,7 @@ void handle_device(AMDeviceRef device) {
|
||||
|
||||
if (detect_only) {
|
||||
printf("[....] Found %s connected through %s.\n", CFStringGetCStringPtr(device_full_name, CFStringGetSystemEncoding()), CFStringGetCStringPtr(device_interface_name, CFStringGetSystemEncoding()));
|
||||
found_device = true;
|
||||
return;
|
||||
}
|
||||
if (device_id != NULL) {
|
||||
@ -1490,13 +1496,15 @@ void handle_device(AMDeviceRef device) {
|
||||
assert(AMDeviceIsPaired(device));
|
||||
assert(AMDeviceValidatePairing(device) == 0);
|
||||
assert(AMDeviceStartSession(device) == 0);
|
||||
|
||||
assert(AMDeviceSecureUninstallApplication(0, device, bundle_id, 0, NULL, 0) == 0);
|
||||
|
||||
|
||||
int code = AMDeviceSecureUninstallApplication(0, device, bundle_id, 0, NULL, 0);
|
||||
if (code == 0) {
|
||||
printf("[ OK ] Uninstalled package with bundle id %s\n", CFStringGetCStringPtr(bundle_id, CFStringGetSystemEncoding()));
|
||||
} else {
|
||||
printf("[ ERROR ] Could not uninstall package with bundle id %s\n", CFStringGetCStringPtr(bundle_id, CFStringGetSystemEncoding()));
|
||||
}
|
||||
assert(AMDeviceStopSession(device) == 0);
|
||||
assert(AMDeviceDisconnect(device) == 0);
|
||||
|
||||
printf("[ OK ] Uninstalled package with bundle id %s\n", CFStringGetCStringPtr(bundle_id, CFStringGetSystemEncoding()));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1600,10 +1608,14 @@ void timeout_callback(CFRunLoopTimerRef timer, void *info) {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!debug)
|
||||
if (!debug) {
|
||||
printf("[....] No more devices found.\n");
|
||||
else
|
||||
{
|
||||
}
|
||||
|
||||
if (detect_only && !found_device) {
|
||||
exit(exitcode_error);
|
||||
return;
|
||||
} else {
|
||||
int mypid = getpid();
|
||||
if ((parent != 0) && (parent == mypid) && (child != 0))
|
||||
{
|
||||
@ -1621,15 +1633,13 @@ void timeout_callback(CFRunLoopTimerRef timer, void *info) {
|
||||
void usage(const char* app) {
|
||||
printf(
|
||||
"Usage: %s [OPTION]...\n"
|
||||
" -d, --debug launch the app in GDB after installation\n"
|
||||
" -d, --debug launch the app in lldb after installation\n"
|
||||
" -i, --id <device_id> the id of the device to connect to\n"
|
||||
" -c, --detect only detect if the device is connected\n"
|
||||
" -b, --bundle <bundle.app> the path to the app bundle to be installed\n"
|
||||
" -a, --args <args> command line arguments to pass to the app when launching it\n"
|
||||
" -t, --timeout <timeout> number of seconds to wait for a device to be connected\n"
|
||||
" -u, --unbuffered don't buffer stdout\n"
|
||||
" -g, --gdbargs <args> extra arguments to pass to GDB when starting the debugger\n"
|
||||
" -x, --gdbexec <file> GDB commands script file\n"
|
||||
" -n, --nostart do not start the app when debugging\n"
|
||||
" -I, --noninteractive start in non interactive mode (quit when app crashes or exits)\n"
|
||||
" -L, --justlaunch just launch the app and exit lldb\n"
|
||||
@ -1658,7 +1668,6 @@ int main(int argc, char *argv[]) {
|
||||
{ "args", required_argument, NULL, 'a' },
|
||||
{ "verbose", no_argument, NULL, 'v' },
|
||||
{ "timeout", required_argument, NULL, 't' },
|
||||
{ "gdbexec", no_argument, NULL, 'x' },
|
||||
{ "unbuffered", no_argument, NULL, 'u' },
|
||||
{ "nostart", no_argument, NULL, 'n' },
|
||||
{ "noninteractive", no_argument, NULL, 'I' },
|
||||
@ -1717,6 +1726,7 @@ int main(int argc, char *argv[]) {
|
||||
break;
|
||||
case 'c':
|
||||
detect_only = true;
|
||||
debug = 1;
|
||||
break;
|
||||
case 'V':
|
||||
show_version();
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ios-deploy",
|
||||
"version": "1.2.0",
|
||||
"version": "1.3.2",
|
||||
"description": "launch iOS apps iOS devices from the command line (Xcode 6)",
|
||||
"main": "ios-deploy",
|
||||
"scripts": {
|
||||
|
Loading…
x
Reference in New Issue
Block a user