《九阴真经: iOS黑客攻防秘籍》新书发布,干货满满,快来看看吧!

iOS 安全论坛 - 专注于研究 iOS 安全

 找回密码
 立即注册
搜索
热搜: iOS12 越狱
查看: 347|回复: 18

APP内如何调用命令安装下载的ipa包

[复制链接]

5

主题

15

帖子

91

积分

注册会员

Rank: 2

积分
91
发表于 2019-7-15 20:15:37 | 显示全部楼层 |阅读模式
APP代码如何调用命令行安装APP内下载的ipa、我现在是APP内下载一个ipa包,下载完了后自动安装和启动应用,请问您有什么好的方法
现在需要实现这样一个功能:一个APP内从服务端下载完ipa后自动安装和打开该ipa应用,越狱机上已安装相关ipa插件,需要APP内代码实现调用命令行自动进行ipa安装、卸载等操作。Mac开发中有NStask,但是iOS开发中如何实现?跪求解答!急!
回复

使用道具 举报

77

主题

225

帖子

924

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
924
发表于 2019-7-15 21:44:37 | 显示全部楼层
1.你说到的 NSTask 在 iOS 上也是有的,也可以使用.
2.ipa包在越狱环境上用的话,你可以直接弄成deb包,安装deb包的命令是 dpkg -i xxx.deb,卸载的命令是 dpkg -r xxx.deb。
回复

使用道具 举报

5

主题

15

帖子

91

积分

注册会员

Rank: 2

积分
91
 楼主| 发表于 2019-7-16 15:40:38 | 显示全部楼层
exchen 发表于 2019-7-15 21:44
1.你说到的 NSTask 在 iOS 上也是有的,也可以使用.
2.ipa包在越狱环境上用的话,你可以直接弄成deb包,安 ...

ios上没有NStask
我现在是APP程序内下载的ipa,不弄成deb包,而是需要下载完直接APP内自动安装ipa,我的问题是想问iOS代码如何调用命令,只要我能调用命令,安装都不是问题。非常感谢你的回答
回复

使用道具 举报

77

主题

225

帖子

924

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
924
发表于 2019-7-16 16:08:18 | 显示全部楼层
向着标杆直跑 发表于 2019-7-16 15:40
ios上没有NStask
我现在是APP程序内下载的ipa,不弄成deb包,而是需要下载完直接APP内自动安装ipa,我的 ...

posix_spawn 执行命令的示例代码如下:
  1. pid_t pid;
  2. char *argv[] = {
  3.   "/bin/ls",  //path
  4.   "-al",     //parameter1
  5.   "/",       //parameter2
  6.   NULL
  7. };

  8. posix_spawn(&pid, argv[0], NULL, NULL, argv, NULL);

  9. printf("pid=%d,child pid = %d\n",getpid(),pid);

  10. int stat;
  11. waitpid(pid,&stat,0);
  12. printf("stat is %d\n",stat);
复制代码


NSTask 执行命令的代码如下:
  1. NSTask *task = [[NSTask alloc] init];
  2. task.launchPath = @"/bin/ls";
  3. task.arguments = [NSArray arrayWithObjects:
  4.                   @"-al",
  5.                   @"/",
  6.                   nil];
  7. [task launch];
  8. [task waitUntilExit];
复制代码
回复

使用道具 举报

77

主题

225

帖子

