2013-07-10 14 views
14

Có những yếu tố như UITableView s, UINavigationBar s có một phong cách khác nhau trên iOS 7.Làm cách nào để iOS 7 triển khai các phần tử giao diện người dùng để chúng trông khác nhau tùy thuộc vào SDK bạn biên dịch?

phong cách này được xác định tại thời gian chạy, vì những lớp học được thực hiện trên UIKit, và UIKit được liên kết với ứng dụng của bạn tự động trong thời gian chạy , không tĩnh tại thời gian biên dịch. Vì vậy, người ta sẽ nghĩ rằng bất kỳ ứng dụng nào chạy trên iOS 7 sẽ có những yếu tố đó trông giống như cách họ nhìn trên iOS 7. Tuy nhiên, họ giữ cùng một kiểu mà họ đã từng có trên iOS 6, cho đến khi bạn biên dịch với iOS 7 SDK. Ngoại trừ một số trong số họ (như UIAlertView hoặc UIMenuController)

lời giải thích duy nhất của tôi cho điều này là họ làm điều gì đó loại như thế này:

#define SDKApplicationWasLinkedAgainst ... 
if (SDKApplicationWasLinkedAgainst < 7.0) 
    ... 
else 
    ... 

Điều này rõ ràng là thực sự cồng kềnh, khiến họ cần phải giữ cho việc duy trì một rất nhiều mã cũ. Vì vậy, tôi tò mò, đây thực sự là những gì đang xảy ra dưới mui xe? Tôi đang thiếu gì?

+5

@Unicorn: Đúng, tuy nhiên, anh ấy không hỏi về bất kỳ điều gì cụ thể cho iOS 7 sẽ được bao gồm bởi NDA. Câu hỏi này có thể áp dụng cho ** bất kỳ ** hai phiên bản iOS nào. – lnafziger

+2

Thật không may, trừ khi bạn là một coder tại Apple, bạn không thể thực sự trả lời câu hỏi làm thế nào ** Apple ** hiện nó. Bạn có thể nhận được một số ý tưởng về * một cách * mà ** bạn ** có thể làm điều đó nếu bạn tua lại câu hỏi của bạn mặc dù. – lnafziger

+2

Điều này thực sự có thể được trả lời ngay cả khi bạn không làm việc tại Apple, và nó sẽ không là một ý kiến: một trường đại học của tôi phát hiện ra cách họ làm điều đó làm một số tháo gỡ. –

Trả lời

9

Mà không đi quá nhiều vào lãnh thổ NDA'd, tôi chỉ muốn nói rằng có, họ đang conditionalizing xuất hiện và hành vi dựa tắt của kết quả từ các cuộc gọi sau đây:

_UIApplicationUsesLegacyUI() 

Chức năng này, lần lượt, thực hiện cuộc gọi đến GSApplicationUsesLegacyUI(), mà tôi đoán là trả về kết quả dựa trên phiên bản của UIKit được liên kết.

Điều này có nghĩa là có, họ đang điều kiện hóa các phần của UIKit cho di sản. Không chắc đó là một điều tốt, nhưng đó là những gì họ quyết định làm.

-1

Tôi không chắc chắn, nhưng đây là một trong những đoán về cách nó được thực hiện. Vì họ biết phiên bản ứng dụng của bạn đã được liên kết với phiên bản SDK nào, nên phiên bản này ra phiên bản trên các thiết bị iOS 7. Vì vậy, có một hệ thống phân cấp trên hệ thống tập tin dọc theo các dòng của /.../iPhoneOS6.1.sdk/.../Frameworks/UIKit. Sau đó, khi tải ứng dụng của bạn, họ chỉ có thể đặt đường dẫn tìm kiếm cho các thư viện để trỏ đến bất kỳ SDK nào mà ứng dụng của bạn đã được liên kết.

Đây là cách Xcode thực hiện ngay bây giờ. Bên trong thư mục Developer bên trong gói Xcode là một thư mục SDK, trong đó, chứa tất cả các SDK khác nhau để liên kết với nhau.

+0

