可以在编译时调整的Objective-C框架

时间:2018-10-09 14:03:16

标签: objective-c macos macros

更详细的说明(对于较小的版本,请最后检查TL; DR):

我创建了一个在Github中可用的框架。其中有7个宏,用于定义应如何编译框架。我不能只将它们替换为static const,因为其中的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:是否可以在不修改框架本身的情况下更改框架中某些宏的值?

1 个答案:

答案 0 :(得分:0)

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