SDK and Deployment Target
I see that my answer to the question What’s the meaning of Base SDK, iOS deployment target, Target, and Project in xcode gets lots of views, so I think I need to elaborate more about it
Good read
- iOS 7 TechTalk - Architecting Modern Apps, Part 2
- Configuring a Project for SDK-Based Development
Base SDK
- We can’t configure this anymore, as Xcode will use the latest SDK. For Xcode 7, the SDK is iOS 9
- If we upgrade Xcode, it will use the newer version of the SDK. Like Xcode 7.2, the SDK is iOS 9.1
-
Choosing the latest SDK for your project lets you use the new APIs introduced in the OS update that corresponds to that SDK. When new functionality is added as part of a system update, the system update itself does not typically contain updated header files reflecting the change. The SDKs, however, do contain updated header files.
Deployment Target
- We can set in Xcode -> Target -> Deployment Info -> Deployment Target
- State that we support this iOS version
What does it mean
So, a modern App might use iOS 9 as the Target SDK, and iOS 7 as the deployment target. This means that you can run on iOS 7, iOS 8 and iOS 9, and that you have available to you any iOS 9 calls when actually running on iOS 9.
.
Each .sdk directory resembles the directory hierarchy of the operating system release it represents: It has usr, System, and Developer directories at its top level. OS X .sdk directories also contain a Library directory. Each of these directories in turn contains subdirectories with the headers and libraries that are present in the corresponding version of the operating system with Xcode installed.
.
The libraries in an iOS or OS X SDK are stubs for linking only; they do not contain executable code but just the exported symbols. SDK support works only with native build targets.
So the SDK is just like stub and header only. It means that we can use certain APIs, but on OS that does not have the real symbols for those APIs, it crashes
available
Swift 2 introduces available
construct that guards against failure when trying to use newer APIs.
Note that available
is runtime, not compile time. All the code is inside your executable
1 |
if #available(iOS 9, OSX 10.10, *) { |
deprecated APIs
Always check to see if you are using deprecated APIs; though still available, deprecated APIs are not guaranteed to be available in the future
Compile time vs Runtime
1 |
#if (arch(i386) || arch(x86_64)) && os(iOS) |
1 |
#if os(OSX) |
1 |
// All the code gets inserted into executable, but is run depending on the version of the OS |
Weakly vs strongly linked
- Weak Linking and Apple Frameworks
- What does it mean to “weak-link” a framework?
- Frameworks and Weak Linking
For example, suppose in Xcode you set the deployment target (minimum required version) to “OS X v10.5” and the base SDK (maximum allowed version) to “OS X v10.6”. During compilation, the compiler would weakly link interfaces that were introduced in OS X v10.6 while strongly linking interfaces defined in earlier versions of the OS. This would allow your application to run in OS X v10.5 and take advantage of newer features when available.
.
None of the (platform) frameworks is really “included in the bundle”. Instead, your app has a reference (“link”) to a framework once you add it to the “Link Binary with Library” build phase. The frameworks are pre-installed on the devices. When you run an app, all the app’s framework references are resolved by the dynamic linker (on the device), which means the framework code is loaded so your app can use it.