Điều này nghe có vẻ như một ý tưởng có thể, nhưng không thể được bởi vì có một số điều mà làm khác nhau. Giống như 'UIActionSheet',' UIAlertView', 'UIMenuController' ... –

+0

Trong trường hợp đó, các thiết bị iOS 7 có thể cập nhật giao diện của các SDK trước đó. Không có gì mà nói rằng phiên bản của hệ điều hành không thể cập nhật các SDK cũ cả. Đây là cách hệ điều hành có thể cập nhật SDK cho các bản phát hành nhỏ (6.0.1, 6.0.2, v.v.) mà không yêu cầu ứng dụng được liên kết lại với các phiên bản SDK mới hơn. Lý do duy nhất để cập nhật lên các phiên bản SDK mới hơn (như 6.1) sẽ là sử dụng các công cụ mới được giới thiệu trong phiên bản đó. – Streeter

+0

Tôi thực sự nghi ngờ đó là những gì họ đã làm: P Biên dịch lại SDK cũ? Nếu những gì họ muốn là khả năng tương thích ngược để không phá vỡ các ứng dụng cũ không có ý nghĩa. –

4

Đặt cược của tôi là họ sử dụng framework compatibility versions.

Mỗi khi bạn biên dịch ứng dụng, ứng dụng của bạn được liên kết với một khuôn khổ cụ thể, với phiên bản tương thích và phiên bản hiện tại. Bạn có thể thấy những con số đó nếu bạn chạy otool -L YourApp.app/YourApp. Ví dụ, đối với một ứng dụng biên soạn một số thời gian trước đây tôi đắc này:

/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 751.58.0) 
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 1500.0.0) 

Như bạn có thể thấy đường dẫn đầy đủ khuôn khổ UIKit được lưu trữ trong Mach-O nhị phân, cùng một vài phiên bản (và đặc biệt là phiên bản tôi biên soạn vào lúc đó).

Tôi cho rằng iOS 7 sẽ có cả phiên bản UIKit bao gồm: phiên bản iOS6 được đánh dấu bằng phiên bản tương ứng và tương thích từ 1.0.0 và phiên bản iOS7 được đánh dấu tương thích với thứ gì đó cao hơn 1500.0.0 (I không biết nếu đó là số cho iOS 6.1.3, nhưng bạn có được ý tưởng).

Khi iOS6 nhị phân của bạn được nạp, thư viện phụ thuộc của nó được đọc bởi dyld và giải quyết, bởi vì bạn được biên soạn nói current version 1500.0.0, và thư viện dành cho iOS 7 nói compatibility version 1501.0.0, bạn sẽ được liên kết với thư viện dành cho iOS 6.

Vì khung cũng là một gói, tất cả các tài nguyên được chứa hoàn toàn và sẽ chỉ được sử dụng bởi phiên bản phù hợp và đó là cách các yếu tố hình ảnh khác nhau sẽ khác nếu bạn biên dịch dựa trên iOS 6 SDK hoặc iOS 7 SDK.

Tôi có thể sai, nhưng tôi chỉ đơn giản hy vọng họ không sử dụng kỹ thuật mã bạn đề xuất, bởi vì đó sẽ là một cơ sở mã crappy để duy trì.

+0

Tôi không nghĩ rằng iOS đi kèm với nhiều phiên bản của cùng một khuôn khổ. Trong ví dụ của bạn, phiên bản 1501.0.0 tương thích ngược với phiên bản 1500.0.0. Nhưng như bạn đã nói chính xác, số phiên bản ứng dụng được liên kết ngược lại được ghi lại trong tệp nhị phân, để có thể kiểm tra thời gian chạy. –

+0

Điều này vẫn không giải thích được tại sao một số lớp nhất định có giao diện mới (ví dụ: 'UIAlertView') –

+0

@MartinR: kiểm tra thời gian chạy là có thể, nhưng tôi nghĩ rằng hai nhị phân rất dễ giải quyết. Nếu tôi phải làm những gì Apple phải làm trong thời gian chuyển tiếp, tôi sẽ chọn không thực hiện các kiểm tra đó trong thời gian chạy. – yonosoytu

Các vấn đề liên quan