2013-08-18 64 views
7

Hiện tại, chúng tôi có ứng dụng iOS đang được bán và chúng tôi đang phát triển phiên bản iOS 7 trên XCode 5 DP bằng cách sử dụng cùng một cơ sở mã. Chúng tôi thực sự cần phải phát hành bản cập nhật ngay bây giờ cho khách hàng iOS 5/6 hiện tại nhưng, tất nhiên, khi chúng tôi tải lại dự án vào XCode 4, nó phàn nàn về các thuộc tính không tồn tại kể từ khi SDK cơ sở sau đó trở thành iOS6 chứ không phải 7:Viết mã iOS7 biên dịch dựa trên iOS 6 Base SDK

// 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; 

(obfuscated để tránh phá vỡ NDA)

XCode lỗi:

tài sản 'fooForExtendedLayout' không tìm thấy trên đối tượng của loại 'UIViewController *'

Sử dụng định danh chưa được khai báo 'UIFooEdgeLeft'

Sử dụng định danh chưa được khai báo 'UIFooEdgeRight'

tài sản 'bottomLayoutFoo' không tìm thấy trên đối tượng của loại 'UIViewController *'

Sẽ là một nỗi đau khi nhận xét mã mới này. Cách chính xác để viết lại nó là tương thích với cả SDK cơ bản cũ và mới, và hiện nay gửi nó (thông qua XCode 4 và được xây dựng dựa trên iOS 6 SDK) có nguy cơ bị loại bỏ App Store không?

Trả lời

6

Tôi khuyên bạn nên đợi cho đến khi iOS 7 sẵn sàng gửi bản cập nhật của bạn.
Tuy nhiên, đó là cách để khắc phục sự cố.

tài sản 'fooForExtendedLayout' không tìm thấy trên đối tượng của loại 'UIViewController *'

Như tính chất chỉ là một đường cú pháp, cách dễ dàng để sửa chữa loại hình báo lỗi là sử dụng một bộ chọn để gọi phương thức (setter):

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

@selector() không thể được sử dụng kể từ khi bạn đang yêu cầu cho một iOS 7 selector với một SDK iOS 6.
Do đó việc sử dụng NSSelectorFromString.
Đối số withObject được tạo cho các đối tượng, như tên của nó. Nhưng khi các đối tượng là con trỏ, và khi phương thức của bạn nhận một giá trị enum, bạn có thể thực sự vượt qua nó mà không có vấn đề, bằng cách sử dụng một diễn viên.

Sử dụng định danh chưa được khai báo 'UIFooEdgeLeft'
Sử dụng định danh chưa được khai báo 'UIFooEdgeRight'

Bây giờ về giá trị enum của bạn, không có lừa như vậy.
Cách duy nhất là khai báo chúng, với cùng giá trị như trong SDK iOS 7, và cầu nguyện rằng nó sẽ không thay đổi cho đến khi phát hành chính thức.

Vì vậy, bây giờ là tùy thuộc vào bạn ... Cá nhân, tôi sẽ chờ đợi.

+0

Đó là chính xác những gì tôi đang tìm kiếm, nhờ . Cảm ơn bạn đã trả lời phần khác của câu hỏi, tức là chia sẻ các đặt phòng của bạn về việc này. –

+0

Bạn được chào đón ...:) – Macmade

-2

Chỉnh sửa: câu trả lời này (và cả các câu hỏi) không còn liên quan nữa kể từ bây giờ Xcode 5 được phát hành! Hãy xem xét việc này khi xuống biểu quyết;)

Lý do cho việc sử dụng một công cụ SCM để có được hai chi nhánh đoạn mã khác nhau là do các vấn đề tinh tế có thể phát sinh khi chuyển đổi các phiên bản Preview Xcode Developer và một phiên bản Xcode phát hành với một giống hệt Dự án Xcode và cùng một mã nguồn và cơ sở tài nguyên. Dự án tập tin và storyboard hoặc xib có thể được thay đổi theo mui xe, và có thể có thể bị hỏng. Đó là không phải vì sẽ không có cách nào để tìm giải pháp trong mã! Tuy nhiên, tôi sẽ không khuyên bạn nên làm việc với khác nhau Phiên bản Xcode trên dự án giống hệt nhau Xcode. Điều này có thể khiến bạn đau đầu!


Cách chính xác là sử dụng công cụ quản lý mã nguồn, như git. Bạn nên có một nhánh "iOS 6", nơi bạn duy trì các phiên bản phát hành và bạn nên có một hoặc nhiều chi nhánh phát triển nơi bạn sử dụng các phiên bản tiền phát hành của Xcode và iOS.

+0

Tôi hiểu điểm của bạn, nhưng câu hỏi là về cách viết lại mã được đăng để nó có thể biên dịch lại cả hai SDK. –

+0

Có tốt hơn khi sử dụng một số giải pháp lập dị cho một vấn đề có thể dễ dàng tránh được không? – CouchDeveloper

+0

Tôi biết, tôi biết ... ... đó là một câu hỏi hay và tôi có xu hướng đồng ý với bạn. Tuy nhiên, nó không phải là ** câu hỏi này **. –

5

Bạn có thể sử dụng:

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

Địa điểm/SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO là gì? – daidai

+0

Đó là một macro: #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO (v) ([[[UIDevice currentDevice] systemVersion] so sánh: 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

Đây là recommended way để có mã biên dịch trên cả iOS 6 và 7 SDK:

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

thanks! điều này đã giúp tôi –