首页 > 解决方案 > 可在编译时调整的 Objective-C 框架

问题描述

更详细的解释(对于较小的版本,请查看最后的 TL;DR):

我创建了一个在 Github 上可用的框架。其中,有 7 个宏定义了框架的编译方式。我不能只用static const's 替换它们,因为其中 6 个宏用于在编译时从框架中删除一些东西。

这些宏可以分为几组:

第 1 组)在可用时使用框架

#define USE_THE_METAL_FRAMEWORK_WHEN_AVAILABLE   true
#define USE_THE_OPENGL_FRAMEWORK_WHEN_AVAILABLE  true

这些定义使框架使用 Metal 和 OpenGL 框架,即使它们没有被添加到项目中。这是使用dlopen. 更多详情如下:

我使用它是为了让这些框架只有在可用时才能使用,因此开发人员可以为 macOS 10.6 构建他/她的应用程序,并且如果系统中可用的话,仍然可以使用 Metal。问题是:如果您的应用程序二进制调用dlopen某处,您不能将它添加到 Apple Store(即使您没有真正使用使用它的函数),因此用户应该能够从代码中删除它,如果他们想。这删除了一些框架功能,但使其能够被提交。

第 2 组)我正在导入框架

#define IM_IMPORTING_THE_METAL_FRAMEWORK   false
#define IM_IMPORTING_THE_OPENGL_FRAMEWORK  false

这些定义使框架真正使用 Metal 和 OpenGL 框架,而不使用dlopen. 这样,它可以提交到 Apple Store 并仍然使用前面提到的功能。

组 3) 行为改变

#define USER_NOTIFICATIONS_SHOULD_SHOW_A_BIGGER_ICON   true
#define NSDEBUGLOG_SHOULD_PRINT_TO_A_DESKTOP_FILE_TOO  true

第一个也可能导致Apple Store出现问题,第二个仅用于调试目的。

最后...

第 4 组)应在 Apple Store 中发布

#define I_WANT_TO_BE_RELEASED_IN_APPLE_STORE  false

那个是用来做的:

#if I_WANT_TO_BE_RELEASED_IN_APPLE_STORE == true
    #define USER_NOTIFICATIONS_SHOULD_SHOW_A_BIGGER_ICON  false
    #define USE_THE_METAL_FRAMEWORK_WHEN_AVAILABLE        false
    #define USE_THE_OPENGL_FRAMEWORK_WHEN_AVAILABLE       false
#endif

它会自动禁用可能导致 Apple Store 出现问题的三个定义。

尽管如此,那些使用 Travis-CI 的人仍然无法更改框架,除非他们将其完全复制到项目中。例如,为了解决这个问题(或至少减少它),这 7 个定义中的 5 个可以通过主项目中的文件进行更改。如果有人有其他可以解决问题的建议,我在听。

(可选)如果这可以通过警告用户(通过 Xcode 或编译时错误)的方式完成,他/她需要设置那些很棒的变量,因为这样可以避免用户出现问题可能需要设置那些宏。

TL;DR:是否可以在不修改框架本身的情况下更改框架内某些宏的值?

标签: objective-cmacosmacros

解决方案


不。做一些方法,用一些参数初始化你的模块。但无论如何你不能使用 dlopen。


推荐阅读