啊,iOS 8 - 很多意外的变化需要考虑!简而言之:有没有一种方法可以在运行时(非预处理宏)编程地确定用于构建应用程序的iOS SDK版本?
我正在为维护的一个库(作为预构建静态库分发)进行一些窗口框架计算方面的努力,因为iOS 8改变了屏幕坐标系统的工作方式。
使用 iOS 7 的代码运行两个初始观察结果而不更改任何内容,如下所示:
1.使用 iOS 7 SDK 构建并在 iOS 8 上运行时,所有内容都像以前一样工作,不需要进行任何更改。 2.使用 iOS 8 SDK 构建并在 iOS 8 上运行时,出现错误:需要对帧计算中的某些更改才能获得正确的定位。
所以,我们更改代码,在 [[UIDevice currentDevice] systemVersion] 上设置条件,以正确地处理新的坐标系统。现在:
1.使用 iOS 7 SDK 构建并在 iOS 7 上运行时,所有内容都正常工作。 2.使用 iOS 8 SDK 构建并在 iOS 8 上运行时,所有内容都正常工作。 3.但是: 使用 iOS 7 SDK 构建,并在 iOS 8 上运行时,计算错误 - 请记住,在使用 iOS 7 SDK 构建时,在进行 iOS 8 特定代码更改之前,所有内容都正常工作。因此,实际上破坏了所做的更改。
通常,我可以通过一些SDK版本的宏条件解决这个问题(#ifdef __IPHONE_8_0 等)。但是,我正在分发使用 iOS 7 SDK 构建的预构建静态库,因此,这些条件中的代码永远不会被包含。以下是为什么会出现问题:
如果使用 iOS 7 SDK 构建静态库,但将其链接到使用 iOS 8 SDK 构建的应用程序中,就像静态库使用 iOS 8 SDK 构建一样(当然,在最终应用程序编译阶段进行链接)。这意味着当使用 iOS 8 SDK 构建应用程序时,需要在其中添加那些 iOS 8 更改-但是我无法使用宏条件来确定是否使用它们,因为C预处理器在 iOS 7 下执行静态库构建时已经完成其操作。
因此,我的问题是:是否有人知道如何能够从预编译的静态库内部在运行时确定应用程序构建是否使用了 iOS 8 SDK?
我尝试检查 iOS 8 特定 SDK 功能(例如-[UIScreen nativeBounds]),但是无法使用该符号-无论 SDK 版本如何,该符号都可用。
有任何想法吗?
我正在为维护的一个库(作为预构建静态库分发)进行一些窗口框架计算方面的努力,因为iOS 8改变了屏幕坐标系统的工作方式。
使用 iOS 7 的代码运行两个初始观察结果而不更改任何内容,如下所示:
1.使用 iOS 7 SDK 构建并在 iOS 8 上运行时,所有内容都像以前一样工作,不需要进行任何更改。 2.使用 iOS 8 SDK 构建并在 iOS 8 上运行时,出现错误:需要对帧计算中的某些更改才能获得正确的定位。
所以,我们更改代码,在 [[UIDevice currentDevice] systemVersion] 上设置条件,以正确地处理新的坐标系统。现在:
1.使用 iOS 7 SDK 构建并在 iOS 7 上运行时,所有内容都正常工作。 2.使用 iOS 8 SDK 构建并在 iOS 8 上运行时,所有内容都正常工作。 3.但是: 使用 iOS 7 SDK 构建,并在 iOS 8 上运行时,计算错误 - 请记住,在使用 iOS 7 SDK 构建时,在进行 iOS 8 特定代码更改之前,所有内容都正常工作。因此,实际上破坏了所做的更改。
通常,我可以通过一些SDK版本的宏条件解决这个问题(#ifdef __IPHONE_8_0 等)。但是,我正在分发使用 iOS 7 SDK 构建的预构建静态库,因此,这些条件中的代码永远不会被包含。以下是为什么会出现问题:
如果使用 iOS 7 SDK 构建静态库,但将其链接到使用 iOS 8 SDK 构建的应用程序中,就像静态库使用 iOS 8 SDK 构建一样(当然,在最终应用程序编译阶段进行链接)。这意味着当使用 iOS 8 SDK 构建应用程序时,需要在其中添加那些 iOS 8 更改-但是我无法使用宏条件来确定是否使用它们,因为C预处理器在 iOS 7 下执行静态库构建时已经完成其操作。
因此,我的问题是:是否有人知道如何能够从预编译的静态库内部在运行时确定应用程序构建是否使用了 iOS 8 SDK?
我尝试检查 iOS 8 特定 SDK 功能(例如-[UIScreen nativeBounds]),但是无法使用该符号-无论 SDK 版本如何,该符号都可用。
有任何想法吗?