如何判断当前进程是否在前台运行?


#1

问题:如何代码判断当前进程是否运行在前台?


问题到这里就结束了,下面的是纯粹凑篇幅和记录笔记


效果图

下面是Tweak代码

#import <UIKit/UIKit.h>
#import <PTFakeTouch/PTFakeTouch.h>
#import <PTFakeTouch/PTFakeMetaTouch.h>

static void Reboot(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
    NSLog(@"iOSRE: reboot");
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
    //    system("reboot");
    //    [[LLMCMDTool sharedInstance] cmd:@"reboot"];
    
    if([UIApplication sharedApplication].applicationState == UIApplicationStateActive)
    {
        NSLog(@"应用程序在前台");
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            
            NSLog(@"我被点击了");
            
            CGPoint point = CGPointMake(200, 300);// 点击的坐标
        NSInteger pointId = [PTFakeMetaTouch fakeTouchId:[PTFakeMetaTouch getAvailablePointId] AtPoint:point withTouchPhase:UITouchPhaseBegan];
            
            [PTFakeMetaTouch fakeTouchId:pointId AtPoint:point withTouchPhase:UITouchPhaseEnded];
            
        });
        
    }
    
    
   
    
#pragma GCC diagnostic pop
}


//%ctor { … }

%ctor {
    
    
    CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, Reboot, CFSTR("com.naken.iosred.reboot"), NULL, CFNotificationSuspensionBehaviorCoalesce);
}

下面是filtter的plsit文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Filter</key>
	<dict>
		<key>Bundles</key>
		<array>
			<string>com.apple.backboardd</string>
			<string>com.apple.UIKit</string>
			<string>com.apple.springboard</string>
		</array>
	</dict>
</dict>
</plist>


#2

大哥你会基础的ios开发不?
你注入的代码是运行在宿主app里的,app怎么做到在前台的时候才执行代码,这么简单的问题不用大家教了吧


#3

很简单"只需要在点击的时候做出判断当前App是不是在前台然后再执行".我这个是注入的所有App.


#4

注入所有app跟注入一个app有什么区别?注入的代码还不是各自独立运行的
问题不就转化为:如何判断自己当前是不是在前台


#5

那你说下你自己是怎么做的吧看你在其他帖子也在问模拟点击


#6

这个问题确实就是:如何判断自己当前是不是在前台


#7

就是你这个思路啊
注入所有的app,只在自己处于前台时接收点击指令,退后台时不接收
至于如何实现「如何判断自己当前是不是在前台」,我只说个思路,hook每个app的 setDelegate就可以了
当然这种方式是比较不优雅的,更优雅的方式还没找到


#8

你和我的思路确定一样?,我看你上来就喷我,感觉你应该有更好地思路,


#9

当然一样
喷你是因为你问的问题摸不着北,完全没有直击痛点,哈哈


#10

但是这种思路会有个弊端就是有些App会有反注入的处理.注入失败的话就不可以模拟点击了.
狗神写的那个damelon可以全局点击的思路特别不错,


#11

只能退而求其次了
你说的那种高端的实现方式,谁不想做到呢,能力有限就只能曲线救国搞搞了


#12

有没有逆向过触动精灵或者xxtouch之类的产品他们是怎么做的.我大概看了下能力不够看不出来他们是怎么做的


#13

膜拜大佬,牛逼


#14

百度后的答案

if([UIApplication sharedApplication].applicationState == UIApplicationStateActive)
    {
        NSLog(@"应用程序在前台");
       
        return;
    }



#15

显然能力不够,看不出来
我其实只是个正向的猿,在这里混着玩玩。。。


#16

……只能用大佬不屑一顾玩剩下的招数来凑数


#17

我记得以前研究SpringBoard时看到过相关功能,刚才看了一下iOS 11的SpringBoard头文件,貌似可以通过SBApplication拿到SBApplicationProcessState,然后有个foreground属性