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

View File

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

View File

@ -49,9 +49,7 @@
}]; }];
[TestFlight takeOff:testFlightToken]; [TestFlight takeOff:testFlightToken];
[[PearlLogger get] registerListener:^BOOL(PearlLogMessage *message) { [[PearlLogger get] registerListener:^BOOL(PearlLogMessage *message) {
PearlLogLevel level = PearlLogLevelWarn; PearlLogLevel level = PearlLogLevelDebug;
if ([[MPiOSConfig get].sendInfo boolValue])
level = PearlLogLevelInfo;
if (message.level >= level) if (message.level >= level)
TFLog( @"%@", [message messageDescription] ); TFLog( @"%@", [message messageDescription] );
@ -80,9 +78,9 @@
[Crashlytics setObjectValue:@"Anonymous" forKey:@"username"]; [Crashlytics setObjectValue:@"Anonymous" forKey:@"username"];
[Crashlytics startWithAPIKey:crashlyticsAPIKey]; [Crashlytics startWithAPIKey:crashlyticsAPIKey];
[[PearlLogger get] registerListener:^BOOL(PearlLogMessage *message) { [[PearlLogger get] registerListener:^BOOL(PearlLogMessage *message) {
PearlLogLevel level = PearlLogLevelWarn; PearlLogLevel level = PearlLogLevelInfo;
if ([[MPiOSConfig get].sendInfo boolValue]) if ([[MPiOSConfig get].sendInfo boolValue])
level = PearlLogLevelInfo; level = PearlLogLevelDebug;
if (message.level >= level) if (message.level >= level)
CLSLog( @"%@", [message messageDescription] ); 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"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view> </view>
<navigationItem key="navigationItem" title="Log Inspector" id="RrC-3Q-nBN"> <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"> <barButtonItem key="rightBarButtonItem" systemItem="action" id="SpB-nm-8qW">
<connections> <connections>
<action selector="action:" destination="Tx0-mM-kHk" id="2fa-eg-8yh"/> <action selector="action:" destination="Tx0-mM-kHk" id="2fa-eg-8yh"/>
@ -1167,17 +1168,17 @@ L4m3P4sSw0rD</string>
<!--Unlock View Controller--> <!--Unlock View Controller-->
<scene sceneID="HkH-JR-Fhy"> <scene sceneID="HkH-JR-Fhy">
<objects> <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"> <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"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<imageView userInteractionEnabled="NO" contentMode="center" image="background.png" id="QWe-Gw-rD3"> <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"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</imageView> </imageView>
<view contentMode="scaleToFill" id="PHH-XC-9QQ" userLabel="View - UI Container"> <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"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="ui_spinner.png" id="27q-lX-0vy"> <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"/> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view> </view>
<view contentMode="scaleToFill" id="870-GQ-iOh" userLabel="View - Share Buttons"> <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"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<button opaque="NO" alpha="0.20000000000000015" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="tGv-v7-kcX" userLabel="google+"> <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> </connections>
</button> </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"> <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"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<fontDescription key="fontDescription" name="Copperplate" family="Copperplate" pointSize="12"/> <fontDescription key="fontDescription" name="Copperplate" family="Copperplate" pointSize="12"/>
<color key="textColor" cocoaTouchSystemColor="lightTextColor"/> <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"/> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view> </view>
<webView opaque="NO" contentMode="scaleToFill" id="rGU-aZ-XVm"> <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"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<dataDetectorType key="dataDetectorTypes"/> <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"/> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view> </view>
<view hidden="YES" alpha="0.30000000000000016" contentMode="scaleToFill" id="KNa-Xb-RuE" userLabel="View - Emergency Generator"> <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"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<view contentMode="scaleToFill" id="vdf-Kn-Sle"> <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"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="ui_panel_display.png" id="jLf-TI-anP"> <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"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<rect key="contentStretch" x="0.050000000000000003" y="0.10000000000000001" width="0.89999999999999991" height="0.79999999999999982"/> <rect key="contentStretch" x="0.050000000000000003" y="0.10000000000000001" width="0.89999999999999991" height="0.79999999999999982"/>
</imageView> </imageView>
@ -1672,11 +1673,11 @@ You can use the words in the background for inspiration in finding a memorable m
</connections> </connections>
</button> </button>
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" hidesWhenStopped="YES" style="whiteLarge" id="3Ax-91-gVM"> <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"/> <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
</activityIndicatorView> </activityIndicatorView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="r9J-C9-Bt1"> <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"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<fontDescription key="fontDescription" name="AmericanTypewriter-Bold" family="American Typewriter" pointSize="30"/> <fontDescription key="fontDescription" name="AmericanTypewriter-Bold" family="American Typewriter" pointSize="30"/>
<size key="titleShadowOffset" width="0.0" height="1"/> <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> </connections>
</button> </button>
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="sD9-hR-UAI" userLabel="View - Content Tip"> <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"/> <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black.png" id="Lua-xm-WX6"> <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> </subviews>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
</view> </view>
<extendedEdge key="edgesForExtendedLayout"/>
<navigationItem key="navigationItem" id="dU2-XK-yUQ"> <navigationItem key="navigationItem" id="dU2-XK-yUQ">
<barButtonItem key="backBarButtonItem" title="Log Out" id="A5d-ER-NUM"/> <barButtonItem key="backBarButtonItem" title="Log Out" id="A5d-ER-NUM"/>
</navigationItem> </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"> <scene sceneID="wrY-9D-LEc">
<objects> <objects>
<navigationController definesPresentationContext="YES" id="uu3-4d-bYN" customClass="PearlNavigationController" sceneMemberID="viewController"> <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"> <navigationBar key="navigationBar" contentMode="scaleToFill" barStyle="black" translucent="NO" id="T2Q-L6-b8f">
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<color key="tintColor" red="0.47450980390000003" green="0.86666666670000003" blue="0.98431372549999996" alpha="1" colorSpace="calibratedRGB"/> <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--> <!--Element List All View Controller-->
<scene sceneID="I7c-vt-d2s"> <scene sceneID="I7c-vt-d2s">
<objects> <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"> <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"/> <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <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"> <scene sceneID="8r0-wA-Zre">
<objects> <objects>
<navigationController id="KZF-fe-y9n" customClass="PearlNavigationController" sceneMemberID="viewController"> <navigationController id="KZF-fe-y9n" customClass="PearlNavigationController" sceneMemberID="viewController">
<extendedEdge key="edgesForExtendedLayout"/>
<toolbarItems/> <toolbarItems/>
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/> <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" barStyle="black" translucent="NO" id="sif-x3-Fol"> <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--> <!--Guide View Controller-->
<scene sceneID="k6U-hl-fJt"> <scene sceneID="k6U-hl-fJt">
<objects> <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"> <view key="view" contentMode="scaleToFill" id="vkG-Oi-PHo">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/> <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <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> </subviews>
<color key="backgroundColor" red="0.14901960780000001" green="0.1647058824" blue="0.18039215689999999" alpha="1" colorSpace="calibratedRGB"/> <color key="backgroundColor" red="0.14901960780000001" green="0.1647058824" blue="0.18039215689999999" alpha="1" colorSpace="calibratedRGB"/>
</view> </view>
<extendedEdge key="edgesForExtendedLayout"/>
<navigationItem key="navigationItem" id="p1Y-gL-psy"/> <navigationItem key="navigationItem" id="p1Y-gL-psy"/>
<nil key="simulatedTopBarMetrics"/> <nil key="simulatedTopBarMetrics"/>
<connections> <connections>
@ -2908,36 +2909,21 @@ However, it means that anyone who finds your device unlocked can do the same.</s
<resources> <resources>
<image name="Square-bottom.png" width="551" height="58"/> <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="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="background.png" width="568" height="568"/>
<image name="book.png" width="320" height="480"/> <image name="book.png" width="320" height="480"/>
<image name="cloud.png" width="105" height="80"/> <image name="cloud.png" width="105" height="80"/>
<image name="icon_action.png" width="32" height="32"/> <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_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_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_find.png" width="32" height="32"/>
<image name="icon_gears.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_person.png" width="32" height="32"/>
<image name="icon_play.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_plus.png" width="32" height="32"/>
<image name="icon_up.png" width="32" height="32"/> <image name="icon_up.png" width="32" height="32"/>
<image name="identity.png" width="82" height="80"/> <image name="identity.png" width="82" height="80"/>
<image name="page-deblock.png" width="305" height="400"/> <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="page-gorillas.png" width="305" height="400"/>
<image name="play.png" width="72" height="80"/> <image name="play.png" width="72" height="80"/>
<image name="pull-down.png" width="60" height="10"/> <image name="pull-down.png" width="60" height="10"/>
<image name="pull-up.png" width="60" height="20"/> <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-google+.png" width="44" height="44"/>
<image name="social-twitter.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_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.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_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.png" width="210" height="60"/>
<image name="tip_basic_black_top_right.png" width="205" height="61"/> <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_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_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_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_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_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_panel_display.png" width="300" height="86"/>
<image name="ui_spinner.png" width="75" height="75"/> <image name="ui_spinner.png" width="75" height="75"/>
<image name="ui_textfield.png" width="158" height="34"/> <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"/> <simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer> </simulatedMetricsContainer>
<inferredMetricsTieBreakers> <inferredMetricsTieBreakers>
<segue reference="jgo-j3-gbW"/> <segue reference="swi-5o-hfK"/>
<segue reference="KIl-ZW-M7G"/> <segue reference="hxY-aA-ngI"/>
<segue reference="rWT-Kr-cAs"/> <segue reference="5Im-dm-qfS"/>
<segue reference="X2A-e4-krq"/> <segue reference="9Bs-cD-ddF"/>
</inferredMetricsTieBreakers> </inferredMetricsTieBreakers>
</document> </document>

View File

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