我的应用程序(越狱的 iOS)是否有一种优雅的方式(Objective C 或 C)来检查特定的动态库在 iOS 中是否可用,而不是使用NSFileManager
或调用检查实际的 dylib 文件是否存在于特定路径中dlopen
?(例如,一个包含我可以访问的可用动态库信息的对象。)
更新:我知道我也可以在我的项目设置(Xcode)中要求它,但是如果 dylib 不可用,应用程序只会在启动时崩溃,没有任何反馈(如果有办法抓住这个并发出警报在崩溃之前,这也是一个可以接受的解决方案)。
我的应用程序(越狱的 iOS)是否有一种优雅的方式(Objective C 或 C)来检查特定的动态库在 iOS 中是否可用,而不是使用NSFileManager
或调用检查实际的 dylib 文件是否存在于特定路径中dlopen
?(例如,一个包含我可以访问的可用动态库信息的对象。)
更新:我知道我也可以在我的项目设置(Xcode)中要求它,但是如果 dylib 不可用,应用程序只会在启动时崩溃,没有任何反馈(如果有办法抓住这个并发出警报在崩溃之前,这也是一个可以接受的解决方案)。
如果您为 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() */
}
进一步阅读:框架编程指南
我个人认为你的方法是错误的。在安装越狱应用程序时,大多数最终用户将通过 Cydia/Installer/Icy 安装它,它是 APT 的包装器。
当你最终将你的包推送到这些商店时,你可以指定包“依赖项”,这将使你的应用程序在没有安装这些包的情况下根本无法安装,更不用说运行了。
但是,由您决定包含您想要的 dylib 的包。
从 APT 安装后,只有少数极端情况可能导致缺少 dylib,即删除库、弄乱 MobileSubstrate 设置以及有人在 APT 之外下载您的应用程序。
但是,在这种情况下,用户不应该期望您的应用程序能够完美运行,因为他们一直在搞乱他们可能不应该做的开发人员类型的事情。