提交到 Mac App Store 时处理 OS X 库数据类型在次要版本之间的差异
Handling OS X library data type difference between minor versions when submitting to Mac App Store
我在 Mac App Store 中有一个为 Mac OS X 编写的应用程序。该应用程序使用 libnetsnmp,whose 版本在 OSX 10.11.1 和 10.11.2 之间从 5.6 更改为 5.6.2.1。此更改的一个结果是在库 headers 中定义的 oid
数据类型也已从 uint32_t
更改为 u_long
,因此,应用程序在 OSX 10.11.2 上停止正常工作。请注意,更改的具体细节对于我想问的问题并不重要。
我想知道如何处理上述关于将应用程序提交到 Mac App Store 的问题。我想让该应用程序与 OS X 的早期版本兼容,但也要使用最新版本。据我所知,Mac App Store 上没有提供两个二进制文件的规定,一个用于最新的 OS X,另一个用于以前的版本。
我认为使用我自己的数据类型(例如通过 typedef
)取决于编译应用程序的 OS 版本也不会起作用,因为 those 在编译期间使用,应用程序将在 OSX 10.11.2 上编译。我需要在 运行 时间内使用正确的数据类型(uint32_t
或 u_long
)。
如果更改发生在主要 OS 版本之间,这会更容易一些,因为我可以使用Xcode 中的部署目标设置,但这只允许我设置主要版本。
两个问题
所以我的问题是:当底层库在次要 OS X 版本之间更改数据类型并且您仍然希望保持应用程序与旧版本的兼容时,您如何处理这种情况OS?
是否可以将较新版本的应用程序限制为仅适用于 OS X 10.11.2 及更高版本?在那种情况下,至少我不会在发布更新时破坏 OS 旧版本用户的应用程序。
编辑:两个 pos 可行的解决方案
解决方案 1
根据 Cristik 提供的答案,一种解决方案是在最小部署目标字段中手动输入 os 的主要和次要版本(在本例中为 10.11.2),这应该使App 的更新版本,包括新版本库中新数据类型所需的更改,在 Mac App Store 上仅供 运行 OSX 10.11 的用户使用.2 或更新版本。
解决方案 2
另一种方法具有不依赖 OS 中包含的库版本的额外好处,是将我自己的库版本与应用程序捆绑在一起。
在这种情况下,我下载了 net-snmp 库的源代码(我使用的是 5.6.2.1 版本)并在 Xcode 之外编译它。然后我将它安装在我的 homedir 内某个目录中 - 我使用了 --prefix=/Users/myusername/devel/Frameworks/usr
选项用于 libnetsnmp 中包含的 configure
脚本。
在 Xcode 中,然后我转到构建设置,找到搜索路径部分,并更改了两个设置:
- 始终搜索用户路径:是
- 用户 Header 搜索路径:添加
/Users/myusername/devel/Frameworks/usr/include
然后在 Build Phases 中,在 Link Binary With Libraries 中,删除与 OS 捆绑在一起的 libnetsnmp.dyld
,单击 +
符号并添加 libnetsnmp.dyld
来自 /Users/myusername/devel/Frameworks/usr/lib
。
最后,在构建阶段/复制文件中,从 /Users/myusername/devel/Frameworks/usr/lib
添加 libnetsnmp.dyld
,并将目标设置为框架。我还将复制时的代码登录设置为是。
要回答第二个问题,您可以将新应用版本的部署目标设置为可用的最低 OSX 版本。使用旧 OSX 版本的用户将获得当前商店应用程序,而其他用户将获得新版本。
关于第一个问题,这个问题有点棘手,因为您需要并行维护应用程序的两个分支:一个使用旧库,一个使用新库。不确定这是否适合 AppStore 设计,因为您在提交应用程序更新时不能上传两个二进制文件。使用旧 OSX-es 的用户可能需要坚持使用使用旧库的最新版本的应用程序。
我在 Mac App Store 中有一个为 Mac OS X 编写的应用程序。该应用程序使用 libnetsnmp,whose 版本在 OSX 10.11.1 和 10.11.2 之间从 5.6 更改为 5.6.2.1。此更改的一个结果是在库 headers 中定义的 oid
数据类型也已从 uint32_t
更改为 u_long
,因此,应用程序在 OSX 10.11.2 上停止正常工作。请注意,更改的具体细节对于我想问的问题并不重要。
我想知道如何处理上述关于将应用程序提交到 Mac App Store 的问题。我想让该应用程序与 OS X 的早期版本兼容,但也要使用最新版本。据我所知,Mac App Store 上没有提供两个二进制文件的规定,一个用于最新的 OS X,另一个用于以前的版本。
我认为使用我自己的数据类型(例如通过 typedef
)取决于编译应用程序的 OS 版本也不会起作用,因为 those 在编译期间使用,应用程序将在 OSX 10.11.2 上编译。我需要在 运行 时间内使用正确的数据类型(uint32_t
或 u_long
)。
如果更改发生在主要 OS 版本之间,这会更容易一些,因为我可以使用Xcode 中的部署目标设置,但这只允许我设置主要版本。
两个问题
所以我的问题是:当底层库在次要 OS X 版本之间更改数据类型并且您仍然希望保持应用程序与旧版本的兼容时,您如何处理这种情况OS?
是否可以将较新版本的应用程序限制为仅适用于 OS X 10.11.2 及更高版本?在那种情况下,至少我不会在发布更新时破坏 OS 旧版本用户的应用程序。
编辑:两个 pos 可行的解决方案
解决方案 1
根据 Cristik 提供的答案,一种解决方案是在最小部署目标字段中手动输入 os 的主要和次要版本(在本例中为 10.11.2),这应该使App 的更新版本,包括新版本库中新数据类型所需的更改,在 Mac App Store 上仅供 运行 OSX 10.11 的用户使用.2 或更新版本。
解决方案 2
另一种方法具有不依赖 OS 中包含的库版本的额外好处,是将我自己的库版本与应用程序捆绑在一起。
在这种情况下,我下载了 net-snmp 库的源代码(我使用的是 5.6.2.1 版本)并在 Xcode 之外编译它。然后我将它安装在我的 homedir 内某个目录中 - 我使用了 --prefix=/Users/myusername/devel/Frameworks/usr
选项用于 libnetsnmp 中包含的 configure
脚本。
在 Xcode 中,然后我转到构建设置,找到搜索路径部分,并更改了两个设置:
- 始终搜索用户路径:是
- 用户 Header 搜索路径:添加
/Users/myusername/devel/Frameworks/usr/include
然后在 Build Phases 中,在 Link Binary With Libraries 中,删除与 OS 捆绑在一起的 libnetsnmp.dyld
,单击 +
符号并添加 libnetsnmp.dyld
来自 /Users/myusername/devel/Frameworks/usr/lib
。
最后,在构建阶段/复制文件中,从 /Users/myusername/devel/Frameworks/usr/lib
添加 libnetsnmp.dyld
,并将目标设置为框架。我还将复制时的代码登录设置为是。
要回答第二个问题,您可以将新应用版本的部署目标设置为可用的最低 OSX 版本。使用旧 OSX 版本的用户将获得当前商店应用程序,而其他用户将获得新版本。
关于第一个问题,这个问题有点棘手,因为您需要并行维护应用程序的两个分支:一个使用旧库,一个使用新库。不确定这是否适合 AppStore 设计,因为您在提交应用程序更新时不能上传两个二进制文件。使用旧 OSX-es 的用户可能需要坚持使用使用旧库的最新版本的应用程序。