Migrate example app to Swift

This commit is contained in:
Felix Schulze 2015-11-17 14:42:42 +01:00
parent 2de304ec36
commit 16625d8093
13 changed files with 123 additions and 190 deletions

View File

@ -7,21 +7,19 @@
objects = {
/* Begin PBXBuildFile section */
2A1DDC8D1BFB1C5D00F7722A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 533ED30B1528C4840005C6FA /* main.m */; };
2A1DDC8F1BFB1DF600F7722A /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A1DDC8E1BFB1DF600F7722A /* ViewController.xib */; };
2A3821001BFB5EEB00328618 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3820FF1BFB5EEB00328618 /* AppDelegate.swift */; };
2A3821021BFB607A00328618 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3821011BFB607A00328618 /* ViewController.swift */; };
2A3821161BFB641E00328618 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3820FF1BFB5EEB00328618 /* AppDelegate.swift */; };
2A3821171BFB642000328618 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3821011BFB607A00328618 /* ViewController.swift */; };
2A8A9A7E1BFA59F7002944B4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2A8A9A7D1BFA59F7002944B4 /* Assets.xcassets */; };
2A8A9A851BFA5AFF002944B4 /* ViewController~tv.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A8A9A841BFA5AFF002944B4 /* ViewController~tv.xib */; };
2A8A9A861BFA5B04002944B4 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 533ED3121528C4840005C6FA /* ViewController.m */; };
2A8A9A871BFA5B6A002944B4 /* FSOpenSSL.m in Sources */ = {isa = PBXBuildFile; fileRef = D1E97EE2A904D58DAE4231E2 /* FSOpenSSL.m */; };
2A8A9A8A1BFA5B85002944B4 /* libcrypto-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A8A9A881BFA5B85002944B4 /* libcrypto-tvOS.a */; };
2A8A9A8B1BFA5B85002944B4 /* libssl-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A8A9A891BFA5B85002944B4 /* libssl-tvOS.a */; };
2A8A9A8D1BFA7B79002944B4 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 533ED30F1528C4840005C6FA /* AppDelegate.m */; };
533ED3001528C4840005C6FA /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 533ED2FF1528C4840005C6FA /* UIKit.framework */; };
533ED3021528C4840005C6FA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 533ED3011528C4840005C6FA /* Foundation.framework */; };
533ED3041528C4840005C6FA /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 533ED3031528C4840005C6FA /* CoreGraphics.framework */; };
533ED30C1528C4840005C6FA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 533ED30B1528C4840005C6FA /* main.m */; };
533ED3101528C4840005C6FA /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 533ED30F1528C4840005C6FA /* AppDelegate.m */; };
533ED3131528C4840005C6FA /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 533ED3121528C4840005C6FA /* ViewController.m */; };
533ED32C1528C53B0005C6FA /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 533ED32A1528C53B0005C6FA /* libcrypto.a */; };
533ED32D1528C53B0005C6FA /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 533ED32B1528C53B0005C6FA /* libssl.a */; };
534FB2AE180975D700B5F868 /* Icons.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 534FB2AD180975D700B5F868 /* Icons.xcassets */; };
@ -45,6 +43,9 @@
/* Begin PBXFileReference section */
2A1DDC8E1BFB1DF600F7722A /* ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ViewController.xib; sourceTree = "<group>"; };
2A3820FE1BFB5EEA00328618 /* OpenSSL-for-iOS-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "OpenSSL-for-iOS-Bridging-Header.h"; sourceTree = "<group>"; };
2A3820FF1BFB5EEB00328618 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
2A3821011BFB607A00328618 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
2A8A9A6F1BFA59F7002944B4 /* OpenSSL-for-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "OpenSSL-for-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
2A8A9A7D1BFA59F7002944B4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
2A8A9A7F1BFA59F7002944B4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@ -56,12 +57,7 @@
533ED3011528C4840005C6FA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
533ED3031528C4840005C6FA /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
533ED3071528C4840005C6FA /* OpenSSL-for-iOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "OpenSSL-for-iOS-Info.plist"; sourceTree = "<group>"; };
533ED30B1528C4840005C6FA /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
533ED30D1528C4840005C6FA /* OpenSSL-for-iOS-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "OpenSSL-for-iOS-Prefix.pch"; sourceTree = "<group>"; };
533ED30E1528C4840005C6FA /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
533ED30F1528C4840005C6FA /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
533ED3111528C4840005C6FA /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
533ED3121528C4840005C6FA /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
533ED32A1528C53B0005C6FA /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcrypto.a; path = lib/libcrypto.a; sourceTree = "<group>"; };
533ED32B1528C53B0005C6FA /* libssl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libssl.a; path = lib/libssl.a; sourceTree = "<group>"; };
534FB2AD180975D700B5F868 /* Icons.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Icons.xcassets; sourceTree = "<group>"; };
@ -163,10 +159,8 @@
533ED3051528C4840005C6FA /* OpenSSL-for-iOS */ = {
isa = PBXGroup;
children = (
533ED30E1528C4840005C6FA /* AppDelegate.h */,
533ED30F1528C4840005C6FA /* AppDelegate.m */,
533ED3111528C4840005C6FA /* ViewController.h */,
533ED3121528C4840005C6FA /* ViewController.m */,
2A3820FF1BFB5EEB00328618 /* AppDelegate.swift */,
2A3821011BFB607A00328618 /* ViewController.swift */,
2A1DDC8E1BFB1DF600F7722A /* ViewController.xib */,
2A8A9A841BFA5AFF002944B4 /* ViewController~tv.xib */,
533ED3061528C4840005C6FA /* Supporting Files */,
@ -181,8 +175,8 @@
isa = PBXGroup;
children = (
533ED3071528C4840005C6FA /* OpenSSL-for-iOS-Info.plist */,
533ED30B1528C4840005C6FA /* main.m */,
533ED30D1528C4840005C6FA /* OpenSSL-for-iOS-Prefix.pch */,
2A3820FE1BFB5EEA00328618 /* OpenSSL-for-iOS-Bridging-Header.h */,
);
name = "Supporting Files";
sourceTree = "<group>";
@ -360,9 +354,8 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
2A8A9A8D1BFA7B79002944B4 /* AppDelegate.m in Sources */,
2A8A9A861BFA5B04002944B4 /* ViewController.m in Sources */,
2A1DDC8D1BFB1C5D00F7722A /* main.m in Sources */,
2A3821161BFB641E00328618 /* AppDelegate.swift in Sources */,
2A3821171BFB642000328618 /* ViewController.swift in Sources */,
2A8A9A871BFA5B6A002944B4 /* FSOpenSSL.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -371,9 +364,8 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
533ED30C1528C4840005C6FA /* main.m in Sources */,
533ED3101528C4840005C6FA /* AppDelegate.m in Sources */,
533ED3131528C4840005C6FA /* ViewController.m in Sources */,
2A3821001BFB5EEB00328618 /* AppDelegate.swift in Sources */,
2A3821021BFB607A00328618 /* ViewController.swift in Sources */,
D1E978031547EE765CD39AD2 /* FSOpenSSL.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -431,6 +423,7 @@
PRODUCT_BUNDLE_IDENTIFIER = "de.felixschulze.OpenSSL-for-tvOS";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = appletvos;
SWIFT_OBJC_BRIDGING_HEADER = "OpenSSL-for-iOS/OpenSSL-for-iOS-Bridging-Header.h";
TARGETED_DEVICE_FAMILY = 3;
TVOS_DEPLOYMENT_TARGET = 9.0;
};
@ -461,6 +454,7 @@
PRODUCT_BUNDLE_IDENTIFIER = "de.felixschulze.OpenSSL-for-tvOS";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = appletvos;
SWIFT_OBJC_BRIDGING_HEADER = "OpenSSL-for-iOS/OpenSSL-for-iOS-Bridging-Header.h";
TARGETED_DEVICE_FAMILY = 3;
TVOS_DEPLOYMENT_TARGET = 9.0;
};
@ -546,15 +540,19 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_ENABLE_MODULES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "OpenSSL-for-iOS/OpenSSL-for-iOS-Prefix.pch";
INFOPLIST_FILE = "OpenSSL-for-iOS/OpenSSL-for-iOS-Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/lib\"",
);
PRODUCT_BUNDLE_IDENTIFIER = "de.felixschulze.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = OpenSSL;
SWIFT_OBJC_BRIDGING_HEADER = "OpenSSL-for-iOS/OpenSSL-for-iOS-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
WRAPPER_EXTENSION = app;
};
name = Debug;
@ -564,15 +562,18 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_ENABLE_MODULES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "OpenSSL-for-iOS/OpenSSL-for-iOS-Prefix.pch";
INFOPLIST_FILE = "OpenSSL-for-iOS/OpenSSL-for-iOS-Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/lib\"",
);
PRODUCT_BUNDLE_IDENTIFIER = "de.felixschulze.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = OpenSSL;
SWIFT_OBJC_BRIDGING_HEADER = "OpenSSL-for-iOS/OpenSSL-for-iOS-Bridging-Header.h";
WRAPPER_EXTENSION = app;
};
name = Release;

View File

@ -1,17 +0,0 @@
//
// AppDelegate.h
// OpenSSL-for-iOS
//
// Created by Felix Schulze on 04.12.2010.
// Updated by Schulze Felix on 01.04.12.
// Copyright (c) 2012 Felix Schulze . All rights reserved.
// Web: http://www.felixschulze.de
//
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

View File

@ -1,33 +0,0 @@
//
// AppDelegate.m
// OpenSSL-for-iOS
//
// Created by Felix Schulze on 04.12.2010.
// Updated by Schulze Felix on 01.04.12.
// Copyright (c) 2012 Felix Schulze . All rights reserved.
// Web: http://www.felixschulze.de
//
#import "AppDelegate.h"
#import "ViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UIViewController *viewController = [[ViewController alloc] init];
#if TARGET_OS_TV
self.window.rootViewController = viewController;
#else
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
navigationController.navigationBar.translucent = NO;
self.window.rootViewController = navigationController;
#endif
[self.window makeKeyAndVisible];
return YES;
}
@end

View File

@ -0,0 +1,35 @@
//
// AppDelegate.swift
// OpenSSL-for-iOS
//
// Created by Felix Schulze on 04.12.2010.
// Updated by Felix Schulze on 17.11.2015.
// Copyright © 2015 Felix Schulze. All rights reserved.
// Web: http://www.felixschulze.de
//
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
#if os(tvOS)
self.window?.rootViewController = ViewController(nibName: "ViewController~tv", bundle: nil)
#else
let navigationController = UINavigationController(rootViewController: ViewController())
navigationController.navigationBar.translucent = false
self.window?.rootViewController = navigationController
#endif
self.window?.makeKeyAndVisible()
return true
}
}

View File

@ -0,0 +1,6 @@
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#import "FSOpenSSL.h"
#include <openssl/opensslv.h>

View File

@ -1,21 +0,0 @@
//
// ViewController.h
// OpenSSL-for-iOS
//
// Created by Felix Schulze on 04.12.2010.
// Updated by Schulze Felix on 01.04.12.
// Copyright (c) 2012 Felix Schulze . All rights reserved.
// Web: http://www.felixschulze.de
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (nonatomic, strong) IBOutlet UITextField *textField;
@property (nonatomic, strong) IBOutlet UILabel *md5TextField;
@property (nonatomic, strong) IBOutlet UILabel *sha256TextField;
- (IBAction)showInfo;
@end

View File

@ -1,71 +0,0 @@
//
// ViewController.m
// OpenSSL-for-iOS
//
// Created by Felix Schulze on 04.12.2010.
// Updated by Schulze Felix on 01.04.12.
// Copyright (c) 2012 Felix Schulze . All rights reserved.
// Web: http://www.felixschulze.de
//
#import "ViewController.h"
#import "FSOpenSSL.h"
#include <openssl/opensslv.h>
@implementation ViewController
- (instancetype)init
{
NSString *nibName = @"ViewController";
#if TARGET_OS_TV
nibName = @"ViewController~tv";
#endif
self = [super initWithNibName:nibName bundle:nil];
if (self) {
}
return self;
}
- (void)viewDidLoad
{
self.title = @"OpenSSL-for-iOS";
UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
[infoButton addTarget:self action:@selector(showInfo) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:infoButton];
[_textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
[self calculateHash];
[super viewDidLoad];
}
- (IBAction)textFieldDidChange:(id)sender
{
[self calculateHash];
}
- (void)calculateHash
{
if (_textField.text.length > 0)
{
_md5TextField.text = [FSOpenSSL md5FromString:_textField.text];
_sha256TextField.text = [FSOpenSSL sha256FromString:_textField.text];
}
else
{
_md5TextField.text = nil;
_sha256TextField.text = nil;
}
}
- (IBAction)showInfo
{
NSString *message = [NSString stringWithFormat:@"OpenSSL-Version: %@\nLicense: See include/LICENSE\n\nCopyright 2010-2015 by Felix Schulze\n http://www.felixschulze.de", @OPENSSL_VERSION_TEXT];
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"OpenSSL-for-iOS" message:message preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleCancel handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
@end

View File

@ -0,0 +1,54 @@
//
// ViewController.swift
// OpenSSL-for-iOS
//
// Created by Felix Schulze on 04.12.2010.
// Updated by Felix Schulze on 17.11.2015.
// Copyright © 2015 Felix Schulze. All rights reserved.
// Web: http://www.felixschulze.de
//
import UIKit
class ViewController: UIViewController {
@IBOutlet var textField: UITextField!
@IBOutlet var md5Label: UILabel!
@IBOutlet var sh256Label: UILabel!
@IBAction
func showInfo() {
let message = "OpenSSL-Version: \(OPENSSL_VERSION_TEXT)\nLicense: See include/LICENSE\n\nCopyright 2010-2015 by Felix Schulze\n http://www.felixschulze.de"
let alertController = UIAlertController(title: "OpenSSL-for-iOS", message: message, preferredStyle: .Alert)
alertController.addAction(UIAlertAction(title: "Ok", style: .Cancel, handler: nil))
self.presentViewController(alertController, animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
self.title = "OpenSSL-for-iOS"
let infoButton = UIButton(type: .InfoLight)
infoButton.addTarget(self, action: "showInfo", forControlEvents: .TouchDown)
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: infoButton)
self.textField.addTarget(self, action: "textFieldDidChange", forControlEvents: .EditingChanged)
self.calculateHash()
}
func textFieldDidChange() {
self.calculateHash()
}
func calculateHash() {
if textField.text!.characters.count > 0 {
md5Label.text = FSOpenSSL.md5FromString(textField.text)
sh256Label.text = FSOpenSSL.sha256FromString(textField.text)
}
else {
md5Label.text = nil
sh256Label.text = nil
}
}
}

View File

@ -7,8 +7,8 @@
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ViewController">
<connections>
<outlet property="md5TextField" destination="36" id="44"/>
<outlet property="sha256TextField" destination="38" id="45"/>
<outlet property="md5Label" destination="36" id="kJu-BA-XNy"/>
<outlet property="sh256Label" destination="38" id="VFS-d2-Jmh"/>
<outlet property="textField" destination="37" id="46"/>
<outlet property="view" destination="6" id="7"/>
</connections>

View File

@ -6,8 +6,8 @@
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ViewController">
<connections>
<outlet property="md5TextField" destination="36" id="44"/>
<outlet property="sha256TextField" destination="38" id="45"/>
<outlet property="md5Label" destination="36" id="QHb-4g-l4G"/>
<outlet property="sh256Label" destination="38" id="0UK-Qg-WRr"/>
<outlet property="textField" destination="37" id="46"/>
<outlet property="view" destination="6" id="7"/>
</connections>

View File

@ -1,19 +0,0 @@
//
// main.m
// OpenSSL-for-iOS
//
// Created by Felix Schulze on 04.12.2010.
// Updated by Schulze Felix on 01.04.12.
// Copyright (c) 2012 Felix Schulze . All rights reserved.
// Web: http://www.felixschulze.de
//
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

View File

@ -22,8 +22,6 @@
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>

View File

@ -23,7 +23,7 @@ If you have problems building for arm64 please uninstall MacPorts (see #28).
* <http://www.x2on.de/2010/07/13/tutorial-iphone-app-with-compiled-openssl-1-0-0a-library/>
## Changelog
* 2015-11-17: tvOS example app
* 2015-11-17: tvOS example app, Migrate to Swift for example app
* 2015-11-16: tvOS support
* 2015-10-25: Xcode 7.1 support
* 2015-08-06: iOS 9.0 support, Bitcode support