2
0

Facebook updates + Mac fixes.

[UPDATED]   Facebook integration bumped for iOS 6.
[FIXED]     Bringing Mac version back up to date.  Compiles again and
            runs with UI bugs.
[ADDED]     Mac: User selection.
This commit is contained in:
Maarten Billemont 2012-10-30 22:54:34 -04:00
parent 678545cc26
commit 05ab38b998
26 changed files with 1463 additions and 1307 deletions

@ -1 +1 @@
Subproject commit 682535050207c771706823cbf0fc31a206b12956 Subproject commit 2a030e795aed343e7614e149a5ebdfa78b223a72

File diff suppressed because it is too large Load Diff

View File

@ -94,8 +94,6 @@
DA4ECA2B160D94A80012ABB9 /* libTestFlight.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA4ECA26160D94A80012ABB9 /* libTestFlight.a */; }; DA4ECA2B160D94A80012ABB9 /* libTestFlight.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA4ECA26160D94A80012ABB9 /* libTestFlight.a */; };
DA4ECA2E160D94A80012ABB9 /* TestFlight.plist in Resources */ = {isa = PBXBuildFile; fileRef = DA4ECA2A160D94A80012ABB9 /* TestFlight.plist */; }; DA4ECA2E160D94A80012ABB9 /* TestFlight.plist in Resources */ = {isa = PBXBuildFile; fileRef = DA4ECA2A160D94A80012ABB9 /* TestFlight.plist */; };
DA55873F15E81D9E00860B4F /* iTunesArtwork-Rounded-73.png in Resources */ = {isa = PBXBuildFile; fileRef = DA55873E15E81D9E00860B4F /* iTunesArtwork-Rounded-73.png */; }; DA55873F15E81D9E00860B4F /* iTunesArtwork-Rounded-73.png in Resources */ = {isa = PBXBuildFile; fileRef = DA55873E15E81D9E00860B4F /* iTunesArtwork-Rounded-73.png */; };
DA55878015E82C0300860B4F /* FacebookSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA55877F15E82C0300860B4F /* FacebookSDK.framework */; };
DA55878215E82C2B00860B4F /* FacebookSDKResources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = DA55878115E82C2B00860B4F /* FacebookSDKResources.bundle */; };
DA5587EB15E83C3200860B4F /* social-facebook.png in Resources */ = {isa = PBXBuildFile; fileRef = DA5587E515E83C3200860B4F /* social-facebook.png */; }; DA5587EB15E83C3200860B4F /* social-facebook.png in Resources */ = {isa = PBXBuildFile; fileRef = DA5587E515E83C3200860B4F /* social-facebook.png */; };
DA5587EC15E83C3200860B4F /* social-facebook@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA5587E615E83C3200860B4F /* social-facebook@2x.png */; }; DA5587EC15E83C3200860B4F /* social-facebook@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA5587E615E83C3200860B4F /* social-facebook@2x.png */; };
DA5587ED15E83C3200860B4F /* social-google+.png in Resources */ = {isa = PBXBuildFile; fileRef = DA5587E715E83C3200860B4F /* social-google+.png */; }; DA5587ED15E83C3200860B4F /* social-google+.png in Resources */ = {isa = PBXBuildFile; fileRef = DA5587E715E83C3200860B4F /* social-google+.png */; };
@ -131,6 +129,11 @@
DA609F5C1600CE980030AE31 /* LocalyticsUploader.h in Headers */ = {isa = PBXBuildFile; fileRef = DA609F551600CE980030AE31 /* LocalyticsUploader.h */; }; DA609F5C1600CE980030AE31 /* LocalyticsUploader.h in Headers */ = {isa = PBXBuildFile; fileRef = DA609F551600CE980030AE31 /* LocalyticsUploader.h */; };
DA609F5D1600CE980030AE31 /* LocalyticsUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = DA609F561600CE980030AE31 /* LocalyticsUploader.m */; }; DA609F5D1600CE980030AE31 /* LocalyticsUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = DA609F561600CE980030AE31 /* LocalyticsUploader.m */; };
DA609F5E1600CE980030AE31 /* WebserviceConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = DA609F571600CE980030AE31 /* WebserviceConstants.h */; }; DA609F5E1600CE980030AE31 /* WebserviceConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = DA609F571600CE980030AE31 /* WebserviceConstants.h */; };
DA6701B816406A4100B61001 /* Accounts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA6701B716406A4100B61001 /* Accounts.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
DA6701BA16406B0600B61001 /* FacebookSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA6701B916406B0600B61001 /* FacebookSDK.framework */; };
DA6701DC16406B3600B61001 /* FacebookSDKResources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = DA6701DB16406B3600B61001 /* FacebookSDKResources.bundle */; };
DA6701DE16406B7300B61001 /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA6701DD16406B7300B61001 /* Social.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
DA6701E016406BB400B61001 /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA6701DF16406BB400B61001 /* AdSupport.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
DA672D2F14F92C6B004A189C /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DA672D2E14F92C6B004A189C /* libz.dylib */; }; DA672D2F14F92C6B004A189C /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DA672D2E14F92C6B004A189C /* libz.dylib */; };
DA672D3014F9413D004A189C /* libPearl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC77CAD148291A600BCF976 /* libPearl.a */; }; DA672D3014F9413D004A189C /* libPearl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC77CAD148291A600BCF976 /* libPearl.a */; };
DA829E52159847E0002417D3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; }; DA829E52159847E0002417D3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; };
@ -1116,41 +1119,6 @@
DA4ECA29160D94A80012ABB9 /* TestFlight.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestFlight.h; sourceTree = "<group>"; }; DA4ECA29160D94A80012ABB9 /* TestFlight.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestFlight.h; sourceTree = "<group>"; };
DA4ECA2A160D94A80012ABB9 /* TestFlight.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = TestFlight.plist; sourceTree = "<group>"; }; DA4ECA2A160D94A80012ABB9 /* TestFlight.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = TestFlight.plist; sourceTree = "<group>"; };
DA55873E15E81D9E00860B4F /* iTunesArtwork-Rounded-73.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "iTunesArtwork-Rounded-73.png"; sourceTree = "<group>"; }; DA55873E15E81D9E00860B4F /* iTunesArtwork-Rounded-73.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "iTunesArtwork-Rounded-73.png"; sourceTree = "<group>"; };
DA55877F15E82C0300860B4F /* FacebookSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FacebookSDK.framework; path = "External/facebook-ios-sdk/build/FacebookSDK.framework"; sourceTree = "<group>"; };
DA55878115E82C2B00860B4F /* FacebookSDKResources.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = FacebookSDKResources.bundle; path = "External/facebook-ios-sdk/build/FacebookSDK.framework/Versions/A/Resources/FacebookSDKResources.bundle"; sourceTree = "<group>"; };
DA5587B815E838CD00860B4F /* Facebook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Facebook.h; sourceTree = "<group>"; };
DA5587B915E838CD00860B4F /* FacebookSDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FacebookSDK.h; sourceTree = "<group>"; };
DA5587BA15E838CD00860B4F /* FBCacheDescriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBCacheDescriptor.h; sourceTree = "<group>"; };
DA5587BB15E838CD00860B4F /* FBConnect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBConnect.h; sourceTree = "<group>"; };
DA5587BC15E838CD00860B4F /* FBDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBDialog.h; sourceTree = "<group>"; };
DA5587BD15E838CD00860B4F /* FBError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBError.h; sourceTree = "<group>"; };
DA5587BE15E838CD00860B4F /* FBFrictionlessRequestSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBFrictionlessRequestSettings.h; sourceTree = "<group>"; };
DA5587BF15E838CD00860B4F /* FBFriendPickerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBFriendPickerViewController.h; sourceTree = "<group>"; };
DA5587C015E838CD00860B4F /* FBGraphLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBGraphLocation.h; sourceTree = "<group>"; };
DA5587C115E838CD00860B4F /* FBGraphObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBGraphObject.h; sourceTree = "<group>"; };
DA5587C215E838CD00860B4F /* FBGraphPlace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBGraphPlace.h; sourceTree = "<group>"; };
DA5587C315E838CD00860B4F /* FBGraphUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBGraphUser.h; sourceTree = "<group>"; };
DA5587C415E838CD00860B4F /* FBLoginDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBLoginDialog.h; sourceTree = "<group>"; };
DA5587C515E838CD00860B4F /* FBLoginView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBLoginView.h; sourceTree = "<group>"; };
DA5587C615E838CD00860B4F /* FBOpenGraphAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBOpenGraphAction.h; sourceTree = "<group>"; };
DA5587C715E838CD00860B4F /* FBPlacePickerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBPlacePickerViewController.h; sourceTree = "<group>"; };
DA5587C815E838CD00860B4F /* FBProfilePictureView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBProfilePictureView.h; sourceTree = "<group>"; };
DA5587C915E838CD00860B4F /* FBRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBRequest.h; sourceTree = "<group>"; };
DA5587CA15E838CD00860B4F /* FBRequestConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBRequestConnection.h; sourceTree = "<group>"; };
DA5587CB15E838CD00860B4F /* FBSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBSession.h; sourceTree = "<group>"; };
DA5587CC15E838CD00860B4F /* FBSessionManualTokenCachingStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBSessionManualTokenCachingStrategy.h; sourceTree = "<group>"; };
DA5587CD15E838CD00860B4F /* FBSessionTokenCachingStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBSessionTokenCachingStrategy.h; sourceTree = "<group>"; };
DA5587CE15E838CD00860B4F /* FBSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBSettings.h; sourceTree = "<group>"; };
DA5587CF15E838CD00860B4F /* FBTestSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBTestSession.h; sourceTree = "<group>"; };
DA5587D015E838CD00860B4F /* FBUserSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBUserSettingsViewController.h; sourceTree = "<group>"; };
DA5587D115E838CD00860B4F /* FBViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBViewController.h; sourceTree = "<group>"; };
DA5587D215E838CD00860B4F /* JSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSON.h; sourceTree = "<group>"; };
DA5587D315E838CD00860B4F /* NSObject+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+SBJSON.h"; sourceTree = "<group>"; };
DA5587D415E838CD00860B4F /* NSString+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+SBJSON.h"; sourceTree = "<group>"; };
DA5587D515E838CD00860B4F /* SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJSON.h; sourceTree = "<group>"; };
DA5587D615E838CD00860B4F /* SBJsonBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonBase.h; sourceTree = "<group>"; };
DA5587D715E838CD00860B4F /* SBJsonParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonParser.h; sourceTree = "<group>"; };
DA5587D815E838CD00860B4F /* SBJsonWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonWriter.h; sourceTree = "<group>"; };
DA5587E515E83C3200860B4F /* social-facebook.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "social-facebook.png"; sourceTree = "<group>"; }; DA5587E515E83C3200860B4F /* social-facebook.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "social-facebook.png"; sourceTree = "<group>"; };
DA5587E615E83C3200860B4F /* social-facebook@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "social-facebook@2x.png"; sourceTree = "<group>"; }; DA5587E615E83C3200860B4F /* social-facebook@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "social-facebook@2x.png"; sourceTree = "<group>"; };
DA5587E715E83C3200860B4F /* social-google+.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "social-google+.png"; sourceTree = "<group>"; }; DA5587E715E83C3200860B4F /* social-google+.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "social-google+.png"; sourceTree = "<group>"; };
@ -1194,6 +1162,42 @@
DA609F551600CE980030AE31 /* LocalyticsUploader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalyticsUploader.h; sourceTree = "<group>"; }; DA609F551600CE980030AE31 /* LocalyticsUploader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalyticsUploader.h; sourceTree = "<group>"; };
DA609F561600CE980030AE31 /* LocalyticsUploader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LocalyticsUploader.m; sourceTree = "<group>"; }; DA609F561600CE980030AE31 /* LocalyticsUploader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LocalyticsUploader.m; sourceTree = "<group>"; };
DA609F571600CE980030AE31 /* WebserviceConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebserviceConstants.h; sourceTree = "<group>"; }; DA609F571600CE980030AE31 /* WebserviceConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebserviceConstants.h; sourceTree = "<group>"; };
DA6701B716406A4100B61001 /* Accounts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accounts.framework; path = System/Library/Frameworks/Accounts.framework; sourceTree = SDKROOT; };
DA6701B916406B0600B61001 /* FacebookSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FacebookSDK.framework; path = "External/facebook-ios-sdk/build/FacebookSDK.framework"; sourceTree = "<group>"; };
DA6701BC16406B1C00B61001 /* Facebook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Facebook.h; sourceTree = "<group>"; };
DA6701BD16406B1C00B61001 /* FacebookSDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FacebookSDK.h; sourceTree = "<group>"; };
DA6701BE16406B1C00B61001 /* FBCacheDescriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBCacheDescriptor.h; sourceTree = "<group>"; };
DA6701BF16406B1C00B61001 /* FBConnect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBConnect.h; sourceTree = "<group>"; };
DA6701C016406B1C00B61001 /* FBDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBDialog.h; sourceTree = "<group>"; };
DA6701C116406B1C00B61001 /* FBError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBError.h; sourceTree = "<group>"; };
DA6701C216406B1C00B61001 /* FBFrictionlessRequestSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBFrictionlessRequestSettings.h; sourceTree = "<group>"; };
DA6701C316406B1C00B61001 /* FBFriendPickerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBFriendPickerViewController.h; sourceTree = "<group>"; };
DA6701C416406B1C00B61001 /* FBGraphLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBGraphLocation.h; sourceTree = "<group>"; };
DA6701C516406B1C00B61001 /* FBGraphObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBGraphObject.h; sourceTree = "<group>"; };
DA6701C616406B1C00B61001 /* FBGraphPlace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBGraphPlace.h; sourceTree = "<group>"; };
DA6701C716406B1C00B61001 /* FBGraphUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBGraphUser.h; sourceTree = "<group>"; };
DA6701C816406B1C00B61001 /* FBLoginDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBLoginDialog.h; sourceTree = "<group>"; };
DA6701C916406B1C00B61001 /* FBLoginView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBLoginView.h; sourceTree = "<group>"; };
DA6701CA16406B1C00B61001 /* FBNativeDialogs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBNativeDialogs.h; sourceTree = "<group>"; };
DA6701CB16406B1C00B61001 /* FBOpenGraphAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBOpenGraphAction.h; sourceTree = "<group>"; };
DA6701CC16406B1C00B61001 /* FBPlacePickerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBPlacePickerViewController.h; sourceTree = "<group>"; };
DA6701CD16406B1C00B61001 /* FBProfilePictureView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBProfilePictureView.h; sourceTree = "<group>"; };
DA6701CE16406B1C00B61001 /* FBRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBRequest.h; sourceTree = "<group>"; };
DA6701CF16406B1C00B61001 /* FBRequestConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBRequestConnection.h; sourceTree = "<group>"; };
DA6701D016406B1C00B61001 /* FBSBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBSBJSON.h; sourceTree = "<group>"; };
DA6701D116406B1C00B61001 /* FBSBJsonBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBSBJsonBase.h; sourceTree = "<group>"; };
DA6701D216406B1C00B61001 /* FBSBJsonParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBSBJsonParser.h; sourceTree = "<group>"; };
DA6701D316406B1C00B61001 /* FBSBJsonWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBSBJsonWriter.h; sourceTree = "<group>"; };
DA6701D416406B1C00B61001 /* FBSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBSession.h; sourceTree = "<group>"; };
DA6701D516406B1C00B61001 /* FBSessionManualTokenCachingStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBSessionManualTokenCachingStrategy.h; sourceTree = "<group>"; };
DA6701D616406B1C00B61001 /* FBSessionTokenCachingStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBSessionTokenCachingStrategy.h; sourceTree = "<group>"; };
DA6701D716406B1C00B61001 /* FBSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBSettings.h; sourceTree = "<group>"; };
DA6701D816406B1C00B61001 /* FBTestSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBTestSession.h; sourceTree = "<group>"; };
DA6701D916406B1C00B61001 /* FBUserSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBUserSettingsViewController.h; sourceTree = "<group>"; };
DA6701DA16406B1C00B61001 /* FBViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBViewController.h; sourceTree = "<group>"; };
DA6701DB16406B3600B61001 /* FacebookSDKResources.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = FacebookSDKResources.bundle; path = "External/facebook-ios-sdk/build/FacebookSDK.framework/Versions/A/Resources/FacebookSDKResources.bundle"; sourceTree = "<group>"; };
DA6701DD16406B7300B61001 /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; };
DA6701DF16406BB400B61001 /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; };
DA672D2E14F92C6B004A189C /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; DA672D2E14F92C6B004A189C /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
DA79A9BB1557DB6F00BAA07A /* libscryptenc-ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libscryptenc-ios.a"; sourceTree = "<group>"; }; DA79A9BB1557DB6F00BAA07A /* libscryptenc-ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libscryptenc-ios.a"; sourceTree = "<group>"; };
DA79A9BD1557DDC700BAA07A /* scrypt.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = scrypt.xcodeproj; path = External/Pearl/External/iOSPorts/ports/security/scrypt/scrypt.xcodeproj; sourceTree = "<group>"; }; DA79A9BD1557DDC700BAA07A /* scrypt.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = scrypt.xcodeproj; path = External/Pearl/External/iOSPorts/ports/security/scrypt/scrypt.xcodeproj; sourceTree = "<group>"; };
@ -2092,6 +2096,9 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
DA6701E016406BB400B61001 /* AdSupport.framework in Frameworks */,
DA6701DE16406B7300B61001 /* Social.framework in Frameworks */,
DA6701B816406A4100B61001 /* Accounts.framework in Frameworks */,
DA497C0C15E8C95700B52167 /* libGoogle+.a in Frameworks */, DA497C0C15E8C95700B52167 /* libGoogle+.a in Frameworks */,
DA829E6215984832002417D3 /* libFontReplacer.a in Frameworks */, DA829E6215984832002417D3 /* libFontReplacer.a in Frameworks */,
DA44260A1557D9E40052177D /* libiCloudStoreManager.a in Frameworks */, DA44260A1557D9E40052177D /* libiCloudStoreManager.a in Frameworks */,
@ -2111,8 +2118,8 @@
DA5BFA4F147E415C00F98B1E /* CoreData.framework in Frameworks */, DA5BFA4F147E415C00F98B1E /* CoreData.framework in Frameworks */,
DAD3126715528C9C00A3F9ED /* Crashlytics.framework in Frameworks */, DAD3126715528C9C00A3F9ED /* Crashlytics.framework in Frameworks */,
93D399433EA75E50656040CB /* Twitter.framework in Frameworks */, 93D399433EA75E50656040CB /* Twitter.framework in Frameworks */,
DA55878015E82C0300860B4F /* FacebookSDK.framework in Frameworks */,
DA4ECA2B160D94A80012ABB9 /* libTestFlight.a in Frameworks */, DA4ECA2B160D94A80012ABB9 /* libTestFlight.a in Frameworks */,
DA6701BA16406B0600B61001 /* FacebookSDK.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -2173,9 +2180,9 @@
DA3EE95B1601C06000C68F6D /* Facebook */ = { DA3EE95B1601C06000C68F6D /* Facebook */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
DA5587B715E838CD00860B4F /* DeprecatedHeaders */, DA6701DB16406B3600B61001 /* FacebookSDKResources.bundle */,
DA55878115E82C2B00860B4F /* FacebookSDKResources.bundle */, DA6701BB16406B1C00B61001 /* DeprecatedHeaders */,
DA55877F15E82C0300860B4F /* FacebookSDK.framework */, DA6701B916406B0600B61001 /* FacebookSDK.framework */,
); );
name = Facebook; name = Facebook;
sourceTree = "<group>"; sourceTree = "<group>";
@ -2302,47 +2309,6 @@
path = GTLPlus; path = GTLPlus;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
DA5587B715E838CD00860B4F /* DeprecatedHeaders */ = {
isa = PBXGroup;
children = (
DA5587B815E838CD00860B4F /* Facebook.h */,
DA5587B915E838CD00860B4F /* FacebookSDK.h */,
DA5587BA15E838CD00860B4F /* FBCacheDescriptor.h */,
DA5587BB15E838CD00860B4F /* FBConnect.h */,
DA5587BC15E838CD00860B4F /* FBDialog.h */,
DA5587BD15E838CD00860B4F /* FBError.h */,
DA5587BE15E838CD00860B4F /* FBFrictionlessRequestSettings.h */,
DA5587BF15E838CD00860B4F /* FBFriendPickerViewController.h */,
DA5587C015E838CD00860B4F /* FBGraphLocation.h */,
DA5587C115E838CD00860B4F /* FBGraphObject.h */,
DA5587C215E838CD00860B4F /* FBGraphPlace.h */,
DA5587C315E838CD00860B4F /* FBGraphUser.h */,
DA5587C415E838CD00860B4F /* FBLoginDialog.h */,
DA5587C515E838CD00860B4F /* FBLoginView.h */,
DA5587C615E838CD00860B4F /* FBOpenGraphAction.h */,
DA5587C715E838CD00860B4F /* FBPlacePickerViewController.h */,
DA5587C815E838CD00860B4F /* FBProfilePictureView.h */,
DA5587C915E838CD00860B4F /* FBRequest.h */,
DA5587CA15E838CD00860B4F /* FBRequestConnection.h */,
DA5587CB15E838CD00860B4F /* FBSession.h */,
DA5587CC15E838CD00860B4F /* FBSessionManualTokenCachingStrategy.h */,
DA5587CD15E838CD00860B4F /* FBSessionTokenCachingStrategy.h */,
DA5587CE15E838CD00860B4F /* FBSettings.h */,
DA5587CF15E838CD00860B4F /* FBTestSession.h */,
DA5587D015E838CD00860B4F /* FBUserSettingsViewController.h */,
DA5587D115E838CD00860B4F /* FBViewController.h */,
DA5587D215E838CD00860B4F /* JSON.h */,
DA5587D315E838CD00860B4F /* NSObject+SBJSON.h */,
DA5587D415E838CD00860B4F /* NSString+SBJSON.h */,
DA5587D515E838CD00860B4F /* SBJSON.h */,
DA5587D615E838CD00860B4F /* SBJsonBase.h */,
DA5587D715E838CD00860B4F /* SBJsonParser.h */,
DA5587D815E838CD00860B4F /* SBJsonWriter.h */,
);
name = DeprecatedHeaders;
path = "External/facebook-ios-sdk/build/FacebookSDK.framework/Versions/A/DeprecatedHeaders";
sourceTree = "<group>";
};
DA5587F715E8B7B200860B4F /* Google+ */ = { DA5587F715E8B7B200860B4F /* Google+ */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -2418,6 +2384,9 @@
DA5BFA47147E415C00F98B1E /* Frameworks */ = { DA5BFA47147E415C00F98B1E /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
DA6701DF16406BB400B61001 /* AdSupport.framework */,
DA6701DD16406B7300B61001 /* Social.framework */,
DA6701B716406A4100B61001 /* Accounts.framework */,
93D394077F8FAB8167647187 /* Twitter.framework */, 93D394077F8FAB8167647187 /* Twitter.framework */,
DAAC35DD156BD77D00C5FD93 /* CoreTelephony.framework */, DAAC35DD156BD77D00C5FD93 /* CoreTelephony.framework */,
DAD312C01552A20800A3F9ED /* libsqlite3.dylib */, DAD312C01552A20800A3F9ED /* libsqlite3.dylib */,
@ -2472,6 +2441,45 @@
path = MasterPassword; path = MasterPassword;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
DA6701BB16406B1C00B61001 /* DeprecatedHeaders */ = {
isa = PBXGroup;
children = (
DA6701BC16406B1C00B61001 /* Facebook.h */,
DA6701BD16406B1C00B61001 /* FacebookSDK.h */,
DA6701BE16406B1C00B61001 /* FBCacheDescriptor.h */,
DA6701BF16406B1C00B61001 /* FBConnect.h */,
DA6701C016406B1C00B61001 /* FBDialog.h */,
DA6701C116406B1C00B61001 /* FBError.h */,
DA6701C216406B1C00B61001 /* FBFrictionlessRequestSettings.h */,
DA6701C316406B1C00B61001 /* FBFriendPickerViewController.h */,
DA6701C416406B1C00B61001 /* FBGraphLocation.h */,
DA6701C516406B1C00B61001 /* FBGraphObject.h */,
DA6701C616406B1C00B61001 /* FBGraphPlace.h */,
DA6701C716406B1C00B61001 /* FBGraphUser.h */,
DA6701C816406B1C00B61001 /* FBLoginDialog.h */,
DA6701C916406B1C00B61001 /* FBLoginView.h */,
DA6701CA16406B1C00B61001 /* FBNativeDialogs.h */,
DA6701CB16406B1C00B61001 /* FBOpenGraphAction.h */,
DA6701CC16406B1C00B61001 /* FBPlacePickerViewController.h */,
DA6701CD16406B1C00B61001 /* FBProfilePictureView.h */,
DA6701CE16406B1C00B61001 /* FBRequest.h */,
DA6701CF16406B1C00B61001 /* FBRequestConnection.h */,
DA6701D016406B1C00B61001 /* FBSBJSON.h */,
DA6701D116406B1C00B61001 /* FBSBJsonBase.h */,
DA6701D216406B1C00B61001 /* FBSBJsonParser.h */,
DA6701D316406B1C00B61001 /* FBSBJsonWriter.h */,
DA6701D416406B1C00B61001 /* FBSession.h */,
DA6701D516406B1C00B61001 /* FBSessionManualTokenCachingStrategy.h */,
DA6701D616406B1C00B61001 /* FBSessionTokenCachingStrategy.h */,
DA6701D716406B1C00B61001 /* FBSettings.h */,
DA6701D816406B1C00B61001 /* FBTestSession.h */,
DA6701D916406B1C00B61001 /* FBUserSettingsViewController.h */,
DA6701DA16406B1C00B61001 /* FBViewController.h */,
);
name = DeprecatedHeaders;
path = "External/facebook-ios-sdk/build/FacebookSDK.framework/Versions/A/DeprecatedHeaders";
sourceTree = "<group>";
};
DA79A9BE1557DDC700BAA07A /* Products */ = { DA79A9BE1557DDC700BAA07A /* Products */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -4661,7 +4669,6 @@
DA46827015AB843200FB09E7 /* tip_basic_black_bottom_right@2x.png in Resources */, DA46827015AB843200FB09E7 /* tip_basic_black_bottom_right@2x.png in Resources */,
DAC4149215C53C48007A716E /* dictionary.lst in Resources */, DAC4149215C53C48007A716E /* dictionary.lst in Resources */,
DA55873F15E81D9E00860B4F /* iTunesArtwork-Rounded-73.png in Resources */, DA55873F15E81D9E00860B4F /* iTunesArtwork-Rounded-73.png in Resources */,
DA55878215E82C2B00860B4F /* FacebookSDKResources.bundle in Resources */,
DA5587EB15E83C3200860B4F /* social-facebook.png in Resources */, DA5587EB15E83C3200860B4F /* social-facebook.png in Resources */,
DA5587EC15E83C3200860B4F /* social-facebook@2x.png in Resources */, DA5587EC15E83C3200860B4F /* social-facebook@2x.png in Resources */,
DA5587ED15E83C3200860B4F /* social-google+.png in Resources */, DA5587ED15E83C3200860B4F /* social-google+.png in Resources */,
@ -4691,6 +4698,7 @@
DA3EE946160145C700C68F6D /* Default-568h.png in Resources */, DA3EE946160145C700C68F6D /* Default-568h.png in Resources */,
DA3EE947160145C700C68F6D /* Default-568h@2x.png in Resources */, DA3EE947160145C700C68F6D /* Default-568h@2x.png in Resources */,
DA4ECA2E160D94A80012ABB9 /* TestFlight.plist in Resources */, DA4ECA2E160D94A80012ABB9 /* TestFlight.plist in Resources */,
DA6701DC16406B3600B61001 /* FacebookSDKResources.bundle in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -5155,10 +5163,12 @@
ARCHS = armv7; ARCHS = armv7;
CLANG_WARN_CXX0X_EXTENSIONS = YES; CLANG_WARN_CXX0X_EXTENSIONS = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
CLANG_WARN_OBJCPP_ARC_ABI = YES; CLANG_WARN_OBJCPP_ARC_ABI = YES;
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@ -5216,10 +5226,12 @@
ARCHS = armv7; ARCHS = armv7;
CLANG_WARN_CXX0X_EXTENSIONS = YES; CLANG_WARN_CXX0X_EXTENSIONS = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
CLANG_WARN_OBJCPP_ARC_ABI = YES; CLANG_WARN_OBJCPP_ARC_ABI = YES;
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
@ -5370,10 +5382,12 @@
ARCHS = armv7; ARCHS = armv7;
CLANG_WARN_CXX0X_EXTENSIONS = YES; CLANG_WARN_CXX0X_EXTENSIONS = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
CLANG_WARN_OBJCPP_ARC_ABI = YES; CLANG_WARN_OBJCPP_ARC_ABI = YES;
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";

View File

@ -26,7 +26,7 @@ id<MPAlgorithm> MPAlgorithmForVersion(NSUInteger version) {
id<MPAlgorithm> algorithm = [versionToAlgorithm objectForKey:@(version)]; id<MPAlgorithm> algorithm = [versionToAlgorithm objectForKey:@(version)];
if (!algorithm) if (!algorithm)
if ((algorithm = [NSClassFromString(PearlString(@"MPAlgorithmV%u", version)) new])) if ((algorithm = [NSClassFromString(PearlString(@"MPAlgorithmV%lu", (unsigned long)version)) new]))
[versionToAlgorithm setObject:algorithm forKey:@(version)]; [versionToAlgorithm setObject:algorithm forKey:@(version)];
return algorithm; return algorithm;

View File

@ -6,10 +6,8 @@
// Copyright (c) 2011 Lyndir. All rights reserved. // Copyright (c) 2011 Lyndir. All rights reserved.
// //
#import <Crashlytics/Crashlytics.h>
#import "MPAppDelegate_Key.h" #import "MPAppDelegate_Key.h"
#import "MPAppDelegate_Store.h" #import "MPAppDelegate_Store.h"
#import "LocalyticsSession.h"
@implementation MPAppDelegate_Shared (Key) @implementation MPAppDelegate_Shared (Key)
@ -101,7 +99,9 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
// Migrate existing elements. // Migrate existing elements.
MPKey *recoverKey = nil; MPKey *recoverKey = nil;
#ifdef PEARL_UIKIT
PearlAlert *activityAlert = [PearlAlert showActivityWithTitle:PearlString(@"Migrating %d sites...", [user.elements count])]; PearlAlert *activityAlert = [PearlAlert showActivityWithTitle:PearlString(@"Migrating %d sites...", [user.elements count])];
#endif
for (MPElementEntity *element in user.elements) { for (MPElementEntity *element in user.elements) {
if (element.type & MPElementTypeClassStored && ![element contentUsingKey:tryKey]) { if (element.type & MPElementTypeClassStored && ![element contentUsingKey:tryKey]) {
@ -111,6 +111,8 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
while (!content) { while (!content) {
__block NSString *masterPassword = nil; __block NSString *masterPassword = nil;
#ifdef PEARL_UIKIT
dispatch_group_t recoverPasswordGroup = dispatch_group_create(); dispatch_group_t recoverPasswordGroup = dispatch_group_create();
dispatch_group_enter(recoverPasswordGroup); dispatch_group_enter(recoverPasswordGroup);
[PearlAlert showAlertWithTitle:@"Enter Old Master Password" [PearlAlert showAlertWithTitle:@"Enter Old Master Password"
@ -130,6 +132,7 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
} }
} cancelTitle:@"Don't Migrate" otherTitles:@"Migrate", nil]; } cancelTitle:@"Don't Migrate" otherTitles:@"Migrate", nil];
dispatch_group_wait(recoverPasswordGroup, DISPATCH_TIME_FOREVER); dispatch_group_wait(recoverPasswordGroup, DISPATCH_TIME_FOREVER);
#endif
if (!masterPassword) if (!masterPassword)
// Don't Migrate // Don't Migrate
@ -149,7 +152,9 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
} }
} }
[[MPAppDelegate_Shared get] saveContext]; [[MPAppDelegate_Shared get] saveContext];
#ifdef PEARL_UIKIT
[activityAlert dismissAlert]; [activityAlert dismissAlert];
#endif
} }
} }
@ -190,7 +195,9 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
#ifdef TESTFLIGHT_SDK_VERSION #ifdef TESTFLIGHT_SDK_VERSION
[TestFlight passCheckpoint:MPCheckpointSignInFailed]; [TestFlight passCheckpoint:MPCheckpointSignInFailed];
#endif #endif
#ifdef LOCALYTICS
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointSignInFailed attributes:nil]; [[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointSignInFailed attributes:nil];
#endif
} }
return NO; return NO;
@ -203,12 +210,14 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
} }
@try { @try {
if ([[MPiOSConfig get].sendInfo boolValue]) { if ([[MPConfig get].sendInfo boolValue]) {
#ifdef TESTFLIGHT_SDK_VERSION #ifdef TESTFLIGHT_SDK_VERSION
[TestFlight addCustomEnvironmentInformation:user.userID forKey:@"username"]; [TestFlight addCustomEnvironmentInformation:user.userID forKey:@"username"];
#endif #endif
#ifdef CRASHLYTICS
[Crashlytics setObjectValue:user.userID forKey:@"username"]; [Crashlytics setObjectValue:user.userID forKey:@"username"];
[Crashlytics setUserName:user.userID]; [Crashlytics setUserName:user.userID];
#endif
} }
} }
@catch (id exception) { @catch (id exception) {
@ -227,7 +236,9 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
#ifdef TESTFLIGHT_SDK_VERSION #ifdef TESTFLIGHT_SDK_VERSION
[TestFlight passCheckpoint:MPCheckpointSignedIn]; [TestFlight passCheckpoint:MPCheckpointSignedIn];
#endif #endif
#ifdef LOCALYTICS
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointSignedIn attributes:nil]; [[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointSignedIn attributes:nil];
#endif
return YES; return YES;
} }

View File

@ -7,7 +7,6 @@
// //
#import "MPAppDelegate_Store.h" #import "MPAppDelegate_Store.h"
#import "LocalyticsSession.h"
@implementation MPAppDelegate_Shared (Store) @implementation MPAppDelegate_Shared (Store)
@ -136,9 +135,11 @@
#ifdef TESTFLIGHT_SDK_VERSION #ifdef TESTFLIGHT_SDK_VERSION
[TestFlight passCheckpoint:iCloudEnabled? MPCheckpointCloudEnabled: MPCheckpointCloudDisabled]; [TestFlight passCheckpoint:iCloudEnabled? MPCheckpointCloudEnabled: MPCheckpointCloudDisabled];
#endif #endif
#ifdef LOCALYTICS
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointCloud attributes:@{ [[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointCloud attributes:@{
@"enabled": iCloudEnabled? @"YES": @"NO" @"enabled": iCloudEnabled? @"YES": @"NO"
}]; }];
#endif
[MPConfig get].iCloud = @(iCloudEnabled); [MPConfig get].iCloud = @(iCloudEnabled);
} }
@ -151,11 +152,13 @@
#ifdef TESTFLIGHT_SDK_VERSION #ifdef TESTFLIGHT_SDK_VERSION
[TestFlight passCheckpoint:PearlString(MPCheckpointMPErrorUbiquity @"_%d", cause)]; [TestFlight passCheckpoint:PearlString(MPCheckpointMPErrorUbiquity @"_%d", cause)];
#endif #endif
#ifdef LOCALYTICS
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointMPErrorUbiquity attributes:@{ [[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointMPErrorUbiquity attributes:@{
@"cause": @(cause), @"cause": @(cause),
@"error.domain": error.domain, @"error.domain": error.domain,
@"error.code": @(error.code) @"error.code": @(error.code)
}]; }];
#endif
switch (cause) { switch (cause) {
case UbiquityStoreManagerErrorCauseDeleteStore: case UbiquityStoreManagerErrorCauseDeleteStore:
@ -172,7 +175,9 @@
#ifdef TESTFLIGHT_SDK_VERSION #ifdef TESTFLIGHT_SDK_VERSION
[TestFlight passCheckpoint:MPCheckpointLocalStoreReset]; [TestFlight passCheckpoint:MPCheckpointLocalStoreReset];
#endif #endif
#ifdef LOCALYTICS
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointLocalStoreReset attributes:nil]; [[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointLocalStoreReset attributes:nil];
#endif
manager.hardResetEnabled = YES; manager.hardResetEnabled = YES;
[manager hardResetLocalStorage]; [manager hardResetLocalStorage];
@ -190,7 +195,9 @@
#ifdef TESTFLIGHT_SDK_VERSION #ifdef TESTFLIGHT_SDK_VERSION
[TestFlight passCheckpoint:MPCheckpointCloudStoreReset]; [TestFlight passCheckpoint:MPCheckpointCloudStoreReset];
#endif #endif
#ifdef LOCALYTICS
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointCloudStoreReset attributes:nil]; [[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointCloudStoreReset attributes:nil];
#endif
manager.hardResetEnabled = YES; manager.hardResetEnabled = YES;
[manager hardResetCloudStorage]; [manager hardResetCloudStorage];
break; break;
@ -276,7 +283,7 @@
return MPImportResultInternalError; return MPImportResultInternalError;
} }
if ([users count] > 1) { if ([users count] > 1) {
err(@"While looking for user: %@, found more than one: %u", importUserName, [users count]); err(@"While looking for user: %@, found more than one: %lu", importUserName, (unsigned long)[users count]);
return MPImportResultInternalError; return MPImportResultInternalError;
} }
@ -337,7 +344,7 @@
} }
// Ask for confirmation to import these sites and the master password of the user. // Ask for confirmation to import these sites and the master password of the user.
inf(@"Importing %u sites, deleting %u sites, for user: %@", [importedSiteElements count], [elementsToDelete count], [MPUserEntity idFor:importUserName]); inf(@"Importing %lu sites, deleting %lu sites, for user: %@", (unsigned long)[importedSiteElements count], (unsigned long)[elementsToDelete count], [MPUserEntity idFor:importUserName]);
NSString *userMasterPassword = userPassword(user.name, [importedSiteElements count], [elementsToDelete count]); NSString *userMasterPassword = userPassword(user.name, [importedSiteElements count], [elementsToDelete count]);
if (!userMasterPassword) { if (!userMasterPassword) {
inf(@"Import cancelled."); inf(@"Import cancelled.");
@ -424,7 +431,9 @@
#ifdef TESTFLIGHT_SDK_VERSION #ifdef TESTFLIGHT_SDK_VERSION
[TestFlight passCheckpoint:MPCheckpointSitesImported]; [TestFlight passCheckpoint:MPCheckpointSitesImported];
#endif #endif
#ifdef LOCALYTICS
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointSitesImported attributes:nil]; [[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointSitesImported attributes:nil];
#endif
return MPImportResultSuccess; return MPImportResultSuccess;
} }
@ -480,16 +489,18 @@
content = element.exportContent; content = element.exportContent;
} }
[export appendFormat:@"%@ %8d %8s %20s\t%@\n", [export appendFormat:@"%@ %8ld %8s %20s\t%@\n",
[[NSDateFormatter rfc3339DateFormatter] stringFromDate:lastUsed], uses, [[NSDateFormatter rfc3339DateFormatter] stringFromDate:lastUsed], (long)uses,
[PearlString(@"%u:%u", type, version) UTF8String], [name UTF8String], content [PearlString(@"%u:%lu", type, (unsigned long)version) UTF8String], [name UTF8String], content
? content: @""]; ? content: @""];
} }
#ifdef TESTFLIGHT_SDK_VERSION #ifdef TESTFLIGHT_SDK_VERSION
[TestFlight passCheckpoint:MPCheckpointSitesExported]; [TestFlight passCheckpoint:MPCheckpointSitesExported];
#endif #endif
#ifdef LOCALYTICS
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointSitesExported attributes:nil]; [[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointSitesExported attributes:nil];
#endif
return export; return export;
} }

View File

@ -10,6 +10,7 @@
@interface MPConfig : PearlConfig @interface MPConfig : PearlConfig
@property (nonatomic, retain) NSNumber *sendInfo;
@property (nonatomic, retain) NSNumber *rememberLogin; @property (nonatomic, retain) NSNumber *rememberLogin;
@property (nonatomic, retain) NSNumber *iCloud; @property (nonatomic, retain) NSNumber *iCloud;

View File

@ -6,10 +6,11 @@
// Copyright (c) 2012 Lyndir. All rights reserved. // Copyright (c) 2012 Lyndir. All rights reserved.
// //
#import "MPConfig.h"
#import "MPAppDelegate.h" #import "MPAppDelegate.h"
@implementation MPConfig @implementation MPConfig
@dynamic rememberLogin, iCloud, iCloudDecided; @dynamic sendInfo, rememberLogin, iCloud, iCloudDecided;
- (id)init { - (id)init {
@ -18,6 +19,7 @@
[self.defaults registerDefaults:@{NSStringFromSelector(@selector(askForReviews)): @YES, [self.defaults registerDefaults:@{NSStringFromSelector(@selector(askForReviews)): @YES,
NSStringFromSelector(@selector(sendInfo)): @NO,
NSStringFromSelector(@selector(rememberLogin)): @NO, NSStringFromSelector(@selector(rememberLogin)): @NO,
NSStringFromSelector(@selector(iCloud)): @NO, NSStringFromSelector(@selector(iCloud)): @NO,
NSStringFromSelector(@selector(iCloudDecided)): @NO}]; NSStringFromSelector(@selector(iCloudDecided)): @NO}];

View File

@ -132,8 +132,8 @@
- (NSString *)debugDescription { - (NSString *)debugDescription {
return PearlString(@"{%@: name=%@, user=%@, type=%d, uses=%d, lastUsed=%@, version=%d, loginName=%@, requiresExplicitMigration=%d}", return PearlString(@"{%@: name=%@, user=%@, type=%d, uses=%ld, lastUsed=%@, version=%ld, loginName=%@, requiresExplicitMigration=%d}",
NSStringFromClass([self class]), self.name, self.user.name, self.type, self.uses, self.lastUsed, self.version, NSStringFromClass([self class]), self.name, self.user.name, self.type, (long)self.uses, self.lastUsed, (long)self.version,
self.loginName, self.requiresExplicitMigration); self.loginName, self.requiresExplicitMigration);
} }
@ -141,9 +141,9 @@
while (self.version < MPAlgorithmDefaultVersion) while (self.version < MPAlgorithmDefaultVersion)
if ([MPAlgorithmForVersion(self.version + 1) migrateElement:self explicit:explicit]) if ([MPAlgorithmForVersion(self.version + 1) migrateElement:self explicit:explicit])
inf(@"%@ migration to version: %d succeeded for element: %@", explicit? @"Explicit": @"Automatic", self.version + 1, self); inf(@"%@ migration to version: %ld succeeded for element: %@", explicit? @"Explicit": @"Automatic", (long)self.version + 1, self);
else { else {
wrn(@"%@ migration to version: %d failed for element: %@", explicit? @"Explicit": @"Automatic", self.version + 1, self); wrn(@"%@ migration to version: %ld failed for element: %@", explicit? @"Explicit": @"Automatic", (long)self.version + 1, self);
return NO; return NO;
} }

View File

@ -68,7 +68,7 @@ typedef enum {
#define MPCheckpointAppGorillas @"MPCheckpointAppGorillas" #define MPCheckpointAppGorillas @"MPCheckpointAppGorillas"
#define MPCheckpointAppDeBlock @"MPCheckpointAppDeBlock" #define MPCheckpointAppDeBlock @"MPCheckpointAppDeBlock"
#define MPNotificationSignedIn @"MPNotificationKeySet" #define MPNotificationSignedIn @"MPNotificationSignedIn"
#define MPNotificationSignedOut @"MPNotificationKeyUnset" #define MPNotificationSignedOut @"MPNotificationSignedOut"
#define MPNotificationKeyForgotten @"MPNotificationKeyForgotten" #define MPNotificationKeyForgotten @"MPNotificationKeyForgotten"
#define MPNotificationElementUpdated @"MPNotificationElementUpdated" #define MPNotificationElementUpdated @"MPNotificationElementUpdated"

View File

@ -12,18 +12,22 @@
@interface MPAppDelegate : MPAppDelegate_Shared<NSApplicationDelegate> @interface MPAppDelegate : MPAppDelegate_Shared<NSApplicationDelegate>
@property (strong) NSStatusItem *statusItem; @property (nonatomic, strong) NSStatusItem *statusItem;
@property (strong) MPPasswordWindowController *passwordWindow; @property (nonatomic, strong) MPPasswordWindowController *passwordWindow;
@property (weak) IBOutlet NSMenuItem *lockItem; @property (nonatomic, weak) IBOutlet NSMenuItem *lockItem;
@property (weak) IBOutlet NSMenuItem *showItem; @property (nonatomic, weak) IBOutlet NSMenuItem *showItem;
@property (strong) IBOutlet NSMenu *statusMenu; @property (nonatomic, strong) IBOutlet NSMenu *statusMenu;
@property (weak) IBOutlet NSMenuItem *useICloudItem; @property (nonatomic, weak) IBOutlet NSMenuItem *useICloudItem;
@property (weak) IBOutlet NSMenuItem *rememberPasswordItem; @property (nonatomic, weak) IBOutlet NSMenuItem *rememberPasswordItem;
@property (weak) IBOutlet NSMenuItem *savePasswordItem; @property (nonatomic, weak) IBOutlet NSMenuItem *savePasswordItem;
@property (nonatomic, weak) IBOutlet NSMenuItem *createUserItem;
@property (nonatomic, weak) IBOutlet NSMenuItem *usersItem;
+ (MPAppDelegate *)get; + (MPAppDelegate *)get;
- (IBAction)activate:(id)sender; - (IBAction)activate:(id)sender;
- (IBAction)togglePreference:(NSMenuItem *)sender; - (IBAction)togglePreference:(NSMenuItem *)sender;
- (IBAction)newUser:(NSMenuItem *)sender;
- (IBAction)signOut:(id)sender;
@end @end

View File

@ -25,7 +25,6 @@
@synthesize passwordWindow; @synthesize passwordWindow;
@synthesize key; @synthesize key;
@synthesize keyID;
#pragma clang diagnostic push #pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wfour-char-constants" #pragma clang diagnostic ignored "-Wfour-char-constants"
@ -37,7 +36,7 @@ static EventHotKeyID MPShowHotKey = {.signature = 'show', .id = 1};
[MPConfig get]; [MPConfig get];
#ifdef DEBUG #ifdef DEBUG
[PearlLogger get].autoprintLevel = PearlLogLevelTrace; [PearlLogger get].printLevel = PearlLogLevelTrace;
#endif #endif
} }
@ -62,10 +61,56 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
return eventNotHandledErr; return eventNotHandledErr;
} }
- (void)updateUsers {
[[[self.usersItem submenu] itemArray] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (idx > 1)
[[self.usersItem submenu] removeItemAtIndex:(NSInteger)idx];
}];
NSManagedObjectContext *moc = [MPAppDelegate managedObjectContextIfReady];
if (!moc) {
[self.createUserItem setEnabled:NO];
[[self.usersItem.submenu addItemWithTitle:@"Loading..." action:NULL keyEquivalent:@""] setEnabled:NO];
return;
}
[self.createUserItem setEnabled:YES];
[moc performBlockAndWait:^{
NSArray *users = nil;
NSError *error = nil;
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([MPUserEntity class])];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"lastUsed" ascending:NO]];
users = [moc executeFetchRequest:fetchRequest error:&error];
if (!users)
err(@"Failed to load users: %@", error);
for (MPUserEntity *user in users) {
NSMenuItem *userItem = [[NSMenuItem alloc] initWithTitle:user.name action:@selector(selectUser:) keyEquivalent:@""];
[userItem setTarget:self];
[userItem setRepresentedObject:user];
[[self.usersItem submenu] addItem:userItem];
}
}];
}
- (void)selectUser:(NSMenuItem *)item {
NSAssert1([[item representedObject] isKindOfClass:[MPUserEntity class]], @"Not a user: %@", item.representedObject);
self.activeUser = item.representedObject;
[[[self.usersItem submenu] itemArray] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[obj setState:NSOffState];
}];
item.state = NSOnState;
}
- (void)showMenu { - (void)showMenu {
self.rememberPasswordItem.state = [[MPConfig get].rememberKey boolValue]? NSOnState: NSOffState; self.rememberPasswordItem.state = [[MPConfig get].rememberLogin boolValue]? NSOnState: NSOffState;
self.savePasswordItem.state = [[MPConfig get].saveKey boolValue]? NSOnState: NSOffState; self.savePasswordItem.state = [MPAppDelegate get].activeUser.saveKey? NSOnState: NSOffState;
self.showItem.enabled = ![self.passwordWindow.window isVisible]; self.showItem.enabled = ![self.passwordWindow.window isVisible];
[self.statusItem popUpStatusItemMenu:self.statusMenu]; [self.statusItem popUpStatusItemMenu:self.statusMenu];
@ -84,17 +129,25 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
if (sender == useICloudItem) if (sender == useICloudItem)
[self.storeManager useiCloudStore:sender.state == NSOffState alertUser:YES]; [self.storeManager useiCloudStore:sender.state == NSOffState alertUser:YES];
if (sender == rememberPasswordItem) if (sender == rememberPasswordItem)
[MPConfig get].rememberKey = [NSNumber numberWithBool:![[MPConfig get].rememberKey boolValue]]; [MPConfig get].rememberLogin = [NSNumber numberWithBool:![[MPConfig get].rememberLogin boolValue]];
if (sender == savePasswordItem) if (sender == savePasswordItem)
[MPConfig get].saveKey = [NSNumber numberWithBool:![[MPConfig get].saveKey boolValue]]; [MPAppDelegate get].activeUser.saveKey = ![MPAppDelegate get].activeUser.saveKey;
}
- (IBAction)newUser:(NSMenuItem *)sender {
}
- (IBAction)signOut:(id)sender {
[self signOutAnimated:YES];
} }
- (void)didUpdateConfigForKey:(SEL)configKey fromValue:(id)oldValue { - (void)didUpdateConfigForKey:(SEL)configKey fromValue:(id)oldValue {
if (configKey == @selector(rememberKey)) if (configKey == @selector(rememberLogin))
self.rememberPasswordItem.state = [[MPConfig get].rememberKey boolValue]? NSOnState: NSOffState; self.rememberPasswordItem.state = [[MPConfig get].rememberLogin boolValue]? NSOnState: NSOffState;
if (configKey == @selector(saveKey)) if (configKey == @selector(saveKey))
self.savePasswordItem.state = [[MPConfig get].saveKey boolValue]? NSOnState: NSOffState; self.savePasswordItem.state = [MPAppDelegate get].activeUser.saveKey? NSOnState: NSOffState;
} }
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
@ -111,7 +164,7 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window { - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
return [[self managedObjectContext] undoManager]; return [[self managedObjectContextIfReady] undoManager];
} }
#pragma mark - NSApplicationDelegate #pragma mark - NSApplicationDelegate
@ -132,6 +185,16 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
self.statusItem.highlightMode = YES; self.statusItem.highlightMode = YES;
self.statusItem.target = self; self.statusItem.target = self;
self.statusItem.action = @selector(showMenu); self.statusItem.action = @selector(showMenu);
[[NSNotificationCenter defaultCenter] addObserverForName:PersistentStoreDidChange object:nil queue:nil usingBlock:
^(NSNotification *note) {
[self updateUsers];
}];
[[NSNotificationCenter defaultCenter] addObserverForName:PersistentStoreDidMergeChanges object:nil queue:nil usingBlock:
^(NSNotification *note) {
[self updateUsers];
}];
[self updateUsers];
// Global hotkey. // Global hotkey.
EventHotKeyRef hotKeyRef; EventHotKeyRef hotKeyRef;
@ -163,28 +226,28 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
- (void)applicationWillResignActive:(NSNotification *)notification { - (void)applicationWillResignActive:(NSNotification *)notification {
if (![[MPConfig get].rememberKey boolValue]) if (![[MPConfig get].rememberLogin boolValue])
self.key = nil; self.key = nil;
} }
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
// Save changes in the application's managed object context before the application terminates. // Save changes in the application's managed object context before the application terminates.
if (![self managedObjectContext]) { if (![self managedObjectContextIfReady]) {
return NSTerminateNow; return NSTerminateNow;
} }
if (![[self managedObjectContext] commitEditing]) { if (![[self managedObjectContextIfReady] commitEditing]) {
NSLog(@"%@:%@ unable to commit editing to terminate", [self class], NSStringFromSelector(_cmd)); NSLog(@"%@:%@ unable to commit editing to terminate", [self class], NSStringFromSelector(_cmd));
return NSTerminateCancel; return NSTerminateCancel;
} }
if (![[self managedObjectContext] hasChanges]) { if (![[self managedObjectContextIfReady] hasChanges]) {
return NSTerminateNow; return NSTerminateNow;
} }
NSError *error = nil; NSError *error = nil;
if (![[self managedObjectContext] save:&error]) { if (![[self managedObjectContextIfReady] save:&error]) {
// Customize this code block to include application-specific recovery steps. // Customize this code block to include application-specific recovery steps.
BOOL result = [sender presentError:error]; BOOL result = [sender presentError:error];
@ -215,9 +278,48 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
#pragma mark - UbiquityStoreManagerDelegate #pragma mark - UbiquityStoreManagerDelegate
- (void)ubiquityStoreManager:(UbiquityStoreManager *)manager didSwitchToiCloud:(BOOL)iCloudEnabled { - (void)ubiquityStoreManager:(UbiquityStoreManager *)manager didSwitchToiCloud:(BOOL)iCloudEnabled {
[super ubiquityStoreManager:manager didSwitchToiCloud:iCloudEnabled];
self.useICloudItem.state = iCloudEnabled? NSOnState: NSOffState; self.useICloudItem.state = iCloudEnabled? NSOnState: NSOffState;
self.useICloudItem.enabled = !iCloudEnabled; self.useICloudItem.enabled = !iCloudEnabled;
if (![[MPConfig get].iCloudDecided boolValue]) {
if (iCloudEnabled)
return;
switch ([[NSAlert alertWithMessageText:@"iCloud Is Disabled"
defaultButton:@"Enable iCloud" alternateButton:@"Leave iCloud Off" otherButton:@"Explain?"
informativeTextWithFormat:@"It is highly recommended you enable iCloud."] runModal]) {
case NSAlertDefaultReturn: {
[MPConfig get].iCloudDecided = @YES;
[manager useiCloudStore:YES alertUser:NO];
break;
}
case NSAlertOtherReturn: {
[[NSAlert alertWithMessageText:@"About iCloud"
defaultButton:[PearlStrings get].commonButtonThanks alternateButton:nil otherButton:nil
informativeTextWithFormat:
@"iCloud is Apple's solution for saving your data in \"the cloud\" "
@"and making sure your other iPhones, iPads and Macs are in sync.\n\n"
@"For Master Password, that means your sites are available on all your "
@"Apple devices, and you always have a backup of them in case "
@"you loose one or need to restore.\n\n"
@"Because of the way Master Password works, it doesn't need to send your "
@"site's passwords to Apple. Only their names are saved to make it easier "
@"for you to find the site you need. For some sites you may have set "
@"a user-specified password: these are sent to iCloud after being encrypted "
@"with your master password.\n\n"
@"Apple can never see any of your passwords."] runModal];
[self ubiquityStoreManager:manager didSwitchToiCloud:iCloudEnabled];
break;
}
default:
break;
};
}
} }
@end @end

View File

@ -0,0 +1,15 @@
//
// MPConfig.h
// MasterPassword
//
// Created by Maarten Billemont on 02/01/12.
// Copyright (c) 2012 Lyndir. All rights reserved.
//
#import "MPConfig.h"
@interface MPMacConfig : MPConfig
+ (MPMacConfig *)get;
@end

View File

@ -0,0 +1,26 @@
//
// MPConfig.m
// MasterPassword
//
// Created by Maarten Billemont on 02/01/12.
// Copyright (c) 2012 Lyndir. All rights reserved.
//
@implementation MPMacConfig
- (id)init {
if (!(self = [super init]))
return self;
[self.defaults registerDefaults:@{NSStringFromSelector(@selector(iTunesID)): @"510296984"}];
return self;
}
+ (MPMacConfig *)get {
return (MPMacConfig *)[super get];
}
@end

View File

@ -13,11 +13,13 @@
NSString *_content; NSString *_content;
} }
@property (strong) NSString *content; @property (nonatomic, strong) NSString *content;
@property (weak) IBOutlet NSTextField *siteField; @property (nonatomic, weak) IBOutlet NSTextField *siteField;
@property (weak) IBOutlet NSTextField *contentField; @property (nonatomic, weak) IBOutlet NSTextField *contentField;
@property (weak) IBOutlet NSTextField *tipField; @property (nonatomic, weak) IBOutlet NSTextField *tipField;
@property (nonatomic, weak) IBOutlet NSView *contentContainer;
@property (nonatomic, weak) IBOutlet NSProgressIndicator *progressView;
- (void)unlock; - (void)unlock;

View File

@ -58,9 +58,9 @@
- (void)unlock { - (void)unlock {
if (![MPAppDelegate get].key) if ([[MPAppDelegate get] signInAsUser:[MPAppDelegate get].activeUser usingMasterPassword:nil])
// Try and load the key from the keychain. // Load the key from the keychain.
[[MPAppDelegate get] loadStoredKey]; return;
if (![MPAppDelegate get].key) if (![MPAppDelegate get].key)
// Ask the user to set the key through his master password. // Ask the user to set the key through his master password.
@ -69,8 +69,8 @@
return; return;
NSAlert *alert = [NSAlert alertWithMessageText:@"Master Password is locked." NSAlert *alert = [NSAlert alertWithMessageText:@"Master Password is locked."
defaultButton:@"Unlock" alternateButton:@"Change" otherButton:@"Quit" defaultButton:@"Unlock" alternateButton:@"Change" otherButton:@"Cancel"
informativeTextWithFormat:@"Your master password is required to unlock the application."]; informativeTextWithFormat:@"The master password is required to unlock the application for:\n\n%@", [MPAppDelegate get].activeUser.name];
NSSecureTextField *passwordField = [[NSSecureTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 22)]; NSSecureTextField *passwordField = [[NSSecureTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 22)];
[alert setAccessoryView:passwordField]; [alert setAccessoryView:passwordField];
[alert layout]; [alert layout];
@ -94,17 +94,31 @@
@"You can always change back to your current master password later.\n" @"You can always change back to your current master password later.\n"
@"Your current sites and passwords will then become available again."] runModal] @"Your current sites and passwords will then become available again."] runModal]
== 1) == 1)
[[MPAppDelegate get] forgetKey]; [[MPAppDelegate get] forgetSavedKeyFor:[MPAppDelegate get].activeUser];
break; break;
case NSAlertOtherReturn: case NSAlertOtherReturn:
// "Quit" button. // "Cancel" button.
[[NSApplication sharedApplication] terminate:self]; [self.window close];
return; return;
case NSAlertDefaultReturn: case NSAlertDefaultReturn: {
// "Unlock" button. // "Unlock" button.
[[MPAppDelegate get] tryMasterPassword:[(NSSecureTextField *)alert.accessoryView stringValue]]; self.contentContainer.alphaValue = 0;
[self.progressView startAnimation:nil];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
BOOL success = [[MPAppDelegate get] signInAsUser:[MPAppDelegate get].activeUser usingMasterPassword:[(NSSecureTextField *)alert.accessoryView stringValue]];
dispatch_async(dispatch_get_main_queue(), ^{
[self.progressView stopAnimation:nil];
if (success)
self.contentContainer.alphaValue = 1;
else
[self.window close];
});
});
}
} }
} }
@ -112,7 +126,7 @@
forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index { forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index {
NSString *query = [[control stringValue] substringWithRange:charRange]; NSString *query = [[control stringValue] substringWithRange:charRange];
if (![query length] || ![MPAppDelegate get].keyID) if (![query length] || ![MPAppDelegate get].key)
return nil; return nil;
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([MPElementEntity class])]; NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([MPElementEntity class])];
@ -121,7 +135,7 @@
query, query, [MPAppDelegate get].activeUser]; query, query, [MPAppDelegate get].activeUser];
NSError *error = nil; NSError *error = nil;
self.siteResults = [[MPAppDelegate managedObjectContext] executeFetchRequest:fetchRequest error:&error]; self.siteResults = [[MPAppDelegate managedObjectContextIfReady] executeFetchRequest:fetchRequest error:&error];
if (error) if (error)
err(@"Couldn't fetch elements: %@", error); err(@"Couldn't fetch elements: %@", error);

File diff suppressed because it is too large Load Diff

View File

@ -29,7 +29,7 @@
<key>LSUIElement</key> <key>LSUIElement</key>
<true/> <true/>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string>Copyright © 2012 Lyndir. All rights reserved.</string> <string>Copyright © 2011-2013 Lyndir. All rights reserved.</string>
<key>NSMainNibFile</key> <key>NSMainNibFile</key>
<string>MainMenu</string> <string>MainMenu</string>
<key>NSPrincipalClass</key> <key>NSPrincipalClass</key>

View File

@ -2,12 +2,16 @@
// Prefix header for all source files of the 'MasterPassword' target in the 'MasterPassword' project // Prefix header for all source files of the 'MasterPassword' target in the 'MasterPassword' project
// //
#import "Pearl-Prefix.pch"
#ifdef __OBJC__ #ifdef __OBJC__
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
#import <Foundation/Foundation.h>
#endif #import <CoreData/CoreData.h>
#import "Pearl-Prefix.pch"
#import "MPTypes.h" #import "MPTypes.h"
#import "MPMacConfig.h"
#endif

View File

@ -2,18 +2,18 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00"> <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
<data> <data>
<int key="IBDocument.SystemTarget">1070</int> <int key="IBDocument.SystemTarget">1070</int>
<string key="IBDocument.SystemVersion">11D50</string> <string key="IBDocument.SystemVersion">12C60</string>
<string key="IBDocument.InterfaceBuilderVersion">2182</string> <string key="IBDocument.InterfaceBuilderVersion">2840</string>
<string key="IBDocument.AppKitVersion">1138.32</string> <string key="IBDocument.AppKitVersion">1187.34</string>
<string key="IBDocument.HIToolboxVersion">568.00</string> <string key="IBDocument.HIToolboxVersion">625.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions"> <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="NS.object.0">2182</string> <string key="NS.object.0">2840</string>
</object> </object>
<array key="IBDocument.IntegratedClassDependencies"> <array key="IBDocument.IntegratedClassDependencies">
<string>NSMenuItem</string>
<string>NSMenu</string>
<string>NSCustomObject</string> <string>NSCustomObject</string>
<string>NSMenu</string>
<string>NSMenuItem</string>
<string>NSUserDefaultsController</string> <string>NSUserDefaultsController</string>
</array> </array>
<array key="IBDocument.PluginDependencies"> <array key="IBDocument.PluginDependencies">
@ -61,6 +61,38 @@
<string key="NSResourceName">NSMenuMixedState</string> <string key="NSResourceName">NSMenuMixedState</string>
</object> </object>
</object> </object>
<object class="NSMenuItem" id="11982480">
<reference key="NSMenu" ref="764588027"/>
<string key="NSTitle">Users</string>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="552246001"/>
<reference key="NSMixedImage" ref="752047669"/>
<string key="NSAction">submenuAction:</string>
<object class="NSMenu" key="NSSubmenu" id="934187555">
<string key="NSTitle">Users</string>
<array class="NSMutableArray" key="NSMenuItems">
<object class="NSMenuItem" id="576787569">
<reference key="NSMenu" ref="934187555"/>
<string key="NSTitle">New User</string>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="552246001"/>
<reference key="NSMixedImage" ref="752047669"/>
</object>
<object class="NSMenuItem" id="925131766">
<reference key="NSMenu" ref="934187555"/>
<bool key="NSIsDisabled">YES</bool>
<bool key="NSIsSeparator">YES</bool>
<string key="NSTitle"/>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="552246001"/>
<reference key="NSMixedImage" ref="752047669"/>
</object>
</array>
</object>
</object>
<object class="NSMenuItem" id="851296005"> <object class="NSMenuItem" id="851296005">
<reference key="NSMenu" ref="764588027"/> <reference key="NSMenu" ref="764588027"/>
<string key="NSTitle">Preferences</string> <string key="NSTitle">Preferences</string>
@ -286,6 +318,30 @@
</object> </object>
<int key="connectionID">754</int> <int key="connectionID">754</int>
</object> </object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">newUser:</string>
<reference key="source" ref="976324537"/>
<reference key="destination" ref="576787569"/>
</object>
<int key="connectionID">761</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">usersItem</string>
<reference key="source" ref="976324537"/>
<reference key="destination" ref="11982480"/>
</object>
<int key="connectionID">762</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">createUserItem</string>
<reference key="source" ref="976324537"/>
<reference key="destination" ref="576787569"/>
</object>
<int key="connectionID">763</int>
</object>
</array> </array>
<object class="IBMutableOrderedSet" key="objectRecords"> <object class="IBMutableOrderedSet" key="objectRecords">
<array key="orderedObjects"> <array key="orderedObjects">
@ -338,6 +394,7 @@
<reference ref="846612332"/> <reference ref="846612332"/>
<reference ref="229948989"/> <reference ref="229948989"/>
<reference ref="851296005"/> <reference ref="851296005"/>
<reference ref="11982480"/>
</array> </array>
<reference key="parent" ref="0"/> <reference key="parent" ref="0"/>
</object> </object>
@ -412,6 +469,33 @@
<reference key="object" ref="123831322"/> <reference key="object" ref="123831322"/>
<reference key="parent" ref="800575174"/> <reference key="parent" ref="800575174"/>
</object> </object>
<object class="IBObjectRecord">
<int key="objectID">755</int>
<reference key="object" ref="11982480"/>
<array class="NSMutableArray" key="children">
<reference ref="934187555"/>
</array>
<reference key="parent" ref="764588027"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">756</int>
<reference key="object" ref="934187555"/>
<array class="NSMutableArray" key="children">
<reference ref="576787569"/>
<reference ref="925131766"/>
</array>
<reference key="parent" ref="11982480"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">757</int>
<reference key="object" ref="576787569"/>
<reference key="parent" ref="934187555"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">759</int>
<reference key="object" ref="925131766"/>
<reference key="parent" ref="934187555"/>
</object>
</array> </array>
</object> </object>
<dictionary class="NSMutableDictionary" key="flattenedProperties"> <dictionary class="NSMutableDictionary" key="flattenedProperties">
@ -434,21 +518,25 @@
<string key="746.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> <string key="746.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="747.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> <string key="747.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="748.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> <string key="748.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="755.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="756.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="757.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="759.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
</dictionary> </dictionary>
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/> <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
<nil key="activeLocalization"/> <nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/> <dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/> <nil key="sourceID"/>
<int key="maxID">754</int> <int key="maxID">763</int>
</object> </object>
<object class="IBClassDescriber" key="IBDocument.Classes"> <object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions"> <array class="NSMutableArray" key="referencedPartialClassDescriptions">
<object class="IBPartialClassDescription"> <object class="IBPartialClassDescription">
<string key="className">MPAppDelegate</string> <string key="className">MPAppDelegate</string>
<string key="superclassName">NSObject</string> <string key="superclassName">MPAppDelegate_Shared</string>
<dictionary class="NSMutableDictionary" key="actions"> <dictionary class="NSMutableDictionary" key="actions">
<string key="activate:">id</string> <string key="activate:">id</string>
<string key="signOut:">id</string> <string key="newUser:">NSMenuItem</string>
<string key="togglePreference:">NSMenuItem</string> <string key="togglePreference:">NSMenuItem</string>
</dictionary> </dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName"> <dictionary class="NSMutableDictionary" key="actionInfosByName">
@ -456,9 +544,9 @@
<string key="name">activate:</string> <string key="name">activate:</string>
<string key="candidateClassName">id</string> <string key="candidateClassName">id</string>
</object> </object>
<object class="IBActionInfo" key="signOut:"> <object class="IBActionInfo" key="newUser:">
<string key="name">signOut:</string> <string key="name">newUser:</string>
<string key="candidateClassName">id</string> <string key="candidateClassName">NSMenuItem</string>
</object> </object>
<object class="IBActionInfo" key="togglePreference:"> <object class="IBActionInfo" key="togglePreference:">
<string key="name">togglePreference:</string> <string key="name">togglePreference:</string>
@ -467,17 +555,23 @@
</dictionary> </dictionary>
<dictionary class="NSMutableDictionary" key="outlets"> <dictionary class="NSMutableDictionary" key="outlets">
<string key="lockItem">NSMenuItem</string> <string key="lockItem">NSMenuItem</string>
<string key="newUserItem">NSMenuItem</string>
<string key="rememberPasswordItem">NSMenuItem</string> <string key="rememberPasswordItem">NSMenuItem</string>
<string key="savePasswordItem">NSMenuItem</string> <string key="savePasswordItem">NSMenuItem</string>
<string key="showItem">NSMenuItem</string> <string key="showItem">NSMenuItem</string>
<string key="statusMenu">NSMenu</string> <string key="statusMenu">NSMenu</string>
<string key="useICloudItem">NSMenuItem</string> <string key="useICloudItem">NSMenuItem</string>
<string key="usersItem">NSMenuItem</string>
</dictionary> </dictionary>
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName"> <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
<object class="IBToOneOutletInfo" key="lockItem"> <object class="IBToOneOutletInfo" key="lockItem">
<string key="name">lockItem</string> <string key="name">lockItem</string>
<string key="candidateClassName">NSMenuItem</string> <string key="candidateClassName">NSMenuItem</string>
</object> </object>
<object class="IBToOneOutletInfo" key="newUserItem">
<string key="name">newUserItem</string>
<string key="candidateClassName">NSMenuItem</string>
</object>
<object class="IBToOneOutletInfo" key="rememberPasswordItem"> <object class="IBToOneOutletInfo" key="rememberPasswordItem">
<string key="name">rememberPasswordItem</string> <string key="name">rememberPasswordItem</string>
<string key="candidateClassName">NSMenuItem</string> <string key="candidateClassName">NSMenuItem</string>
@ -498,12 +592,24 @@
<string key="name">useICloudItem</string> <string key="name">useICloudItem</string>
<string key="candidateClassName">NSMenuItem</string> <string key="candidateClassName">NSMenuItem</string>
</object> </object>
<object class="IBToOneOutletInfo" key="usersItem">
<string key="name">usersItem</string>
<string key="candidateClassName">NSMenuItem</string>
</object>
</dictionary> </dictionary>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string> <string key="majorKey">IBProjectSource</string>
<string key="minorKey">./Classes/MPAppDelegate.h</string> <string key="minorKey">./Classes/MPAppDelegate.h</string>
</object> </object>
</object> </object>
<object class="IBPartialClassDescription">
<string key="className">MPAppDelegate_Shared</string>
<string key="superclassName">NSObject</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">./Classes/MPAppDelegate_Shared.h</string>
</object>
</object>
</array> </array>
</object> </object>
<int key="IBDocument.localizationMode">0</int> <int key="IBDocument.localizationMode">0</int>

View File

@ -383,9 +383,7 @@
inf(@"Re-activated"); inf(@"Re-activated");
[[MPAppDelegate get] checkConfig]; [[MPAppDelegate get] checkConfig];
if (FBSession.activeSession.state == FBSessionStateCreatedOpening) [FBSession.activeSession handleDidBecomeActive];
// An old Facebook Login session that wasn't finished. Clean it up.
[FBSession.activeSession close];
[[LocalyticsSession sharedLocalyticsSession] resume]; [[LocalyticsSession sharedLocalyticsSession] resume];
[[LocalyticsSession sharedLocalyticsSession] upload]; [[LocalyticsSession sharedLocalyticsSession] upload];

View File

@ -935,8 +935,10 @@
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI { - (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
return [FBSession openActiveSessionWithPermissions:nil allowLoginUI:allowLoginUI return [FBSession openActiveSessionWithPublishPermissions:nil
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { defaultAudience:FBSessionDefaultAudienceEveryone
allowLoginUI:YES
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
[self sessionStateChanged:session state:state error:error]; [self sessionStateChanged:session state:state error:error];
}]; }];
} }

View File

@ -10,7 +10,6 @@
@interface MPiOSConfig : MPConfig @interface MPiOSConfig : MPConfig
@property (nonatomic, retain) NSNumber *sendInfo;
@property (nonatomic, retain) NSNumber *helpHidden; @property (nonatomic, retain) NSNumber *helpHidden;
@property (nonatomic, retain) NSNumber *siteInfoHidden; @property (nonatomic, retain) NSNumber *siteInfoHidden;
@property (nonatomic, retain) NSNumber *showQuickStart; @property (nonatomic, retain) NSNumber *showQuickStart;

View File

@ -14,8 +14,7 @@
if (!(self = [super init])) if (!(self = [super init]))
return self; return self;
[self.defaults registerDefaults:@{NSStringFromSelector(@selector(sendInfo)): @NO, [self.defaults registerDefaults:@{ NSStringFromSelector(@selector(helpHidden)): @NO,
NSStringFromSelector(@selector(helpHidden)): @NO,
NSStringFromSelector(@selector(siteInfoHidden)): @YES, NSStringFromSelector(@selector(siteInfoHidden)): @YES,
NSStringFromSelector(@selector(showQuickStart)): @YES, NSStringFromSelector(@selector(showQuickStart)): @YES,
NSStringFromSelector(@selector(iTunesID)): @"510296984", NSStringFromSelector(@selector(iTunesID)): @"510296984",

View File

@ -93,7 +93,7 @@
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string>© 2011-2012, Lyndir</string> <string>Copyright © 2011-2013 Lyndir. All rights reserved.</string>
<key>ReplacementFonts</key> <key>ReplacementFonts</key>
<dict> <dict>
<key>Futura-CondensedExtraBold</key> <key>Futura-CondensedExtraBold</key>

View File

@ -18,6 +18,9 @@
#import "TestFlight.h" #import "TestFlight.h"
#import <Crashlytics/Crashlytics.h> #import <Crashlytics/Crashlytics.h>
#import "LocalyticsSession.h"
#define LOCALYTICS 1
#define CRASHLYTICS 1
#import "MPTypes.h" #import "MPTypes.h"
#import "MPiOSConfig.h" #import "MPiOSConfig.h"