我的应用程序(越狱iOS)是否有一种优雅的方式(目标C或C)来检查iOS中是否有特定的动态库,除了检查实际的dylib文件是否存在于特定路径中NSFileManager
或致电dlopen
? (例如,一个对象,其中包含我可以访问的可用动态库的信息。)
更新:我知道我也可以在我的项目设置(Xcode)中使它成为一个要求,但是如果dylib不可用,那么应用程序只会在启动时崩溃,没有任何反馈(如果有办法捕获这个和在崩溃之前做一个警报,这也是一个可接受的解决方案。)
答案 0 :(得分: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() */
}
答案 1 :(得分:0)
我个人认为你的方法已经结束了。安装越狱应用程序时,大多数最终用户将通过Cydia / Installer / Icy安装它,这是APT的包装器。
当您最终将包推送到这些商店时,您可以指定包“依赖关系”,这将使您的应用程序根本无法安装,更不用说运行,而不安装这些包。
然而,您需要确定包含您希望的dylib的包。
只有少数边缘情况可能导致从APT安装后丢失dylib,即删除库,搞乱MobileSubstrate设置,以及有人在APT之外下载你的应用程序。
然而,在这种情况下,用户不应该期望你的应用程序能够完美地工作,因为他们一直在搞乱他们可能不应该使用的开发人员类型的东西。