2
0

Fixes to cloud store switching.

[UPDATED]   Log out when user is no longer available.
[UPDATED]   Re-enabled cloud store switching using new USM store enumeration facilities.
[UPDATED]   Lower log level for test and crash logs so we can see why stuff fails.
This commit is contained in:
Maarten Billemont 2013-09-14 14:04:06 -04:00
parent 27870c7420
commit 009b1ff996
6 changed files with 106 additions and 152 deletions

@ -1 +1 @@
Subproject commit 0202de6cf5b1f2847f4726af0788f6fce9683b32
Subproject commit 0c13b407e1ca5113bbed5c233215ff61ed77f41a

View File

@ -8,6 +8,7 @@
#import "MPAppDelegate_Shared.h"
#import "MPAppDelegate_Store.h"
#import "MPAppDelegate_Key.h"
@implementation MPAppDelegate_Shared {
NSManagedObjectID *_activeUserOID;
@ -36,8 +37,10 @@
NSError *error;
MPUserEntity *activeUser = (MPUserEntity *)[moc existingObjectWithID:_activeUserOID error:&error];
if (!activeUser)
if (!activeUser) {
[self signOutAnimated:YES];
err(@"Failed to retrieve active user: %@", error);
}
return activeUser;
}

View File

@ -74,83 +74,77 @@
- (void)switchCloudStore {
// NSError *error = nil;
// NSURL *cloudStoreDirectory = [[MPiOSAppDelegate get].storeManager URLForCloudStoreDirectory];
// NSURL *cloudContentDirectory = [[MPiOSAppDelegate get].storeManager URLForCloudContentDirectory];
// NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:cloudContentDirectory includingPropertiesForKeys:nil
// options:NSDirectoryEnumerationSkipsHiddenFiles error:&error];
// if (!contents)
// err(@"While enumerating cloud contents: %@", error);
//
// BOOL directory;
// NSMutableDictionary *stores = [NSMutableDictionary dictionaryWithCapacity:[contents count]];
// NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
// NSPersistentStoreCoordinator *storePSC = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
// NSFetchRequest *usersFetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass( [MPUserEntity class] )];
// NSFetchRequest *sitesFetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass( [MPElementEntity class] )];
// for (NSURL *content in contents)
// if ([[NSFileManager defaultManager] fileExistsAtPath:content.path isDirectory:&directory] && directory) {
// NSString *contentString = [content lastPathComponent];
// NSUInteger firstDash = [contentString rangeOfString:@"-" options:0].location;
// NSString *storeDescription = firstDash == NSNotFound? contentString: [contentString substringToIndex:firstDash];
// NSPersistentStore *store = nil;
// @try {
// NSURL *storeURL = [[cloudStoreDirectory
// URLByAppendingPathComponent:[content lastPathComponent] isDirectory:NO]
// URLByAppendingPathExtension:@"sqlite"];
// if (!(store = [storePSC addPersistentStoreWithType:NSSQLiteStoreType configuration:nil
// URL:storeURL options:@{
// NSPersistentStoreUbiquitousContentNameKey : [[MPiOSAppDelegate get].storeManager valueForKey:@"contentName"],
// NSPersistentStoreUbiquitousContentURLKey : content,
// NSMigratePersistentStoresAutomaticallyOption : @YES,
// NSInferMappingModelAutomaticallyOption : @YES,
// NSPersistentStoreFileProtectionKey : NSFileProtectionComplete
// } error:&error])) {
// wrn(@"Couldn't describe store opening %@: %@", [content lastPathComponent], error);
// continue;
// }
//
// NSUInteger userCount, siteCount;
// NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
// moc.persistentStoreCoordinator = storePSC;
// if ((userCount = [moc countForFetchRequest:usersFetchRequest error:&error]) == NSNotFound) {
// wrn(@"Couldn't describe store userCount %@: %@", [content lastPathComponent], error);
// continue;
// }
// if ((siteCount = [moc countForFetchRequest:sitesFetchRequest error:&error]) == NSNotFound) {
// wrn(@"Couldn't describe store siteCount %@: %@", [content lastPathComponent], error);
// continue;
// }
//
// storeDescription = PearlString( @"%@: %dU, %dS", storeDescription, userCount, siteCount );
// }
// @catch (NSException *exception) {
// wrn(@"Couldn't describe store %@: exception %@", [content lastPathComponent], exception);
// }
// @finally {
// if (store) if (![storePSC removePersistentStore:store error:&error])
// wrn(@"Couldn't remove store %@: %@", [content lastPathComponent], error);
// [stores setObject:storeDescription forKey:[content lastPathComponent]];
// }
// }
//
// NSString *storeUUID = [[MPiOSAppDelegate get].storeManager valueForKey:@"storeUUID_ThreadSafe"];
// NSUInteger firstDash = [storeUUID rangeOfString:@"-" options:0].location;
// PearlArrayTVC *vc = [[PearlArrayTVC alloc] initWithStyle:UITableViewStylePlain];
// vc.title = PearlString( @"Current: %@", firstDash == NSNotFound? storeUUID: [storeUUID substringToIndex:firstDash] );
// [stores enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
// [vc addRowWithName:obj style:PearlArrayTVCRowStyleLink toggled:NO toSection:@"Cloud Stores"
// activationBlock:^BOOL(BOOL wasToggled) {
// [[MPiOSAppDelegate get].storeManager setValue:key forKey:@"storeUUID"];
// [[MPiOSAppDelegate get].storeManager reloadStore];
// [[MPiOSAppDelegate get] signOutAnimated:YES];
// return YES;
// }];
// }];
// dispatch_async( dispatch_get_main_queue(), ^{
// [switchCloudStoreProgress cancelAlertAnimated:YES];
// [self.navigationController pushViewController:vc animated:YES];
// } );
NSDictionary *cloudStores = [[MPiOSAppDelegate get].storeManager enumerateCloudStores];
if (!cloudStores)
wrn(@"Failed enumerating cloud stores.");
NSString *currentStoreUUID = nil;
NSMutableDictionary *stores = [NSMutableDictionary dictionary];
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
NSPersistentStoreCoordinator *storePSC = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
NSFetchRequest *usersFetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass( [MPUserEntity class] )];
NSFetchRequest *sitesFetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass( [MPElementEntity class] )];
for (NSURL *cloudStoreURL in cloudStores) {
NSString *storeUUID = [[cloudStoreURL URLByDeletingPathExtension] lastPathComponent];
for (NSDictionary *cloudStoreOptions in [cloudStores objectForKey:cloudStoreURL]) {
NSError *error = nil;
NSPersistentStore *store = nil;
NSUInteger firstDash = [storeUUID rangeOfString:@"-" options:0].location;
NSString *storeDescription = PearlString( @"%@ v%@",
firstDash == NSNotFound? storeUUID: [storeUUID substringToIndex:firstDash],
cloudStoreOptions[USMCloudVersionKey] );
if ([cloudStoreOptions[USMCloudCurrentKey] boolValue])
currentStoreUUID = storeUUID;
@try {
if (!(store = [storePSC addPersistentStoreWithType:NSSQLiteStoreType configuration:nil
URL:cloudStoreURL options:cloudStoreOptions error:&error])) {
wrn(@"Couldn't describe store %@. While opening: %@", storeDescription, error);
continue;
}
NSUInteger userCount, siteCount;
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
moc.persistentStoreCoordinator = storePSC;
if ((userCount = [moc countForFetchRequest:usersFetchRequest error:&error]) == NSNotFound) {
wrn(@"Couldn't describe store %@. While determining userCount: %@", storeDescription, error);
continue;
}
if ((siteCount = [moc countForFetchRequest:sitesFetchRequest error:&error]) == NSNotFound) {
wrn(@"Couldn't describe store %@. While determining siteCount: %@", storeDescription, error);
continue;
}
storeDescription = PearlString( @"%@: %dU, %dS", storeDescription, userCount, siteCount );
}
@catch (NSException *exception) {
wrn(@"Couldn't describe store %@: %@", storeDescription, exception);
}
@finally {
if (store && ![storePSC removePersistentStore:store error:&error]) {
wrn(@"Couldn't remove store %@: %@", storeDescription, error);
storePSC = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
}
[stores setObject:cloudStoreOptions forKey:storeDescription];
}
}
}
PearlArrayTVC *vc = [[PearlArrayTVC alloc] initWithStyle:UITableViewStylePlain];
NSUInteger firstDash = [currentStoreUUID rangeOfString:@"-" options:0].location;
vc.title = PearlString( @"Active: %@", firstDash == NSNotFound? currentStoreUUID: [currentStoreUUID substringToIndex:firstDash] );
[stores enumerateKeysAndObjectsUsingBlock:^(id storeDescription, id cloudStoreOptions, BOOL *stop) {
[vc addRowWithName:storeDescription style:PearlArrayTVCRowStyleLink toggled:[cloudStoreOptions[USMCloudCurrentKey] boolValue]
toSection:@"Cloud Stores" activationBlock:^BOOL(BOOL wasToggled) {
[[MPiOSAppDelegate get].storeManager switchToCloudStoreWithOptions:cloudStoreOptions];
[self.navigationController popToRootViewControllerAnimated:YES];
return YES;
}];
}];
dispatch_async( dispatch_get_main_queue(), ^{
[switchCloudStoreProgress cancelAlertAnimated:YES];
[self.navigationController pushViewController:vc animated:YES];
} );
}
- (IBAction)toggleLevelControl:(UISegmentedControl *)sender {

View File

@ -49,9 +49,7 @@
}];
[TestFlight takeOff:testFlightToken];
[[PearlLogger get] registerListener:^BOOL(PearlLogMessage *message) {
PearlLogLevel level = PearlLogLevelWarn;
if ([[MPiOSConfig get].sendInfo boolValue])
level = PearlLogLevelInfo;
PearlLogLevel level = PearlLogLevelDebug;
if (message.level >= level)
TFLog( @"%@", [message messageDescription] );
@ -80,9 +78,9 @@
[Crashlytics setObjectValue:@"Anonymous" forKey:@"username"];
[Crashlytics startWithAPIKey:crashlyticsAPIKey];
[[PearlLogger get] registerListener:^BOOL(PearlLogMessage *message) {
PearlLogLevel level = PearlLogLevelWarn;
PearlLogLevel level = PearlLogLevelInfo;
if ([[MPiOSConfig get].sendInfo boolValue])
level = PearlLogLevelInfo;
level = PearlLogLevelDebug;
if (message.level >= level)
CLSLog( @"%@", [message messageDescription] );

View File

@ -545,6 +545,7 @@ Your passwords will be AES-encrypted with your master password.</string>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" title="Log Inspector" id="RrC-3Q-nBN">
<barButtonItem key="backBarButtonItem" title="Logs" id="6wH-VM-LLh"/>
<barButtonItem key="rightBarButtonItem" systemItem="action" id="SpB-nm-8qW">
<connections>
<action selector="action:" destination="Tx0-mM-kHk" id="2fa-eg-8yh"/>
@ -1167,17 +1168,17 @@ L4m3P4sSw0rD</string>
<!--Unlock View Controller-->
<scene sceneID="HkH-JR-Fhy">
<objects>
<viewController storyboardIdentifier="MPUnlockViewController" automaticallyAdjustsScrollViewInsets="NO" modalTransitionStyle="flipHorizontal" id="Nbn-Rv-sP1" customClass="MPUnlockViewController" sceneMemberID="viewController">
<viewController storyboardIdentifier="MPUnlockViewController" extendedLayoutIncludesOpaqueBars="YES" modalTransitionStyle="flipHorizontal" id="Nbn-Rv-sP1" customClass="MPUnlockViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="GeE-5J-ZZO">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="center" image="background.png" id="QWe-Gw-rD3">
<rect key="frame" x="0.0" y="0.0" width="320" height="592"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="656"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</imageView>
<view contentMode="scaleToFill" id="PHH-XC-9QQ" userLabel="View - UI Container">
<rect key="frame" x="0.0" y="0.0" width="320" height="504"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="ui_spinner.png" id="27q-lX-0vy">
@ -1336,7 +1337,7 @@ L4m3P4sSw0rD</string>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view contentMode="scaleToFill" id="870-GQ-iOh" userLabel="View - Share Buttons">
<rect key="frame" x="0.0" y="0.0" width="320" height="504"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" alpha="0.20000000000000015" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="tGv-v7-kcX" userLabel="google+">
@ -1417,7 +1418,7 @@ L4m3P4sSw0rD</string>
</connections>
</button>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.5" contentMode="left" text="Tap and hold to delete or reset user." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="DBJ-Qi-ZcF">
<rect key="frame" x="20" y="484" width="280" height="20"/>
<rect key="frame" x="20" y="548" width="280" height="20"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<fontDescription key="fontDescription" name="Copperplate" family="Copperplate" pointSize="12"/>
<color key="textColor" cocoaTouchSystemColor="lightTextColor"/>
@ -1537,7 +1538,7 @@ You can use the words in the background for inspiration in finding a memorable m
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<webView opaque="NO" contentMode="scaleToFill" id="rGU-aZ-XVm">
<rect key="frame" x="0.0" y="435" width="320" height="44"/>
<rect key="frame" x="0.0" y="499" width="320" height="44"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<dataDetectorType key="dataDetectorTypes"/>
@ -1549,15 +1550,15 @@ You can use the words in the background for inspiration in finding a memorable m
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view hidden="YES" alpha="0.30000000000000016" contentMode="scaleToFill" id="KNa-Xb-RuE" userLabel="View - Emergency Generator">
<rect key="frame" x="-100" y="0.0" width="520" height="504"/>
<rect key="frame" x="-100" y="0.0" width="520" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" id="vdf-Kn-Sle">
<rect key="frame" x="100" y="20" width="320" height="370"/>
<rect key="frame" x="100" y="20" width="320" height="434"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="ui_panel_display.png" id="jLf-TI-anP">
<rect key="frame" x="11" y="0.0" width="298" height="370"/>
<rect key="frame" x="11" y="0.0" width="298" height="434"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<rect key="contentStretch" x="0.050000000000000003" y="0.10000000000000001" width="0.89999999999999991" height="0.79999999999999982"/>
</imageView>
@ -1672,11 +1673,11 @@ You can use the words in the background for inspiration in finding a memorable m
</connections>
</button>
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" hidesWhenStopped="YES" style="whiteLarge" id="3Ax-91-gVM">
<rect key="frame" x="141" y="324" width="37" height="37"/>
<rect key="frame" x="141" y="388" width="37" height="37"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
</activityIndicatorView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="r9J-C9-Bt1">
<rect key="frame" x="20" y="316" width="280" height="54"/>
<rect key="frame" x="20" y="380" width="280" height="54"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<fontDescription key="fontDescription" name="AmericanTypewriter-Bold" family="American Typewriter" pointSize="30"/>
<size key="titleShadowOffset" width="0.0" height="1"/>
@ -1692,7 +1693,7 @@ You can use the words in the background for inspiration in finding a memorable m
</connections>
</button>
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="sD9-hR-UAI" userLabel="View - Content Tip">
<rect key="frame" x="55" y="290" width="210" height="60"/>
<rect key="frame" x="55" y="354" width="210" height="60"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black.png" id="Lua-xm-WX6">
@ -1718,7 +1719,6 @@ You can use the words in the background for inspiration in finding a memorable m
</subviews>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
</view>
<extendedEdge key="edgesForExtendedLayout"/>
<navigationItem key="navigationItem" id="dU2-XK-yUQ">
<barButtonItem key="backBarButtonItem" title="Log Out" id="A5d-ER-NUM"/>
</navigationItem>
@ -1771,6 +1771,7 @@ You can use the words in the background for inspiration in finding a memorable m
<scene sceneID="wrY-9D-LEc">
<objects>
<navigationController definesPresentationContext="YES" id="uu3-4d-bYN" customClass="PearlNavigationController" sceneMemberID="viewController">
<extendedEdge key="edgesForExtendedLayout"/>
<navigationBar key="navigationBar" contentMode="scaleToFill" barStyle="black" translucent="NO" id="T2Q-L6-b8f">
<autoresizingMask key="autoresizingMask"/>
<color key="tintColor" red="0.47450980390000003" green="0.86666666670000003" blue="0.98431372549999996" alpha="1" colorSpace="calibratedRGB"/>
@ -1850,7 +1851,7 @@ If you set a custom password, it will be encrypted before it is saved to the clo
<!--Element List All View Controller-->
<scene sceneID="I7c-vt-d2s">
<objects>
<tableViewController automaticallyAdjustsScrollViewInsets="NO" id="idA-Pj-1U9" customClass="MPElementListAllViewController" sceneMemberID="viewController">
<tableViewController id="idA-Pj-1U9" customClass="MPElementListAllViewController" sceneMemberID="viewController">
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="48" sectionHeaderHeight="22" sectionFooterHeight="22" id="N83-sj-4tl">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@ -1944,6 +1945,7 @@ If you set a custom password, it will be encrypted before it is saved to the clo
<scene sceneID="8r0-wA-Zre">
<objects>
<navigationController id="KZF-fe-y9n" customClass="PearlNavigationController" sceneMemberID="viewController">
<extendedEdge key="edgesForExtendedLayout"/>
<toolbarItems/>
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" barStyle="black" translucent="NO" id="sif-x3-Fol">
@ -2512,7 +2514,7 @@ You can make passwords for anything, like email addresses, sites or real-world t
<!--Guide View Controller-->
<scene sceneID="k6U-hl-fJt">
<objects>
<viewController automaticallyAdjustsScrollViewInsets="NO" id="myN-X7-9Tg" customClass="MPGuideViewController" sceneMemberID="viewController">
<viewController id="myN-X7-9Tg" customClass="MPGuideViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="vkG-Oi-PHo">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@ -2813,7 +2815,6 @@ You can make passwords for anything, like email addresses, sites or real-world t
</subviews>
<color key="backgroundColor" red="0.14901960780000001" green="0.1647058824" blue="0.18039215689999999" alpha="1" colorSpace="calibratedRGB"/>
</view>
<extendedEdge key="edgesForExtendedLayout"/>
<navigationItem key="navigationItem" id="p1Y-gL-psy"/>
<nil key="simulatedTopBarMetrics"/>
<connections>
@ -2908,36 +2909,21 @@ However, it means that anyone who finds your device unlocked can do the same.</s
<resources>
<image name="Square-bottom.png" width="551" height="58"/>
<image name="avatar-0.png" width="110" height="110"/>
<image name="avatar-0.png" width="110" height="110"/>
<image name="background.png" width="568" height="568"/>
<image name="background.png" width="568" height="568"/>
<image name="background.png" width="568" height="568"/>
<image name="background.png" width="568" height="568"/>
<image name="background.png" width="568" height="568"/>
<image name="background.png" width="568" height="568"/>
<image name="background.png" width="568" height="568"/>
<image name="book.png" width="320" height="480"/>
<image name="cloud.png" width="105" height="80"/>
<image name="icon_action.png" width="32" height="32"/>
<image name="icon_cancel.png" width="32" height="32"/>
<image name="icon_cancel.png" width="32" height="32"/>
<image name="icon_cancel.png" width="32" height="32"/>
<image name="icon_cancel.png" width="32" height="32"/>
<image name="icon_edit.png" width="32" height="32"/>
<image name="icon_edit.png" width="32" height="32"/>
<image name="icon_find.png" width="32" height="32"/>
<image name="icon_find.png" width="32" height="32"/>
<image name="icon_gears.png" width="32" height="32"/>
<image name="icon_person.png" width="32" height="32"/>
<image name="icon_person.png" width="32" height="32"/>
<image name="icon_play.png" width="32" height="32"/>
<image name="icon_plus.png" width="32" height="32"/>
<image name="icon_plus.png" width="32" height="32"/>
<image name="icon_up.png" width="32" height="32"/>
<image name="identity.png" width="82" height="80"/>
<image name="page-deblock.png" width="305" height="400"/>
<image name="page-gorillas.png" width="305" height="400"/>
<image name="page-gorillas.png" width="305" height="400"/>
<image name="play.png" width="72" height="80"/>
<image name="pull-down.png" width="60" height="10"/>
<image name="pull-up.png" width="60" height="20"/>
@ -2945,39 +2931,15 @@ However, it means that anyone who finds your device unlocked can do the same.</s
<image name="social-google+.png" width="44" height="44"/>
<image name="social-twitter.png" width="44" height="44"/>
<image name="tip_alert_black.png" width="235" height="81"/>
<image name="tip_alert_black.png" width="235" height="81"/>
<image name="tip_basic_black.png" width="210" height="60"/>
<image name="tip_basic_black.png" width="210" height="60"/>
<image name="tip_basic_black.png" width="210" height="60"/>
<image name="tip_basic_black.png" width="210" height="60"/>
<image name="tip_basic_black.png" width="210" height="60"/>
<image name="tip_basic_black.png" width="210" height="60"/>
<image name="tip_basic_black.png" width="210" height="60"/>
<image name="tip_basic_black_bottom_right.png" width="210" height="60"/>
<image name="tip_basic_black_bottom_right.png" width="210" height="60"/>
<image name="tip_basic_black_top.png" width="210" height="60"/>
<image name="tip_basic_black_top.png" width="210" height="60"/>
<image name="tip_basic_black_top.png" width="210" height="60"/>
<image name="tip_basic_black_top.png" width="210" height="60"/>
<image name="tip_basic_black_top_right.png" width="205" height="61"/>
<image name="ui_button_standard_large.png" width="300" height="46"/>
<image name="ui_button_standard_large.png" width="300" height="46"/>
<image name="ui_list_first.png" width="300" height="35"/>
<image name="ui_list_first.png" width="300" height="35"/>
<image name="ui_list_first.png" width="300" height="35"/>
<image name="ui_list_first.png" width="300" height="35"/>
<image name="ui_list_last.png" width="300" height="35"/>
<image name="ui_list_last.png" width="300" height="35"/>
<image name="ui_list_last.png" width="300" height="35"/>
<image name="ui_list_last.png" width="300" height="35"/>
<image name="ui_list_middle.png" width="300" height="34"/>
<image name="ui_list_middle.png" width="300" height="34"/>
<image name="ui_list_middle.png" width="300" height="34"/>
<image name="ui_list_middle.png" width="300" height="34"/>
<image name="ui_panel_container.png" width="300" height="87"/>
<image name="ui_panel_container.png" width="300" height="87"/>
<image name="ui_panel_display.png" width="300" height="86"/>
<image name="ui_panel_display.png" width="300" height="86"/>
<image name="ui_panel_display.png" width="300" height="86"/>
<image name="ui_spinner.png" width="75" height="75"/>
<image name="ui_textfield.png" width="158" height="34"/>
@ -2989,9 +2951,9 @@ However, it means that anyone who finds your device unlocked can do the same.</s
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
<inferredMetricsTieBreakers>
<segue reference="jgo-j3-gbW"/>
<segue reference="KIl-ZW-M7G"/>
<segue reference="rWT-Kr-cAs"/>
<segue reference="X2A-e4-krq"/>
<segue reference="swi-5o-hfK"/>
<segue reference="hxY-aA-ngI"/>
<segue reference="5Im-dm-qfS"/>
<segue reference="9Bs-cD-ddF"/>
</inferredMetricsTieBreakers>
</document>

View File

@ -3709,12 +3709,10 @@
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_ENABLE_OBJC_ARC = YES;
CODE_SIGN_ENTITLEMENTS = MasterPassword.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Maarten Billemont (DWGU95U4ZD)";
EXCLUDED_SOURCE_FILE_NAMES = libTestFlight.a;
GCC_PREFIX_HEADER = "MasterPassword-Prefix.pch";
INFOPLIST_FILE = "MasterPassword-Info.plist";
PROVISIONING_PROFILE = "";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "EBD2A2E4-AEC3-4EEA-8FF0-5F1A0D9FFA1C";
SKIP_INSTALL = NO;
TARGETED_DEVICE_FAMILY = 1;
@ -3728,12 +3726,11 @@
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_ENABLE_OBJC_ARC = YES;
CODE_SIGN_ENTITLEMENTS = MasterPassword.entitlements;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Maarten Billemont";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Maarten Billemont (HL3Q45LX9N)";
EXCLUDED_SOURCE_FILE_NAMES = "";
GCC_PREFIX_HEADER = "MasterPassword-Prefix.pch";
INFOPLIST_FILE = "MasterPassword-Info.plist";
PROVISIONING_PROFILE = "";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "E0204B5E-CCA7-447B-828F-53912F920A0C";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "4CBD21E7-DB60-4F7F-80F8-98DFA83D2CE0";
SKIP_INSTALL = NO;
TARGETED_DEVICE_FAMILY = 1;
};
@ -3844,10 +3841,10 @@
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_ENABLE_OBJC_ARC = YES;
CODE_SIGN_ENTITLEMENTS = MasterPassword.entitlements;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Maarten Billemont (HL3Q45LX9N)";
EXCLUDED_SOURCE_FILE_NAMES = libTestFlight.a;
GCC_PREFIX_HEADER = "MasterPassword-Prefix.pch";
INFOPLIST_FILE = "MasterPassword-Info.plist";
PROVISIONING_PROFILE = "";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "6C6B84DD-9D8F-4321-BD77-5F737DBE1778";
SKIP_INSTALL = NO;
TARGETED_DEVICE_FAMILY = 1;