iOS 8 Module Migration Guide

A couple of things have changed with iOS 8 that require some changes to your native module project and a recompilation with Xcode 6.

While we can't cover all of the API changes Apple introduced with iOS 8, this guide should at least get your module project up to date with the changes to the Forge platform.

1. Update your module manifest file

Open your module/manifest.json file in a text editor or the Trigger Toolkit and:

  • Set the min_platform_version value to 2.2.0
  • Set the platform_version value to 2.2.2
  • Remember to bump your module version!

Example:

{
    "changes": "* Support arm64 devices running iOS 8", 
    "description": "Add a navigation button bar to the bottom of your app.", 
    "min_platform_version": "v2.2.0", 
    "namespace": "tabbar", 
    "platform_version": "v2.2.2", 
    "version": "2.5"
}

2. Update your ios-inspector in the toolkit to get the new ForgeInspector harness

  • Shut down Xcode if you have module inspector open.
  • If you already have your module open in the Trigger Toolkit you may need to refresh the page to pick up your changes to the module manifest.
  • Click on the Module "Status" menu to go to the main module status page.
  • Click the "Update iOS" button and then the "Update" button.

3. Update your ForgeModule Xcode project

iOS 8 requires a few changes to be made to your module's compilation settings.

To do this, open your module's inspector/ios-inspector/ForgeModule/ForgeModule.xcodeproj/project.pbxproj file in a text editor and:

  • Change both occurrences of IPHONEOS_DEPLOYMENT_TARGET as follows:

    IPHONEOS_DEPLOYMENT_TARGET = 6.0;

  • Change both occurrences of VALID_ARCHS as follows:

    VALID_ARCHS = "armv7 armv7s arm64 i386 x86_64";

It's harder, but you can also do this by opening the ForgeInspector project in Xcode 6:

  • Update IPHONEOS_DEPLOYMENT_TARGET:

Update IPHONE_OS_DEPLOYMENT_TARGET

  • Update VALID_ARCHS:

Update VALID_ARCHS

4. [[ForgeApp sharedApp] webView] changes

This only matters if your module is currently accessing the webView property.

To accommodate Apple's new WKWebView web control the type of the [[ForgeApp sharedApp] webView] property has changed from UIWebView to their common ancestor type: UIView

Depending on iOS version and app configuration an app may still be using the old web view so you will need to make sure your module works with both.

Example:

// include the new Webkit header at the top of your file
#import <WebKit/WebKit.h>

// use this wherever you're referencing webView:
if (NSClassFromString(@"WKWebView") && [[ForgeApp sharedApp] useWKWebView]) {
    WKWebView *webView = (WKWebView*)[[ForgeApp sharedApp] webView];
    // Handle new WebView 
} else {
    UIWebView *webView = (UIWebView*)[[ForgeApp sharedApp] webView];
    // Handle old WebView
}