编写针对iOS 6 Base SDK编译的iOS7代码

时间:2013-08-18 21:20:22

标签: xcode ios6 sdk

我们现在有一个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;

(为避免破坏NDA而混淆)

XCode错误:

  

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

     

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

     

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

     

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

评论这个新代码会很痛苦。重新编写它以便与旧的和新的Base SDK兼容的正确方法是什么,并且现在提交它(通过XCode 4并针对iOS 6 SDK构建)会冒任何类型的App Store拒绝风险?

5 个答案:

答案 0 :(得分:7)

以下是recommended way代码,可以在iOS 6和7 SDK上编译:

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

答案 1 :(得分:6)

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

  

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

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

[ self performSelector: NSSelectorFromString( "setFooForExtendedLayout:" ) withObject: ( id )xxx ];
由于您要求使用iOS 6 SDK的iOS 7选择器,因此无法使用

@selector() 因此使用NSSelectorFromString
正如名称所暗示的那样,withObject参数是针对对象生成的。但是,由于对象是指针,并且您的方法采用枚举值,因此您可以使用强制转换实际传递它。

  

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

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

所以现在由你决定...就个人而言,我会等。

答案 2 :(得分:5)

您可以使用:

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

答案 3 :(得分:1)

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

答案 4 :(得分:-2)

编辑:此答案(以及问题)已不再相关,因为现在Xcode 5已经发布!在进行投票时请考虑这一点;)

使用SCM工具获取两个不同代码分支的基本原理是由于在使用相同的 Xcode项目和相同代码切换Xcode Developer Preview版本和Xcode Release版本时可能出现的细微问题和资源基础。项目文件和故事板或xib可能会在引擎盖下更改,并且可能会损坏。这是,因为无法在代码中找到解决方案!尽管如此,我不建议在相同的 Xcode项目上使用不同的 Xcode版本。这可能会让你头痛!


正确的方法是使用源代码管理工具,如git。您应该拥有一个“iOS 6”分支,您可以在其中维护发行版本,并且您应该有一个或多个开发分支,您可以使用Xcode和iOS的预发布版本。