1

我的应用程序(越狱的 iOS)是否有一种优雅的方式(Objective C 或 C)来检查特定的动态库在 iOS 中是否可用,而不是使用NSFileManager或调用检查实际的 dylib 文件是否存在于特定路径中dlopen?(例如,一个包含我可以访问的可用动态库信息的对象。)

更新:我知道我也可以在我的项目设置(Xcode)中要求它,但是如果 dylib 不可用,应用程序只会在启动时崩溃,没有任何反馈(如果有办法抓住这个并发出警报在崩溃之前,这也是一个可以接受的解决方案)。

4

2 回答 2

3

如果您为 dylib 使用弱链接,通过检查特定符号应该很容易检测库是否存在。

假设您void foo( void );在该库中有一个函数。

您可以extern在自己的代码中声明该原型,并使用weak_import属性:

extern void foo( void ) __attribute__( ( weak_import ) );

这样,如果找不到符号(因为它不再在库中,或者因为整个库不可用),链接器会将符号的地址设置为NULL.

然后,您可以简单而优雅地检查该符号:

if( foo == NULL )
{
    /* Alerts the user */
}
else
{
    /* It's safe to use foo() */
}

进一步阅读:框架编程指南

于 2013-01-09T15:25:02.333 回答
0

我个人认为你的方法是错误的。在安装越狱应用程序时,大多数最终用户将通过 Cydia/Installer/Icy 安装它,它是 APT 的包装器。

当你最终将你的包推送到这些商店时,你可以指定包“依赖项”,这将使你的应用程序在没有安装这些包的情况下根本无法安装,更不用说运行了。

但是,由您决定包含您想要的 dylib 的包。

从 APT 安装后,只有少数极端情况可能导致缺少 dylib,即删除库、弄乱 MobileSubstrate 设置以及有人在 APT 之外下载您的应用程序。

但是,在这种情况下,用户不应该期望您的应用程序能够完美运行,因为他们一直在搞乱他们可能不应该做的开发人员类型的事情。

于 2013-01-09T14:56:37.590 回答