358 lines
10 KiB
Objective-C
358 lines
10 KiB
Objective-C
//
|
|
// IosSystemCmd.m
|
|
// nochange
|
|
//
|
|
// Created by mac on 2024/8/27.
|
|
//
|
|
|
|
|
|
#import "IosSystemCmd.h"
|
|
#import "XSPhoneConfig.h"
|
|
#import "XSPhoneInfo.h"
|
|
#import "XSHelper.h"
|
|
#import "XSHackIos.h"
|
|
#import "MyScriptTask.h"
|
|
#import "MyEventBus.h"
|
|
#import "XSHttpHelper.h"
|
|
#import "MyAdTask2.h"
|
|
#import "MyAdServer.h"
|
|
|
|
#define CMD_RES @"/ios/top_selection/system_cmd_response"
|
|
#define CMD @"/ios/top_selection/system_cmds"
|
|
|
|
@implementation IosSystemCmd
|
|
{
|
|
@private
|
|
XSPhoneConfig *_config;
|
|
XSHttpHelper *http;
|
|
dispatch_source_t _timer; // 替换 NSTimer
|
|
dispatch_queue_t _workQueue;
|
|
}
|
|
|
|
+ (instancetype)sharedInstance {
|
|
static IosSystemCmd *sharedInstance = nil;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^{
|
|
sharedInstance = [[self alloc] init];
|
|
});
|
|
return sharedInstance;
|
|
}
|
|
|
|
- (instancetype)init {
|
|
self = [super init];
|
|
if (self) {
|
|
self->_config = [XSPhoneConfig sharedInstance];
|
|
self->http = [[XSHttpHelper alloc] init];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (NSString *)cmdUrl {
|
|
return [NSString stringWithFormat:@"%@%@", _config.ServerURL, CMD];
|
|
}
|
|
- (NSString *)cmdResUrl {
|
|
return [NSString stringWithFormat:@"%@%@", _config.ServerURL, CMD_RES];
|
|
}
|
|
|
|
- (void) start {
|
|
if (_timer) return;
|
|
_workQueue = dispatch_queue_create("com.iossystemcmd.queue", DISPATCH_QUEUE_SERIAL);
|
|
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, _workQueue);
|
|
dispatch_source_set_timer(_timer, dispatch_time(DISPATCH_TIME_NOW, 0), 2 * NSEC_PER_SEC, 0.1 * NSEC_PER_SEC);
|
|
|
|
__weak typeof(self) weakSelf = self;
|
|
dispatch_source_set_event_handler(_timer, ^{
|
|
@autoreleasepool {
|
|
[weakSelf runTask];
|
|
}
|
|
});
|
|
|
|
dispatch_resume(_timer);
|
|
}
|
|
|
|
- (void) runTask {
|
|
NSLog(@"XC- run system task...");
|
|
NSString *deviceId = [_config DeviceId];
|
|
NSString *ip = [[XSPhoneInfo sharedInstance] IPAddress];
|
|
NSString *name = [_config IPhoneName];
|
|
NSDictionary *dic = @{
|
|
@"deviceId": deviceId,
|
|
@"ip": ip,
|
|
@"iphoneId": name
|
|
};
|
|
/*
|
|
pushInfo(2,
|
|
[XSHelper dic2Json:dic],
|
|
^(NSString *data) {
|
|
if(data){
|
|
NSDictionary *dic = [XSHelper json2Dictionary:data];
|
|
[self executeTask:dic];
|
|
} else {
|
|
NSLog(@"XC- get system cmd error");
|
|
}
|
|
}, ^(NSError *err) {
|
|
NSLog(@"XC- get system cmd error:%@",err);
|
|
});
|
|
*/
|
|
__weak typeof(self) weakSelf = self;
|
|
[self->http doPOST:[self cmdUrl] json:[XSHelper dic2Json:dic] withCallback:^(NSData *data) {
|
|
if (data) {
|
|
NSDictionary *dic = [XSHelper jsonData2Dictionary:data];
|
|
if (dic && [dic objectForKey:@"data"]) {
|
|
id data = dic[@"data"];
|
|
if (data && data != [NSNull null]) {
|
|
[weakSelf executeTask:data];
|
|
}
|
|
}
|
|
} else {
|
|
NSLog(@"XC- get system cmd error");
|
|
}
|
|
|
|
} withError:^(NSError *err) {
|
|
NSLog(@"XC- get system cmd error:%@",err);
|
|
}];
|
|
|
|
}
|
|
|
|
- (void) executeTask: (NSDictionary*)dic {
|
|
if ([dic objectForKey:@"cmd"]) {
|
|
NSString *cmd = dic[@"cmd"];
|
|
NSString *taskId = dic[@"taskId"];
|
|
if ([cmd isEqual:@"EDIT_NAME"]) {
|
|
[self executeEditName:taskId data:dic[@"cmdData"]];
|
|
return;
|
|
}
|
|
if ([cmd isEqual:@"UPLOAD_APPS"]) {
|
|
[self executeUploadApps:taskId data:dic[@"cmdData"]];
|
|
return;
|
|
}
|
|
if ([cmd isEqual:@"START"]) {
|
|
[self executeStart:taskId data:dic[@"cmdData"]];
|
|
return;
|
|
}
|
|
if ([cmd isEqual:@"STOP"]) {
|
|
[self executeStop:taskId data:dic[@"cmdData"]];
|
|
return;
|
|
}
|
|
if ([cmd isEqual:@"SCREENSHOT"]) {
|
|
[self executeScreenshot:taskId data:dic[@"cmdData"]];
|
|
return;
|
|
}
|
|
if ([cmd isEqual:@"UNLOCK"]) {
|
|
[self executeUnlock:taskId data:dic[@"cmdData"]];
|
|
return;
|
|
}
|
|
if ([cmd isEqual:@"RESTART_SYSTEM"]) {
|
|
[self executeRestart:taskId data:dic[@"cmdData"]];
|
|
return;
|
|
}
|
|
if ([cmd isEqual:@"RESTART"]) {
|
|
[self executeReboot:taskId data:dic[@"cmdData"]];
|
|
return;
|
|
}
|
|
if ([cmd isEqual:@"TOUCH"]) {
|
|
[self executeTouch:taskId data:dic[@"cmdData"]];
|
|
return;
|
|
}
|
|
if ([cmd isEqual:@"KEY"]) {
|
|
[self executeKey:taskId data:dic[@"cmdData"]];
|
|
return;
|
|
}
|
|
if ([cmd isEqual:@"UPDATE_KEY"]) {
|
|
[self executeUpdateKey:taskId data:dic[@"cmdData"]];
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void) putTask: (NSString*)taskId error: (NSString*)error data:(NSString*)data {
|
|
NSDictionary *dic = @{
|
|
@"taskId": taskId,
|
|
@"data": data,
|
|
@"error": error
|
|
};
|
|
/*
|
|
pushInfo(3, [XSHelper dic2Json:dic], ^(NSString *data) {
|
|
if(data) {
|
|
NSLog(@"XS- %@", data);
|
|
}
|
|
}, ^(NSError *err) {
|
|
NSLog(@"XS- %@", err);
|
|
});
|
|
*/
|
|
|
|
[self->http doPOST:[self cmdResUrl] json:[XSHelper dic2Json:dic] withCallback:^(NSData *data) {
|
|
if (data) {
|
|
NSLog(@"XS- %@", [XSHelper data2str:data]);
|
|
}
|
|
} withError:^(NSError *err) {
|
|
NSLog(@"XS- %@", err);
|
|
}];
|
|
|
|
}
|
|
|
|
- (void) executeEditName: (NSString*)taskId data:(NSString*)data {
|
|
if (data) {
|
|
BOOL setSs = [_config SetIPhoneName:data];
|
|
[[MyEventBus sharedInstance] postEvent:@"UpdateName" withObject:data];
|
|
NSString *r = [NSString stringWithFormat:@"set:%@", setSs == YES ?@ "YES": @"NO"];
|
|
[self putTask:taskId error:r data:data];
|
|
}
|
|
}
|
|
|
|
- (void) executeUploadApps: (NSString*)taskId data:(NSString*)data {
|
|
NSArray *apps = [self getMyApps];
|
|
NSData *appsData = [XSHelper obj2JsonData:apps];
|
|
if (appsData) {
|
|
[self putTask:taskId error:@"" data:[XSHelper data2str:appsData]];
|
|
} else {
|
|
NSLog(@"upload apps error");
|
|
}
|
|
}
|
|
|
|
- (void) executeStart: (NSString*)taskId data:(NSString*)data {
|
|
//[[XSConsole sharedInstance] restart];
|
|
[[MyEventBus sharedInstance] postEvent:@"UpdateRunStatus" withObject:@(YES)];
|
|
[[MyAdTask2Mangger sharedInstance] start];
|
|
[self putTask:taskId error:@"" data:data];
|
|
}
|
|
|
|
- (void) executeStop: (NSString*)taskId data:(NSString*)data {
|
|
//[[XSConsole sharedInstance] stop];
|
|
[[MyAdTask2Mangger sharedInstance] stop];
|
|
[[MyEventBus sharedInstance] postEvent:@"UpdateRunStatus" withObject:@(NO)];
|
|
[self putTask:taskId error:@"" data:data];
|
|
}
|
|
|
|
- (void) executeScreenshot:(NSString*)taskId data:(NSString*)data {
|
|
@try {
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
NSLog(@"executeScreenshot;%@;%@",taskId, data);
|
|
UIImage *img = XSCcaptureScreen2();
|
|
NSString *base64 = [XSHelper base64StringFromJpgImage:img];
|
|
if (base64) {
|
|
[self putTask:taskId error:@"" data:base64];
|
|
} else {
|
|
[self putTask:taskId error:@"截屏失败" data:data];
|
|
}
|
|
});
|
|
} @catch (NSException *exception) {
|
|
[self putTask:taskId error:@"截屏失败" data:data];
|
|
}
|
|
}
|
|
|
|
- (void) executeUnlock: (NSString*) taskId data:(NSString*)data {
|
|
@try {
|
|
|
|
//[[[XSJsApi alloc] init] unlock];
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
XSRemoteUnlock();
|
|
});
|
|
|
|
} @catch (NSException *exception) {
|
|
|
|
}
|
|
}
|
|
- (void) executeRestart: (NSString*) taskId data:(NSString*)data {
|
|
@try {
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
XSKillApp(@"SpringBoard");
|
|
});
|
|
} @catch (NSException *exception) {
|
|
|
|
}
|
|
}
|
|
- (void) executeReboot: (NSString*) taskId data:(NSString*)data {
|
|
@try {
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
XSReboot();
|
|
});
|
|
} @catch (NSException *exception) {
|
|
|
|
}
|
|
}
|
|
|
|
- (void) executeTouch: (NSString*) taskId data:(NSString*)data {
|
|
@try {
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
if(data && ![data isEqual:[NSNull null]]) {
|
|
NSDictionary *dic = [XSHelper json2Dictionary:data];
|
|
if (dic && ![dic isEqual:[NSNull null]]) {
|
|
NSNumber *x = dic[@"x"];
|
|
NSNumber *y = dic[@"y"];
|
|
float nx = [x floatValue];
|
|
float ny = [y floatValue];
|
|
//[[[XSJsApi alloc] init] tap:10 x:nx y:ny];
|
|
}
|
|
}
|
|
});
|
|
} @catch (NSException *exception) {
|
|
|
|
}
|
|
}
|
|
|
|
- (void) executeUpdateKey: (NSString*) taskId data:(NSString*)data {
|
|
[[XSPhoneConfig sharedInstance] SetApiKey:data];
|
|
}
|
|
|
|
- (void) executeKey: (NSString*) taskId data:(NSString*)data {
|
|
@try {
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
if(data && ![data isEqual:[NSNull null]]) {
|
|
NSDictionary *dic = [XSHelper json2Dictionary:data];
|
|
if (dic && ![dic isEqual:[NSNull null]]) {
|
|
NSNumber *k = dic[@"key"];
|
|
long key = [k longValue];
|
|
}
|
|
}
|
|
});
|
|
} @catch (NSException *exception) {
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- (NSArray*) getMyApps {
|
|
NSArray *apps = XSGetApps();
|
|
NSMutableArray *resApps = [[NSMutableArray alloc] init];
|
|
[apps enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
|
|
if (obj) {
|
|
NSDictionary *oldDic = obj;
|
|
NSString *appId = oldDic[@"bundleId"];
|
|
if ([appId hasPrefix:@"com.apple."]) {
|
|
|
|
} else {
|
|
NSString *icon = @"";
|
|
if ([oldDic objectForKey:@"icon"]) {
|
|
if (oldDic[@"icon"] && oldDic[@"icon"] != [NSNull null]) {
|
|
icon = [XSHelper base64StringFromJpgImage:oldDic[@"icon"]];
|
|
}
|
|
}
|
|
NSDictionary *dic = @{
|
|
@"bundleId": oldDic[@"bundleId"],
|
|
@"name":oldDic[@"name"],
|
|
@"containerPath": oldDic[@"containerPath"],
|
|
@"version": oldDic[@"version"],
|
|
@"shortVersion": oldDic[@"shortVersion"],
|
|
@"icon": icon,
|
|
};
|
|
[resApps addObject:dic];
|
|
}
|
|
}
|
|
}];
|
|
return resApps;
|
|
}
|
|
|
|
- (void)stop {
|
|
if (_timer) {
|
|
dispatch_source_cancel(_timer);
|
|
_timer = nil;
|
|
}
|
|
}
|
|
|
|
- (void)dealloc {
|
|
[self stop];
|
|
}
|
|
|
|
@end
|