6

我正在使用 Jailbreak + Appsync + iOS5.0.1 设备(没有开发人员许可证,但有一些技巧我可以在设备上运行我的应用程序)

现在我想使用私有 API launchApplicationWithIdentifier:suspended:。所以我需要添加

<key>com.apple.springboard.launchapplications</key>
<true/>

到 myApp.entitlements.plist 文件。然后它应该可以工作,但我仍然收到错误

'Receiver type 'UIApplication' for instance message does not declare a method 
 with selector 'launchApplicationWithIdentifier:suspended:''

然后我发现有人说,如果我想使用 Entitlements.plist,必须启用代码签名。这是真的吗?我必须有开发者许可证吗?

或者有没有其他方法可以使用这种方法?我阅读了一些关于如何使用私有 API 的方法。似乎很难。我是 iOS 开发的新手。

谢谢你。

4

1 回答 1

5

我在您的帖子中看到两个问题/问题:

1)你得到错误

'接收器类型'UIApplication'例如消息未声明带有选择器'launchApplicationWithIdentifier:suspended:'的方法

那是编译器错误吗?听起来可能是这样。事情就是这样。在公共框架集中有很多objective-c 类仍然有一些私有方法。因此,在公共框架的普通头文件(.h 文件)中,不会列出那些私有方法。但是,它们存在于动态库中。如果你想构建一个使用这些的应用程序,那么解决问题的一种方法是找到完整标题的副本。

例如,这里是完整 UIApplication.h 标头的副本

然后,您可以复制私有方法的声明,并在您自己的代码中,像这样声明它们:

// Used to disable warning for non-public methods
@interface UIApplication (Extensions)
  - (BOOL)launchApplicationWithIdentifier:(id)identifier suspended:(BOOL)suspended;
@end

这应该阻止编译器抱怨私有方法不存在。

对于未来,您应该阅读 about class-dump,这是一个您可以在 SDK 中的公共或私有框架上运行的工具,并自己反向生成上述标头。它们会随着 SDK 的每个版本而改变,因此能够自己生成它们是件好事。

2)您询问有关在没有代码签名的情况下使用权利的问题。

首先,在这里阅读 Saurik 最初写的关于它的内容是的,您确实需要对权利进行代码签名。但是,,越狱手机上不一定要有 Apple 证书。您可以通过下载ldid可执行文件并执行

cd MyAppName.app
ldid -Sentitlements.xml MyAppName

假设您的应用程序名为MyAppName并且您创建了权利文件entitlements.xml。如果您使用 ldid 伪造代码签名,我相信此权利文件对您有用:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>com.apple.springboard.launchapplications</key>
    <true/>
  </dict>
</plist>

当心。我ldid在网上找到了几个地方。我真的不确定哪一个是正确的。我记得有一次,我尝试这样做,而ldid我使用的版本不适用于签署权利。我ldid从另一个来源下载,然后它工作。所以,小心。

于 2012-06-19T02:00:28.203 回答