aboutsummaryrefslogtreecommitdiffhomepage
path: root/example
diff options
context:
space:
mode:
authorGravatar Jonathan Willing <jwilling@me.com>2013-04-08 14:31:23 -0500
committerGravatar Jonathan Willing <jwilling@me.com>2013-04-08 14:31:23 -0500
commit351f468c24d0e42f168232528b59f2a4ad47919f (patch)
treee4fb3bd20536abca4724f779b140ac7b0ee4861a /example
parente5541c30ca54aee7392d14591d54338cc1782e81 (diff)
add preliminary iOS example
Diffstat (limited to 'example')
-rwxr-xr-xexample/common/FXKeychain.h54
-rwxr-xr-xexample/common/FXKeychain.m197
-rwxr-xr-xexample/common/FXKeychain_LICENCE.md21
-rw-r--r--example/ios/iOS UI Test/iOS UI Test.xcodeproj/project.pbxproj471
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/AppDelegate.h15
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/AppDelegate.m46
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/Default-568h@2x.pngbin0 -> 18594 bytes
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/Default.pngbin0 -> 6540 bytes
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/Default@2x.pngbin0 -> 16107 bytes
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/DetailViewController.h16
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/DetailViewController.m51
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/MasterViewController.h18
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/MasterViewController.m102
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/SettingsViewController.h28
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/SettingsViewController.m51
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/SettingsViewController.xib495
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/en.lproj/InfoPlist.strings2
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/en.lproj/MainStoryboard.storyboard109
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/iOS UI Test-Info.plist50
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/iOS UI Test-Prefix.pch14
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/main.m18
21 files changed, 1758 insertions, 0 deletions
diff --git a/example/common/FXKeychain.h b/example/common/FXKeychain.h
new file mode 100755
index 00000000..3e80c817
--- /dev/null
+++ b/example/common/FXKeychain.h
@@ -0,0 +1,54 @@
+//
+// FXKeychain.h
+//
+// Version 1.3.1
+//
+// Created by Nick Lockwood on 29/12/2012.
+// Copyright 2012 Charcoal Design
+//
+// Distributed under the permissive zlib License
+// Get the latest version from here:
+//
+// https://github.com/nicklockwood/FXKeychain
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+
+#import <Foundation/Foundation.h>
+#import <Security/Security.h>
+
+
+@interface FXKeychain : NSObject
+
++ (instancetype)defaultKeychain;
+
+@property (nonatomic, copy, readonly) NSString *service;
+@property (nonatomic, copy, readonly) NSString *accessGroup;
+
+- (id)initWithService:(NSString *)service
+ accessGroup:(NSString *)accessGroup;
+
+- (BOOL)setObject:(id)object forKey:(id)key;
+- (BOOL)setObject:(id)object forKeyedSubscript:(id)key;
+- (BOOL)removeObjectForKey:(id)key;
+- (id)objectForKey:(id)key;
+- (id)objectForKeyedSubscript:(id)key;
+
+@end
diff --git a/example/common/FXKeychain.m b/example/common/FXKeychain.m
new file mode 100755
index 00000000..f4cb4388
--- /dev/null
+++ b/example/common/FXKeychain.m
@@ -0,0 +1,197 @@
+//
+// FXKeychain.m
+//
+// Version 1.3.2
+//
+// Created by Nick Lockwood on 29/12/2012.
+// Copyright 2012 Charcoal Design
+//
+// Distributed under the permissive zlib License
+// Get the latest version from here:
+//
+// https://github.com/nicklockwood/FXKeychain
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+
+#import "FXKeychain.h"
+
+
+#import <Availability.h>
+#if !__has_feature(objc_arc)
+#error This class requires automatic reference counting
+#endif
+
+
+@implementation FXKeychain
+
++ (instancetype)defaultKeychain
+{
+ static id sharedInstance = nil;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+
+ NSString *bundleID = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleIdentifierKey];
+ sharedInstance = [[FXKeychain alloc] initWithService:bundleID
+ accessGroup:nil];
+ });
+
+ return sharedInstance;
+}
+
+- (id)init
+{
+ return [self initWithService:nil accessGroup:nil];
+}
+
+- (id)initWithService:(NSString *)service
+ accessGroup:(NSString *)accessGroup
+{
+ if ((self = [super init]))
+ {
+ _service = [service copy];
+ _accessGroup = [accessGroup copy];
+ }
+ return self;
+}
+
+- (BOOL)setObject:(id)object forKey:(id)key
+{
+ NSParameterAssert(key);
+
+ //generate query
+ NSMutableDictionary *query = [NSMutableDictionary dictionary];
+ if ([_service length]) query[(__bridge NSString *)kSecAttrService] = _service;
+ query[(__bridge NSString *)kSecClass] = (__bridge id)kSecClassGenericPassword;
+ query[(__bridge NSString *)kSecAttrAccount] = [key description];
+
+#if defined __IPHONE_OS_VERSION_MAX_ALLOWED && !TARGET_IPHONE_SIMULATOR
+ if ([_accessGroup length]) query[(__bridge NSString *)kSecAttrAccessGroup] = _accessGroup;
+#endif
+
+ //encode object
+ NSData *data = nil;
+ NSError *error = nil;
+ if ([(id)object isKindOfClass:[NSString class]])
+ {
+ data = [(NSString *)object dataUsingEncoding:NSUTF8StringEncoding];
+ }
+ else if (object)
+ {
+ data = [NSPropertyListSerialization dataWithPropertyList:object
+ format:NSPropertyListBinaryFormat_v1_0
+ options:0
+ error:&error];
+ }
+
+ //fail if object is invalid
+ NSAssert(!object || (object && data), @"FXKeychain failed to encode object for key '%@', error: %@", key, error);
+
+ //delete existing data
+ OSStatus status = SecItemDelete((__bridge CFDictionaryRef)query);
+
+ //write data
+ if (data)
+ {
+ query[(__bridge NSString *)kSecValueData] = data;
+ status = SecItemAdd ((__bridge CFDictionaryRef)query, NULL);
+ if (status != errSecSuccess)
+ {
+ NSLog(@"FXKeychain failed to store data for key '%@', error: %ld", key, (long)status);
+ return NO;
+ }
+ }
+ else if (status != errSecSuccess)
+ {
+ NSLog(@"FXKeychain failed to delete data for key '%@', error: %ld", key, (long)status);
+ return NO;
+ }
+ return YES;
+}
+
+- (BOOL)setObject:(id)object forKeyedSubscript:(id)key
+{
+ return [self setObject:object forKey:key];
+}
+
+- (BOOL)removeObjectForKey:(id)key
+{
+ return [self setObject:nil forKey:key];
+}
+
+- (id)objectForKey:(id)key
+{
+ NSParameterAssert(key);
+
+ //generate query
+ NSMutableDictionary *query = [NSMutableDictionary dictionary];
+ if ([_service length]) query[(__bridge NSString *)kSecAttrService] = _service;
+ query[(__bridge NSString *)kSecClass] = (__bridge id)kSecClassGenericPassword;
+ query[(__bridge NSString *)kSecMatchLimit] = (__bridge id)kSecMatchLimitOne;
+ query[(__bridge NSString *)kSecReturnData] = (__bridge id)kCFBooleanTrue;
+ query[(__bridge NSString *)kSecAttrAccount] = [key description];
+
+#if defined __IPHONE_OS_VERSION_MAX_ALLOWED && !TARGET_IPHONE_SIMULATOR
+ if ([_accessGroup length]) query[(__bridge NSString *)kSecAttrAccessGroup] = _accessGroup;
+#endif
+
+ //recover data
+ id object = nil;
+ NSError *error = nil;
+ CFDataRef data = nil;
+ OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&data);
+ if (status == errSecSuccess && data)
+ {
+ //attempt to decode as a plist
+ object = [NSPropertyListSerialization propertyListWithData:(__bridge NSData *)data
+ options:NSPropertyListImmutable
+ format:NULL
+ error:&error];
+
+ if ([object respondsToSelector:@selector(objectForKey:)] && object[@"$archiver"])
+ {
+ //data represents an NSCoded archive. don't trust it
+ object = nil;
+ }
+ else if (!object)
+ {
+ //may be a string
+ object = [[NSString alloc] initWithData:(__bridge NSData *)data encoding:NSUTF8StringEncoding];
+ }
+ if (!object)
+ {
+ NSLog(@"FXKeychain failed to decode data for key '%@', error: %@", key, error);
+ }
+ CFRelease(data);
+ return object;
+ }
+ else
+ {
+ //no value found
+ return nil;
+ }
+}
+
+- (id)objectForKeyedSubscript:(id)key
+{
+ return [self objectForKey:key];
+}
+
+@end
diff --git a/example/common/FXKeychain_LICENCE.md b/example/common/FXKeychain_LICENCE.md
new file mode 100755
index 00000000..68a5f4f5
--- /dev/null
+++ b/example/common/FXKeychain_LICENCE.md
@@ -0,0 +1,21 @@
+FXKeychain
+
+Version 1.3.2, April 4th, 2013
+
+Copyright (C) 2012 Charcoal Design
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution. \ No newline at end of file
diff --git a/example/ios/iOS UI Test/iOS UI Test.xcodeproj/project.pbxproj b/example/ios/iOS UI Test/iOS UI Test.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..5aeb271c
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test.xcodeproj/project.pbxproj
@@ -0,0 +1,471 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ AB665BC817134319007F2151 /* libMailCore-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AB665BBD171342C1007F2151 /* libMailCore-ios.a */; };
+ AB665BCD17134336007F2151 /* FXKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = AB665BCB17134336007F2151 /* FXKeychain.m */; };
+ AB9EAE06170368F000D750C7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB9EAE05170368F000D750C7 /* UIKit.framework */; };
+ AB9EAE08170368F000D750C7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB9EAE07170368F000D750C7 /* Foundation.framework */; };
+ AB9EAE0A170368F000D750C7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB9EAE09170368F000D750C7 /* CoreGraphics.framework */; };
+ AB9EAE10170368F000D750C7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB9EAE0E170368F000D750C7 /* InfoPlist.strings */; };
+ AB9EAE12170368F000D750C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = AB9EAE11170368F000D750C7 /* main.m */; };
+ AB9EAE16170368F000D750C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = AB9EAE15170368F000D750C7 /* AppDelegate.m */; };
+ AB9EAE18170368F000D750C7 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = AB9EAE17170368F000D750C7 /* Default.png */; };
+ AB9EAE1A170368F000D750C7 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AB9EAE19170368F000D750C7 /* Default@2x.png */; };
+ AB9EAE1C170368F000D750C7 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AB9EAE1B170368F000D750C7 /* Default-568h@2x.png */; };
+ AB9EAE1F170368F000D750C7 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AB9EAE1D170368F000D750C7 /* MainStoryboard.storyboard */; };
+ AB9EAE22170368F000D750C7 /* MasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AB9EAE21170368F000D750C7 /* MasterViewController.m */; };
+ AB9EAE25170368F000D750C7 /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AB9EAE24170368F000D750C7 /* DetailViewController.m */; };
+ AB9EAE3617036FD700D750C7 /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AB9EAE3417036FD600D750C7 /* SettingsViewController.m */; };
+ AB9EAE3717036FD700D750C7 /* SettingsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB9EAE3517036FD700D750C7 /* SettingsViewController.xib */; };
+ AB9EAE40170374D900D750C7 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB9EAE3F170374D900D750C7 /* Security.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ AB665BBA171342C1007F2151 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = AB665BB2171342C0007F2151 /* mailcore2.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = C64EA537169E772200778456;
+ remoteInfo = "static mailcore2 osx";
+ };
+ AB665BBC171342C1007F2151 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = AB665BB2171342C0007F2151 /* mailcore2.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = C6BA2C191705F4E6003F0E9E;
+ remoteInfo = "static mailcore2 ios";
+ };
+ AB665BBE171342C1007F2151 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = AB665BB2171342C0007F2151 /* mailcore2.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = C64EA78C169F259200778456;
+ remoteInfo = tests;
+ };
+ AB665BC0171342C1007F2151 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = AB665BB2171342C0007F2151 /* mailcore2.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = C6A81B911706840C00882C15;
+ remoteInfo = "test-ios";
+ };
+ AB665BC2171342C1007F2151 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = AB665BB2171342C0007F2151 /* mailcore2.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = C6BD288D170BD71100A91AC1;
+ remoteInfo = "mailcore osx";
+ };
+ AB665BC6171342FF007F2151 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = AB665BB2171342C0007F2151 /* mailcore2.xcodeproj */;
+ proxyType = 1;
+ remoteGlobalIDString = C6BA2B091705F4E6003F0E9E;
+ remoteInfo = "static mailcore2 ios";
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ AB665BB2171342C0007F2151 /* mailcore2.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = mailcore2.xcodeproj; path = "../../../../build-mac/mailcore2.xcodeproj"; sourceTree = "<group>"; };
+ AB665BCA17134336007F2151 /* FXKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FXKeychain.h; sourceTree = "<group>"; };
+ AB665BCB17134336007F2151 /* FXKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FXKeychain.m; sourceTree = "<group>"; };
+ AB665BCC17134336007F2151 /* FXKeychain_LICENCE.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = FXKeychain_LICENCE.md; sourceTree = "<group>"; };
+ AB9EAE02170368F000D750C7 /* iOS UI Test.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iOS UI Test.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ AB9EAE05170368F000D750C7 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ AB9EAE07170368F000D750C7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ AB9EAE09170368F000D750C7 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ AB9EAE0D170368F000D750C7 /* iOS UI Test-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iOS UI Test-Info.plist"; sourceTree = "<group>"; };
+ AB9EAE0F170368F000D750C7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ AB9EAE11170368F000D750C7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ AB9EAE13170368F000D750C7 /* iOS UI Test-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iOS UI Test-Prefix.pch"; sourceTree = "<group>"; };
+ AB9EAE14170368F000D750C7 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+ AB9EAE15170368F000D750C7 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+ AB9EAE17170368F000D750C7 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
+ AB9EAE19170368F000D750C7 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = "<group>"; };
+ AB9EAE1B170368F000D750C7 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
+ AB9EAE1E170368F000D750C7 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard.storyboard; sourceTree = "<group>"; };
+ AB9EAE20170368F000D750C7 /* MasterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MasterViewController.h; sourceTree = "<group>"; };
+ AB9EAE21170368F000D750C7 /* MasterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MasterViewController.m; sourceTree = "<group>"; };
+ AB9EAE23170368F000D750C7 /* DetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DetailViewController.h; sourceTree = "<group>"; };
+ AB9EAE24170368F000D750C7 /* DetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DetailViewController.m; sourceTree = "<group>"; };
+ AB9EAE3317036FD600D750C7 /* SettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsViewController.h; sourceTree = "<group>"; };
+ AB9EAE3417036FD600D750C7 /* SettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsViewController.m; sourceTree = "<group>"; };
+ AB9EAE3517036FD700D750C7 /* SettingsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SettingsViewController.xib; sourceTree = "<group>"; };
+ AB9EAE3F170374D900D750C7 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ AB9EADFF170368F000D750C7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AB665BC817134319007F2151 /* libMailCore-ios.a in Frameworks */,
+ AB9EAE40170374D900D750C7 /* Security.framework in Frameworks */,
+ AB9EAE06170368F000D750C7 /* UIKit.framework in Frameworks */,
+ AB9EAE08170368F000D750C7 /* Foundation.framework in Frameworks */,
+ AB9EAE0A170368F000D750C7 /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ AB665BB3171342C0007F2151 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ AB665BBB171342C1007F2151 /* libMailCore.a */,
+ AB665BBD171342C1007F2151 /* libMailCore-ios.a */,
+ AB665BBF171342C1007F2151 /* tests */,
+ AB665BC1171342C1007F2151 /* test-ios.app */,
+ AB665BC3171342C1007F2151 /* MailCore.framework */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ AB665BC917134336007F2151 /* common */ = {
+ isa = PBXGroup;
+ children = (
+ AB665BCA17134336007F2151 /* FXKeychain.h */,
+ AB665BCB17134336007F2151 /* FXKeychain.m */,
+ AB665BCC17134336007F2151 /* FXKeychain_LICENCE.md */,
+ );
+ name = common;
+ path = ../../../common;
+ sourceTree = "<group>";
+ };
+ AB9EADF9170368F000D750C7 = {
+ isa = PBXGroup;
+ children = (
+ AB9EAE0B170368F000D750C7 /* iOS UI Test */,
+ AB9EAE04170368F000D750C7 /* Frameworks */,
+ AB9EAE03170368F000D750C7 /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ AB9EAE03170368F000D750C7 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ AB9EAE02170368F000D750C7 /* iOS UI Test.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ AB9EAE04170368F000D750C7 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ AB9EAE3F170374D900D750C7 /* Security.framework */,
+ AB9EAE05170368F000D750C7 /* UIKit.framework */,
+ AB9EAE07170368F000D750C7 /* Foundation.framework */,
+ AB9EAE09170368F000D750C7 /* CoreGraphics.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ AB9EAE0B170368F000D750C7 /* iOS UI Test */ = {
+ isa = PBXGroup;
+ children = (
+ AB665BB2171342C0007F2151 /* mailcore2.xcodeproj */,
+ AB9EAE14170368F000D750C7 /* AppDelegate.h */,
+ AB9EAE15170368F000D750C7 /* AppDelegate.m */,
+ AB9EAE1D170368F000D750C7 /* MainStoryboard.storyboard */,
+ AB9EAE20170368F000D750C7 /* MasterViewController.h */,
+ AB9EAE21170368F000D750C7 /* MasterViewController.m */,
+ AB9EAE23170368F000D750C7 /* DetailViewController.h */,
+ AB9EAE24170368F000D750C7 /* DetailViewController.m */,
+ AB9EAE0C170368F000D750C7 /* Supporting Files */,
+ AB9EAE3317036FD600D750C7 /* SettingsViewController.h */,
+ AB9EAE3417036FD600D750C7 /* SettingsViewController.m */,
+ AB9EAE3517036FD700D750C7 /* SettingsViewController.xib */,
+ AB665BC917134336007F2151 /* common */,
+ );
+ path = "iOS UI Test";
+ sourceTree = "<group>";
+ };
+ AB9EAE0C170368F000D750C7 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ AB9EAE0D170368F000D750C7 /* iOS UI Test-Info.plist */,
+ AB9EAE0E170368F000D750C7 /* InfoPlist.strings */,
+ AB9EAE11170368F000D750C7 /* main.m */,
+ AB9EAE13170368F000D750C7 /* iOS UI Test-Prefix.pch */,
+ AB9EAE17170368F000D750C7 /* Default.png */,
+ AB9EAE19170368F000D750C7 /* Default@2x.png */,
+ AB9EAE1B170368F000D750C7 /* Default-568h@2x.png */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ AB9EAE01170368F000D750C7 /* iOS UI Test */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AB9EAE28170368F000D750C7 /* Build configuration list for PBXNativeTarget "iOS UI Test" */;
+ buildPhases = (
+ AB9EADFE170368F000D750C7 /* Sources */,
+ AB9EADFF170368F000D750C7 /* Frameworks */,
+ AB9EAE00170368F000D750C7 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AB665BC7171342FF007F2151 /* PBXTargetDependency */,
+ );
+ name = "iOS UI Test";
+ productName = "iOS UI Test";
+ productReference = AB9EAE02170368F000D750C7 /* iOS UI Test.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ AB9EADFA170368F000D750C7 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0460;
+ ORGANIZATIONNAME = AppJon;
+ };
+ buildConfigurationList = AB9EADFD170368F000D750C7 /* Build configuration list for PBXProject "iOS UI Test" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = AB9EADF9170368F000D750C7;
+ productRefGroup = AB9EAE03170368F000D750C7 /* Products */;
+ projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = AB665BB3171342C0007F2151 /* Products */;
+ ProjectRef = AB665BB2171342C0007F2151 /* mailcore2.xcodeproj */;
+ },
+ );
+ projectRoot = "";
+ targets = (
+ AB9EAE01170368F000D750C7 /* iOS UI Test */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+ AB665BBB171342C1007F2151 /* libMailCore.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libMailCore.a;
+ remoteRef = AB665BBA171342C1007F2151 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ AB665BBD171342C1007F2151 /* libMailCore-ios.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = "libMailCore-ios.a";
+ remoteRef = AB665BBC171342C1007F2151 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ AB665BBF171342C1007F2151 /* tests */ = {
+ isa = PBXReferenceProxy;
+ fileType = "compiled.mach-o.executable";
+ path = tests;
+ remoteRef = AB665BBE171342C1007F2151 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ AB665BC1171342C1007F2151 /* test-ios.app */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.application;
+ path = "test-ios.app";
+ remoteRef = AB665BC0171342C1007F2151 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ AB665BC3171342C1007F2151 /* MailCore.framework */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.framework;
+ path = MailCore.framework;
+ remoteRef = AB665BC2171342C1007F2151 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+ AB9EAE00170368F000D750C7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AB9EAE10170368F000D750C7 /* InfoPlist.strings in Resources */,
+ AB9EAE18170368F000D750C7 /* Default.png in Resources */,
+ AB9EAE1A170368F000D750C7 /* Default@2x.png in Resources */,
+ AB9EAE1C170368F000D750C7 /* Default-568h@2x.png in Resources */,
+ AB9EAE1F170368F000D750C7 /* MainStoryboard.storyboard in Resources */,
+ AB9EAE3717036FD700D750C7 /* SettingsViewController.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ AB9EADFE170368F000D750C7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AB9EAE12170368F000D750C7 /* main.m in Sources */,
+ AB9EAE16170368F000D750C7 /* AppDelegate.m in Sources */,
+ AB9EAE22170368F000D750C7 /* MasterViewController.m in Sources */,
+ AB9EAE25170368F000D750C7 /* DetailViewController.m in Sources */,
+ AB9EAE3617036FD700D750C7 /* SettingsViewController.m in Sources */,
+ AB665BCD17134336007F2151 /* FXKeychain.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ AB665BC7171342FF007F2151 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ name = "static mailcore2 ios";
+ targetProxy = AB665BC6171342FF007F2151 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ AB9EAE0E170368F000D750C7 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ AB9EAE0F170368F000D750C7 /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ AB9EAE1D170368F000D750C7 /* MainStoryboard.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ AB9EAE1E170368F000D750C7 /* en */,
+ );
+ name = MainStoryboard.storyboard;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ AB9EAE26170368F000D750C7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ AB9EAE27170368F000D750C7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ SDKROOT = iphoneos;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ AB9EAE29170368F000D750C7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "iOS UI Test/iOS UI Test-Prefix.pch";
+ HEADER_SEARCH_PATHS = (
+ "$(SRCROOT)/../../Externals/libetpan/include",
+ "$(SRCROOT)/../../Externals/icu4c/include",
+ "$(SRCROOT)/../../Externals/ctemplate/include",
+ "$(SRCROOT)/../../src",
+ );
+ INFOPLIST_FILE = "iOS UI Test/iOS UI Test-Info.plist";
+ OTHER_LDFLAGS = "-Objc";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ AB9EAE2A170368F000D750C7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "iOS UI Test/iOS UI Test-Prefix.pch";
+ HEADER_SEARCH_PATHS = (
+ "$(SRCROOT)/../../Externals/libetpan/include",
+ "$(SRCROOT)/../../Externals/icu4c/include",
+ "$(SRCROOT)/../../Externals/ctemplate/include",
+ "$(SRCROOT)/../../src",
+ );
+ INFOPLIST_FILE = "iOS UI Test/iOS UI Test-Info.plist";
+ OTHER_LDFLAGS = "-Objc";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ AB9EADFD170368F000D750C7 /* Build configuration list for PBXProject "iOS UI Test" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AB9EAE26170368F000D750C7 /* Debug */,
+ AB9EAE27170368F000D750C7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AB9EAE28170368F000D750C7 /* Build configuration list for PBXNativeTarget "iOS UI Test" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AB9EAE29170368F000D750C7 /* Debug */,
+ AB9EAE2A170368F000D750C7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = AB9EADFA170368F000D750C7 /* Project object */;
+}
diff --git a/example/ios/iOS UI Test/iOS UI Test/AppDelegate.h b/example/ios/iOS UI Test/iOS UI Test/AppDelegate.h
new file mode 100644
index 00000000..524e3102
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/AppDelegate.h
@@ -0,0 +1,15 @@
+//
+// AppDelegate.h
+// iOS UI Test
+//
+// Created by Jonathan Willing on 4/8/13.
+// Copyright (c) 2013 AppJon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+@end
diff --git a/example/ios/iOS UI Test/iOS UI Test/AppDelegate.m b/example/ios/iOS UI Test/iOS UI Test/AppDelegate.m
new file mode 100644
index 00000000..557653f7
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/AppDelegate.m
@@ -0,0 +1,46 @@
+//
+// AppDelegate.m
+// iOS UI Test
+//
+// Created by Jonathan Willing on 4/8/13.
+// Copyright (c) 2013 AppJon. All rights reserved.
+//
+
+#import "AppDelegate.h"
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ // Override point for customization after application launch.
+ return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application
+{
+ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+ // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application
+{
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
+}
+
+@end
diff --git a/example/ios/iOS UI Test/iOS UI Test/Default-568h@2x.png b/example/ios/iOS UI Test/iOS UI Test/Default-568h@2x.png
new file mode 100644
index 00000000..0891b7aa
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/Default-568h@2x.png
Binary files differ
diff --git a/example/ios/iOS UI Test/iOS UI Test/Default.png b/example/ios/iOS UI Test/iOS UI Test/Default.png
new file mode 100644
index 00000000..4c8ca6f6
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/Default.png
Binary files differ
diff --git a/example/ios/iOS UI Test/iOS UI Test/Default@2x.png b/example/ios/iOS UI Test/iOS UI Test/Default@2x.png
new file mode 100644
index 00000000..35b84cff
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/Default@2x.png
Binary files differ
diff --git a/example/ios/iOS UI Test/iOS UI Test/DetailViewController.h b/example/ios/iOS UI Test/iOS UI Test/DetailViewController.h
new file mode 100644
index 00000000..fe50ad58
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/DetailViewController.h
@@ -0,0 +1,16 @@
+//
+// DetailViewController.h
+// iOS UI Test
+//
+// Created by Jonathan Willing on 4/8/13.
+// Copyright (c) 2013 AppJon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface DetailViewController : UIViewController
+
+@property (strong, nonatomic) id detailItem;
+
+@property (weak, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
+@end
diff --git a/example/ios/iOS UI Test/iOS UI Test/DetailViewController.m b/example/ios/iOS UI Test/iOS UI Test/DetailViewController.m
new file mode 100644
index 00000000..16100698
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/DetailViewController.m
@@ -0,0 +1,51 @@
+//
+// DetailViewController.m
+// iOS UI Test
+//
+// Created by Jonathan Willing on 4/8/13.
+// Copyright (c) 2013 AppJon. All rights reserved.
+//
+
+#import "DetailViewController.h"
+
+@interface DetailViewController ()
+- (void)configureView;
+@end
+
+@implementation DetailViewController
+
+#pragma mark - Managing the detail item
+
+- (void)setDetailItem:(id)newDetailItem
+{
+ if (_detailItem != newDetailItem) {
+ _detailItem = newDetailItem;
+
+ // Update the view.
+ [self configureView];
+ }
+}
+
+- (void)configureView
+{
+ // Update the user interface for the detail item.
+
+ if (self.detailItem) {
+ self.detailDescriptionLabel.text = [self.detailItem description];
+ }
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ // Do any additional setup after loading the view, typically from a nib.
+ [self configureView];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+@end
diff --git a/example/ios/iOS UI Test/iOS UI Test/MasterViewController.h b/example/ios/iOS UI Test/iOS UI Test/MasterViewController.h
new file mode 100644
index 00000000..da63eb60
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/MasterViewController.h
@@ -0,0 +1,18 @@
+//
+// MasterViewController.h
+// iOS UI Test
+//
+// Created by Jonathan Willing on 4/8/13.
+// Copyright (c) 2013 AppJon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "SettingsViewController.h"
+//#import <mailcore/mailcore.h>
+
+
+@interface MasterViewController : UITableViewController <SettingsViewControllerDelegate>
+
+- (IBAction)showSettingsViewController:(id)sender;
+
+@end
diff --git a/example/ios/iOS UI Test/iOS UI Test/MasterViewController.m b/example/ios/iOS UI Test/iOS UI Test/MasterViewController.m
new file mode 100644
index 00000000..7a76efa7
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/MasterViewController.m
@@ -0,0 +1,102 @@
+//
+// MasterViewController.m
+// iOS UI Test
+//
+// Created by Jonathan Willing on 4/8/13.
+// Copyright (c) 2013 AppJon. All rights reserved.
+//
+
+#import "MasterViewController.h"
+#import "DetailViewController.h"
+#import <MailCore/MailCore.h>
+#import "FXKeychain.h"
+
+@interface MasterViewController () {
+ NSMutableArray *_objects;
+}
+@property (nonatomic, strong) MCOIMAPOperation *imapCheckOp;
+@property (nonatomic, strong) MCOIMAPSession *imapSession;
+@end
+
+@implementation MasterViewController
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+ self.navigationItem.leftBarButtonItem = self.editButtonItem;
+
+ NSString *username = [[NSUserDefaults standardUserDefaults] objectForKey:UsernameKey];
+ NSString *password = [FXKeychain defaultKeychain][PasswordKey];
+
+ self.imapSession = [[MCOIMAPSession alloc] init];
+ self.imapSession.hostname = @"imap.gmail.com";
+ self.imapSession.port = 993;
+ self.imapSession.username = username;
+ self.imapSession.password = password;
+ self.imapSession.connectionType = MCOConnectionTypeTLS;
+}
+
+- (void)didReceiveMemoryWarning {
+ [super didReceiveMemoryWarning];
+ NSLog(@"%s",__PRETTY_FUNCTION__);
+}
+
+- (void)insertNewObject:(id)sender {
+ if (!_objects) {
+ _objects = [[NSMutableArray alloc] init];
+ }
+ [_objects insertObject:[NSDate date] atIndex:0];
+ NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
+ [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
+}
+
+#pragma mark - Table View
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+ return 1;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ return _objects.count;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
+
+ NSDate *object = _objects[indexPath.row];
+ cell.textLabel.text = [object description];
+ return cell;
+}
+
+- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
+ // Return NO if you do not want the specified item to be editable.
+ return YES;
+}
+
+- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
+ if (editingStyle == UITableViewCellEditingStyleDelete) {
+ [_objects removeObjectAtIndex:indexPath.row];
+ [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
+ } else if (editingStyle == UITableViewCellEditingStyleInsert) {
+ // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
+ }
+}
+
+- (void)showSettingsViewController:(id)sender {
+ SettingsViewController *settingsViewController = [[SettingsViewController alloc] initWithNibName:nil bundle:nil];
+ settingsViewController.delegate = self;
+ [self presentViewController:settingsViewController animated:YES completion:nil];
+}
+
+- (void)settingsViewControllerFinished:(SettingsViewController *)viewController {
+ [self dismissViewControllerAnimated:YES completion:nil];
+}
+
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+ if ([[segue identifier] isEqualToString:@"showDetail"]) {
+ NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
+ NSDate *object = _objects[indexPath.row];
+ [[segue destinationViewController] setDetailItem:object];
+ }
+}
+
+@end
diff --git a/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.h b/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.h
new file mode 100644
index 00000000..37fd2af4
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.h
@@ -0,0 +1,28 @@
+//
+// SettingsViewController.h
+// iOS UI Test
+//
+// Created by Jonathan Willing on 4/8/13.
+// Copyright (c) 2013 AppJon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import <mailcore/mailcore.h>
+
+extern NSString * const UsernameKey;
+extern NSString * const PasswordKey;
+
+@protocol SettingsViewControllerDelegate;
+
+@interface SettingsViewController : UIViewController
+
+@property (weak, nonatomic) IBOutlet UITextField *emailTextField;
+@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;
+@property (nonatomic, weak) id<SettingsViewControllerDelegate> delegate;
+- (IBAction)done:(id)sender;
+
+@end
+
+@protocol SettingsViewControllerDelegate <NSObject>
+- (void)settingsViewControllerFinished:(SettingsViewController *)viewController;
+@end \ No newline at end of file
diff --git a/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.m b/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.m
new file mode 100644
index 00000000..d7621dd0
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.m
@@ -0,0 +1,51 @@
+//
+// SettingsViewController.m
+// iOS UI Test
+//
+// Created by Jonathan Willing on 4/8/13.
+// Copyright (c) 2013 AppJon. All rights reserved.
+//
+
+#import "SettingsViewController.h"
+#import "FXKeychain.h"
+
+NSString * const UsernameKey = @"username";
+NSString * const PasswordKey = @"password";
+
+@interface SettingsViewController ()
+
+@end
+
+@implementation SettingsViewController
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)done:(id)sender {
+ [[NSUserDefaults standardUserDefaults] setObject:self.emailTextField.text forKey:UsernameKey];
+ [FXKeychain defaultKeychain][PasswordKey] = self.passwordTextField.text;
+
+ [self.delegate settingsViewControllerFinished:self];
+}
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+
+ self.view.backgroundColor = [UIColor underPageBackgroundColor];
+ self.emailTextField.text = [[NSUserDefaults standardUserDefaults] stringForKey:UsernameKey];
+ self.passwordTextField.text = [FXKeychain defaultKeychain][PasswordKey];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+@end
diff --git a/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.xib b/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.xib
new file mode 100644
index 00000000..6e788970
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.xib
@@ -0,0 +1,495 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">1552</int>
+ <string key="IBDocument.SystemVersion">12D78</string>
+ <string key="IBDocument.InterfaceBuilderVersion">3084</string>
+ <string key="IBDocument.AppKitVersion">1187.37</string>
+ <string key="IBDocument.HIToolboxVersion">626.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">2083</string>
+ </object>
+ <array key="IBDocument.IntegratedClassDependencies">
+ <string>IBNSLayoutConstraint</string>
+ <string>IBProxyObject</string>
+ <string>IBUIBarButtonItem</string>
+ <string>IBUINavigationBar</string>
+ <string>IBUINavigationItem</string>
+ <string>IBUITextField</string>
+ <string>IBUIView</string>
+ </array>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </array>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <object class="IBProxyObject" id="372490531">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBProxyObject" id="975951072">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBUIView" id="191373211">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="IBUINavigationBar" id="703582545">
+ <reference key="NSNextResponder" ref="191373211"/>
+ <int key="NSvFlags">290</int>
+ <string key="NSFrameSize">{320, 44}</string>
+ <reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSNextKeyView" ref="339913914"/>
+ <string key="NSReuseIdentifierKey">_NS:9</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <array class="NSMutableArray" key="IBUIItems">
+ <object class="IBUINavigationItem" id="938505117">
+ <reference key="IBUINavigationBar" ref="703582545"/>
+ <string key="IBUITitle">Settings</string>
+ <object class="IBUIBarButtonItem" key="IBUIRightBarButtonItem" id="38144743">
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <int key="IBUIStyle">1</int>
+ <reference key="IBUINavigationItem" ref="938505117"/>
+ <int key="IBUISystemItemIdentifier">0</int>
+ </object>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ </array>
+ </object>
+ <object class="IBUITextField" id="339913914">
+ <reference key="NSNextResponder" ref="191373211"/>
+ <int key="NSvFlags">292</int>
+ <string key="NSFrame">{{20, 66}, {280, 30}}</string>
+ <reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSNextKeyView" ref="923634912"/>
+ <string key="NSReuseIdentifierKey">_NS:9</string>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <int key="IBUIContentVerticalAlignment">0</int>
+ <string key="IBUIText"/>
+ <int key="IBUIBorderStyle">3</int>
+ <string key="IBUIPlaceholder">email</string>
+ <object class="NSColor" key="IBUITextColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ <object class="NSColorSpace" key="NSCustomColorSpace" id="327218161">
+ <int key="NSID">2</int>
+ </object>
+ </object>
+ <bool key="IBUIAdjustsFontSizeToFit">YES</bool>
+ <float key="IBUIMinimumFontSize">17</float>
+ <object class="IBUITextInputTraits" key="IBUITextInputTraits">
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <int key="IBUIClearButtonMode">1</int>
+ <object class="IBUIFontDescription" key="IBUIFontDescription" id="985700861">
+ <int key="type">1</int>
+ <double key="pointSize">14</double>
+ </object>
+ <object class="NSFont" key="IBUIFont" id="649714166">
+ <string key="NSName">Helvetica</string>
+ <double key="NSSize">14</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ </object>
+ <object class="IBUITextField" id="923634912">
+ <reference key="NSNextResponder" ref="191373211"/>
+ <int key="NSvFlags">292</int>
+ <string key="NSFrame">{{20, 104}, {280, 30}}</string>
+ <reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSNextKeyView"/>
+ <string key="NSReuseIdentifierKey">_NS:9</string>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <int key="IBUIContentVerticalAlignment">0</int>
+ <string key="IBUIText"/>
+ <int key="IBUIBorderStyle">3</int>
+ <string key="IBUIPlaceholder">password</string>
+ <object class="NSColor" key="IBUITextColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ <reference key="NSCustomColorSpace" ref="327218161"/>
+ </object>
+ <bool key="IBUIAdjustsFontSizeToFit">YES</bool>
+ <float key="IBUIMinimumFontSize">17</float>
+ <object class="IBUITextInputTraits" key="IBUITextInputTraits">
+ <bool key="IBUISecureTextEntry">YES</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <int key="IBUIClearButtonMode">1</int>
+ <reference key="IBUIFontDescription" ref="985700861"/>
+ <reference key="IBUIFont" ref="649714166"/>
+ </object>
+ </array>
+ <string key="NSFrame">{{0, 20}, {320, 548}}</string>
+ <reference key="NSSuperview"/>
+ <reference key="NSNextKeyView" ref="703582545"/>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MC43MDI5NDc0NDMyIDAuNzAyOTQ3NDQzMiAwLjcwMjk0NzQ0MzIAA</bytes>
+ </object>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
+ <object class="IBUIScreenMetrics" key="IBUISimulatedDestinationMetrics">
+ <string key="IBUISimulatedSizeMetricsClass">IBUIScreenMetrics</string>
+ <object class="NSMutableDictionary" key="IBUINormalizedOrientationToSizeMap">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <array key="dict.sortedKeys">
+ <integer value="1"/>
+ <integer value="3"/>
+ </array>
+ <array key="dict.values">
+ <string>{320, 568}</string>
+ <string>{568, 320}</string>
+ </array>
+ </object>
+ <string key="IBUITargetRuntime">IBCocoaTouchFramework</string>
+ <string key="IBUIDisplayName">Retina 4 Full Screen</string>
+ <int key="IBUIType">2</int>
+ </object>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ </array>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <array class="NSMutableArray" key="connectionRecords">
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">view</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="191373211"/>
+ </object>
+ <int key="connectionID">3</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">emailTextField</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="339913914"/>
+ </object>
+ <int key="connectionID">49</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">passwordTextField</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="923634912"/>
+ </object>
+ <int key="connectionID">50</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchEventConnection" key="connection">
+ <string key="label">done:</string>
+ <reference key="source" ref="38144743"/>
+ <reference key="destination" ref="372490531"/>
+ </object>
+ <int key="connectionID">16</int>
+ </object>
+ </array>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <array key="orderedObjects">
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <array key="object" id="0"/>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1</int>
+ <reference key="object" ref="191373211"/>
+ <array class="NSMutableArray" key="children">
+ <object class="IBNSLayoutConstraint" id="295413753">
+ <reference key="firstItem" ref="923634912"/>
+ <int key="firstAttribute">3</int>
+ <int key="relation">0</int>
+ <reference key="secondItem" ref="339913914"/>
+ <int key="secondAttribute">4</int>
+ <float key="multiplier">1</float>
+ <object class="IBNSLayoutSymbolicConstant" key="constant">
+ <double key="value">8</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="191373211"/>
+ <int key="scoringType">6</int>
+ <float key="scoringTypeFloat">24</float>
+ <int key="contentType">3</int>
+ </object>
+ <object class="IBNSLayoutConstraint" id="144109937">
+ <reference key="firstItem" ref="191373211"/>
+ <int key="firstAttribute">6</int>
+ <int key="relation">0</int>
+ <reference key="secondItem" ref="923634912"/>
+ <int key="secondAttribute">6</int>
+ <float key="multiplier">1</float>
+ <object class="IBNSLayoutSymbolicConstant" key="constant">
+ <double key="value">20</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="191373211"/>
+ <int key="scoringType">8</int>
+ <float key="scoringTypeFloat">29</float>
+ <int key="contentType">3</int>
+ </object>
+ <object class="IBNSLayoutConstraint" id="620844127">
+ <reference key="firstItem" ref="923634912"/>
+ <int key="firstAttribute">5</int>
+ <int key="relation">0</int>
+ <reference key="secondItem" ref="191373211"/>
+ <int key="secondAttribute">5</int>
+ <float key="multiplier">1</float>
+ <object class="IBNSLayoutSymbolicConstant" key="constant">
+ <double key="value">20</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="191373211"/>
+ <int key="scoringType">8</int>
+ <float key="scoringTypeFloat">29</float>
+ <int key="contentType">3</int>
+ </object>
+ <object class="IBNSLayoutConstraint" id="321610222">
+ <reference key="firstItem" ref="191373211"/>
+ <int key="firstAttribute">6</int>
+ <int key="relation">0</int>
+ <reference key="secondItem" ref="339913914"/>
+ <int key="secondAttribute">6</int>
+ <float key="multiplier">1</float>
+ <object class="IBNSLayoutSymbolicConstant" key="constant">
+ <double key="value">20</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="191373211"/>
+ <int key="scoringType">8</int>
+ <float key="scoringTypeFloat">29</float>
+ <int key="contentType">3</int>
+ </object>
+ <object class="IBNSLayoutConstraint" id="126503603">
+ <reference key="firstItem" ref="339913914"/>
+ <int key="firstAttribute">3</int>
+ <int key="relation">0</int>
+ <reference key="secondItem" ref="191373211"/>
+ <int key="secondAttribute">3</int>
+ <float key="multiplier">1</float>
+ <object class="IBLayoutConstant" key="constant">
+ <double key="value">66</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="191373211"/>
+ <int key="scoringType">3</int>
+ <float key="scoringTypeFloat">9</float>
+ <int key="contentType">3</int>
+ </object>
+ <object class="IBNSLayoutConstraint" id="17620276">
+ <reference key="firstItem" ref="339913914"/>
+ <int key="firstAttribute">5</int>
+ <int key="relation">0</int>
+ <reference key="secondItem" ref="191373211"/>
+ <int key="secondAttribute">5</int>
+ <float key="multiplier">1</float>
+ <object class="IBNSLayoutSymbolicConstant" key="constant">
+ <double key="value">20</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="191373211"/>
+ <int key="scoringType">8</int>
+ <float key="scoringTypeFloat">29</float>
+ <int key="contentType">3</int>
+ </object>
+ <object class="IBNSLayoutConstraint" id="118803530">
+ <reference key="firstItem" ref="703582545"/>
+ <int key="firstAttribute">6</int>
+ <int key="relation">0</int>
+ <reference key="secondItem" ref="191373211"/>
+ <int key="secondAttribute">6</int>
+ <float key="multiplier">1</float>
+ <object class="IBLayoutConstant" key="constant">
+ <double key="value">0.0</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="191373211"/>
+ <int key="scoringType">8</int>
+ <float key="scoringTypeFloat">29</float>
+ <int key="contentType">3</int>
+ </object>
+ <object class="IBNSLayoutConstraint" id="7756024">
+ <reference key="firstItem" ref="703582545"/>
+ <int key="firstAttribute">5</int>
+ <int key="relation">0</int>
+ <reference key="secondItem" ref="191373211"/>
+ <int key="secondAttribute">5</int>
+ <float key="multiplier">1</float>
+ <object class="IBLayoutConstant" key="constant">
+ <double key="value">0.0</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="191373211"/>
+ <int key="scoringType">8</int>
+ <float key="scoringTypeFloat">29</float>
+ <int key="contentType">3</int>
+ </object>
+ <object class="IBNSLayoutConstraint" id="630587606">
+ <reference key="firstItem" ref="703582545"/>
+ <int key="firstAttribute">3</int>
+ <int key="relation">0</int>
+ <reference key="secondItem" ref="191373211"/>
+ <int key="secondAttribute">3</int>
+ <float key="multiplier">1</float>
+ <object class="IBLayoutConstant" key="constant">
+ <double key="value">0.0</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="191373211"/>
+ <int key="scoringType">8</int>
+ <float key="scoringTypeFloat">29</float>
+ <int key="contentType">3</int>
+ </object>
+ <reference ref="703582545"/>
+ <reference ref="339913914"/>
+ <reference ref="923634912"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="372490531"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="975951072"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">4</int>
+ <reference key="object" ref="703582545"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="938505117"/>
+ </array>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="938505117"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="38144743"/>
+ </array>
+ <reference key="parent" ref="703582545"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">9</int>
+ <reference key="object" ref="630587606"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">10</int>
+ <reference key="object" ref="7756024"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">11</int>
+ <reference key="object" ref="118803530"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">15</int>
+ <reference key="object" ref="38144743"/>
+ <reference key="parent" ref="938505117"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">39</int>
+ <reference key="object" ref="339913914"/>
+ <array class="NSMutableArray" key="children"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">40</int>
+ <reference key="object" ref="17620276"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">41</int>
+ <reference key="object" ref="126503603"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">44</int>
+ <reference key="object" ref="321610222"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">45</int>
+ <reference key="object" ref="923634912"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">46</int>
+ <reference key="object" ref="620844127"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">47</int>
+ <reference key="object" ref="144109937"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">48</int>
+ <reference key="object" ref="295413753"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ </array>
+ </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-1.CustomClassName">SettingsViewController</string>
+ <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="-2.CustomClassName">UIResponder</string>
+ <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <array key="1.IBViewMetadataConstraints">
+ <reference ref="630587606"/>
+ <reference ref="7756024"/>
+ <reference ref="118803530"/>
+ <reference ref="17620276"/>
+ <reference ref="126503603"/>
+ <reference ref="321610222"/>
+ <reference ref="620844127"/>
+ <reference ref="144109937"/>
+ <reference ref="295413753"/>
+ </array>
+ <string key="10.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="11.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="15.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="39.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <boolean value="NO" key="39.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
+ <string key="4.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <boolean value="NO" key="4.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
+ <string key="40.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="41.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="44.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="45.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <boolean value="NO" key="45.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
+ <string key="46.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="47.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="48.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="9.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+ <nil key="activeLocalization"/>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
+ <nil key="sourceID"/>
+ <int key="maxID">50</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes"/>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <bool key="IBDocument.UseAutolayout">YES</bool>
+ <string key="IBCocoaTouchPluginVersion">2083</string>
+ </data>
+</archive>
diff --git a/example/ios/iOS UI Test/iOS UI Test/en.lproj/InfoPlist.strings b/example/ios/iOS UI Test/iOS UI Test/en.lproj/InfoPlist.strings
new file mode 100644
index 00000000..477b28ff
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
diff --git a/example/ios/iOS UI Test/iOS UI Test/en.lproj/MainStoryboard.storyboard b/example/ios/iOS UI Test/iOS UI Test/en.lproj/MainStoryboard.storyboard
new file mode 100644
index 00000000..f28d0b06
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/en.lproj/MainStoryboard.storyboard
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="12D78" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="3">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ </dependencies>
+ <scenes>
+ <!--Navigation Controller-->
+ <scene sceneID="11">
+ <objects>
+ <navigationController id="3" sceneMemberID="viewController">
+ <navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="4">
+ <autoresizingMask key="autoresizingMask"/>
+ </navigationBar>
+ <connections>
+ <segue destination="12" kind="relationship" relationship="rootViewController" id="19"/>
+ </connections>
+ </navigationController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="10" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="-1" y="64"/>
+ </scene>
+ <!--Master View Controller - Master-->
+ <scene sceneID="18">
+ <objects>
+ <tableViewController storyboardIdentifier="" title="Master" id="12" customClass="MasterViewController" sceneMemberID="viewController">
+ <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="13">
+ <rect key="frame" x="0.0" y="64" width="320" height="504"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <prototypes>
+ <tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="Cell" textLabel="phq-AM-6qj" style="IBUITableViewCellStyleDefault" id="lJ0-d7-vTF">
+ <rect key="frame" x="0.0" y="22" width="320" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+ <rect key="frame" x="0.0" y="0.0" width="300" height="43"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="phq-AM-6qj">
+ <rect key="frame" x="10" y="0.0" width="280" height="43"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <fontDescription key="fontDescription" type="boldSystem" pointSize="20"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ </label>
+ </subviews>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </view>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <connections>
+ <segue destination="21" kind="push" identifier="showDetail" id="jZb-fq-zAk"/>
+ </connections>
+ </tableViewCell>
+ </prototypes>
+ <sections/>
+ <connections>
+ <outlet property="dataSource" destination="12" id="16"/>
+ <outlet property="delegate" destination="12" id="15"/>
+ </connections>
+ </tableView>
+ <navigationItem key="navigationItem" title="Master" id="36">
+ <barButtonItem key="rightBarButtonItem" title="Settings" id="91f-3m-Uww">
+ <connections>
+ <action selector="showSettingsViewController:" destination="12" id="i9b-HB-ul1"/>
+ </connections>
+ </barButtonItem>
+ </navigationItem>
+ </tableViewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="17" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="459" y="64"/>
+ </scene>
+ <!--Detail View Controller - Detail-->
+ <scene sceneID="24">
+ <objects>
+ <viewController storyboardIdentifier="" title="Detail" id="21" customClass="DetailViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="22">
+ <rect key="frame" x="0.0" y="64" width="320" height="504"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" text="Detail view content goes here" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="27">
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <fontDescription key="fontDescription" type="system" size="system"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstItem="27" firstAttribute="centerY" secondItem="22" secondAttribute="centerY" type="default" id="7cE-gL-0wv"/>
+ <constraint firstItem="27" firstAttribute="leading" secondItem="22" secondAttribute="leading" constant="20" symbolic="YES" type="default" id="R0m-z7-TWk"/>
+ <constraint firstAttribute="trailing" secondItem="27" secondAttribute="trailing" constant="20" symbolic="YES" type="default" id="pRe-qY-58T"/>
+ </constraints>
+ </view>
+ <navigationItem key="navigationItem" title="Detail" id="26"/>
+ <connections>
+ <outlet property="detailDescriptionLabel" destination="27" id="28"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="23" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="902" y="64"/>
+ </scene>
+ </scenes>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination" type="retina4"/>
+ </simulatedMetricsContainer>
+</document> \ No newline at end of file
diff --git a/example/ios/iOS UI Test/iOS UI Test/iOS UI Test-Info.plist b/example/ios/iOS UI Test/iOS UI Test/iOS UI Test-Info.plist
new file mode 100644
index 00000000..5459a9e0
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/iOS UI Test-Info.plist
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.AppJon.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UIMainStoryboardFile</key>
+ <string>MainStoryboard</string>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UIStatusBarTintParameters</key>
+ <dict>
+ <key>UINavigationBar</key>
+ <dict>
+ <key>Style</key>
+ <string>UIBarStyleDefault</string>
+ <key>Translucent</key>
+ <false/>
+ </dict>
+ </dict>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+</dict>
+</plist>
diff --git a/example/ios/iOS UI Test/iOS UI Test/iOS UI Test-Prefix.pch b/example/ios/iOS UI Test/iOS UI Test/iOS UI Test-Prefix.pch
new file mode 100644
index 00000000..084c93ad
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/iOS UI Test-Prefix.pch
@@ -0,0 +1,14 @@
+//
+// Prefix header for all source files of the 'iOS UI Test' target in the 'iOS UI Test' project
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_5_0
+#warning "This project uses features only available in iOS SDK 5.0 and later."
+#endif
+
+#ifdef __OBJC__
+ #import <UIKit/UIKit.h>
+ #import <Foundation/Foundation.h>
+#endif
diff --git a/example/ios/iOS UI Test/iOS UI Test/main.m b/example/ios/iOS UI Test/iOS UI Test/main.m
new file mode 100644
index 00000000..479c71e4
--- /dev/null
+++ b/example/ios/iOS UI Test/iOS UI Test/main.m
@@ -0,0 +1,18 @@
+//
+// main.m
+// iOS UI Test
+//
+// Created by Jonathan Willing on 4/8/13.
+// Copyright (c) 2013 AppJon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+#import "AppDelegate.h"
+
+int main(int argc, char *argv[])
+{
+ @autoreleasepool {
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+ }
+}