想获取调用某方法的类名

大大们好:
我在我的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等直接改成别的名字,又不正常

不知道我说清楚了没有,希望大大可以知道一下,先谢过了~

插件A和插件B各是什么?

先谢谢大大关注

插件A和插件B是我简化后用来做实验的两个工程, 功能是一样的
tweak.xm里面只有我上面写的那几行代码, 就是想试试能否查看调用setDelegate:的类名

但是同样代码在不同工程竟然不同结果, 会是权限之类的问题导致的吗?

A和B的代码完全一样吗?
你把你的Msg函数改成NSLog试试,我觉得更可能是你代码的问题

谢谢
我试了一下,grep出来的日志 显示的类名也是:dylib_SxtbRwx_func90

我想我这个问题可以换一下,叫做: 为什么获取调用setDelegate:方法的类名都显示dylib_SxtbRwx_func90

说实话:我不是很确定插件A插件创建过程是否和插件B完全一样,
但是我现在每个新创建的工程都只能获取到dylib_SxtbRwx_func90这个类名
昨天一晚上加上今天一上午都没有研究出原因

你B插件的代码贴上来看看,我觉得应该是B插件代码的原因

#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?

是的,大大 我用我的电脑每新建一个工程,使用我的测试手机都是打印出这个

我刚刚又进行了一系列的测试

首先 我在同事换了一台电脑装了theos环境 tweak里面写如上代码
使用我的测试手机 和同事的手机 都可以正常获取类名

然后 我使用我的插件B安装在同事手机,也是正常的
唯独我的插件B装在我的测试手机上 就打印的是dylib_SxtbRwx_func90
这个太奇葩了…我也是醉了

这个我就不知道了,如果你要刨根问底的话,用LLDB跟进去调调看吧,找找这个dylib_SxtbRwx_func90是哪里来的

你可以grep一下你的dylib和App,看看有没有dylib_SxtbRwx_func90的字眼

谢谢大大
我grep了一下我的dylib,还是没有相关信息

但是刚才我删除了一些插件,就可以了

我猜想应该是其他插件用到了和我一样的方法,然后我得到的代理,已经不是纯洁的了,而是被其他插件改过的.

但是如果真是这样的话,却时好时坏…看来这个东西也存在很多的不确定性啊…

最后要谢谢大大的耐心,虽然我这次歪打正着,但是从解决问题的过程中也学到了不少.:smile: