编写iOS7代码,根据iOS6BaseSDK进行编译



我们现在有一个iOS应用程序在销售,我们正在使用相同的代码库在XCode 5 DP上开发iOS 7版本。

我们现在确实需要为现有的iOS 5/6客户发布更新,但当然,当我们将项目重新加载到XCode 4中时,它会抱怨不存在的属性,因为Base SDK后来变成了iOS6,而不是7:

// Only run this bit on iOS 7
if ([self respondsToSelector:@selector(setFooForExtendedLayout:)])
{
    self.fooForExtendedLayout = UIFooEdgeLeft | UIFooEdgeRight;
}
float bottomOffset = 0;
// Only run this bit on iOS 7, else leave bottomOffset as 0
if ([self.hostController respondsToSelector:@selector(bottomLayoutFoo)])
    bottomOffset = self.hostController.bottomLayoutFoo.length;

(混淆以避免破坏保密协议)

XCode错误:

在类型为的对象上找不到属性"fooForExtendedLayout"'UIViewController*'

使用未声明的标识符"UIFooEdgeLeft"

使用未声明的标识符"UIFooEdgeRight"

在类型为"UIViewController*"的对象上找不到属性"bottomLayoutFoo"

对这个新代码进行注释会很痛苦。重新编写它以兼容新旧基本SDK的正确方法是什么?现在提交它(通过XCode 4并针对iOS 6 SDK构建)是否有被App Store拒绝的风险?

我建议等到iOS 7准备好提交更新
然而,它们是解决问题的方法。

在类型为的对象上找不到属性"fooForExtendedLayout"'UIViewController*'

由于属性只是语法糖,修复这种错误的简单方法是使用选择器调用方法(setter):

[ self performSelector: NSSelectorFromString( "setFooForExtendedLayout:" ) withObject: ( id )xxx ];

@selector()无法使用,因为您要求使用带有iOS 6 SDK的iOS 7选择器
因此使用了CCD_ 2
withObject参数是为对象创建的,顾名思义。但是,由于对象是指针,并且您的方法采用枚举值,因此您实际上可以使用强制转换毫无问题地传递它。

使用未声明的标识符"UIFooEdgeLeft"
使用未声明的标识符"UIFooEdgeRight"

现在关于您的枚举值,没有这样的技巧
唯一的方法是用与iOS 7 SDK中相同的值声明它们,并祈祷在正式发布之前不会更改

所以现在就看你了。。。就我个人而言,我会等待。

以下是在iOS 6和7 SDK上编译代码的推荐方法:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
    if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
        self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeRight;
#endif

您可以使用:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
    self.edgesForExtendedLayout = UIRectEdgeNone;
}
#endif
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
    self.edgesForExtendedLayout = UIRectEdgeNone;
}
#endif

编辑:这个答案(以及问题)不再相关,因为现在Xcode 5发布了!请在投反对票时考虑这一点;)

使用SCM工具获取两个不同代码分支的基本原理是,在切换具有相同Xcode项目和相同代码和资源库的Xcode Developer Preview版本和Xcode Release版本时,可能会出现一些微妙的问题。项目文件和情节提要或xib可能会在后台更改,并且可能会损坏。这不是,因为在代码中找不到解决方案!尽管如此,我不建议在相同的Xcode项目上使用不同的Xcode版本。这可能会让你头疼!


正确的方法是使用源代码管理工具,如git。你应该有一个"iOS 6"分支,在那里你可以维护发布版本,你应该有个或多个开发分支,在这里你可以使用Xcode和iOS的预发布版本。

最新更新