2013-08-18 55 views
7

我們現在有一個iOS應用程序在售,我們正在使用相同的代碼庫在XCode 5 DP上開發iOS 7版本。編寫針對iOS 6編譯的iOS7代碼Base SDK

我們現在確實需要爲現有iOS 5/6客戶發佈更新,當然,當我們將項目重新加載到XCode 4中時,它會抱怨不存在的屬性,因爲基本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' 不是類型的對象中找到0 '的UIViewController *'

使用未聲明的標識符的 'UIFooEdgeLeft'

使用未聲明的標識符 'UIFooEdgeRight'

住宅 'bottomLayoutFoo' 的上型 '的UIViewController *'

的對象未找到

註釋掉這個新代碼會很痛苦。重寫它與新舊Base SDK兼容的正確方法是什麼?並且現在提交它(通過XCode 4並針對iOS 6 SDK構建)會面臨任何類型的App Store拒絕?

回答

6

我建議等待iOS 7準備好提交更新。
但是,它們是解決問題的方法。

住宅「fooForExtendedLayout」不是類型的對象中找到 「的UIViewController *」

由於屬性只是一個語法糖,最簡單的方式來解決這種錯誤是使用一個選擇器調用方法(二傳):

既然你問的是iOS 7選擇使用iOS 6 SDK
[ self performSelector: NSSelectorFromString("setFooForExtendedLayout:") withObject: (id)xxx ]; 

@selector()不能使用。
因此使用NSSelectorFromString
withObject參數是爲對象創建的,因爲它的名稱暗示。但是因爲對象是指針,並且由於你的方法需要一個枚舉值,所以你可以使用一個強制轉換來毫無問題地傳遞它。

使用未聲明的標識符的「UIFooEdgeLeft」
使用未聲明的標識符的「UIFooEdgeRight」

現在你的枚舉值,有沒有這樣的伎倆。
唯一的方法是聲明它們,其值與iOS 7 SDK 中的值相同,並祈禱它不會更改,直到官方發佈

所以,現在取決於你...我個人而言,我會等。

+0

這正是我一直在尋找,謝謝。感謝您回答問題的其他部分,即分享您對此的保留意見。 –

+0

不客氣:) – Macmade

-2

編輯:這個答案(和問題)已經不再相關,因爲現在Xcode 5發佈了!請考慮這個的時候下投票;)

了使用SCM工具來獲得兩個不同的代碼分支的理由是由於開關與相同的Xcode開發者預覽版本和Xcode的發行版本時可能出現的微妙問題Xcode項目和相同的代碼和資源庫。項目文件和故事板或xib可能會被改變,並可能會損壞。這是而不是,因爲沒有辦法在代碼中找到解決方案!儘管如此,我不會推薦與不同 Xcode版本相同 Xcode項目。這可能會導致你頭痛!


正確的方法是使用源代碼管理工具,如git。您應該擁有一個「iOS 6」分支,您可以在其中維護髮行版本,並且您應該有一個或多個開發分支,您可以使用Xcode和iOS的預發行版本。

+0

我明白你的觀點,但問題是如何重新編寫發佈的代碼,以便它可以針對兩個SDK進行編譯。 –

+0

對於可以輕鬆避免的問題,使用一些古怪的解決方法會更好嗎? – CouchDeveloper

+0

我知道,我知道......這是一個很好的問題,我傾向於同意你的看法。但是,這不是**這個問題。 –

5

你可以使用:

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

什麼/在哪裏是SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO? – daidai

+0

這是一個宏:#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch]!= NSOrderedAscending) – Alena

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

這裏是recommended way有這兩個的iOS 6和7 SDK編譯代碼:

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

謝謝!這幫助了我 –