11174
(套马的女汉子)
#1
大大们好:
我在我的tweak里面hook住了 CLLocationManager这个类的setDelegate:方法
代码如下:
%hook CLLocationManager
- (void) setDelegate:(id)aDelegate
{
Msg(@“delegateName:%@”,NSStringFromClass([aDelegate class]));
%orig;
}
%end
其中Msg()是我写的用来在屏幕上展示信息的类,类似于AlertView
就这么几行代码而已,但是我发现我建的不同工程,这几行代码实现的效果不一样.
比如我打开手机自带的地图,
在不同工程中,
有的可以展示出:delegateName:MKCoreLocationManagerProvider (假定是插件A)
而我新建的一个项目中是:delegateName:dylib_SxtbRwx_func90(假定是插件B)
插件A是我想要的效果,但是我后面创建的几个项目都只能显示像插件B那样而已
再打开其他需要用到地理信息的应用,插件A会显示其他应用对应的类名
但是插件B显示的还是一模一样的:delegateName:dylib_SxtbRwx_func90
我有将两个工程进行对比,除了项目名称其他都是一样的了,
甚至我把插件B的文件拿到插件A的工程里面,修改一下名字,都可以工作正常,
但是插件A里面把control,makefile等直接改成别的名字,又不正常
不知道我说清楚了没有,希望大大可以知道一下,先谢过了~
11174
(套马的女汉子)
#3
先谢谢大大关注
插件A和插件B是我简化后用来做实验的两个工程, 功能是一样的
tweak.xm里面只有我上面写的那几行代码, 就是想试试能否查看调用setDelegate:的类名
但是同样代码在不同工程竟然不同结果, 会是权限之类的问题导致的吗?
A和B的代码完全一样吗?
你把你的Msg函数改成NSLog试试,我觉得更可能是你代码的问题
11174
(套马的女汉子)
#5
谢谢
我试了一下,grep出来的日志 显示的类名也是:dylib_SxtbRwx_func90
我想我这个问题可以换一下,叫做: 为什么获取调用setDelegate:方法的类名都显示dylib_SxtbRwx_func90
说实话:我不是很确定插件A插件创建过程是否和插件B完全一样,
但是我现在每个新创建的工程都只能获取到dylib_SxtbRwx_func90这个类名
昨天一晚上加上今天一上午都没有研究出原因
你B插件的代码贴上来看看,我觉得应该是B插件代码的原因
11174
(套马的女汉子)
#7
#import <CoreLocation/CoreLocation.h>
#import <CoreLocation/CLLocationManager.h>
%hook CLLocationManager
- (void) setDelegate:(id)aDelegate
{
NSLog(@“TheDelegateIsSet:%@”,NSStringFromClass([aDelegate class]));
%orig;
}
%end
就是这样而已
你意思是,每个新建的工程,用这段代码,
#import <CoreLocation/CoreLocation.h>
#import <CoreLocation/CLLocationManager.h>
%hook CLLocationManager
- (void) setDelegate:(id<CLLocationManagerDelegate>)aDelegate
{
NSLog(@"TheDelegateIsSet:%@",NSStringFromClass([aDelegate class]));
%orig;
}
%end
打印出的都是dylib_SxtbRwx_func90?
11174
(套马的女汉子)
#9
是的,大大 我用我的电脑每新建一个工程,使用我的测试手机都是打印出这个
我刚刚又进行了一系列的测试
首先 我在同事换了一台电脑装了theos环境 tweak里面写如上代码
使用我的测试手机 和同事的手机 都可以正常获取类名
然后 我使用我的插件B安装在同事手机,也是正常的
唯独我的插件B装在我的测试手机上 就打印的是dylib_SxtbRwx_func90
这个太奇葩了…我也是醉了
这个我就不知道了,如果你要刨根问底的话,用LLDB跟进去调调看吧,找找这个dylib_SxtbRwx_func90是哪里来的
你可以grep一下你的dylib和App,看看有没有dylib_SxtbRwx_func90的字眼
11174
(套马的女汉子)
#12
谢谢大大
我grep了一下我的dylib,还是没有相关信息
但是刚才我删除了一些插件,就可以了
我猜想应该是其他插件用到了和我一样的方法,然后我得到的代理,已经不是纯洁的了,而是被其他插件改过的.
但是如果真是这样的话,却时好时坏…看来这个东西也存在很多的不确定性啊…
最后要谢谢大大的耐心,虽然我这次歪打正着,但是从解决问题的过程中也学到了不少.