924

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
924
发表于 2019-7-16 16:08:57 | 显示全部楼层
NSTask.h 头文件信息如下:
  1. #import <Foundation/NSObject.h>

  2. @class NSString, NSArray, NSDictionary;

  3. @interface NSTask : NSObject

  4. // Create an NSTask which can be run at a later time
  5. // An NSTask can only be run once. Subsequent attempts to
  6. // run an NSTask will raise.
  7. // Upon task death a notification will be sent
  8. //   { Name = NSTaskDidTerminateNotification; object = task; }
  9. //

  10. - (instancetype)init;

  11. // set parameters
  12. // these methods can only be done before a launch
  13. // if not set, use current
  14. // if not set, use current

  15. // set standard I/O channels; may be either an NSFileHandle or an NSPipe
  16. - (void)setStandardInput:(id)input;
  17. - (void)setStandardOutput:(id)output;
  18. - (void)setStandardError:(id)error;

  19. // get parameters
  20. @property (NS_NONATOMIC_IOSONLY, copy) NSString *launchPath;
  21. @property (NS_NONATOMIC_IOSONLY, copy) NSArray *arguments;
  22. @property (NS_NONATOMIC_IOSONLY, copy) NSDictionary *environment;
  23. @property (NS_NONATOMIC_IOSONLY, copy) NSString *currentDirectoryPath;

  24. // get standard I/O channels; could be either an NSFileHandle or an NSPipe
  25. - (id)standardInput;
  26. - (id)standardOutput;
  27. - (id)standardError;

  28. // actions
  29. - (void)launch;

  30. - (void)interrupt; // Not always possible. Sends SIGINT.
  31. - (void)terminate; // Not always possible. Sends SIGTERM.

  32. @property (NS_NONATOMIC_IOSONLY, readonly) BOOL suspend;
  33. @property (NS_NONATOMIC_IOSONLY, readonly) BOOL resume;

  34. // status
  35. @property (NS_NONATOMIC_IOSONLY, readonly) int processIdentifier;
  36. @property (NS_NONATOMIC_IOSONLY, getter=isRunning, readonly) BOOL running;

  37. @property (NS_NONATOMIC_IOSONLY, readonly) int terminationStatus;

  38. @end

  39. @interface NSTask (NSTaskConveniences)

  40. + (NSTask *)launchedTaskWithLaunchPath:(NSString *)path arguments:(NSArray *)arguments;
  41. // convenience; create and launch

  42. - (void)waitUntilExit;
  43. // poll the runLoop in defaultMode until task completes

  44. @end

  45. FOUNDATION_EXPORT NSString * const NSTaskDidTerminateNotification;
复制代码
回复

使用道具 举报

5

主题

15

帖子

91

积分

注册会员

Rank: 2

积分
91
 楼主| 发表于 2019-7-16 21:20:57 | 显示全部楼层
exchen 发表于 2019-7-16 16:08
posix_spawn 执行命令的示例代码如下:

非常非常感谢你提供的答案,现在我还有两个疑问想问下:
1、我在代码中使用posix_spawn会报错:Declaration of 'posix_spawn' must be imported from module 'Darwin.POSIX.spawn' before it is required 和 Implicit declaration of function 'posix_spawn' is invalid in C99,添加头文件#import <sys/time.h>也无济于事,请问该怎么解决?
2、使用NSTask还不太会,比如说我在/var/mobile/Downloads/目录下有一个xxxx.ipa文件,需要调用命令:ipainstaller /var/mobile/Downloads/xxxx.ipa来安装,那么这个task.arguments该如何写,其实是刚入门的小白,求指导!期待您的解答
回复

使用道具 举报

77

主题

225

帖子

924

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
924
发表于 2019-7-16 21:43:53 | 显示全部楼层
posix_spawn 的头文件是在 #import <spawn.h>
回复

使用道具 举报

77

主题

225

帖子

924

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
924
发表于 2019-7-16 21:44:54 | 显示全部楼层
你想要执行的命令,用 NSTask 的方式写法如下:
  1. NSTask *task = [[NSTask alloc] init];
  2. task.launchPath = @"ipainstaller";   //这里要写 ipainstaller 的绝对路径       
  3. task.arguments = [NSArray arrayWithObjects:
  4.                         @"/var/mobile/Downloads/xxxx.ipa",
  5.                   nil];
  6. [task launch];
  7. [task waitUntilExit];
复制代码
回复

使用道具 举报

5

主题

15

帖子

91

积分

注册会员

Rank: 2

积分
91
 楼主| 发表于 2019-7-17 00:01:47 | 显示全部楼层
exchen 发表于 2019-7-16 21:44
你想要执行的命令,用 NSTask 的方式写法如下:

您好,在我的APP测试助手程序内下载IPA,完了后自动安装该IPA,我使用Cydia中安装的IPA Installer Console插件进行IPA安装,此时需要调命令,而您说的task.launchPath那写ipainstaller 的绝对路径是指的什么?不太明白,  非常感谢您的耐心解答!
如方便的话加下QQ1020386527
回复

使用道具 举报

77

主题

225

帖子

924

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
924
发表于 2019-7-17 00:10:43 | 显示全部楼层
ipainstaller,你先直接这样写看行不行。不行的话就得写绝对路径了,find / -name ipainstaller,这个命令可以查找文件的位置。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|iOSHacker

GMT+8, 2019-10-21 16:00 , Processed in 0.050865 second(s), 20 queries .

iOS安全论坛

© 2017-2019 iOS Hacker Inc.

快速回复 返回顶部 返回列表