8

我们现在有一个 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 错误:

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

使用未声明的标识符“UIFooEdgeLeft”

使用未声明的标识符“UIFooEdgeRight”

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

注释掉这个新代码会很痛苦。重写它以与新旧 Base SDK 兼容的正确方法是什么,现在提交它(通过 XCode 4 并针对 iOS 6 SDK 构建)是否有任何形式的 App Store 拒绝风险?

4

5 回答 5

7

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

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

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

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

@selector()无法使用,因为您要求使用带有 iOS 6 SDK 的 iOS 7 选择器。
因此使用NSSelectorFromString.
正如其名称所暗示的那样,该withObject参数是针对对象进行的。但是由于对象是指针,并且由于您的方法采用枚举值,因此您实际上可以使用强制转换毫无问题地传递它。

使用未声明的标识符“UIFooEdgeLeft”
使用未声明的标识符“UIFooEdgeRight”

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

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

于 2013-08-18T21:31:34.427 回答
7

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

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
    if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
        self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeRight;
#endif
于 2013-10-31T10:51:04.610 回答
5

You could use:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
    self.edgesForExtendedLayout = UIRectEdgeNone;
}
#endif
于 2013-08-27T08:53:55.597 回答
1
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
    self.edgesForExtendedLayout = UIRectEdgeNone;
}
#endif
于 2013-09-23T12:23:51.003 回答
-2

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

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


正确的方法是使用源代码管理工具,比如 git。你应该有一个“iOS 6”分支来维护发布版本,你应该有一个或多个开发分支来使用 Xcode 和 iOS 的预发布版本。

于 2013-08-19T08:21:21.220 回答