1

我正在对 cydia 基板进行调整,我有这行代码:

double threshold = [SBLockScreenNotificationScrollView scrollThresholdForPasscodeScroll];

当我尝试编译时,我收到了该行的这些错误和警告。

在此处输入图像描述

我已经导入<Springboard/Springboard.h>我的文件,它来自/opt/theos/include. 我也尝试过导入<SBLockScreenNotificationScrollView.h>,但找不到文件。我有点迷失在这里,任何帮助表示赞赏。谢谢。

编辑:我尝试过使用这些头文件,但它们给了我一大堆错误,编译器无法列出。

4

2 回答 2

1

这里的根本原因是您要使用的 API 是私有API。如果要包含诸如 之类的文件,则SBLockScreenNotificationScrollView.h需要获取或生成该头文件,然后手动将其放入项目中。该文件不会随 Theos/Logos 或 iOS SDK 自动交付。

可能最简单的方法是运行class-dumpclass-dump-z来对该头文件进行逆向工程。类转储应该在SpringBoard可执行文件本身上运行。SpringBoard 是一个应用程序(不是一个框架),它存在于 iPhone 上的/System/Library/CoreServices/SpringBoard.app/SpringBoard. 因此,如果您的设备已越狱,并且您已openssh安装,您可以通过 ssh 进入设备(或使用scp)将可执行文件传输到您的 Mac:

scp root@iphone-ip-address:/System/Library/CoreServices/SpringBoard.app/SpringBoard .

然后,在可执行文件上运行类转储:

class-dump-z -H SpringBoard

您将在当前目录中获得大量头文件,包括 SBLockScreenNotificationScrollView.h。

然后您可能会注意到您的标头依赖于另一个标头,而另一个标头又依赖于另一个标头。如果您尝试构建,您会经常遇到令人沮丧的构建错误。我的建议是从包含所需私有方法的标题中删除所有不需要的东西。那些私有头文件,当包含在您的项目中时,不需要是私有类(例如类)的完整规范。SBLockScreenNotificationScrollView它们只需要包含您尝试调用的接口的最小描述,以满足编译器的要求。

例子

这个修剪后的标题可能对您来说就足够了(注意我已经注释掉的内容):

//#import "UIGestureRecognizerDelegate.h"
//#import <XXUnknownSuperclass.h> // Unknown library

//@class SBLockScreenNotificationCell;

@interface SBLockScreenNotificationScrollView /* : XXUnknownSuperclass <UIGestureRecognizerDelegate> */ {
//        SBLockScreenNotificationCell* _associatedCell;
}
//@property(assign, nonatomic) SBLockScreenNotificationCell* associatedCell;
+(float)scrollThresholdForPasscodeScroll;
@end

注意:在那之后,如果您遇到链接器错误,您可能需要做更多的事情。我建议发布另一个关于 theos/logos 链接器错误的问题,显示错误输出,有人可能会帮助你。这样,我们就可以使每个问题都变得狭窄而具体。谢谢!

参考

iPhone私有API编译

于 2014-03-02T23:35:08.697 回答
0

错误消息似乎无济于事——无论如何一开始。但它们通常内容丰富,但需要一些学习来学习如何解释。对大多数人来说最糟糕的是链接器消息,但它们也提供了丰富的信息,只需要一些研究。

让我们看看它们:

double threshold = [SBLockScreenNotificationScrollView scrollThresholdForPasscodeScroll];

类消息的接收者“SBLockScreenNotificationScrollView”是前向声明

只有一个前向声明,可能@SBLockScreenNotificationScrollView类的实际声明SBLockScreenNotificationScrollView和它的方法scrollThresholdForPasscodeScroll需要类(.m文件)看到。

选择器“scrollThresholdForPasscodeScroll”没有已知的类方法

方法scrollThresholdForPasscodeScroll未知。这是从先前的错误消息中得出的,该错误消息暗示没有声明。

使用不兼容类型“id”的表达式初始化“double”

这个有点难。由于scrollThresholdForPasscodeScroll没有看到 of 的方法声明,编译器假设返回类型是 an,id但它被分配给 double。

因此,似乎它们都归结为没有看到声明,这意味着可能没有导入头文件 (.h)。检查它是否正确导入或添加导入。

于 2014-03-01T22:13:37.327 回答