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:
parent
27870c7420
commit
009b1ff996
2
External/UbiquityStoreManager
vendored
2
External/UbiquityStoreManager
vendored
@ -1 +1 @@
|
||||
Subproject commit 0202de6cf5b1f2847f4726af0788f6fce9683b32
|
||||
Subproject commit 0c13b407e1ca5113bbed5c233215ff61ed77f41a
|
@ -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)
|
||||
err(@"Failed to retrieve active user: %@", error);
|
||||
if (!activeUser) {
|
||||
[self signOutAnimated:YES];
|
||||
err(@"Failed to retrieve active user: %@", error);
|
||||
}
|
||||
|
||||
return activeUser;
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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] );
|
||||
|
@ -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>
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user