Skip to content
Mickey Reiss edited this page Sep 4, 2015 · 13 revisions

When using PureLayout in an App Extension, you must define the preprocessor macro PURELAYOUT_APP_EXTENSIONS to prevent usage of unavailable APIs.

If you do not do this, you will see an error such as:

'sharedApplication' is unavailable: not available on iOS (App Extension) - Use view controller based solutions where appropriate instead.

To fix this:

If you're using CocoaPods

You probably don't want to modify the Pods project (and the Pods-PureLayout target it contains) by hand because it is regenerated every time you run pod install. Instead, you should use a post_install hook to have the preprocessor macro automatically added every time you run pod install.

At the end of your Podfile, add the following post_install hook:

post_install do |installer|
  # NOTE: If you are using a CocoaPods version prior to 0.38, replace `pods_project` with `project` on the below line
  installer.pods_project.targets.each do |target|
    if target.name.end_with? "PureLayout"
      target.build_configurations.each do |build_configuration|
        if build_configuration.build_settings['APPLICATION_EXTENSION_API_ONLY'] == 'YES'
          build_configuration.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = ['$(inherited)', 'PURELAYOUT_APP_EXTENSIONS=1']
        end
      end
    end
  end
end

The above post_install hook will define the macro PURELAYOUT_APP_EXTENSIONS=1 for every build configuration on all PureLayout targets in the generated Pods project that are used by App Extensions.

If you've integrated the source code directly into your project

  1. In Xcode, click on your Project
  2. Click on the Target for your App Extension
  3. Click Build Settings
  4. Find (or search) Preprocessor Macros under Apple LLVM 6.0 - Preprocessing
  5. For all build configurations (Debug & Release) add the macro: PURELAYOUT_APP_EXTENSIONS=1

Now, when your App Extension target is selected, PureLayout will not use unavailable APIs.