求教关于在一个 hook 中调用另一个类的实例方法的问题

在写一个作用于 Music.app 的 tweak。

在 MusicNowPlayingItemViewController 类中,我获得了一个 MPMediaItem 类的对象,在试图调用它的一个 getter 方法时,编译无法通过:

%hook MusicNowPlayingItemViewController

-(id)item {
	id origResult = %orig;
	%c(MPAVItem);
	MPAVItem *avItem = origResult;
	%c(MPMediaItem);
	MPMediaItem *mediaItem = MSHookIvar<MPMediaItem *>(avItem, "_mediaItem");
        //到这为止编译时都能通过
	BOOL isCloudItem = [mediaItem isCloudItem];
	NSLog(@"isCloudItem called: %d", isCloudItem);
	return origResult;
}

%end

编译器报错:

Tweak.xm:82:32: error: instance method '-isCloudItem' not found (return type defaults to 'id')
      [-Werror,-Wobjc-method-access]
        BOOL isCloudItem = [mediaItem isCloudItem];
                                      ^~~~~~~~~~~
Tweak.xm:18:8: note: receiver is instance of class declared here
@class MPMediaItem; @class MPAVItem; @class MusicNowPlayingItemViewController; @class MPMedia...
       ^
Tweak.xm:82:7: error: cannot initialize a variable of type 'BOOL' (aka 'signed char') with an rvalue
      of type 'id'
        BOOL isCloudItem = [mediaItem isCloudItem];
             ^             ~~~~~~~~~~~~~~~~~~~~~~~
2 errors generated.

相关头文件的部分(头文件是我自己 decache 手机上的库文件然后 class-dump 的):

//MPMediaItem.h
#import <MediaPlayer/MPMediaEntity.h>

@class MPMediaItemArtwork, NSArray, NSDate, NSString, NSURL;

@interface MPMediaItem : MPMediaEntity
{
}
...
@property(readonly, nonatomic, getter=isCloudItem) BOOL cloudItem;
...

求问我哪里写错了…… :pensive:谢谢~

找到解决方法了,结贴。
只要在 Tweak.xm 中 #import MPMediaItem.h 即可,而且不需要 #import 完整的,只需要把用到的部分留下。并且 %c 的部分也不需要了。

1 个赞

并没有用呀 我#import 一个类之后 使用他 还是报这些错, 能贴一个完整的代码不