From 60518e0a371ae4d89dc6b4284ba8aee5f9f3f55a Mon Sep 17 00:00:00 2001 From: Thomas Dohmke Date: Thu, 31 Oct 2013 21:10:26 +0100 Subject: [PATCH 01/62] Issue #75: Fix warning on implicit conversion from CGImageAlphaInfo to CGBitmapInfo (safe according to https://developer.apple.com/library/ios/documentation/graphicsimaging/Reference/CGBitmapContext/Reference/reference.html#//apple_ref/c/func/CGBitmapContextCreate). --- Classes/BITHockeyHelper.m | 4 +- Support/HockeySDK.xcodeproj/project.pbxproj | 3 ++ .../xcshareddata/HockeySDK.xccheckout | 41 +++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 Support/HockeySDK.xcodeproj/project.xcworkspace/xcshareddata/HockeySDK.xccheckout diff --git a/Classes/BITHockeyHelper.m b/Classes/BITHockeyHelper.m index 03311465e3..e30b99f5df 100644 --- a/Classes/BITHockeyHelper.m +++ b/Classes/BITHockeyHelper.m @@ -278,7 +278,7 @@ CGImageRef bit_CreateGradientImage(int pixelsWide, int pixelsHigh, float fromAlp // create the bitmap context CGContextRef gradientBitmapContext = CGBitmapContextCreate(NULL, pixelsWide, pixelsHigh, - 8, 0, colorSpace, kCGImageAlphaNone); + 8, 0, colorSpace, (CGBitmapInfo)kCGImageAlphaNone); // define the start and end grayscale values (with the alpha, even though // our bitmap context doesn't support alpha the gradient requires it) @@ -421,7 +421,7 @@ UIImage *bit_imageToFitSize(UIImage *inputImage, CGSize fitSize, BOOL honorScale // Try older method. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(NULL, scaledWidth, scaledHeight, 8, (fitSize.width * 4), - colorSpace, kCGImageAlphaPremultipliedLast); + colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast); sourceImg = CGImageCreateWithImageInRect([inputImage CGImage], sourceRect); CGContextDrawImage(context, destRect, sourceImg); CGImageRelease(sourceImg); diff --git a/Support/HockeySDK.xcodeproj/project.pbxproj b/Support/HockeySDK.xcodeproj/project.pbxproj index 55a039f4e1..09c1dca636 100644 --- a/Support/HockeySDK.xcodeproj/project.pbxproj +++ b/Support/HockeySDK.xcodeproj/project.pbxproj @@ -1131,6 +1131,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ENUM_CONVERSION = YES; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1265,6 +1266,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ENUM_CONVERSION = YES; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1299,6 +1301,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ENUM_CONVERSION = YES; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; diff --git a/Support/HockeySDK.xcodeproj/project.xcworkspace/xcshareddata/HockeySDK.xccheckout b/Support/HockeySDK.xcodeproj/project.xcworkspace/xcshareddata/HockeySDK.xccheckout new file mode 100644 index 0000000000..356ee41404 --- /dev/null +++ b/Support/HockeySDK.xcodeproj/project.xcworkspace/xcshareddata/HockeySDK.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + B0288ADA-155B-40AE-826F-356B0D5E5013 + IDESourceControlProjectName + HockeySDK + IDESourceControlProjectOriginsDictionary + + 611F891C-5A79-4873-9041-6BECC48889BA + ssh://github.com/bitstadium/HockeySDK-iOS.git + + IDESourceControlProjectPath + Support/HockeySDK.xcodeproj/project.xcworkspace + IDESourceControlProjectRelativeInstallPathDictionary + + 611F891C-5A79-4873-9041-6BECC48889BA + ../../.. + + IDESourceControlProjectURL + ssh://github.com/bitstadium/HockeySDK-iOS.git + IDESourceControlProjectVersion + 110 + IDESourceControlProjectWCCIdentifier + 611F891C-5A79-4873-9041-6BECC48889BA + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 611F891C-5A79-4873-9041-6BECC48889BA + IDESourceControlWCCName + HockeySDK-iOS + + + + From bb59a9f464d78bcbfd73466a68427074689e0745 Mon Sep 17 00:00:00 2001 From: Thomas Dohmke Date: Thu, 31 Oct 2013 21:52:32 +0100 Subject: [PATCH 02/62] Remove Xcode 5 file. --- .gitignore | 1 + .../xcshareddata/HockeySDK.xccheckout | 41 ------------------- 2 files changed, 1 insertion(+), 41 deletions(-) delete mode 100644 Support/HockeySDK.xcodeproj/project.xcworkspace/xcshareddata/HockeySDK.xccheckout diff --git a/.gitignore b/.gitignore index ebc78fd0c1..f962d0da9a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ build *.perspectivev3 !default.perspectivev3 !default.xcworkspace +!project.xcworkspace xcuserdata profile *.moved-aside diff --git a/Support/HockeySDK.xcodeproj/project.xcworkspace/xcshareddata/HockeySDK.xccheckout b/Support/HockeySDK.xcodeproj/project.xcworkspace/xcshareddata/HockeySDK.xccheckout deleted file mode 100644 index 356ee41404..0000000000 --- a/Support/HockeySDK.xcodeproj/project.xcworkspace/xcshareddata/HockeySDK.xccheckout +++ /dev/null @@ -1,41 +0,0 @@ - - - - - IDESourceControlProjectFavoriteDictionaryKey - - IDESourceControlProjectIdentifier - B0288ADA-155B-40AE-826F-356B0D5E5013 - IDESourceControlProjectName - HockeySDK - IDESourceControlProjectOriginsDictionary - - 611F891C-5A79-4873-9041-6BECC48889BA - ssh://github.com/bitstadium/HockeySDK-iOS.git - - IDESourceControlProjectPath - Support/HockeySDK.xcodeproj/project.xcworkspace - IDESourceControlProjectRelativeInstallPathDictionary - - 611F891C-5A79-4873-9041-6BECC48889BA - ../../.. - - IDESourceControlProjectURL - ssh://github.com/bitstadium/HockeySDK-iOS.git - IDESourceControlProjectVersion - 110 - IDESourceControlProjectWCCIdentifier - 611F891C-5A79-4873-9041-6BECC48889BA - IDESourceControlProjectWCConfigurations - - - IDESourceControlRepositoryExtensionIdentifierKey - public.vcs.git - IDESourceControlWCCIdentifierKey - 611F891C-5A79-4873-9041-6BECC48889BA - IDESourceControlWCCName - HockeySDK-iOS - - - - From da7b0b290f40bfbb7bbf1b172f49514150eb9191 Mon Sep 17 00:00:00 2001 From: Thomas Dohmke Date: Thu, 31 Oct 2013 21:53:10 +0100 Subject: [PATCH 03/62] Issue #74: Fix warnings for implicit conversions of UITextAlignment and UILineBreakMode --- Classes/BITAttributedLabel.m | 75 ++++++++++++++++++++++++++++-------- Classes/HockeySDKPrivate.h | 18 ++++----- 2 files changed, 69 insertions(+), 24 deletions(-) diff --git a/Classes/BITAttributedLabel.m b/Classes/BITAttributedLabel.m index dcf222fd3b..1e35596db5 100755 --- a/Classes/BITAttributedLabel.m +++ b/Classes/BITAttributedLabel.m @@ -34,24 +34,57 @@ NSString * const kBITBackgroundLineWidthAttributeName = @"BITBackgroundLineWidth NSString * const kBITBackgroundCornerRadiusAttributeName = @"BITBackgroundCornerRadius"; static inline CTTextAlignment CTTextAlignmentFromUITextAlignment(UITextAlignment alignment) { - switch (alignment) { - case UITextAlignmentLeft: return kCTLeftTextAlignment; - case UITextAlignmentCenter: return kCTCenterTextAlignment; - case UITextAlignmentRight: return kCTRightTextAlignment; - default: return kCTNaturalTextAlignment; - } + switch (alignment) { + case UITextAlignmentLeft: return kCTLeftTextAlignment; + case UITextAlignmentCenter: return kCTCenterTextAlignment; + case UITextAlignmentRight: return kCTRightTextAlignment; + default: return kCTNaturalTextAlignment; + } +} + +static inline CTTextAlignment CTTextAlignmentFromNSTextAlignment(NSTextAlignment alignment) { + switch (alignment) { + case NSTextAlignmentLeft: return kCTLeftTextAlignment; + case NSTextAlignmentCenter: return kCTCenterTextAlignment; + case NSTextAlignmentRight: return kCTRightTextAlignment; + default: return kCTNaturalTextAlignment; + } } static inline CTLineBreakMode CTLineBreakModeFromUILineBreakMode(UILineBreakMode lineBreakMode) { - switch (lineBreakMode) { - case UILineBreakModeWordWrap: return kCTLineBreakByWordWrapping; - case UILineBreakModeCharacterWrap: return kCTLineBreakByCharWrapping; - case UILineBreakModeClip: return kCTLineBreakByClipping; - case UILineBreakModeHeadTruncation: return kCTLineBreakByTruncatingHead; - case UILineBreakModeTailTruncation: return kCTLineBreakByTruncatingTail; - case UILineBreakModeMiddleTruncation: return kCTLineBreakByTruncatingMiddle; - default: return 0; - } + switch (lineBreakMode) { + case UILineBreakModeWordWrap: return kCTLineBreakByWordWrapping; + case UILineBreakModeCharacterWrap: return kCTLineBreakByCharWrapping; + case UILineBreakModeClip: return kCTLineBreakByClipping; + case UILineBreakModeHeadTruncation: return kCTLineBreakByTruncatingHead; + case UILineBreakModeTailTruncation: return kCTLineBreakByTruncatingTail; + case UILineBreakModeMiddleTruncation: return kCTLineBreakByTruncatingMiddle; + default: return 0; + } +} + +static inline CTLineBreakMode CTLineBreakModeFromNSLineBreakMode(NSLineBreakMode lineBreakMode) { + switch (lineBreakMode) { + case NSLineBreakByWordWrapping: return kCTLineBreakByWordWrapping; + case NSLineBreakByCharWrapping: return kCTLineBreakByCharWrapping; + case NSLineBreakByClipping: return kCTLineBreakByClipping; + case NSLineBreakByTruncatingHead: return kCTLineBreakByTruncatingHead; + case NSLineBreakByTruncatingTail: return kCTLineBreakByTruncatingTail; + case NSLineBreakByTruncatingMiddle: return kCTLineBreakByTruncatingMiddle; + default: return 0; + } +} + +static inline UILineBreakMode UILineBreakModeFromNSLineBreakMode(NSLineBreakMode lineBreakMode) { + switch (lineBreakMode) { + case NSLineBreakByWordWrapping: return UILineBreakModeWordWrap; + case NSLineBreakByCharWrapping: return UILineBreakModeCharacterWrap; + case NSLineBreakByClipping: return UILineBreakModeClip; + case NSLineBreakByTruncatingHead: return UILineBreakModeHeadTruncation; + case NSLineBreakByTruncatingTail: return UILineBreakModeTailTruncation; + case NSLineBreakByTruncatingMiddle: return UILineBreakModeMiddleTruncation; + default: return 0; + } } static inline NSTextCheckingType NSTextCheckingTypeFromUIDataDetectorType(UIDataDetectorTypes dataDetectorType) { @@ -84,7 +117,11 @@ static inline NSDictionary * NSAttributedStringAttributesFromLabel(BITAttributed [mutableAttributes setObject:(id)[label.textColor CGColor] forKey:(NSString *)kCTForegroundColorAttributeName]; +#ifdef __IPHONE_6_0 + CTTextAlignment alignment = CTTextAlignmentFromNSTextAlignment(label.textAlignment); +#else CTTextAlignment alignment = CTTextAlignmentFromUITextAlignment(label.textAlignment); +#endif CGFloat lineSpacing = label.leading; CGFloat lineSpacingAdjustment = label.font.lineHeight - label.font.ascender + label.font.descender; CGFloat lineHeightMultiple = label.lineHeightMultiple; @@ -98,7 +135,11 @@ static inline NSDictionary * NSAttributedStringAttributesFromLabel(BITAttributed if (label.numberOfLines != 1) { lineBreakMode = CTLineBreakModeFromUILineBreakMode(UILineBreakModeWordWrap); } else { +#ifdef __IPHONE_6_0 + lineBreakMode = CTLineBreakModeFromNSLineBreakMode(label.lineBreakMode); +#else lineBreakMode = CTLineBreakModeFromUILineBreakMode(label.lineBreakMode); +#endif } CTParagraphStyleSetting paragraphStyles[10] = { @@ -488,7 +529,11 @@ static inline NSAttributedString * NSAttributedStringBySettingColorFromContext(N // Get correct truncationType and attribute position CTLineTruncationType truncationType; NSUInteger truncationAttributePosition = lastLineRange.location; +#ifdef __IPHONE_6_0 + UILineBreakMode lineBreakMode = UILineBreakModeFromNSLineBreakMode(self.lineBreakMode); +#else UILineBreakMode lineBreakMode = self.lineBreakMode; +#endif // Multiple lines, only use UILineBreakModeTailTruncation if (numberOfLines != 1) { diff --git a/Classes/HockeySDKPrivate.h b/Classes/HockeySDKPrivate.h index 2b694b9c66..f7de1ab154 100644 --- a/Classes/HockeySDKPrivate.h +++ b/Classes/HockeySDKPrivate.h @@ -67,21 +67,21 @@ NSBundle *BITHockeyBundle(void); NSString *BITHockeyLocalizedString(NSString *stringToken); NSString *BITHockeyMD5(NSString *str); -#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0 - -#define kBITTextLabelAlignmentCenter UITextAlignmentCenter -#define kBITTextLabelAlignmentLeft UITextAlignmentLeft -#define kBITTextLabelAlignmentRight UITextAlignmentRight -#define kBITLineBreakModeMiddleTruncation UILineBreakModeMiddleTruncation - -#else +#ifdef __IPHONE_6_0 #define kBITTextLabelAlignmentCenter NSTextAlignmentCenter #define kBITTextLabelAlignmentLeft NSTextAlignmentLeft #define kBITTextLabelAlignmentRight NSTextAlignmentRight #define kBITLineBreakModeMiddleTruncation NSLineBreakByTruncatingMiddle -#endif /* __IPHONE_OS_VERSION_MIN_REQUIRED */ +#else + +#define kBITTextLabelAlignmentCenter UITextAlignmentCenter +#define kBITTextLabelAlignmentLeft UITextAlignmentLeft +#define kBITTextLabelAlignmentRight UITextAlignmentRight +#define kBITLineBreakModeMiddleTruncation UILineBreakModeMiddleTruncation + +#endif /* __IPHONE_6_0 */ #if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_6_1 From 982ce567983bc34ff1178cb4a72efd883689ccfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Fri, 1 Nov 2013 12:52:26 +0100 Subject: [PATCH 04/62] Explicitly set spaces settings at the project level --- Support/HockeySDK.xcodeproj/project.pbxproj | 1 + 1 file changed, 1 insertion(+) diff --git a/Support/HockeySDK.xcodeproj/project.pbxproj b/Support/HockeySDK.xcodeproj/project.pbxproj index 09c1dca636..5690421221 100644 --- a/Support/HockeySDK.xcodeproj/project.pbxproj +++ b/Support/HockeySDK.xcodeproj/project.pbxproj @@ -544,6 +544,7 @@ indentWidth = 2; sourceTree = ""; tabWidth = 2; + usesTabs = 0; }; E400561B148D79B500EB22B9 /* Products */ = { isa = PBXGroup; From c0e4ffe84e921bde8c19fb3882610cb08d8df78a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Fri, 1 Nov 2013 12:52:55 +0100 Subject: [PATCH 05/62] Do not use deprecated delegate method --- Classes/BITFeedbackActivity.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/BITFeedbackActivity.m b/Classes/BITFeedbackActivity.m index c7d9390a90..cfb9a085ab 100644 --- a/Classes/BITFeedbackActivity.m +++ b/Classes/BITFeedbackActivity.m @@ -106,7 +106,7 @@ return navController; } --(void)feedbackComposeViewControllerDidFinish:(BITFeedbackComposeViewController *)composeViewController { +- (void)feedbackComposeViewController:(BITFeedbackComposeViewController *)composeViewController didFinishWithResult:(BITFeedbackComposeResult)composeResult { [self activityDidFinish:YES]; } From d52652f4d237f93b3b786f9ab2a890e0de04888a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Fri, 1 Nov 2013 13:45:33 +0100 Subject: [PATCH 06/62] Use only one activity view controller per UIActivity On iPad under iOS 6, calling `activityDidFinish:` internally calls -[BITFeedbackActivity activityViewController]. We must therefore keep a reference to the previously created activity view controller else the activity view controller can not be dismissed since a new instance is returned for dismissal. Under iOS 7, -[BITFeedbackActivity activityViewController] is not called for dismissal. On iPhone, the -[BITFeedbackActivity activityViewController] method is not called for dismissal. --- Classes/BITFeedbackActivity.m | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/Classes/BITFeedbackActivity.m b/Classes/BITFeedbackActivity.m index cfb9a085ab..c78e340d99 100644 --- a/Classes/BITFeedbackActivity.m +++ b/Classes/BITFeedbackActivity.m @@ -28,6 +28,9 @@ @implementation BITFeedbackActivity +{ + UIViewController *_activityViewController; +} #pragma mark - NSObject @@ -92,18 +95,19 @@ } - (UIViewController *)activityViewController { - // TODO: return compose controller with activity content added - BITFeedbackManager *manager = [BITHockeyManager sharedHockeyManager].feedbackManager; - - BITFeedbackComposeViewController *composeViewController = [manager feedbackComposeViewController]; - composeViewController.delegate = self; - [composeViewController prepareWithItems:_items]; - - UINavigationController *navController = [manager customNavigationControllerWithRootViewController:composeViewController - presentationStyle:UIModalPresentationFormSheet]; - navController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; - - return navController; + if (!_activityViewController) { + // TODO: return compose controller with activity content added + BITFeedbackManager *manager = [BITHockeyManager sharedHockeyManager].feedbackManager; + + BITFeedbackComposeViewController *composeViewController = [manager feedbackComposeViewController]; + composeViewController.delegate = self; + [composeViewController prepareWithItems:_items]; + + _activityViewController = [manager customNavigationControllerWithRootViewController:composeViewController + presentationStyle:UIModalPresentationFormSheet]; + _activityViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; + } + return _activityViewController; } - (void)feedbackComposeViewController:(BITFeedbackComposeViewController *)composeViewController didFinishWithResult:(BITFeedbackComposeResult)composeResult { From b4234111d47bce326c9536920ec63798708e1a5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Fri, 1 Nov 2013 22:50:56 +0100 Subject: [PATCH 07/62] Comply to -[UIActivity activityDidFinish:] requirements --- Classes/BITFeedbackActivity.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/BITFeedbackActivity.m b/Classes/BITFeedbackActivity.m index c78e340d99..e3f78ef74d 100644 --- a/Classes/BITFeedbackActivity.m +++ b/Classes/BITFeedbackActivity.m @@ -111,7 +111,7 @@ } - (void)feedbackComposeViewController:(BITFeedbackComposeViewController *)composeViewController didFinishWithResult:(BITFeedbackComposeResult)composeResult { - [self activityDidFinish:YES]; + [self activityDidFinish:composeResult == BITFeedbackComposeResultSubmitted]; } From 74d2cc3bc174402dc8cf10059f5112439f6a524f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Sat, 2 Nov 2013 00:30:17 +0100 Subject: [PATCH 08/62] Cleanup base64 code Use -[NSData base64Encoding] which exists since iOS 4.0 (but is only documented since the iOS 7 SDK). --- Classes/BITAuthenticator.m | 8 +++- Classes/BITHockeyHelper.h | 2 - Classes/BITHockeyHelper.m | 75 -------------------------------------- 3 files changed, 7 insertions(+), 78 deletions(-) diff --git a/Classes/BITAuthenticator.m b/Classes/BITAuthenticator.m index a12a41983c..1ee3d380e0 100644 --- a/Classes/BITAuthenticator.m +++ b/Classes/BITAuthenticator.m @@ -35,6 +35,12 @@ #import "BITHockeyAppClient.h" #import "BITHockeyHelper.h" +#if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000 +@interface NSData (iOS7) +- (NSString *)base64Encoding; +@end +#endif + static NSString* const kBITAuthenticatorUUIDKey = @"BITAuthenticatorUUIDKey"; static NSString* const kBITAuthenticatorIdentifierKey = @"BITAuthenticatorIdentifierKey"; static NSString* const kBITAuthenticatorIdentifierTypeKey = @"BITAuthenticatorIdentifierTypeKey"; @@ -408,7 +414,7 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut if(BITAuthenticatorIdentificationTypeHockeyAppUser == self.identificationType) { NSString *authStr = [NSString stringWithFormat:@"%@:%@", email, password]; NSData *authData = [authStr dataUsingEncoding:NSASCIIStringEncoding]; - NSString *authValue = [NSString stringWithFormat:@"Basic %@", bit_base64String(authData, authData.length)]; + NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64Encoding]]; [request setValue:authValue forHTTPHeaderField:@"Authorization"]; } return request; diff --git a/Classes/BITHockeyHelper.h b/Classes/BITHockeyHelper.h index 1f39fdab29..4c5bdee4fc 100644 --- a/Classes/BITHockeyHelper.h +++ b/Classes/BITHockeyHelper.h @@ -32,8 +32,6 @@ /* NSString helpers */ NSString *bit_URLEncodedString(NSString *inputString); NSString *bit_URLDecodedString(NSString *inputString); -NSString *bit_base64StringPreiOS7(NSData * data, unsigned long length); -NSString *bit_base64String(NSData * data, unsigned long length); BOOL bit_validateEmail(NSString *email); NSString *bit_keychainHockeySDKServiceName(void); diff --git a/Classes/BITHockeyHelper.m b/Classes/BITHockeyHelper.m index e30b99f5df..8ac4687e7c 100644 --- a/Classes/BITHockeyHelper.m +++ b/Classes/BITHockeyHelper.m @@ -33,13 +33,6 @@ #import "HockeySDKPrivate.h" #import -static char base64EncodingTable[64] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' -}; - #pragma mark NSString helpers NSString *bit_URLEncodedString(NSString *inputString) { @@ -59,74 +52,6 @@ NSString *bit_URLDecodedString(NSString *inputString) { ); } -NSString *bit_base64StringPreiOS7(NSData * data, unsigned long length) { - unsigned long ixtext, lentext; - long ctremaining; - unsigned char input[3], output[4]; - short i, charsonline = 0, ctcopy; - const unsigned char *raw; - NSMutableString *result; - - lentext = [data length]; - if (lentext < 1) - return @""; - result = [NSMutableString stringWithCapacity: lentext]; - raw = [data bytes]; - ixtext = 0; - - while (true) { - ctremaining = (long)(lentext - ixtext); - if (ctremaining <= 0) - break; - for (unsigned long y = 0; y < 3; y++) { - unsigned long ix = (ixtext + y); - if (ix < lentext) - input[y] = raw[ix]; - else - input[y] = 0; - } - output[0] = (input[0] & 0xFC) >> 2; - output[1] = (unsigned char)((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4); - output[2] = (unsigned char)((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6); - output[3] = input[2] & 0x3F; - ctcopy = 4; - switch (ctremaining) { - case 1: - ctcopy = 2; - break; - case 2: - ctcopy = 3; - break; - } - - for (i = 0; i < ctcopy; i++) - [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]]; - - for (i = ctcopy; i < 4; i++) - [result appendString: @"="]; - - ixtext += 3; - charsonline += 4; - - if ((length > 0) && (charsonline >= length)) - charsonline = 0; - } - return result; -} - -NSString *bit_base64String(NSData * data, unsigned long length) { -#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1 - SEL base64EncodingSelector = NSSelectorFromString(@"base64EncodedStringWithOptions:"); - if ([data respondsToSelector:base64EncodingSelector]) { - return [data base64EncodedStringWithOptions:0]; - } else { -#endif - return bit_base64StringPreiOS7(data, length); -#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1 - } -#endif -} - BOOL bit_validateEmail(NSString *email) { NSString *emailRegex = @"(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}" From 41867dc57d83d1bfc21ebd6757e85ddb119618f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Sat, 2 Nov 2013 00:31:38 +0100 Subject: [PATCH 09/62] Delete base64 tests --- Support/HockeySDKTests/BITHockeyHelperTests.m | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/Support/HockeySDKTests/BITHockeyHelperTests.m b/Support/HockeySDKTests/BITHockeyHelperTests.m index afa96ecd13..9166d961cb 100644 --- a/Support/HockeySDKTests/BITHockeyHelperTests.m +++ b/Support/HockeySDKTests/BITHockeyHelperTests.m @@ -36,46 +36,6 @@ [super tearDown]; } -- (void)testBase64Encoding { - NSString *string = @"Lorem ipsum dolor sit amet."; - NSData *stringData = [string dataUsingEncoding:NSUTF8StringEncoding]; - NSString *encodedString = bit_base64String(stringData, stringData.length); - assertThatBool([encodedString isEqualToString:@"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQu"], equalToBool(YES)); -} - -- (void)testBase64EncodingPreiOS7 { - NSString *string = @"Lorem ipsum dolor sit amet."; - NSData *stringData = [string dataUsingEncoding:NSUTF8StringEncoding]; - NSString *encodedString = bit_base64StringPreiOS7(stringData, stringData.length); - assertThatBool([encodedString isEqualToString:@"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQu"], equalToBool(YES)); -} - -- (void)testBase64EncodingPreiOS7EmptyString { - NSString *string = @""; - NSData *stringData = [string dataUsingEncoding:NSUTF8StringEncoding]; - NSString *encodedString = bit_base64StringPreiOS7(stringData, stringData.length); - assertThatBool([encodedString isEqualToString:@""], equalToBool(YES)); -} - -- (void)testBase64EncodingCompareToiOS7Implementation { - // this requires iOS 7 - BOOL result = YES; - SEL base64EncodingSelector = NSSelectorFromString(@"base64EncodedStringWithOptions:"); - NSData *dataInstance = [NSData data]; - if ([dataInstance respondsToSelector:base64EncodingSelector]) { - - NSString *string = @"A dummy whatever strange !* char : test &# more"; - NSData *stringData = [string dataUsingEncoding:NSUTF8StringEncoding]; - - NSString *encodedString = bit_base64String(stringData, stringData.length); - - NSString *base64EncodedString = [[string dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0]; - - result = [base64EncodedString isEqualToString:encodedString]; - } - assertThatBool(result, equalToBool(YES)); -} - - (void)testValidateEmail { BOOL result = NO; From 94b8f5dfb0b8b9379d0d5d369caf0ccdf5b44df7 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Sun, 3 Nov 2013 23:17:32 +0100 Subject: [PATCH 10/62] Fix compile issues when excluding all modules but crash reporting --- Classes/BITHockeyManager.m | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Classes/BITHockeyManager.m b/Classes/BITHockeyManager.m index a4b755035d..7d60c8f6db 100644 --- a/Classes/BITHockeyManager.m +++ b/Classes/BITHockeyManager.m @@ -298,12 +298,12 @@ aServerURL = [NSString stringWithFormat:@"%@/", aServerURL]; } -#if HOCKEYSDK_FEATURE_AUTHENTICATOR if (_serverURL != aServerURL) { _serverURL = [aServerURL copy]; +#if HOCKEYSDK_FEATURE_AUTHENTICATOR _authenticator.hockeyAppClient.baseURL = [NSURL URLWithString:_serverURL ? _serverURL : BITHOCKEYSDK_URL]; - } #endif /* HOCKEYSDK_FEATURE_AUTHENTICATOR */ + } } @@ -424,11 +424,15 @@ _feedbackManager.delegate = _delegate; #endif /* HOCKEYSDK_FEATURE_FEEDBACK */ +#if HOCKEYSDK_FEATURE_AUTHENTICATOR BITHockeyLog(@"INFO: Setup Authenticator"); BITHockeyAppClient *client = [[BITHockeyAppClient alloc] initWithBaseURL:[NSURL URLWithString:_serverURL ? _serverURL : BITHOCKEYSDK_URL]]; _authenticator = [[BITAuthenticator alloc] initWithAppIdentifier:_appIdentifier isAppStoreEnvironment:_appStoreEnvironment]; _authenticator.hockeyAppClient = client; _authenticator.delegate = _delegate; +#endif /* HOCKEYSDK_FEATURE_AUTHENTICATOR */ + +#if HOCKEYSDK_FEATURE_UPDATES #if HOCKEYSDK_FEATURE_JIRA_MOBILE_CONNECT // Only if JMC is part of the project @@ -440,7 +444,9 @@ [self performSelector:@selector(configureJMC) withObject:nil afterDelay:0]; } #endif /* HOCKEYSDK_FEATURE_JIRA_MOBILE_CONNECT */ - + +#endif /* HOCKEYSDK_FEATURE_UPDATES */ + } else { [self logInvalidIdentifier:@"app identifier"]; } From 1341668224a57fd9c441dc4630491c04c57c6dc4 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Mon, 4 Nov 2013 16:27:34 +0100 Subject: [PATCH 11/62] Use UTF8 encoding for auth data --- Classes/BITAuthenticator.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/BITAuthenticator.m b/Classes/BITAuthenticator.m index a12a41983c..e62773720d 100644 --- a/Classes/BITAuthenticator.m +++ b/Classes/BITAuthenticator.m @@ -407,7 +407,7 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut parameters:params]; if(BITAuthenticatorIdentificationTypeHockeyAppUser == self.identificationType) { NSString *authStr = [NSString stringWithFormat:@"%@:%@", email, password]; - NSData *authData = [authStr dataUsingEncoding:NSASCIIStringEncoding]; + NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding]; NSString *authValue = [NSString stringWithFormat:@"Basic %@", bit_base64String(authData, authData.length)]; [request setValue:authValue forHTTPHeaderField:@"Authorization"]; } From 3225f462e98eaa17effbfd7ae4f73a25bb85f230 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Tue, 5 Nov 2013 15:47:49 +0100 Subject: [PATCH 12/62] Fix a bug when creating crash report textual representation It was working always before, but isn't actually correct. --- Classes/BITCrashReportTextFormatter.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Classes/BITCrashReportTextFormatter.m b/Classes/BITCrashReportTextFormatter.m index f0c8748c63..708ea8fefc 100644 --- a/Classes/BITCrashReportTextFormatter.m +++ b/Classes/BITCrashReportTextFormatter.m @@ -289,7 +289,7 @@ static NSInteger bit_binaryImageSort(id binary1, id binary2, void *context); * post-processed report, Apple writes this out as full frame entries. We use the latter format. */ for (NSUInteger frame_idx = 0; frame_idx < [exception.stackFrames count]; frame_idx++) { BITPLCrashReportStackFrameInfo *frameInfo = [exception.stackFrames objectAtIndex: frame_idx]; - [text appendString: [self bit_formatStackFrame: frameInfo frameIndex: frame_idx report: report lp64: lp64]]; + [text appendString: [[self class] bit_formatStackFrame: frameInfo frameIndex: frame_idx report: report lp64: lp64]]; } [text appendString: @"\n"]; } @@ -306,7 +306,7 @@ static NSInteger bit_binaryImageSort(id binary1, id binary2, void *context); } for (NSUInteger frame_idx = 0; frame_idx < [thread.stackFrames count]; frame_idx++) { BITPLCrashReportStackFrameInfo *frameInfo = [thread.stackFrames objectAtIndex: frame_idx]; - [text appendString: [self bit_formatStackFrame: frameInfo frameIndex: frame_idx report: report lp64: lp64]]; + [text appendString: [[self class] bit_formatStackFrame: frameInfo frameIndex: frame_idx report: report lp64: lp64]]; } [text appendString: @"\n"]; @@ -365,7 +365,7 @@ static NSInteger bit_binaryImageSort(id binary1, id binary2, void *context); uuid = @"???"; /* Determine the architecture string */ - NSString *archName = [self bit_archNameFromImageInfo:imageInfo]; + NSString *archName = [[self class] bit_archNameFromImageInfo:imageInfo]; /* Determine if this is the main executable or an app specific framework*/ NSString *binaryDesignator = @" "; @@ -425,7 +425,7 @@ static NSInteger bit_binaryImageSort(id binary1, id binary2, void *context); uuid = @"???"; /* Determine the architecture string */ - NSString *archName = [self bit_archNameFromImageInfo:imageInfo]; + NSString *archName = [[self class] bit_archNameFromImageInfo:imageInfo]; /* Determine if this is the app executable or app specific framework */ NSString *imagePath = [imageInfo.imageName stringByStandardizingPath]; From b2618ad31a3b18e17853f55d9d25531adfc78b49 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Tue, 5 Nov 2013 19:52:37 +0100 Subject: [PATCH 13/62] Don't use a category in BITCrashReportTextFormatter This allows the framework to be used inside another framework. --- Classes/BITCrashReportTextFormatter.m | 41 +++++++++------------------ 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/Classes/BITCrashReportTextFormatter.m b/Classes/BITCrashReportTextFormatter.m index 708ea8fefc..11081770b9 100644 --- a/Classes/BITCrashReportTextFormatter.m +++ b/Classes/BITCrashReportTextFormatter.m @@ -52,13 +52,20 @@ #endif -@interface BITCrashReportTextFormatter (PrivateAPI) -static NSInteger bit_binaryImageSort(id binary1, id binary2, void *context); -+ (NSString *)bit_formatStackFrame:(BITPLCrashReportStackFrameInfo *)frameInfo - frameIndex:(NSUInteger)frameIndex - report:(BITPLCrashReport *)report - lp64: (BOOL) lp64; -@end +/** + * Sort PLCrashReportBinaryImageInfo instances by their starting address. + */ +static NSInteger bit_binaryImageSort(id binary1, id binary2, void *context) { + uint64_t addr1 = [binary1 imageBaseAddress]; + uint64_t addr2 = [binary2 imageBaseAddress]; + + if (addr1 < addr2) + return NSOrderedAscending; + else if (addr1 > addr2) + return NSOrderedDescending; + else + return NSOrderedSame; +} /** @@ -511,11 +518,6 @@ static NSInteger bit_binaryImageSort(id binary1, id binary2, void *context); return archName; } -@end - - -@implementation BITCrashReportTextFormatter (PrivateAPI) - /** * Format a stack frame for display in a thread backtrace. @@ -608,19 +610,4 @@ static NSInteger bit_binaryImageSort(id binary1, id binary2, void *context); symbolString]; } -/** - * Sort PLCrashReportBinaryImageInfo instances by their starting address. - */ -static NSInteger bit_binaryImageSort(id binary1, id binary2, void *context) { - uint64_t addr1 = [binary1 imageBaseAddress]; - uint64_t addr2 = [binary2 imageBaseAddress]; - - if (addr1 < addr2) - return NSOrderedAscending; - else if (addr1 > addr2) - return NSOrderedDescending; - else - return NSOrderedSame; -} - @end From 70ea29d68b1f7651dd89b1bef42f8916d2196da4 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Tue, 5 Nov 2013 21:51:18 +0100 Subject: [PATCH 14/62] Hide deprecation warning Even when using iOS 7 only as base SDK calling `base64Encoding` causes a deprecation warning. --- Classes/BITHockeyHelper.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Classes/BITHockeyHelper.m b/Classes/BITHockeyHelper.m index acffb1aaec..025fe40199 100644 --- a/Classes/BITHockeyHelper.m +++ b/Classes/BITHockeyHelper.m @@ -67,7 +67,10 @@ NSString *bit_base64String(NSData * data, unsigned long length) { return [data base64EncodedStringWithOptions:0]; } else { #endif +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" return [data base64Encoding]; +#pragma clang diagnostic pop #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1 } #endif From fe9bbd55e98d1a2373de7f8a4b563af738229157 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Sun, 10 Nov 2013 22:44:54 +0100 Subject: [PATCH 15/62] Fix two block related memory issues in BITAuthenticator --- Classes/BITAuthenticator.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/BITAuthenticator.m b/Classes/BITAuthenticator.m index e62773720d..c4e4d24c57 100644 --- a/Classes/BITAuthenticator.m +++ b/Classes/BITAuthenticator.m @@ -281,7 +281,7 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut NSError *error = [NSError errorWithDomain:kBITAuthenticatorErrorDomain code:BITAuthenticatorNetworkError userInfo:userInfo]; - self.validated = NO; + strongSelf.validated = NO; if(completion) completion(NO, error); } else { NSError *validationParseError = nil; @@ -379,7 +379,7 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut } else { identified = NO; } - self.identified = identified; + strongSelf.identified = identified; completion(identified, authParseError); if(strongSelf.identificationCompletion) strongSelf.identificationCompletion(identified, authParseError); strongSelf.identificationCompletion = nil; From 27b7ebe201c69e5afe7eca39bafa12fb41f59ee2 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Fri, 8 Nov 2013 05:34:20 -0800 Subject: [PATCH 16/62] Merge pull request #79 from elektrojunge/master Updated podspec to use vendored_frameworks attribute --- HockeySDK.podspec | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/HockeySDK.podspec b/HockeySDK.podspec index ab9fa6294c..fa978bd129 100644 --- a/HockeySDK.podspec +++ b/HockeySDK.podspec @@ -18,10 +18,10 @@ Pod::Spec.new do |s| s.source_files = 'Classes' s.requires_arc = true - s.preserve_paths = 'Resources', 'Support', 'Vendor' - s.frameworks = 'CoreText', 'QuartzCore', 'SystemConfiguration', 'CrashReporter', 'CoreGraphics', 'UIKit', 'Security' - s.xcconfig = { 'FRAMEWORK_SEARCH_PATHS' => '"$(PODS_ROOT)/HockeySDK/Vendor"', - 'GCC_PREPROCESSOR_DEFINITIONS' => %{$(inherited) BITHOCKEY_VERSION="@\\"#{s.version}\\""} } + s.preserve_paths = 'Resources', 'Support' + s.frameworks = 'CoreText', 'QuartzCore', 'SystemConfiguration', 'CoreGraphics', 'UIKit', 'Security' + s.ios.vendored_frameworks = 'Vendor/CrashReporter.framework' + s.xcconfig = {'GCC_PREPROCESSOR_DEFINITIONS' => %{$(inherited) BITHOCKEY_VERSION="@\\"#{s.version}\\""} } s.resource_bundle = { 'HockeySDKResources' => ['Resources/*.png', 'Resources/*.lproj'] } end \ No newline at end of file From 4f3f5f9c9624aaa4547463909a239a2f4a5a65e9 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Mon, 18 Nov 2013 13:38:13 +0100 Subject: [PATCH 17/62] Adjust font size and add an 3rd row for expired view --- Classes/BITUpdateManager.m | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Classes/BITUpdateManager.m b/Classes/BITUpdateManager.m index 62c591f0d1..06ca3304ba 100644 --- a/Classes/BITUpdateManager.m +++ b/Classes/BITUpdateManager.m @@ -524,12 +524,13 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { frame.origin.x = 20; frame.origin.y = frame.size.height - 140; frame.size.width -= 40; - frame.size.height = 50; + frame.size.height = 70; UILabel *label = [[UILabel alloc] initWithFrame:frame]; label.text = message; label.textAlignment = kBITTextLabelAlignmentCenter; - label.numberOfLines = 2; + label.numberOfLines = 3; + label.adjustsFontSizeToFitWidth = YES; label.backgroundColor = [UIColor clearColor]; [self.blockingView addSubview:label]; From 323b9784ea7c203b34ee9e1cc3b88e3fec6de8d8 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Wed, 20 Nov 2013 22:54:28 +0100 Subject: [PATCH 18/62] Simplified configuration - Add simplified initializers - Add option to set delegate via public property --- Classes/BITCrashManager.m | 1 - Classes/BITFeedbackManager.m | 2 -- Classes/BITHockeyBaseManager.m | 1 - Classes/BITHockeyManager.h | 31 +++++++++++++++++ Classes/BITHockeyManager.m | 37 ++++++++++++++++++++- Classes/BITHockeyManagerPrivate.h | 37 --------------------- Support/HockeySDK.xcodeproj/project.pbxproj | 4 --- 7 files changed, 67 insertions(+), 46 deletions(-) delete mode 100644 Classes/BITHockeyManagerPrivate.h diff --git a/Classes/BITCrashManager.m b/Classes/BITCrashManager.m index 7daea4d93b..ae8ab6c223 100644 --- a/Classes/BITCrashManager.m +++ b/Classes/BITCrashManager.m @@ -38,7 +38,6 @@ #import "HockeySDKPrivate.h" #import "BITHockeyHelper.h" -#import "BITHockeyManagerPrivate.h" #import "BITHockeyBaseManagerPrivate.h" #import "BITCrashManagerPrivate.h" #import "BITCrashReportTextFormatter.h" diff --git a/Classes/BITFeedbackManager.m b/Classes/BITFeedbackManager.m index c1219b9f7a..72698086f8 100644 --- a/Classes/BITFeedbackManager.m +++ b/Classes/BITFeedbackManager.m @@ -37,8 +37,6 @@ #import "BITFeedbackManagerPrivate.h" #import "BITHockeyBaseManagerPrivate.h" -#import "BITHockeyManagerPrivate.h" - #import "BITHockeyHelper.h" #import "BITHockeyAppClient.h" diff --git a/Classes/BITHockeyBaseManager.m b/Classes/BITHockeyBaseManager.m index 9614ecefa8..be905fea17 100644 --- a/Classes/BITHockeyBaseManager.m +++ b/Classes/BITHockeyBaseManager.m @@ -35,7 +35,6 @@ #import "BITHockeyBaseManagerPrivate.h" #import "BITHockeyBaseViewController.h" -#import "BITHockeyManagerPrivate.h" #import "BITKeychainUtils.h" #import diff --git a/Classes/BITHockeyManager.h b/Classes/BITHockeyManager.h index 5a64ad13fa..b027475e5c 100644 --- a/Classes/BITHockeyManager.h +++ b/Classes/BITHockeyManager.h @@ -86,6 +86,22 @@ + (BITHockeyManager *)sharedHockeyManager; +/** + Initializes the manager with a particular app identifier + + Initialize the manager with a HockeyApp app identifier. + + [[BITHockeyManager sharedHockeyManager] + configureWithIdentifier:@""]; + + @see configureWithIdentifier:delegate: + @see configureWithBetaIdentifier:liveIdentifier:delegate: + @see startManager + @param appIdentifier The app identifier that should be used. + */ +- (void)configureWithIdentifier:(NSString *)appIdentifier; + + /** Initializes the manager with a particular app identifier and delegate @@ -97,6 +113,7 @@ configureWithIdentifier:@"" delegate:nil]; + @see configureWithIdentifier: @see configureWithBetaIdentifier:liveIdentifier:delegate: @see startManager @see BITHockeyManagerDelegate @@ -132,6 +149,7 @@ you to upload any IPA files, uploading only the dSYM package for crash reporting is just fine. + @see configureWithIdentifier: @see configureWithIdentifier:delegate: @see startManager @see BITHockeyManagerDelegate @@ -163,6 +181,19 @@ ///----------------------------------------------------------------------------- +/** + * Set the delegate + * + * Defines the class that implements the optional protocol `BITHockeyManagerDelegate`. + * + * @see BITHockeyManagerDelegate + * @see BITCrashManagerDelegate + * @see BITUpdateManagerDelegate + * @see BITFeedbackManagerDelegate + */ +@property (nonatomic, weak) id delegate; + + /** Defines the server URL to send data to or request data from diff --git a/Classes/BITHockeyManager.m b/Classes/BITHockeyManager.m index 7d60c8f6db..873dc79544 100644 --- a/Classes/BITHockeyManager.m +++ b/Classes/BITHockeyManager.m @@ -30,7 +30,6 @@ #import "HockeySDK.h" #import "HockeySDKPrivate.h" -#import "BITHockeyManagerPrivate.h" #import "BITHockeyBaseManagerPrivate.h" #import "BITHockeyHelper.h" @@ -149,6 +148,12 @@ #pragma mark - Public Instance Methods (Configuration) +- (void)configureWithIdentifier:(NSString *)appIdentifier { + _appIdentifier = [appIdentifier copy]; + + [self initializeModules]; +} + - (void)configureWithIdentifier:(NSString *)appIdentifier delegate:(id)delegate { _delegate = delegate; _appIdentifier = [appIdentifier copy]; @@ -307,6 +312,36 @@ } +- (void)setDelegate:(id)delegate { + if (_delegate != delegate) { + _delegate = delegate; + +#if HOCKEYSDK_FEATURE_CRASH_REPORTER + if (_crashManager) { + _crashManager.delegate = _delegate; + } +#endif /* HOCKEYSDK_FEATURE_CRASH_REPORTER */ + +#if HOCKEYSDK_FEATURE_UPDATES + if (_updateManager) { + _updateManager.delegate = _delegate; + } +#endif /* HOCKEYSDK_FEATURE_UPDATES */ + +#if HOCKEYSDK_FEATURE_FEEDBACK + if (_feedbackManager) { + _feedbackManager.delegate = _delegate; + } +#endif /* HOCKEYSDK_FEATURE_FEEDBACK */ + +#if HOCKEYSDK_FEATURE_AUTHENTICATOR + if (_authenticator) { + _authenticator.delegate = _delegate; + } +#endif /* HOCKEYSDK_FEATURE_AUTHENTICATOR */ + } +} + #pragma mark - KVO #if HOCKEYSDK_FEATURE_UPDATES diff --git a/Classes/BITHockeyManagerPrivate.h b/Classes/BITHockeyManagerPrivate.h deleted file mode 100644 index 7ac35c4102..0000000000 --- a/Classes/BITHockeyManagerPrivate.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Author: Andreas Linde - * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - - -@interface BITHockeyManager () { -} - -@property (nonatomic, weak) id delegate; - -@end diff --git a/Support/HockeySDK.xcodeproj/project.pbxproj b/Support/HockeySDK.xcodeproj/project.pbxproj index 5690421221..900fcd060a 100644 --- a/Support/HockeySDK.xcodeproj/project.pbxproj +++ b/Support/HockeySDK.xcodeproj/project.pbxproj @@ -127,7 +127,6 @@ 1EAF20AA162DC0F600957B1D /* feedbackActiviy.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A6162DC0F600957B1D /* feedbackActiviy.png */; }; 1EAF20AB162DC0F600957B1D /* feedbackActiviy@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A7162DC0F600957B1D /* feedbackActiviy@2x.png */; }; 1EB52FD5167B766100C801D5 /* HockeySDK.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1E59555F15B6F80E00A03429 /* HockeySDK.strings */; }; - 1EC69F601615001500808FD9 /* BITHockeyManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */; }; 1EF95CA6162CB037000AE3AD /* BITFeedbackActivity.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EF95CA4162CB036000AE3AD /* BITFeedbackActivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1EF95CA7162CB037000AE3AD /* BITFeedbackActivity.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EF95CA5162CB036000AE3AD /* BITFeedbackActivity.m */; }; 1EF95CAA162CB314000AE3AD /* BITFeedbackComposeViewControllerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EF95CA9162CB313000AE3AD /* BITFeedbackComposeViewControllerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -284,7 +283,6 @@ 1EAF20A6162DC0F600957B1D /* feedbackActiviy.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = feedbackActiviy.png; sourceTree = ""; }; 1EAF20A7162DC0F600957B1D /* feedbackActiviy@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActiviy@2x.png"; sourceTree = ""; }; 1EB52FC3167B73D400C801D5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/HockeySDK.strings; sourceTree = ""; }; - 1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyManagerPrivate.h; sourceTree = ""; }; 1EDA60CF15C2C1450032D10B /* HockeySDK-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "HockeySDK-Info.plist"; sourceTree = ""; }; 1EF95CA4162CB036000AE3AD /* BITFeedbackActivity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackActivity.h; sourceTree = ""; }; 1EF95CA5162CB036000AE3AD /* BITFeedbackActivity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackActivity.m; sourceTree = ""; }; @@ -590,7 +588,6 @@ 1E94F9DE16E912DD006570AD /* StoreUpdate */, E41EB465148D7BF50015DEDC /* BITHockeyManager.h */, E41EB466148D7BF50015DEDC /* BITHockeyManager.m */, - 1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */, 1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */, 1E71509A15B5C76F004E88FF /* HockeySDK.h */, 1E84DB3317E0977C00AC83FD /* HockeySDKFeatureConfig.h */, @@ -667,7 +664,6 @@ E405266217A2AD300096359C /* BITFeedbackManagerDelegate.h in Headers */, 1E49A4D0161222B900463151 /* BITWebTableViewCell.h in Headers */, 1E49A4D8161222D400463151 /* HockeySDKPrivate.h in Headers */, - 1EC69F601615001500808FD9 /* BITHockeyManagerPrivate.h in Headers */, E48A3DEC17B3ED1C00924C3D /* BITAuthenticator.h in Headers */, 1E754E601621FBB70070AB92 /* BITCrashReportTextFormatter.h in Headers */, 1E84DB3417E099BA00AC83FD /* HockeySDKFeatureConfig.h in Headers */, From 8cf46655707aba8144d509c04481104bbe620773 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Thu, 21 Nov 2013 00:03:14 +0100 Subject: [PATCH 19/62] Add generateTestCrash method --- Classes/BITCrashManager.h | 16 ++++++++++++++++ Classes/BITCrashManager.m | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Classes/BITCrashManager.h b/Classes/BITCrashManager.h index acae8c57a8..5e61e1b92a 100644 --- a/Classes/BITCrashManager.h +++ b/Classes/BITCrashManager.h @@ -227,4 +227,20 @@ typedef NS_ENUM(NSUInteger, BITCrashManagerStatus) { */ - (BOOL)isDebuggerAttached; + +/** + * Lets the app crash for easy testing of the SDK + * + * The best way to use this is to trigger the crash with a button action. + * + * Make sure not to let the app crash in `applicationDidFinishLaunching` or any other + * startup method! Since otherwise the app would crash before the SDK could process it. + * + * Note that our SDK provides support for handling crashes that happen early on startup. + * Check the documentation for more information on how to use this. + * + * If the SDK detects an App Store environment, it will _NOT_ cause the app to crash! + */ +- (void)generateTestCrash; + @end diff --git a/Classes/BITCrashManager.m b/Classes/BITCrashManager.m index ae8ab6c223..0a2ef965c8 100644 --- a/Classes/BITCrashManager.m +++ b/Classes/BITCrashManager.m @@ -418,6 +418,18 @@ NSString *const kBITCrashManagerStatus = @"BITCrashManagerStatus"; } +- (void)generateTestCrash { + if (![self isAppStoreEnvironment]) { + + if ([self isDebuggerAttached]) { + NSLog(@"[HockeySDK] WARNING: The debugger is attached. The following crash cannot be detected by the SDK!"); + } + + __builtin_trap(); + } +} + + #pragma mark - PLCrashReporter /** From 69d639bab33dbd6128b59b883f1db2017aa72d24 Mon Sep 17 00:00:00 2001 From: Philippe Casgrain Date: Wed, 27 Nov 2013 16:22:17 -0500 Subject: [PATCH 20/62] Removed automaticMode from tests automaticMode was removed in commit 498bd62cbb. --- Support/HockeySDKTests/BITAuthenticatorTests.m | 1 - 1 file changed, 1 deletion(-) diff --git a/Support/HockeySDKTests/BITAuthenticatorTests.m b/Support/HockeySDKTests/BITAuthenticatorTests.m index af68b0c490..7f8e401060 100644 --- a/Support/HockeySDKTests/BITAuthenticatorTests.m +++ b/Support/HockeySDKTests/BITAuthenticatorTests.m @@ -105,7 +105,6 @@ static void *kInstallationIdentification = &kInstallationIdentification; #pragma mark - Initial defaults - (void) testDefaultValues { - assertThatBool(_sut.automaticMode, equalToBool(YES)); assertThatBool(_sut.restrictApplicationUsage, equalToBool(NO)); assertThatBool(_sut.isIdentified, equalToBool(NO)); assertThatBool(_sut.isValidated, equalToBool(NO)); From 117265f15c2978f59b39c383b5e2ca24276ffe3a Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Fri, 29 Nov 2013 15:45:09 +0100 Subject: [PATCH 21/62] Add support for SDK integration workflow --- Classes/BITHockeyManager.m | 85 +++++++++++++++++++++++++++++++++++--- Classes/HockeySDKPrivate.h | 2 + 2 files changed, 81 insertions(+), 6 deletions(-) diff --git a/Classes/BITHockeyManager.m b/Classes/BITHockeyManager.m index 873dc79544..5ad650d81a 100644 --- a/Classes/BITHockeyManager.m +++ b/Classes/BITHockeyManager.m @@ -33,6 +33,7 @@ #import "BITHockeyBaseManagerPrivate.h" #import "BITHockeyHelper.h" +#import "BITHockeyAppClient.h" #if HOCKEYSDK_FEATURE_CRASH_REPORTER @@ -53,7 +54,6 @@ #if HOCKEYSDK_FEATURE_AUTHENTICATOR #import "BITAuthenticator_Private.h" -#import "BITHockeyAppClient.h" #endif /* HOCKEYSDK_FEATURE_AUTHENTICATOR */ @interface BITHockeyManager () @@ -75,6 +75,8 @@ BOOL _startManagerIsInvoked; BOOL _startUpdateManagerIsInvoked; + + BITHockeyAppClient *_hockeyAppClient; } #pragma mark - Private Class Methods @@ -121,6 +123,8 @@ _serverURL = nil; _delegate = nil; + _hockeyAppClient = nil; + _disableCrashManager = NO; _disableUpdateManager = NO; _disableFeedbackManager = NO; @@ -305,9 +309,10 @@ if (_serverURL != aServerURL) { _serverURL = [aServerURL copy]; -#if HOCKEYSDK_FEATURE_AUTHENTICATOR - _authenticator.hockeyAppClient.baseURL = [NSURL URLWithString:_serverURL ? _serverURL : BITHOCKEYSDK_URL]; -#endif /* HOCKEYSDK_FEATURE_AUTHENTICATOR */ + + if (_hockeyAppClient) { + _hockeyAppClient.baseURL = [NSURL URLWithString:_serverURL ? _serverURL : BITHOCKEYSDK_URL]; + } } } @@ -375,6 +380,69 @@ #pragma mark - Private Instance Methods +- (BITHockeyAppClient *)hockeyAppClient { + if (!_hockeyAppClient) { + _hockeyAppClient = [[BITHockeyAppClient alloc] initWithBaseURL:[NSURL URLWithString:_serverURL ? _serverURL : BITHOCKEYSDK_URL]]; + + _hockeyAppClient.baseURL = [NSURL URLWithString:_serverURL ? _serverURL : BITHOCKEYSDK_URL]; + } + + return _hockeyAppClient; +} + +- (NSString *)integrationFlowTimeString { + NSString *timeString = [[NSBundle mainBundle] objectForInfoDictionaryKey:BITHOCKEY_INTEGRATIONFLOW_TIMESTAMP]; + + return timeString; +} + +- (BOOL)integrationFlowStartedWithTimeString:(NSString *)timeString { + if (timeString == nil || [self isAppStoreEnvironment]) { + return NO; + } + + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; + [dateFormatter setLocale:enUSPOSIXLocale]; + [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; + NSDate *integrationFlowStartDate = [dateFormatter dateFromString:timeString]; + + if (integrationFlowStartDate && [integrationFlowStartDate timeIntervalSince1970] > [[NSDate date] timeIntervalSince1970] - (60 * 10) ) { + return YES; + } + + return NO; +} + +- (void)pingServerForIntegrationStartWorkflowWithTimeString:(NSString *)timeString { + if (!_appIdentifier || [self isAppStoreEnvironment]) { + return; + } + + NSString *integrationPath = [NSString stringWithFormat:@"api/3/apps/%@/integration", bit_encodeAppIdentifier(_appIdentifier)]; + + BITHockeyLog(@"INFO: Sending integration workflow ping to %@", integrationPath); + + [[self hockeyAppClient] postPath:integrationPath + parameters:@{@"timestamp": timeString} + completion:^(BITHTTPOperation *operation, NSData* responseData, NSError *error) { + switch (operation.response.statusCode) { + case 400: + BITHockeyLog(@"ERROR: App ID not found"); + break; + case 201: + BITHockeyLog(@"INFO: Ping accepted."); + break; + case 200: + BITHockeyLog(@"INFO: Ping accepted. Server already knows."); + break; + default: + BITHockeyLog(@"ERROR: Unknown error"); + break; + } + }]; +} + - (void)validateStartManagerIsInvoked { if (_validAppIdentifier && !_appStoreEnvironment) { if (!_startManagerIsInvoked) { @@ -461,9 +529,8 @@ #if HOCKEYSDK_FEATURE_AUTHENTICATOR BITHockeyLog(@"INFO: Setup Authenticator"); - BITHockeyAppClient *client = [[BITHockeyAppClient alloc] initWithBaseURL:[NSURL URLWithString:_serverURL ? _serverURL : BITHOCKEYSDK_URL]]; _authenticator = [[BITAuthenticator alloc] initWithAppIdentifier:_appIdentifier isAppStoreEnvironment:_appStoreEnvironment]; - _authenticator.hockeyAppClient = client; + _authenticator.hockeyAppClient = [self hockeyAppClient]; _authenticator.delegate = _delegate; #endif /* HOCKEYSDK_FEATURE_AUTHENTICATOR */ @@ -482,6 +549,12 @@ #endif /* HOCKEYSDK_FEATURE_UPDATES */ + if (![self isAppStoreEnvironment]) { + NSString *integrationFlowTime = [self integrationFlowTimeString]; + if (integrationFlowTime && [self integrationFlowStartedWithTimeString:integrationFlowTime]) { + [self pingServerForIntegrationStartWorkflowWithTimeString:integrationFlowTime]; + } + } } else { [self logInvalidIdentifier:@"app identifier"]; } diff --git a/Classes/HockeySDKPrivate.h b/Classes/HockeySDKPrivate.h index f7de1ab154..7d5e81c4be 100644 --- a/Classes/HockeySDKPrivate.h +++ b/Classes/HockeySDKPrivate.h @@ -56,6 +56,8 @@ #define kBITStoreUpdateLastUUID @"BITStoreUpdateLastUUID" #define kBITStoreUpdateIgnoreVersion @"BITStoreUpdateIgnoredVersion" +#define BITHOCKEY_INTEGRATIONFLOW_TIMESTAMP @"BITIntegrationFlowStartTimestamp" + #define BITHOCKEYSDK_BUNDLE @"HockeySDKResources.bundle" #define BITHOCKEYSDK_URL @"https://sdk.hockeyapp.net/" From 308ea14b6e47ba55196f6f8a624ab84ac6c89f7e Mon Sep 17 00:00:00 2001 From: Philippe Casgrain Date: Wed, 27 Nov 2013 16:22:17 -0500 Subject: [PATCH 22/62] Removed automaticMode from tests automaticMode was removed in commit 498bd62cbb. --- Support/HockeySDKTests/BITAuthenticatorTests.m | 1 - 1 file changed, 1 deletion(-) diff --git a/Support/HockeySDKTests/BITAuthenticatorTests.m b/Support/HockeySDKTests/BITAuthenticatorTests.m index af68b0c490..7f8e401060 100644 --- a/Support/HockeySDKTests/BITAuthenticatorTests.m +++ b/Support/HockeySDKTests/BITAuthenticatorTests.m @@ -105,7 +105,6 @@ static void *kInstallationIdentification = &kInstallationIdentification; #pragma mark - Initial defaults - (void) testDefaultValues { - assertThatBool(_sut.automaticMode, equalToBool(YES)); assertThatBool(_sut.restrictApplicationUsage, equalToBool(NO)); assertThatBool(_sut.isIdentified, equalToBool(NO)); assertThatBool(_sut.isValidated, equalToBool(NO)); From 6bbacd9d394d61959636977c0b2ee828b71103bf Mon Sep 17 00:00:00 2001 From: Philippe Casgrain Date: Wed, 27 Nov 2013 16:22:17 -0500 Subject: [PATCH 23/62] Removed automaticMode from tests automaticMode was removed in commit 498bd62cbb. --- Support/HockeySDKTests/BITAuthenticatorTests.m | 1 - 1 file changed, 1 deletion(-) diff --git a/Support/HockeySDKTests/BITAuthenticatorTests.m b/Support/HockeySDKTests/BITAuthenticatorTests.m index af68b0c490..7f8e401060 100644 --- a/Support/HockeySDKTests/BITAuthenticatorTests.m +++ b/Support/HockeySDKTests/BITAuthenticatorTests.m @@ -105,7 +105,6 @@ static void *kInstallationIdentification = &kInstallationIdentification; #pragma mark - Initial defaults - (void) testDefaultValues { - assertThatBool(_sut.automaticMode, equalToBool(YES)); assertThatBool(_sut.restrictApplicationUsage, equalToBool(NO)); assertThatBool(_sut.isIdentified, equalToBool(NO)); assertThatBool(_sut.isValidated, equalToBool(NO)); From 569b2d93d5e674160ec9fc886c8080e6f6a5c9b6 Mon Sep 17 00:00:00 2001 From: Philippe Casgrain Date: Mon, 2 Dec 2013 13:30:35 -0500 Subject: [PATCH 24/62] Removed obsolete test The user is now required to call `authenticateInstallation` manually, which obviates the need for this test. Required call was implemented in 7052f0cd. --- Support/HockeySDKTests/BITAuthenticatorTests.m | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Support/HockeySDKTests/BITAuthenticatorTests.m b/Support/HockeySDKTests/BITAuthenticatorTests.m index 7f8e401060..5e3fab0ae5 100644 --- a/Support/HockeySDKTests/BITAuthenticatorTests.m +++ b/Support/HockeySDKTests/BITAuthenticatorTests.m @@ -300,16 +300,6 @@ static void *kInstallationIdentification = &kInstallationIdentification; } #pragma mark - Lifetime checks -- (void) testThatAuthenticationTriggersOnStart { - id delegateMock = mockProtocol(@protocol(BITAuthenticatorDelegate)); - _sut.delegate = delegateMock; - _sut.identificationType = BITAuthenticatorIdentificationTypeDevice; - - [_sut startManager]; - - [verify(delegateMock) authenticator:_sut willShowAuthenticationController:(id)anything()]; -} - - (void) testThatValidationTriggersOnDidBecomeActive { id delegateMock = mockProtocol(@protocol(BITAuthenticatorDelegate)); _sut.delegate = delegateMock; From ed1b546384c3d0020b48566de5368a64e944f7f8 Mon Sep 17 00:00:00 2001 From: Philippe Casgrain Date: Mon, 2 Dec 2013 13:30:35 -0500 Subject: [PATCH 25/62] Removed obsolete test The user is now required to call `authenticateInstallation` manually, which obviates the need for this test. Required call was implemented in 7052f0cd. --- Support/HockeySDKTests/BITAuthenticatorTests.m | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Support/HockeySDKTests/BITAuthenticatorTests.m b/Support/HockeySDKTests/BITAuthenticatorTests.m index 7f8e401060..5e3fab0ae5 100644 --- a/Support/HockeySDKTests/BITAuthenticatorTests.m +++ b/Support/HockeySDKTests/BITAuthenticatorTests.m @@ -300,16 +300,6 @@ static void *kInstallationIdentification = &kInstallationIdentification; } #pragma mark - Lifetime checks -- (void) testThatAuthenticationTriggersOnStart { - id delegateMock = mockProtocol(@protocol(BITAuthenticatorDelegate)); - _sut.delegate = delegateMock; - _sut.identificationType = BITAuthenticatorIdentificationTypeDevice; - - [_sut startManager]; - - [verify(delegateMock) authenticator:_sut willShowAuthenticationController:(id)anything()]; -} - - (void) testThatValidationTriggersOnDidBecomeActive { id delegateMock = mockProtocol(@protocol(BITAuthenticatorDelegate)); _sut.delegate = delegateMock; From 4f6ff2ee6ea6c0c4032057d877a8649aac073ed5 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Tue, 3 Dec 2013 17:01:02 +0100 Subject: [PATCH 26/62] Documentation fix for `restrictApplicationUsage` in `BITAuthenticator` --- Classes/BITAuthenticator.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Classes/BITAuthenticator.h b/Classes/BITAuthenticator.h index c14cf9bd7c..784ba5e7ac 100644 --- a/Classes/BITAuthenticator.h +++ b/Classes/BITAuthenticator.h @@ -160,9 +160,9 @@ typedef NS_ENUM(NSUInteger, BITAuthenticatorAppRestrictionEnforcementFrequency) * If enabled, the Authenticator checks depending on `restrictionEnforcementFrequency` * if the user is allowed to use this application. * - * Enabling this property and setting `identificationType` to `BITAuthenticatorIdentificationTypeHockeyAppEmail` - * or `BITAuthenticatorIdentificationTypeHockeyAppUser` also allows to remove access for users - * by removing them from the app's users list on HockeyApp. + * Enabling this property and setting `identificationType` to `BITAuthenticatorIdentificationTypeHockeyAppEmail`, + * `BITAuthenticatorIdentificationTypeHockeyAppUser` or `BITAuthenticatorIdentificationTypeWebAuth` also allows + * to remove access for users by removing them from the app's users list on HockeyApp. * * _Default_: `NO` * From 0619ac9169db2bf7f4ff2b7ea535c83e070b2cba Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Wed, 4 Dec 2013 02:13:50 +0100 Subject: [PATCH 27/62] Add unit test post action for code coverage HTML generation --- .../xcshareddata/xcschemes/HockeySDK.xcscheme | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/Support/HockeySDK.xcodeproj/xcshareddata/xcschemes/HockeySDK.xcscheme b/Support/HockeySDK.xcodeproj/xcshareddata/xcschemes/HockeySDK.xcscheme index aea8ba42ee..1170466773 100644 --- a/Support/HockeySDK.xcodeproj/xcshareddata/xcschemes/HockeySDK.xcscheme +++ b/Support/HockeySDK.xcodeproj/xcshareddata/xcschemes/HockeySDK.xcscheme @@ -1,7 +1,7 @@ + version = "1.7"> @@ -20,6 +20,20 @@ ReferencedContainer = "container:HockeySDK.xcodeproj"> + + + + + + + + + + + + + + From 785f654060b59a66fc9f611da69345c7199acae9 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Wed, 4 Dec 2013 02:19:37 +0100 Subject: [PATCH 28/62] Fixed static analyzer warnings for unit tests when running against 64 bit target --- .../HockeySDKTests/BITAuthenticatorTests.m | 2 +- .../HockeySDKTests/BITHockeyAppClientTests.m | 32 +++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Support/HockeySDKTests/BITAuthenticatorTests.m b/Support/HockeySDKTests/BITAuthenticatorTests.m index 5e3fab0ae5..96ea679369 100644 --- a/Support/HockeySDKTests/BITAuthenticatorTests.m +++ b/Support/HockeySDKTests/BITAuthenticatorTests.m @@ -258,7 +258,7 @@ static void *kInstallationIdentification = &kInstallationIdentification; _sut.identificationType = BITAuthenticatorIdentificationTypeHockeyAppUser; [_sut validateWithCompletion:^(BOOL validated, NSError *error) { assertThatBool(validated, equalToBool(NO)); - assertThatInt(error.code, equalToInt(BITAuthenticatorNotIdentified)); + assertThatLong(error.code, equalToLong(BITAuthenticatorNotIdentified)); }]; } diff --git a/Support/HockeySDKTests/BITHockeyAppClientTests.m b/Support/HockeySDKTests/BITHockeyAppClientTests.m index e9502e095b..d009de2c00 100644 --- a/Support/HockeySDKTests/BITHockeyAppClientTests.m +++ b/Support/HockeySDKTests/BITHockeyAppClientTests.m @@ -115,25 +115,25 @@ #pragma mark - Convenience methods - (void) testThatGetPathCreatesAndEnquesAnOperation { - assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(0)); + assertThatUnsignedLong(_sut.operationQueue.operationCount, equalToUnsignedLong(0)); [given([_sut operationWithURLRequest:(id)anything() completion:nil]) willReturn:[NSOperation new]]; [_sut getPath:@"endpoint" parameters:nil completion:nil]; - assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(1)); + assertThatUnsignedLong(_sut.operationQueue.operationCount, equalToUnsignedLong(1)); } - (void) testThatPostPathCreatesAndEnquesAnOperation { - assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(0)); + assertThatUnsignedLong(_sut.operationQueue.operationCount, equalToUnsignedLong(0)); [given([_sut operationWithURLRequest:nil completion:nil]) willReturn:[NSOperation new]]; [_sut postPath:@"endpoint" parameters:nil completion:nil]; - assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(1)); + assertThatUnsignedLong(_sut.operationQueue.operationCount, equalToUnsignedLong(1)); } #pragma mark - Completion Tests @@ -143,12 +143,12 @@ #pragma mark - HTTPOperation enqueuing / cancellation - (void) testThatOperationIsQueued { - assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(0)); + assertThatUnsignedLong(_sut.operationQueue.operationCount, equalToUnsignedLong(0)); [_sut.operationQueue setSuspended:YES]; BITHTTPOperation *op = [BITHTTPOperation new]; [_sut enqeueHTTPOperation:op]; - assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(1)); + assertThatUnsignedLong(_sut.operationQueue.operationCount, equalToUnsignedLong(1)); } - (void) testThatOperationCancellingMatchesAllOperationsWithNilMethod { @@ -162,9 +162,9 @@ completion:nil]]; [_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost completion:nil]]; - assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3)); + assertThatUnsignedLong(_sut.operationQueue.operationCount, equalToUnsignedLong(3)); NSUInteger numCancelled = [_sut cancelOperationsWithPath:nil method:nil]; - assertThatUnsignedInt(numCancelled, equalToUnsignedInt(3)); + assertThatUnsignedLong(numCancelled, equalToUnsignedLong(3)); } - (void) testThatOperationCancellingMatchesAllOperationsWithNilPath { @@ -178,9 +178,9 @@ completion:nil]]; [_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost completion:nil]]; - assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3)); + assertThatUnsignedLong(_sut.operationQueue.operationCount, equalToUnsignedLong(3)); NSUInteger numCancelled = [_sut cancelOperationsWithPath:nil method:nil]; - assertThatUnsignedInt(numCancelled, equalToUnsignedInt(3)); + assertThatUnsignedLong(numCancelled, equalToUnsignedLong(3)); } @@ -196,9 +196,9 @@ completion:nil]]; [_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost completion:nil]]; - assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3)); + assertThatUnsignedLong(_sut.operationQueue.operationCount, equalToUnsignedLong(3)); NSUInteger numCancelled = [_sut cancelOperationsWithPath:@"Another/acas" method:nil]; - assertThatUnsignedInt(numCancelled, equalToUnsignedInt(1)); + assertThatUnsignedLong(numCancelled, equalToUnsignedLong(1)); } - (void) testThatOperationCancellingMatchesAllOperationsWithSetMethod { @@ -211,9 +211,9 @@ completion:nil]]; [_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost completion:nil]]; - assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3)); + assertThatUnsignedLong(_sut.operationQueue.operationCount, equalToUnsignedLong(3)); NSUInteger numCancelled = [_sut cancelOperationsWithPath:nil method:@"POST"]; - assertThatUnsignedInt(numCancelled, equalToUnsignedInt(1)); + assertThatUnsignedLong(numCancelled, equalToUnsignedLong(1)); } - (void) testThatOperationCancellingMatchesAllOperationsWithSetMethodAndPath { @@ -226,9 +226,9 @@ completion:nil]]; [_sut enqeueHTTPOperation:[_sut operationWithURLRequest:requestPost completion:nil]]; - assertThatUnsignedInt(_sut.operationQueue.operationCount, equalToUnsignedInt(3)); + assertThatUnsignedLong(_sut.operationQueue.operationCount, equalToUnsignedLong(3)); NSUInteger numCancelled = [_sut cancelOperationsWithPath:@"Another/acas" method:@"PUT"]; - assertThatUnsignedInt(numCancelled, equalToUnsignedInt(1)); + assertThatUnsignedLong(numCancelled, equalToUnsignedLong(1)); } #pragma mark - Operation Testing From 6d6012b0f65a43b006f2ad44b7a9062262a8a65d Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Wed, 4 Dec 2013 14:08:08 +0100 Subject: [PATCH 29/62] Fixed self.validated not always being set to NO if restrictionEnforcementFrequency is set to BITAuthenticatorAppRestrictionEnforcementOnAppActive --- Classes/BITAuthenticator.m | 21 +++++++++------------ Classes/BITAuthenticator_Private.h | 4 ++-- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/Classes/BITAuthenticator.m b/Classes/BITAuthenticator.m index c4e4d24c57..3da5a383cf 100644 --- a/Classes/BITAuthenticator.m +++ b/Classes/BITAuthenticator.m @@ -48,7 +48,7 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut @implementation BITAuthenticator { id _appDidBecomeActiveObserver; - id _appWillResignActiveObserver; + id _appDidEnterBackgroundOberser; UIViewController *_authenticationController; BOOL _isSetup; @@ -651,13 +651,13 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut [strongSelf applicationDidBecomeActive:note]; }]; } - if(nil == _appWillResignActiveObserver) { - _appWillResignActiveObserver = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillResignActiveNotification + if(nil == _appDidEnterBackgroundOberser) { + _appDidEnterBackgroundOberser = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil queue:NSOperationQueue.mainQueue usingBlock:^(NSNotification *note) { typeof(self) strongSelf = weakSelf; - [strongSelf applicationWillResignActive:note]; + [strongSelf applicationDidEnterBackground:note]; }]; } } @@ -667,9 +667,9 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut [[NSNotificationCenter defaultCenter] removeObserver:_appDidBecomeActiveObserver]; _appDidBecomeActiveObserver = nil; } - if(_appWillResignActiveObserver) { - [[NSNotificationCenter defaultCenter] removeObserver:_appWillResignActiveObserver]; - _appWillResignActiveObserver = nil; + if(_appDidEnterBackgroundOberser) { + [[NSNotificationCenter defaultCenter] removeObserver:_appDidEnterBackgroundOberser]; + _appDidEnterBackgroundOberser = nil; } } @@ -755,11 +755,8 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut [self authenticate]; } -- (void)applicationWillResignActive:(NSNotification *)note { - //only reset if app is really going into the background, e.g not when pulling down - //the notification center - if(BITAuthenticatorAppRestrictionEnforcementOnAppActive == self.restrictionEnforcementFrequency && - [[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) { +- (void)applicationDidEnterBackground:(NSNotification *)note { + if(BITAuthenticatorAppRestrictionEnforcementOnAppActive == self.restrictionEnforcementFrequency) { self.validated = NO; } } diff --git a/Classes/BITAuthenticator_Private.h b/Classes/BITAuthenticator_Private.h index c41134600a..86064cc836 100644 --- a/Classes/BITAuthenticator_Private.h +++ b/Classes/BITAuthenticator_Private.h @@ -60,11 +60,11 @@ @property (nonatomic, copy, readonly) NSString *installationIdentifier; /** - * method registered as observer for applicationWillBecomeInactive events + * method registered as observer for applicationDidEnterBackground events * * @param note NSNotification */ -- (void) applicationWillResignActive:(NSNotification*) note; +- (void) applicationDidEnterBackground:(NSNotification*) note; /** * method registered as observer for applicationsDidBecomeActive events From 8a17777c7e325429154e0e883bd6f91f1769fdd7 Mon Sep 17 00:00:00 2001 From: Stefan Haubold Date: Wed, 4 Dec 2013 21:12:59 +0100 Subject: [PATCH 30/62] improved logic to choose right window to show dialogs in --- Classes/BITHockeyBaseManager.m | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Classes/BITHockeyBaseManager.m b/Classes/BITHockeyBaseManager.m index 9614ecefa8..e3899c79ce 100644 --- a/Classes/BITHockeyBaseManager.m +++ b/Classes/BITHockeyBaseManager.m @@ -162,7 +162,11 @@ } - (UIWindow *)findVisibleWindow { - UIWindow *visibleWindow = nil; + UIWindow *visibleWindow = [UIApplication sharedApplication].keyWindow; + + if (!(visibleWindow.hidden)) { + return visibleWindow; + } // if the rootViewController property (available >= iOS 4.0) of the main window is set, we present the modal view controller on top of the rootViewController NSArray *windows = [[UIApplication sharedApplication] windows]; @@ -171,7 +175,7 @@ visibleWindow = window; } if ([UIWindow instancesRespondToSelector:@selector(rootViewController)]) { - if ([window rootViewController]) { + if (!(window.hidden) && ([window rootViewController])) { visibleWindow = window; BITHockeyLog(@"INFO: UIWindow with rootViewController found: %@", visibleWindow); break; From eeff4d611d9af366adb0041388af42212db8f819 Mon Sep 17 00:00:00 2001 From: Thomas Dohmke Date: Thu, 5 Dec 2013 17:41:35 +0100 Subject: [PATCH 31/62] Handle authorize URL from full-size-image. --- Classes/BITAuthenticator.m | 99 +++++++++++++++++++++++++++++++++----- 1 file changed, 87 insertions(+), 12 deletions(-) diff --git a/Classes/BITAuthenticator.m b/Classes/BITAuthenticator.m index 3da5a383cf..aa41b63c1f 100644 --- a/Classes/BITAuthenticator.m +++ b/Classes/BITAuthenticator.m @@ -35,6 +35,8 @@ #import "BITHockeyAppClient.h" #import "BITHockeyHelper.h" +#include + static NSString* const kBITAuthenticatorUUIDKey = @"BITAuthenticatorUUIDKey"; static NSString* const kBITAuthenticatorIdentifierKey = @"BITAuthenticatorIdentifierKey"; static NSString* const kBITAuthenticatorIdentifierTypeKey = @"BITAuthenticatorIdentifierTypeKey"; @@ -45,12 +47,14 @@ static NSString* const kBITAuthenticatorUserEmailKey = @"BITAuthenticatorUserEma static NSString* const kBITAuthenticatorAuthTokenKey = @"BITAuthenticatorAuthTokenKey"; static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAuthTokenTypeKey"; +typedef unsigned int bit_uint32; +static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; @implementation BITAuthenticator { id _appDidBecomeActiveObserver; id _appDidEnterBackgroundOberser; UIViewController *_authenticationController; - + BOOL _isSetup; } @@ -155,6 +159,12 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut return; } + [self processFullSizeImage]; + if (self.identified) { + if(completion) completion(YES, nil); + return; + } + //it's not identified yet, do it now BITAuthenticationViewController *viewController = nil; switch (self.identificationType) { @@ -270,9 +280,7 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut completion:^(BITHTTPOperation *operation, NSData* responseData, NSError *error) { typeof (self) strongSelf = weakSelf; if(nil == responseData) { - NSDictionary *userInfo = @{ - NSLocalizedDescriptionKey : BITHockeyLocalizedString(@"HockeyAuthenticationFailedAuthenticate"), - }; + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : BITHockeyLocalizedString(@"HockeyAuthenticationFailedAuthenticate")}; if(error) { NSMutableDictionary *dict = [userInfo mutableCopy]; dict[NSUnderlyingErrorKey] = error; @@ -516,7 +524,6 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut case BITAuthenticatorIdentificationTypeAnonymous: case BITAuthenticatorIdentificationTypeHockeyAppEmail: case BITAuthenticatorIdentificationTypeHockeyAppUser: - NSAssert(NO,@"Should not happen. Those identification types don't need an authentication URL"); return nil; break; } @@ -543,7 +550,7 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut if(!([[url scheme] isEqualToString:urlScheme] && [[url host] isEqualToString:kAuthorizationHost])) { return NO; } - + NSString *installationIdentifier = nil; NSString *localizedErrorDescription = nil; switch (self.identificationType) { @@ -627,6 +634,7 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut } #pragma mark - Private helpers + - (void) cleanupInternalStorage { [self removeKeyFromKeychain:kBITAuthenticatorIdentifierTypeKey]; [self removeKeyFromKeychain:kBITAuthenticatorIdentifierKey]; @@ -639,6 +647,73 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut [self removeKeyFromKeychain:kBITAuthenticatorAuthTokenTypeKey]; } +- (void)processFullSizeImage { +#ifdef BIT_INTERNAL_DEBUG + NSString* path = [[NSBundle mainBundle] pathForResource:@"iTunesArtwork" ofType:@"png"]; +#else + NSString* path = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/../iTunesArtwork"]; +#endif + + struct stat fs; + int fd = open([path UTF8String], O_RDONLY, 0); + if (fstat(fd, &fs) < 0) { + // File not found + return; + } + + unsigned char *buffer, *source; + source = (unsigned char *)malloc(fs.st_size); + if (read(fd, source, fs.st_size) != fs.st_size) { + // Couldn't read file + free(source); + return; + } + + bit_uint32 length; + unsigned char *name; + unsigned char *data; + NSString *result = nil; + + buffer = source + 8; + int index = 0; + do { + memcpy(&length, buffer, 4); + length = ntohl(length); + name = (unsigned char *)malloc(4); + + buffer += 4; + + memcpy(name, buffer, 4); + buffer += 4; + data = (unsigned char *)malloc(length + 1); + memcpy(data, buffer, length); + buffer += length; + buffer += 4; + + if (!strcmp((const char *)name, "tEXt")) { + data[length] = 0; + NSString *key = [NSString stringWithCString:(char *)data encoding:NSUTF8StringEncoding]; + + if ([key isEqualToString:@"Data"]) { + result = [NSString stringWithCString:(char *)(data + key.length + 1) encoding:NSUTF8StringEncoding]; + } + } + + if (!memcmp(name, kBITPNGEndChunk, 4)){ + index = 128; + } + + free(data); + free(name); + } while (index++ < 128); + + free(source); + + if (result) { + [self handleOpenURL:[NSURL URLWithString:result] sourceApplication:nil annotation:nil]; + } +} + #pragma mark - KVO - (void) registerObservers { __weak typeof(self) weakSelf = self; @@ -653,12 +728,12 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut } if(nil == _appDidEnterBackgroundOberser) { _appDidEnterBackgroundOberser = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification - object:nil - queue:NSOperationQueue.mainQueue - usingBlock:^(NSNotification *note) { - typeof(self) strongSelf = weakSelf; - [strongSelf applicationDidEnterBackground:note]; - }]; + object:nil + queue:NSOperationQueue.mainQueue + usingBlock:^(NSNotification *note) { + typeof(self) strongSelf = weakSelf; + [strongSelf applicationDidEnterBackground:note]; + }]; } } From 14a5a0f32252637180c6802f66848a3fe4d2dc63 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Mon, 16 Dec 2013 03:27:11 +0100 Subject: [PATCH 32/62] Fix delete button appearance in feedback list view on iOS 7 when swiping a feedback message --- Classes/BITFeedbackListViewCell.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Classes/BITFeedbackListViewCell.m b/Classes/BITFeedbackListViewCell.m index 22a7ceeded..759128926d 100644 --- a/Classes/BITFeedbackListViewCell.m +++ b/Classes/BITFeedbackListViewCell.m @@ -178,7 +178,9 @@ } // background for deletion accessory view - [self addSubview:accessoryViewBackground]; + if (self.style == BITFeedbackListViewCellPresentatationStyleDefault) { + [self addSubview:accessoryViewBackground]; + } // header NSString *dateString = @""; From 3396b796205cd15283c893839bf259d45b193629 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Mon, 16 Dec 2013 18:35:02 +0100 Subject: [PATCH 33/62] Fix typo --- Classes/BITHockeyManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/BITHockeyManager.h b/Classes/BITHockeyManager.h index b027475e5c..0f7eb24177 100644 --- a/Classes/BITHockeyManager.h +++ b/Classes/BITHockeyManager.h @@ -75,7 +75,7 @@ #pragma mark - Public Methods ///----------------------------------------------------------------------------- -/// @name Initializion +/// @name Initialization ///----------------------------------------------------------------------------- /** From 480054abe3fefbfc327f3cb4cb3d48eb94c81baa Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Mon, 16 Dec 2013 18:51:12 +0100 Subject: [PATCH 34/62] Add public integration test to let the user check if the SDK reaches the server --- Classes/BITHockeyManager.h | 18 ++++++++++++++++++ Classes/BITHockeyManager.m | 26 ++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/Classes/BITHockeyManager.h b/Classes/BITHockeyManager.h index 0f7eb24177..bd0bacddbd 100644 --- a/Classes/BITHockeyManager.h +++ b/Classes/BITHockeyManager.h @@ -367,4 +367,22 @@ @property (nonatomic, assign, getter=isDebugLogEnabled) BOOL debugLogEnabled; +///----------------------------------------------------------------------------- +/// @name Integration test +///----------------------------------------------------------------------------- + +/** + Pings the server with the HockeyApp app identifiers used for initialization + + Call this method once for debugging purposes to test if your SDK setup code + reaches the server successfully. + + Once invoked, check the apps page on HockeyApp for a verification. + + If you setup the SDK with a beta and live identifier, a call to both app IDs will be done. + + This call is ignored if the app is running in the App Store!. + */ +- (void)testIdentifier; + @end diff --git a/Classes/BITHockeyManager.m b/Classes/BITHockeyManager.m index 5ad650d81a..8c3fa549ae 100644 --- a/Classes/BITHockeyManager.m +++ b/Classes/BITHockeyManager.m @@ -69,6 +69,7 @@ @implementation BITHockeyManager { NSString *_appIdentifier; + NSString *_liveIdentifier; BOOL _validAppIdentifier; @@ -135,6 +136,7 @@ _startManagerIsInvoked = NO; _startUpdateManagerIsInvoked = NO; + _liveIdentifier = nil; _installString = bit_appAnonID(); #if !TARGET_IPHONE_SIMULATOR @@ -171,6 +173,7 @@ // check the live identifier now, because otherwise invalid identifier would only be logged when the app is already in the store if (![self checkValidityOfAppIdentifier:liveIdentifier]) { [self logInvalidIdentifier:@"liveIdentifier"]; + _liveIdentifier = [liveIdentifier copy]; } if ([self shouldUseLiveIdentifier]) { @@ -347,6 +350,21 @@ } } +- (void)testIdentifier { + if (!_appIdentifier || [self isAppStoreEnvironment]) { + return; + } + + NSDate *now = [NSDate date]; + NSString *timeString = [NSString stringWithFormat:@"%.0f", [now timeIntervalSince1970]]; + [self pingServerForIntegrationStartWorkflowWithTimeString:timeString appIdentifier:_appIdentifier]; + + if (_liveIdentifier) { + [self pingServerForIntegrationStartWorkflowWithTimeString:timeString appIdentifier:_liveIdentifier]; + } +} + + #pragma mark - KVO #if HOCKEYSDK_FEATURE_UPDATES @@ -414,12 +432,12 @@ return NO; } -- (void)pingServerForIntegrationStartWorkflowWithTimeString:(NSString *)timeString { - if (!_appIdentifier || [self isAppStoreEnvironment]) { +- (void)pingServerForIntegrationStartWorkflowWithTimeString:(NSString *)timeString appIdentifier:(NSString *)appIdentifier { + if (!appIdentifier || [self isAppStoreEnvironment]) { return; } - NSString *integrationPath = [NSString stringWithFormat:@"api/3/apps/%@/integration", bit_encodeAppIdentifier(_appIdentifier)]; + NSString *integrationPath = [NSString stringWithFormat:@"api/3/apps/%@/integration", bit_encodeAppIdentifier(appIdentifier)]; BITHockeyLog(@"INFO: Sending integration workflow ping to %@", integrationPath); @@ -552,7 +570,7 @@ if (![self isAppStoreEnvironment]) { NSString *integrationFlowTime = [self integrationFlowTimeString]; if (integrationFlowTime && [self integrationFlowStartedWithTimeString:integrationFlowTime]) { - [self pingServerForIntegrationStartWorkflowWithTimeString:integrationFlowTime]; + [self pingServerForIntegrationStartWorkflowWithTimeString:integrationFlowTime appIdentifier:_appIdentifier]; } } } else { From 292d9abc0d894d5b9643535100af93ca518e5d86 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Tue, 17 Dec 2013 01:34:13 +0100 Subject: [PATCH 35/62] Bring back date format and timestamp of crash reports to be always identical no matter what locale is set This was introduced in https://github.com/bitstadium/HockeySDK-iOS/commit/4dbbef38e2ec008627b1f79ba10a044ec9a2495c but when merging PLCR changes back in it accidentally got removed --- Classes/BITCrashReportTextFormatter.m | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Classes/BITCrashReportTextFormatter.m b/Classes/BITCrashReportTextFormatter.m index 11081770b9..0816ee4f87 100644 --- a/Classes/BITCrashReportTextFormatter.m +++ b/Classes/BITCrashReportTextFormatter.m @@ -256,7 +256,13 @@ static NSInteger bit_binaryImageSort(id binary1, id binary2, void *context) { if (report.systemInfo.operatingSystemBuild != nil) osBuild = report.systemInfo.operatingSystemBuild; - [text appendFormat: @"Date/Time: %@\n", report.systemInfo.timestamp]; + NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; + NSDateFormatter *rfc3339Formatter = [[NSDateFormatter alloc] init]; + [rfc3339Formatter setLocale:enUSPOSIXLocale]; + [rfc3339Formatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; + [rfc3339Formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; + + [text appendFormat: @"Date/Time: %@\n", [rfc3339Formatter stringFromDate:report.systemInfo.timestamp]]; [text appendFormat: @"OS Version: %@ %@ (%@)\n", osName, report.systemInfo.operatingSystemVersion, osBuild]; [text appendFormat: @"Report Version: 104\n"]; } From 3b5f70d38a7e0c6c25a4497560af9eeea5c1704a Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Tue, 17 Dec 2013 16:01:04 +0100 Subject: [PATCH 36/62] Make sure that BITHockeyLocalizedString always returns a valid string --- Classes/HockeySDKPrivate.m | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Classes/HockeySDKPrivate.m b/Classes/HockeySDKPrivate.m index 6307434adf..381fddf894 100644 --- a/Classes/HockeySDKPrivate.m +++ b/Classes/HockeySDKPrivate.m @@ -50,11 +50,16 @@ NSBundle *BITHockeyBundle(void) { } NSString *BITHockeyLocalizedString(NSString *stringToken) { + if (!stringToken) return @""; + NSString *appSpecificLocalizationString = NSLocalizedString(stringToken, @""); if (appSpecificLocalizationString && ![stringToken isEqualToString:appSpecificLocalizationString]) { return appSpecificLocalizationString; } else if (BITHockeyBundle()) { - return NSLocalizedStringFromTableInBundle(stringToken, @"HockeySDK", BITHockeyBundle(), @""); + NSString *bundleSpecificLocalizationString = NSLocalizedStringFromTableInBundle(stringToken, @"HockeySDK", BITHockeyBundle(), @""); + if (bundleSpecificLocalizationString) + return bundleSpecificLocalizationString; + return stringToken; } else { return stringToken; } From f2dd25367046513cf7e18ad5d930729012c71f68 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Tue, 17 Dec 2013 17:51:23 +0100 Subject: [PATCH 37/62] Safe app version usage time in its own property list file instead of the user defaults --- Classes/BITUpdateManager.m | 67 ++++++++++++++++++++++++++++--- Classes/BITUpdateManagerPrivate.h | 2 + Classes/HockeySDKPrivate.h | 2 + 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/Classes/BITUpdateManager.m b/Classes/BITUpdateManager.m index 06ca3304ba..5332f1d227 100644 --- a/Classes/BITUpdateManager.m +++ b/Classes/BITUpdateManager.m @@ -59,6 +59,10 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { BOOL _lastCheckFailed; BOOL _sendUsageData; + NSFileManager *_fileManager; + NSString *_updateDir; + NSString *_usageDataFile; + id _appDidBecomeActiveObserver; id _appDidEnterBackgroundObserver; id _networkDidBecomeReachableObserver; @@ -200,10 +204,10 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { #pragma mark - Usage -- (void)startUsage { +- (void)loadAppVersionUsageData { + self.currentAppVersionUsageTime = @0; + if ([self expiryDateReached]) return; - - self.usageStartTimestamp = [NSDate date]; BOOL newVersion = NO; @@ -219,21 +223,55 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithDouble:[[NSDate date] timeIntervalSinceReferenceDate]] forKey:kBITUpdateDateOfVersionInstallation]; [[NSUserDefaults standardUserDefaults] setObject:_uuid forKey:kBITUpdateUsageTimeForUUID]; [self storeUsageTimeForCurrentVersion:[NSNumber numberWithDouble:0]]; + } else { + if (![_fileManager fileExistsAtPath:_usageDataFile]) + return; + + NSData *codedData = [[NSData alloc] initWithContentsOfFile:_usageDataFile]; + if (codedData == nil) return; + + NSKeyedUnarchiver *unarchiver = nil; + + @try { + unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:codedData]; + } + @catch (NSException *exception) { + return; + } + + if ([unarchiver containsValueForKey:kBITUpdateUsageTimeOfCurrentVersion]) { + self.currentAppVersionUsageTime = [unarchiver decodeObjectForKey:kBITUpdateUsageTimeOfCurrentVersion]; + } + + [unarchiver finishDecoding]; } } +- (void)startUsage { + if ([self expiryDateReached]) return; + + self.usageStartTimestamp = [NSDate date]; +} + - (void)stopUsage { if ([self expiryDateReached]) return; double timeDifference = [[NSDate date] timeIntervalSinceReferenceDate] - [_usageStartTimestamp timeIntervalSinceReferenceDate]; - double previousTimeDifference = [(NSNumber *)[[NSUserDefaults standardUserDefaults] valueForKey:kBITUpdateUsageTimeOfCurrentVersion] doubleValue]; + double previousTimeDifference = [self.currentAppVersionUsageTime doubleValue]; [self storeUsageTimeForCurrentVersion:[NSNumber numberWithDouble:previousTimeDifference + timeDifference]]; } - (void) storeUsageTimeForCurrentVersion:(NSNumber *)usageTime { - [[NSUserDefaults standardUserDefaults] setObject:usageTime forKey:kBITUpdateUsageTimeOfCurrentVersion]; - [[NSUserDefaults standardUserDefaults] synchronize]; + NSMutableData *data = [[NSMutableData alloc] init]; + NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; + + [archiver encodeObject:usageTime forKey:kBITUpdateUsageTimeOfCurrentVersion]; + + [archiver finishEncoding]; + [data writeToFile:_usageDataFile atomically:YES]; + + self.currentAppVersionUsageTime = usageTime; } - (NSString *)currentUsageString { @@ -384,6 +422,7 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { _checkForTracker = NO; _firstStartAfterInstall = NO; _companyName = nil; + _currentAppVersionUsageTime = @0; // set defaults self.showDirectInstallOption = NO; @@ -411,10 +450,26 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { NSLog(@"[HockeySDK] WARNING: %@ is missing, make sure it is added!", BITHOCKEYSDK_BUNDLE); } + _fileManager = [[NSFileManager alloc] init]; + + // temporary directory for crashes grabbed from PLCrashReporter + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); + _updateDir = [[paths objectAtIndex:0] stringByAppendingPathComponent:BITHOCKEY_IDENTIFIER]; + + if (![_fileManager fileExistsAtPath:_updateDir]) { + NSDictionary *attributes = [NSDictionary dictionaryWithObject: [NSNumber numberWithUnsignedLong: 0755] forKey: NSFilePosixPermissions]; + NSError *theError = NULL; + + [_fileManager createDirectoryAtPath:_updateDir withIntermediateDirectories: YES attributes: attributes error: &theError]; + } + + _usageDataFile = [_updateDir stringByAppendingPathComponent:BITHOCKEY_USAGE_DATA]; + [self loadAppCache]; _installationIdentification = [self stringValueFromKeychainForKey:kBITUpdateInstallationIdentification]; + [self loadAppVersionUsageData]; [self startUsage]; NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter]; diff --git a/Classes/BITUpdateManagerPrivate.h b/Classes/BITUpdateManagerPrivate.h index 17b8dd05ff..208003b3b8 100644 --- a/Classes/BITUpdateManagerPrivate.h +++ b/Classes/BITUpdateManagerPrivate.h @@ -52,6 +52,8 @@ // get array of all available versions @property (nonatomic, copy) NSArray *appVersions; +@property (nonatomic, strong) NSNumber *currentAppVersionUsageTime; + @property (nonatomic, strong) NSURLConnection *urlConnection; @property (nonatomic, copy) NSDate *usageStartTimestamp; diff --git a/Classes/HockeySDKPrivate.h b/Classes/HockeySDKPrivate.h index f7de1ab154..d58674f9c1 100644 --- a/Classes/HockeySDKPrivate.h +++ b/Classes/HockeySDKPrivate.h @@ -41,6 +41,8 @@ #define BITHOCKEY_FEEDBACK_SETTINGS @"BITFeedbackManager.plist" +#define BITHOCKEY_USAGE_DATA @"BITUpdateManager.plist" + #define kBITUpdateInstalledUUID @"BITUpdateInstalledUUID" #define kBITUpdateInstalledVersionID @"BITUpdateInstalledVersionID" #define kBITUpdateCurrentCompanyName @"BITUpdateCurrentCompanyName" From 7347d3525b71fbce4ba6e3abcfcfef77d5cde761 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Wed, 18 Dec 2013 20:43:52 +0100 Subject: [PATCH 38/62] Replace email placeholder text Replace email placeholder text from `example@email.com` to `email@example.com` --- Resources/de.lproj/HockeySDK.strings | 4 ++-- Resources/en.lproj/HockeySDK.strings | 4 ++-- Resources/es.lproj/HockeySDK.strings | 4 ++-- Resources/fr.lproj/HockeySDK.strings | 4 ++-- Resources/hr.lproj/HockeySDK.strings | 4 ++-- Resources/hu.lproj/HockeySDK.strings | 4 ++-- Resources/it.lproj/HockeySDK.strings | 4 ++-- Resources/ja.lproj/HockeySDK.strings | 4 ++-- Resources/nl.lproj/HockeySDK.strings | 4 ++-- Resources/pt-PT.lproj/HockeySDK.strings | 4 ++-- Resources/pt.lproj/HockeySDK.strings | 4 ++-- Resources/ro.lproj/HockeySDK.strings | 4 ++-- Resources/ru.lproj/HockeySDK.strings | 4 ++-- Resources/zh-Hans.lproj/HockeySDK.strings | 4 ++-- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/Resources/de.lproj/HockeySDK.strings b/Resources/de.lproj/HockeySDK.strings index dd3d6342b7..8529703ebb 100644 --- a/Resources/de.lproj/HockeySDK.strings +++ b/Resources/de.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "E-Mail"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "beispiel@email.de"; +"HockeyFeedbackUserDataEmailPlaceholder" = "email@beispiel.de"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "Geben Sie die E-Mail-Adresse und das Kennwort Ihres HockeyApp-Accounts ein, um Zugriff auf diese App zu erhalten."; "HockeyAuthenticationViewControllerDataEmailDescription" = "Geben Sie die E-Mail-Adresse Ihres HockeyApp-Accounts ein, um Zugriff auf diese App zu erhalten."; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "beispiel@email.de"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "email@beispiel.de"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "Erforderlich"; "HockeyAuthenticationViewControllerEmailDescription" = "E-Mail"; "HockeyAuthenticationViewControllerPasswordDescription" = "Kennwort"; diff --git a/Resources/en.lproj/HockeySDK.strings b/Resources/en.lproj/HockeySDK.strings index 2b8e620795..c6e2ac4bc8 100644 --- a/Resources/en.lproj/HockeySDK.strings +++ b/Resources/en.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "Email"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com"; +"HockeyFeedbackUserDataEmailPlaceholder" = "email@example.com"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "Please enter your HockeyApp account's email address and password to authorize access to this app."; "HockeyAuthenticationViewControllerDataEmailDescription" = "Please enter your HockeyApp account's email address to authorize access to this app."; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "example@email.com"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "email@example.com"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "Required"; "HockeyAuthenticationViewControllerEmailDescription" = "Email"; "HockeyAuthenticationViewControllerPasswordDescription" = "Password"; diff --git a/Resources/es.lproj/HockeySDK.strings b/Resources/es.lproj/HockeySDK.strings index c9b1276bdd..a3551572f8 100644 --- a/Resources/es.lproj/HockeySDK.strings +++ b/Resources/es.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "Correo"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "ejemplo@correo.com"; +"HockeyFeedbackUserDataEmailPlaceholder" = "correo@ejemplo.com"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "Escriba el correo y contraseña de su cuenta de HockeyApp para autorizar el acceso a esta app."; "HockeyAuthenticationViewControllerDataEmailDescription" = "Escriba el correo de su cuenta de HockeyApp para autorizar el acceso a esta app."; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "ejemplo@dominio.com"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "correo@ejemplo.com"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "Obligatorio"; "HockeyAuthenticationViewControllerEmailDescription" = "Correo"; "HockeyAuthenticationViewControllerPasswordDescription" = "Contraseña"; diff --git a/Resources/fr.lproj/HockeySDK.strings b/Resources/fr.lproj/HockeySDK.strings index 3fe5bd098e..9677af296a 100644 --- a/Resources/fr.lproj/HockeySDK.strings +++ b/Resources/fr.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "Adresse"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "exemple@email.com"; +"HockeyFeedbackUserDataEmailPlaceholder" = "email@exemple.com"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "Saisissez l'adresse électronique et le mot de passe de votre compte HockeyApp pour autoriser l'accès à cette application."; "HockeyAuthenticationViewControllerDataEmailDescription" = "Saisissez l'adresse électronique de votre compte HockeyApp pour autoriser l'accès à cette application."; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "exemple@email.com"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "email@exemple.com"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "Requis"; "HockeyAuthenticationViewControllerEmailDescription" = "Adresse"; "HockeyAuthenticationViewControllerPasswordDescription" = "Mot de passe"; diff --git a/Resources/hr.lproj/HockeySDK.strings b/Resources/hr.lproj/HockeySDK.strings index 682ddc7a5e..1b9d07ddca 100644 --- a/Resources/hr.lproj/HockeySDK.strings +++ b/Resources/hr.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "E-mail"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "primjer@email.com"; +"HockeyFeedbackUserDataEmailPlaceholder" = "email@primjer.com"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "Unesite molimo Vas e-mail adresu i lozinku Vašeg HockeyApp računa kako biste autorizirali pristup ovoj aplikaciji."; "HockeyAuthenticationViewControllerDataEmailDescription" = "Molimo Vas unesite e-mail adresu Vašeg HockeyApp računa za autorizaciju pristupa aplikaciji."; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "primjer@email.com"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "email@primjer.com"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "Obavezno"; "HockeyAuthenticationViewControllerEmailDescription" = "E-mail"; "HockeyAuthenticationViewControllerPasswordDescription" = "Lozinka"; diff --git a/Resources/hu.lproj/HockeySDK.strings b/Resources/hu.lproj/HockeySDK.strings index 8ba8262fd8..88eaa7a5b7 100644 --- a/Resources/hu.lproj/HockeySDK.strings +++ b/Resources/hu.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "E-mail"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com"; +"HockeyFeedbackUserDataEmailPlaceholder" = "email@example.com"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "Kérjük, adja meg HockeyApp fiókjához tartozó e-mail címét és jelszavát az alkalmazáshoz történő hozzáférés engedélyezéséhez."; "HockeyAuthenticationViewControllerDataEmailDescription" = "Kérjük, adja meg HockeyApp fiókjához tartozó e-mail címét az alkalmazáshoz történő hozzáférés engedélyezéséhez."; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "example@email.com"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "email@example.com"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "Szükséges mező"; "HockeyAuthenticationViewControllerEmailDescription" = "E-mail"; "HockeyAuthenticationViewControllerPasswordDescription" = "Jelszó"; diff --git a/Resources/it.lproj/HockeySDK.strings b/Resources/it.lproj/HockeySDK.strings index eb485608bb..1a125239a4 100644 --- a/Resources/it.lproj/HockeySDK.strings +++ b/Resources/it.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "E-mail"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "esempio@email.com"; +"HockeyFeedbackUserDataEmailPlaceholder" = "email@esempio.com"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "Inserisci l'indirizzo e-mail e la password del tuo account HockeyApp per autorizzare l'accesso a questa app."; "HockeyAuthenticationViewControllerDataEmailDescription" = "Inserisci l'indirizzo e-mail del tuo account HockeyApp per autorizzare l'accesso a questa app."; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "esempio@email.com"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "email@esempio.com"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "Richiesto"; "HockeyAuthenticationViewControllerEmailDescription" = "E-mail"; "HockeyAuthenticationViewControllerPasswordDescription" = "Password"; diff --git a/Resources/ja.lproj/HockeySDK.strings b/Resources/ja.lproj/HockeySDK.strings index 4f22449ac5..865df99f3b 100644 --- a/Resources/ja.lproj/HockeySDK.strings +++ b/Resources/ja.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "メール"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com"; +"HockeyFeedbackUserDataEmailPlaceholder" = "email@example.com"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "HockeyAppアカウントのメールアドレスとパスワードを入力し、このAppへのアクセスを認証してください。"; "HockeyAuthenticationViewControllerDataEmailDescription" = "HockeyAppアカウントのメールアドレスを入力し、このAppへのアクセスを認証してください。"; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "example@email.com"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "email@example.com"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "必須"; "HockeyAuthenticationViewControllerEmailDescription" = "メール"; "HockeyAuthenticationViewControllerPasswordDescription" = "パスワード"; diff --git a/Resources/nl.lproj/HockeySDK.strings b/Resources/nl.lproj/HockeySDK.strings index a3a508f56a..cd2b2336c7 100755 --- a/Resources/nl.lproj/HockeySDK.strings +++ b/Resources/nl.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "E-mail"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "voorbeeld@e-mail.com"; +"HockeyFeedbackUserDataEmailPlaceholder" = "e-mail@voorbeeld.com"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "Voer het e-mailadres en wachtwoord van uw HockeyApp-account in om toegang tot deze app te verlenen."; "HockeyAuthenticationViewControllerDataEmailDescription" = "Voer het e-mailadres van uw HockeyApp-account in om toegang tot deze app te verlenen."; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "voorbeeld@e-mail.com"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "mail@voorbeeld.com"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "Verplicht"; "HockeyAuthenticationViewControllerEmailDescription" = "E-mail"; "HockeyAuthenticationViewControllerPasswordDescription" = "Wachtwoord"; diff --git a/Resources/pt-PT.lproj/HockeySDK.strings b/Resources/pt-PT.lproj/HockeySDK.strings index 31c8e476c9..2273ca2267 100644 --- a/Resources/pt-PT.lproj/HockeySDK.strings +++ b/Resources/pt-PT.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "E-mail"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "exemplo@email.com"; +"HockeyFeedbackUserDataEmailPlaceholder" = "email@exemplo.com"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "Introduza o endereço de e-mail e a palavra-passe da sua conta HockeyApp para autorizar o acesso a esta aplicação."; "HockeyAuthenticationViewControllerDataEmailDescription" = "Introduza o endereço de e-mail da sua conta HockeyApp para autorizar o acesso a esta aplicação."; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "exemplo@email.com"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "email@exemplo.com"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "Necessário"; "HockeyAuthenticationViewControllerEmailDescription" = "E-mail"; "HockeyAuthenticationViewControllerPasswordDescription" = "Palavra-passe"; diff --git a/Resources/pt.lproj/HockeySDK.strings b/Resources/pt.lproj/HockeySDK.strings index 4016350c71..b4ff7f97e5 100644 --- a/Resources/pt.lproj/HockeySDK.strings +++ b/Resources/pt.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "E-mail"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "exemplo@email.com"; +"HockeyFeedbackUserDataEmailPlaceholder" = "email@exemplo.com"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "Informe seu e-mail e senha da conta do HockeyApp para autorizar o acesso a este aplicativo."; "HockeyAuthenticationViewControllerDataEmailDescription" = "Informe seu e-mail da conta do HockeyApp para autorizar o acesso a este aplicativo."; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "exemplo@email.com"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "email@exemplo.com"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "Necessário"; "HockeyAuthenticationViewControllerEmailDescription" = "E-mail"; "HockeyAuthenticationViewControllerPasswordDescription" = "Senha"; diff --git a/Resources/ro.lproj/HockeySDK.strings b/Resources/ro.lproj/HockeySDK.strings index dd8d561752..aae2a983bc 100755 --- a/Resources/ro.lproj/HockeySDK.strings +++ b/Resources/ro.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "E-mail"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "exemplu@email.ro"; +"HockeyFeedbackUserDataEmailPlaceholder" = "email@exemplu.ro"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "Please enter your HockeyApp account's email address and password to authorize access to this app."; "HockeyAuthenticationViewControllerDataEmailDescription" = "Please enter your HockeyApp account's email address to authorize access to this app."; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "exemplu@email.ro"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "email@exemplu.ro"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "Required"; "HockeyAuthenticationViewControllerEmailDescription" = "E-mail"; "HockeyAuthenticationViewControllerPasswordDescription" = "Password"; diff --git a/Resources/ru.lproj/HockeySDK.strings b/Resources/ru.lproj/HockeySDK.strings index bb459e0329..e0ca880402 100644 --- a/Resources/ru.lproj/HockeySDK.strings +++ b/Resources/ru.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "Email"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com"; +"HockeyFeedbackUserDataEmailPlaceholder" = "email@example.com"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "Введите email и пароль аккаунта HockeyApp, чтобы авторизовать доступ к этому приложению."; "HockeyAuthenticationViewControllerDataEmailDescription" = "Введите email аккаунта HockeyApp, чтобы авторизовать доступ к этому приложению."; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "example@email.com"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "email@example.com"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "Обязательное поле"; "HockeyAuthenticationViewControllerEmailDescription" = "Email"; "HockeyAuthenticationViewControllerPasswordDescription" = "Пароль"; diff --git a/Resources/zh-Hans.lproj/HockeySDK.strings b/Resources/zh-Hans.lproj/HockeySDK.strings index 36d530a99a..daaa3aa17c 100644 --- a/Resources/zh-Hans.lproj/HockeySDK.strings +++ b/Resources/zh-Hans.lproj/HockeySDK.strings @@ -231,7 +231,7 @@ "HockeyFeedbackUserDataEmail" = "邮件"; /* Email Placeholder */ -"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com"; +"HockeyFeedbackUserDataEmailPlaceholder" = "email@example.com"; /* Authenticator */ @@ -249,7 +249,7 @@ /* BITAuthenticatorAuthTypeEmail and BITAuthenticatorAuthTypeEmailAndPassword */ "HockeyAuthenticationViewControllerDataEmailAndPasswordDescription" = "请输入你的 HockeyApp 帐户的电子邮件和密码来授权访问这个 app。"; "HockeyAuthenticationViewControllerDataEmailDescription" = "请输入你的 HockeyApp 帐户的电子邮件来授权访问这个 app。"; -"HockeyAuthenticationViewControllerEmailPlaceholder" = "example@email.com"; +"HockeyAuthenticationViewControllerEmailPlaceholder" = "email@example.com"; "HockeyAuthenticationViewControllerPasswordPlaceholder" = "必需的"; "HockeyAuthenticationViewControllerEmailDescription" = "邮件"; "HockeyAuthenticationViewControllerPasswordDescription" = "密码"; From 5c5a549c750fb014706c7901fc3bdba1f99928d2 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Wed, 18 Dec 2013 20:46:03 +0100 Subject: [PATCH 39/62] Update PLCrashReporter to v1.2 RC 2 This build enables dwarf/compact unwind support on ARM64 --- .../Versions/A/CrashReporter | Bin 1386900 -> 1436196 bytes .../Versions/A/Headers/PLCrashFeatureConfig.h | 9 ++++----- .../Versions/A/Resources/Info.plist | 8 ++++---- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Vendor/CrashReporter.framework/Versions/A/CrashReporter b/Vendor/CrashReporter.framework/Versions/A/CrashReporter index b44e082e4618bcc79ac311ded5daf44088f6954e..ef9fc8e724940cfc1833820ebe11b2a18166eacc 100644 GIT binary patch delta 135832 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 delta 94041 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 z z2@cBSEYHsJqgj4Y=K0T)CadAIEdQ3})~o-$0{L0)oaLTb9==*%fBv}zQ?nZG%kt_h z*JSydEbq#4>#BdRa2NZ8<3Cs6tgMD1S&n6SUY6Hp`MoUHXSuom_`g@+uq>aHbh&C42pI?H}-R$*I~f6sEuC;q*{M`XEImiuRU=)diIWBy(6ZpiX&S+2erP542d3?()^I0EPj^aUwx7=bRJ3gSyA#}fEG%3=Ffm7(-Ppj~+| BuildMachineOSBuild - 13A603 + 13B42 CFBundleDevelopmentRegion English CFBundleExecutable @@ -23,7 +23,7 @@ DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild - 5A2034a + 5A3005 DTPlatformVersion GM DTSDKBuild @@ -31,8 +31,8 @@ DTSDKName macosx10.9 DTXcode - 0501 + 0502 DTXcodeBuild - 5A2034a + 5A3005 From 720dbccefee0a63e8a1aa6ea8ab45b66f8e4e214 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Thu, 21 Nov 2013 00:03:14 +0100 Subject: [PATCH 40/62] Add generateTestCrash method --- Classes/BITCrashManager.h | 16 ++++++++++++++++ Classes/BITCrashManager.m | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Classes/BITCrashManager.h b/Classes/BITCrashManager.h index acae8c57a8..5e61e1b92a 100644 --- a/Classes/BITCrashManager.h +++ b/Classes/BITCrashManager.h @@ -227,4 +227,20 @@ typedef NS_ENUM(NSUInteger, BITCrashManagerStatus) { */ - (BOOL)isDebuggerAttached; + +/** + * Lets the app crash for easy testing of the SDK + * + * The best way to use this is to trigger the crash with a button action. + * + * Make sure not to let the app crash in `applicationDidFinishLaunching` or any other + * startup method! Since otherwise the app would crash before the SDK could process it. + * + * Note that our SDK provides support for handling crashes that happen early on startup. + * Check the documentation for more information on how to use this. + * + * If the SDK detects an App Store environment, it will _NOT_ cause the app to crash! + */ +- (void)generateTestCrash; + @end diff --git a/Classes/BITCrashManager.m b/Classes/BITCrashManager.m index 7daea4d93b..9f518f0a5e 100644 --- a/Classes/BITCrashManager.m +++ b/Classes/BITCrashManager.m @@ -419,6 +419,18 @@ NSString *const kBITCrashManagerStatus = @"BITCrashManagerStatus"; } +- (void)generateTestCrash { + if (![self isAppStoreEnvironment]) { + + if ([self isDebuggerAttached]) { + NSLog(@"[HockeySDK] WARNING: The debugger is attached. The following crash cannot be detected by the SDK!"); + } + + __builtin_trap(); + } +} + + #pragma mark - PLCrashReporter /** From d37e1c1187bdde149e797d2651084c2902875522 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Mon, 16 Dec 2013 18:35:02 +0100 Subject: [PATCH 41/62] Fix typo --- Classes/BITHockeyManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/BITHockeyManager.h b/Classes/BITHockeyManager.h index 5a64ad13fa..c53bcb5b3a 100644 --- a/Classes/BITHockeyManager.h +++ b/Classes/BITHockeyManager.h @@ -75,7 +75,7 @@ #pragma mark - Public Methods ///----------------------------------------------------------------------------- -/// @name Initializion +/// @name Initialization ///----------------------------------------------------------------------------- /** From cdfca4d330c5fc8eb2ced74dbfec63cbda361185 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Thu, 19 Dec 2013 15:36:31 +0100 Subject: [PATCH 42/62] Add the option to define callbacks that will be executed prior to program termination after a crash has occurred This is _NOT_recommended to be used! Code that runs in such callbacks need to be async-safe, which excludes ANY Objective-C code and lots of C as well. See https://www.plcrashreporter.org/documentation/api/v1.2-rc2/async_safety.html --- Classes/BITCrashManager.h | 26 ++++++++++++++++++++++++++ Classes/BITCrashManager.m | 13 +++++++++++++ Classes/BITCrashManagerPrivate.h | 2 -- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/Classes/BITCrashManager.h b/Classes/BITCrashManager.h index 5e61e1b92a..b3dc982639 100644 --- a/Classes/BITCrashManager.h +++ b/Classes/BITCrashManager.h @@ -32,6 +32,7 @@ #import "BITHockeyBaseManager.h" +#import /** * Crash Manager status @@ -160,6 +161,31 @@ typedef NS_ENUM(NSUInteger, BITCrashManagerStatus) { @property (nonatomic, assign, getter=isMachExceptionHandlerEnabled) BOOL enableMachExceptionHandler; +/** + * Set the callbacks that will be executed prior to program termination after a crash has occurred + * + * PLCrashReporter provides support for executing an application specified function in the context + * of the crash reporter's signal handler, after the crash report has been written to disk. + * + * Writing code intended for execution inside of a signal handler is exceptionally difficult, and is _NOT_ recommended! + * + * _Program Flow and Signal Handlers_ + * + * When the signal handler is called the normal flow of the program is interrupted, and your program is an unknown state. Locks may be held, the heap may be corrupt (or in the process of being updated), and your signal handler may invoke a function that was being executed at the time of the signal. This may result in deadlocks, data corruption, and program termination. + * + * _Async-Safe Functions_ + * + * A subset of functions are defined to be async-safe by the OS, and are safely callable from within a signal handler. If you do implement a custom post-crash handler, it must be async-safe. A table of POSIX-defined async-safe functions and additional information is available from the CERT programming guide - SIG30-C, see https://www.securecoding.cert.org/confluence/display/seccode/SIG30-C.+Call+only+asynchronous-safe+functions+within+signal+handlers + * + * Most notably, the Objective-C runtime itself is not async-safe, and Objective-C may not be used within a signal handler. + * + * Documentation taken from PLCrashReporter: https://www.plcrashreporter.org/documentation/api/v1.2-rc2/async_safety.html + * + * @param callbacks A pointer to an initialized PLCrashReporterCallback structure, see https://www.plcrashreporter.org/documentation/api/v1.2-rc2/struct_p_l_crash_reporter_callbacks.html + */ +- (void)setCrashCallbacks: (PLCrashReporterCallbacks *) callbacks; + + /** Flag that determines if an "Always" option should be shown diff --git a/Classes/BITCrashManager.m b/Classes/BITCrashManager.m index 9f518f0a5e..b76978cf64 100644 --- a/Classes/BITCrashManager.m +++ b/Classes/BITCrashManager.m @@ -72,6 +72,8 @@ NSString *const kBITCrashManagerStatus = @"BITCrashManagerStatus"; NSString *_analyzerInProgressFile; NSFileManager *_fileManager; + PLCrashReporterCallbacks *_crashCallBacks; + BOOL _crashIdenticalCurrentVersion; NSMutableData *_responseData; @@ -95,6 +97,7 @@ NSString *const kBITCrashManagerStatus = @"BITCrashManagerStatus"; _plCrashReporter = nil; _exceptionHandler = nil; + _crashCallBacks = nil; _crashIdenticalCurrentVersion = YES; _urlConnection = nil; @@ -385,6 +388,11 @@ NSString *const kBITCrashManagerStatus = @"BITCrashManagerStatus"; #pragma mark - Public + +- (void)setCrashCallbacks: (PLCrashReporterCallbacks *) callbacks { + _crashCallBacks = callbacks; +} + /** * Check if the debugger is attached * @@ -702,6 +710,11 @@ NSString *const kBITCrashManagerStatus = @"BITCrashManagerStatus"; // can't break this NSError *error = NULL; + // set any user defined callbacks, hopefully the users knows what they do + if (_crashCallBacks) { + [self.plCrashReporter setCrashCallbacks:_crashCallBacks]; + } + // Enable the Crash Reporter if (![self.plCrashReporter enableCrashReporterAndReturnError: &error]) NSLog(@"[HockeySDK] WARNING: Could not enable crash reporter: %@", [error localizedDescription]); diff --git a/Classes/BITCrashManagerPrivate.h b/Classes/BITCrashManagerPrivate.h index dfc471156a..f1963926a0 100644 --- a/Classes/BITCrashManagerPrivate.h +++ b/Classes/BITCrashManagerPrivate.h @@ -31,8 +31,6 @@ #if HOCKEYSDK_FEATURE_CRASH_REPORTER -#import - @interface BITCrashManager () { } From 90ab6fcd57509fcb7bb2764f705974ec9de19dc2 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Tue, 24 Dec 2013 14:48:05 +0100 Subject: [PATCH 43/62] Remove old project.pbxproj.orig file which accidentally got added in a merge --- .../HockeySDK.xcodeproj/project.pbxproj.orig | 1319 ----------------- 1 file changed, 1319 deletions(-) delete mode 100644 Support/HockeySDK.xcodeproj/project.pbxproj.orig diff --git a/Support/HockeySDK.xcodeproj/project.pbxproj.orig b/Support/HockeySDK.xcodeproj/project.pbxproj.orig deleted file mode 100644 index cee7a511fa..0000000000 --- a/Support/HockeySDK.xcodeproj/project.pbxproj.orig +++ /dev/null @@ -1,1319 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXAggregateTarget section */ - 1E4F61E91621AD970033EFC5 /* HockeySDK Framework */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 1E4F61EA1621AD970033EFC5 /* Build configuration list for PBXAggregateTarget "HockeySDK Framework" */; - buildPhases = ( - 1E4F61ED1621ADE70033EFC5 /* Build universal embedded framework */, - ); - dependencies = ( - 1E754E431621F6290070AB92 /* PBXTargetDependency */, - ); - name = "HockeySDK Framework"; - productName = "HockeySDK Framework"; - }; - 1E8E66AD15BC3D7700632A2E /* HockeySDK Documentation */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 1E8E66B015BC3D7700632A2E /* Build configuration list for PBXAggregateTarget "HockeySDK Documentation" */; - buildPhases = ( - 1E8E66B215BC3D8200632A2E /* ShellScript */, - ); - dependencies = ( - ); - name = "HockeySDK Documentation"; - productName = Documentation; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 1E0829001708F69A0073050E /* BITStoreUpdateManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E0828FF1708F69A0073050E /* BITStoreUpdateManagerDelegate.h */; }; - 1E0FEE28173BDB260061331F /* BITKeychainUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E0FEE26173BDB260061331F /* BITKeychainUtils.h */; }; - 1E0FEE29173BDB260061331F /* BITKeychainUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E0FEE27173BDB260061331F /* BITKeychainUtils.m */; }; - 1E1127C416580C87007067A2 /* buttonRoundedDelete.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127BC16580C87007067A2 /* buttonRoundedDelete.png */; }; - 1E1127C516580C87007067A2 /* buttonRoundedDelete@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127BD16580C87007067A2 /* buttonRoundedDelete@2x.png */; }; - 1E1127C616580C87007067A2 /* buttonRoundedDeleteHighlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127BE16580C87007067A2 /* buttonRoundedDeleteHighlighted.png */; }; - 1E1127C716580C87007067A2 /* buttonRoundedDeleteHighlighted@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127BF16580C87007067A2 /* buttonRoundedDeleteHighlighted@2x.png */; }; - 1E1127C816580C87007067A2 /* buttonRoundedRegular.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127C016580C87007067A2 /* buttonRoundedRegular.png */; }; - 1E1127C916580C87007067A2 /* buttonRoundedRegular@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127C116580C87007067A2 /* buttonRoundedRegular@2x.png */; }; - 1E1127CA16580C87007067A2 /* buttonRoundedRegularHighlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127C216580C87007067A2 /* buttonRoundedRegularHighlighted.png */; }; - 1E1127CB16580C87007067A2 /* buttonRoundedRegularHighlighted@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127C316580C87007067A2 /* buttonRoundedRegularHighlighted@2x.png */; }; - 1E49A43C1612223B00463151 /* BITFeedbackComposeViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A42D1612223B00463151 /* BITFeedbackComposeViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A43F1612223B00463151 /* BITFeedbackComposeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A42E1612223B00463151 /* BITFeedbackComposeViewController.m */; }; - 1E49A4421612223B00463151 /* BITFeedbackListViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A42F1612223B00463151 /* BITFeedbackListViewCell.h */; }; - 1E49A4451612223B00463151 /* BITFeedbackListViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4301612223B00463151 /* BITFeedbackListViewCell.m */; }; - 1E49A4481612223B00463151 /* BITFeedbackListViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4311612223B00463151 /* BITFeedbackListViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A44B1612223B00463151 /* BITFeedbackListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4321612223B00463151 /* BITFeedbackListViewController.m */; }; - 1E49A44E1612223B00463151 /* BITFeedbackManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4331612223B00463151 /* BITFeedbackManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A4511612223B00463151 /* BITFeedbackManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4341612223B00463151 /* BITFeedbackManager.m */; }; - 1E49A4541612223B00463151 /* BITFeedbackManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4351612223B00463151 /* BITFeedbackManagerPrivate.h */; }; - 1E49A4571612223B00463151 /* BITFeedbackMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4361612223B00463151 /* BITFeedbackMessage.h */; }; - 1E49A45A1612223B00463151 /* BITFeedbackMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4371612223B00463151 /* BITFeedbackMessage.m */; }; - 1E49A45D1612223B00463151 /* BITFeedbackUserDataViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4381612223B00463151 /* BITFeedbackUserDataViewController.h */; }; - 1E49A4601612223B00463151 /* BITFeedbackUserDataViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4391612223B00463151 /* BITFeedbackUserDataViewController.m */; }; - 1E49A46D1612226D00463151 /* BITAppVersionMetaInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4621612226D00463151 /* BITAppVersionMetaInfo.h */; }; - 1E49A4701612226D00463151 /* BITAppVersionMetaInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4631612226D00463151 /* BITAppVersionMetaInfo.m */; }; - 1E49A4731612226D00463151 /* BITUpdateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4641612226D00463151 /* BITUpdateManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A4761612226D00463151 /* BITUpdateManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4651612226D00463151 /* BITUpdateManager.m */; }; - 1E49A4791612226D00463151 /* BITUpdateManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4661612226D00463151 /* BITUpdateManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A47C1612226D00463151 /* BITUpdateManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4671612226D00463151 /* BITUpdateManagerPrivate.h */; }; - 1E49A47F1612226D00463151 /* BITUpdateViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4681612226D00463151 /* BITUpdateViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A4821612226D00463151 /* BITUpdateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4691612226D00463151 /* BITUpdateViewController.m */; }; - 1E49A4851612226D00463151 /* BITUpdateViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A46A1612226D00463151 /* BITUpdateViewControllerPrivate.h */; }; - 1E49A4AF161222B900463151 /* BITHockeyBaseManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A0161222B900463151 /* BITHockeyBaseManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A4B2161222B900463151 /* BITHockeyBaseManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A1161222B900463151 /* BITHockeyBaseManager.m */; }; - 1E49A4B5161222B900463151 /* BITHockeyBaseManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A2161222B900463151 /* BITHockeyBaseManagerPrivate.h */; }; - 1E49A4B8161222B900463151 /* BITHockeyBaseViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A3161222B900463151 /* BITHockeyBaseViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A4BB161222B900463151 /* BITHockeyBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A4161222B900463151 /* BITHockeyBaseViewController.m */; }; - 1E49A4BE161222B900463151 /* BITHockeyHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A5161222B900463151 /* BITHockeyHelper.h */; }; - 1E49A4C1161222B900463151 /* BITHockeyHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A6161222B900463151 /* BITHockeyHelper.m */; }; - 1E49A4C4161222B900463151 /* BITAppStoreHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A7161222B900463151 /* BITAppStoreHeader.h */; }; - 1E49A4C7161222B900463151 /* BITAppStoreHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A8161222B900463151 /* BITAppStoreHeader.m */; }; - 1E49A4CA161222B900463151 /* BITStoreButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A9161222B900463151 /* BITStoreButton.h */; }; - 1E49A4CD161222B900463151 /* BITStoreButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4AA161222B900463151 /* BITStoreButton.m */; }; - 1E49A4D0161222B900463151 /* BITWebTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4AB161222B900463151 /* BITWebTableViewCell.h */; }; - 1E49A4D3161222B900463151 /* BITWebTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4AC161222B900463151 /* BITWebTableViewCell.m */; }; - 1E49A4D8161222D400463151 /* HockeySDKPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4D4161222D400463151 /* HockeySDKPrivate.h */; }; - 1E49A4DB161222D400463151 /* HockeySDKPrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4D5161222D400463151 /* HockeySDKPrivate.m */; }; - 1E5954D315B6F24A00A03429 /* BITHockeyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB466148D7BF50015DEDC /* BITHockeyManager.m */; }; - 1E5954DC15B6F24A00A03429 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E400561D148D79B500EB22B9 /* Foundation.framework */; }; - 1E5954DD15B6F24A00A03429 /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */; }; - 1E59559A15B6FDA500A03429 /* BITHockeyManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB465148D7BF50015DEDC /* BITHockeyManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E59559B15B6FDA500A03429 /* HockeySDK.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E71509A15B5C76F004E88FF /* HockeySDK.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E5955C615B71C8600A03429 /* authorize_denied.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955BB15B71C8600A03429 /* authorize_denied.png */; }; - 1E5955C715B71C8600A03429 /* authorize_denied@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955BC15B71C8600A03429 /* authorize_denied@2x.png */; }; - 1E5955CA15B71C8600A03429 /* bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955BF15B71C8600A03429 /* bg.png */; }; - 1E5955CB15B71C8600A03429 /* buttonHighlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955C015B71C8600A03429 /* buttonHighlight.png */; }; - 1E5955CC15B71C8600A03429 /* buttonHighlight@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955C115B71C8600A03429 /* buttonHighlight@2x.png */; }; - 1E5955CF15B71C8600A03429 /* IconGradient.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955C415B71C8600A03429 /* IconGradient.png */; }; - 1E5955D015B71C8600A03429 /* IconGradient@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955C515B71C8600A03429 /* IconGradient@2x.png */; }; - 1E5955FD15B7877B00A03429 /* BITHockeyManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E5A459216F0DFC200B55C04 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E5A459116F0DFC200B55C04 /* SenTestingKit.framework */; }; - 1E5A459416F0DFC200B55C04 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E5A459316F0DFC200B55C04 /* UIKit.framework */; }; - 1E5A459516F0DFC200B55C04 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E400561D148D79B500EB22B9 /* Foundation.framework */; }; - 1E5A459B16F0DFC200B55C04 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1E5A459916F0DFC200B55C04 /* InfoPlist.strings */; }; - 1E5A459E16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E5A459D16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m */; }; - 1E754E5C1621FBB70070AB92 /* BITCrashManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E754E561621FBB70070AB92 /* BITCrashManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E754E5D1621FBB70070AB92 /* BITCrashManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E754E571621FBB70070AB92 /* BITCrashManager.m */; }; - 1E754E5E1621FBB70070AB92 /* BITCrashManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E754E581621FBB70070AB92 /* BITCrashManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E754E601621FBB70070AB92 /* BITCrashReportTextFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E754E5A1621FBB70070AB92 /* BITCrashReportTextFormatter.h */; }; - 1E754E611621FBB70070AB92 /* BITCrashReportTextFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E754E5B1621FBB70070AB92 /* BITCrashReportTextFormatter.m */; }; - 1E7A45FC16F54FB5005B08F1 /* OCHamcrestIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E7A45FA16F54FB5005B08F1 /* OCHamcrestIOS.framework */; }; - 1E7A45FD16F54FB5005B08F1 /* OCMockitoIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E7A45FB16F54FB5005B08F1 /* OCMockitoIOS.framework */; }; - 1E94F9E116E91330006570AD /* BITStoreUpdateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E94F9DF16E91330006570AD /* BITStoreUpdateManager.h */; }; - 1E94F9E216E91330006570AD /* BITStoreUpdateManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E94F9E016E91330006570AD /* BITStoreUpdateManager.m */; }; - 1E94F9E416E9136B006570AD /* BITStoreUpdateManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E94F9E316E9136B006570AD /* BITStoreUpdateManagerPrivate.h */; }; - 1EA1170016F4D32C001C015C /* libHockeySDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E5954F215B6F24A00A03429 /* libHockeySDK.a */; }; - 1EA1170116F4D354001C015C /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */; }; - 1EA1170416F53B49001C015C /* StoreBundleIdentifierUnknown.json in Resources */ = {isa = PBXBuildFile; fileRef = 1EA1170316F53B49001C015C /* StoreBundleIdentifierUnknown.json */; }; - 1EA1170716F53B91001C015C /* BITTestHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EA1170616F53B91001C015C /* BITTestHelper.m */; }; - 1EA1170916F53E3A001C015C /* StoreBundleIdentifierKnown.json in Resources */ = {isa = PBXBuildFile; fileRef = 1EA1170816F53E3A001C015C /* StoreBundleIdentifierKnown.json */; }; - 1EA1170C16F54A64001C015C /* HockeySDKResources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 1E59550A15B6F45800A03429 /* HockeySDKResources.bundle */; }; - 1EACC97B162F041E007578C5 /* BITAttributedLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EACC979162F041E007578C5 /* BITAttributedLabel.h */; }; - 1EACC97C162F041E007578C5 /* BITAttributedLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EACC97A162F041E007578C5 /* BITAttributedLabel.m */; }; - 1EAF20A8162DC0F600957B1D /* feedbackActivity@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A4162DC0F600957B1D /* feedbackActivity@2x~ipad.png */; }; - 1EAF20A9162DC0F600957B1D /* feedbackActivity~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A5162DC0F600957B1D /* feedbackActivity~ipad.png */; }; - 1EAF20AA162DC0F600957B1D /* feedbackActiviy.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A6162DC0F600957B1D /* feedbackActiviy.png */; }; - 1EAF20AB162DC0F600957B1D /* feedbackActiviy@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A7162DC0F600957B1D /* feedbackActiviy@2x.png */; }; - 1EB52FD5167B766100C801D5 /* HockeySDK.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1E59555F15B6F80E00A03429 /* HockeySDK.strings */; }; - 1EC69F601615001500808FD9 /* BITHockeyManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */; }; - 1EF95CA6162CB037000AE3AD /* BITFeedbackActivity.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EF95CA4162CB036000AE3AD /* BITFeedbackActivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1EF95CA7162CB037000AE3AD /* BITFeedbackActivity.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EF95CA5162CB036000AE3AD /* BITFeedbackActivity.m */; }; - 1EF95CAA162CB314000AE3AD /* BITFeedbackComposeViewControllerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EF95CA9162CB313000AE3AD /* BITFeedbackComposeViewControllerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E405266217A2AD300096359C /* BITFeedbackManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = E405266117A2AD300096359C /* BITFeedbackManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E48A3DEC17B3ED1C00924C3D /* BITAuthenticator.h in Headers */ = {isa = PBXBuildFile; fileRef = E48A3DEA17B3ED1C00924C3D /* BITAuthenticator.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E48A3DED17B3ED1C00924C3D /* BITAuthenticator.m in Sources */ = {isa = PBXBuildFile; fileRef = E48A3DEB17B3ED1C00924C3D /* BITAuthenticator.m */; }; - E48A3DEF17B3EFF100924C3D /* BITAuthenticatorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E48A3DEE17B3EFF100924C3D /* BITAuthenticatorTests.m */; }; - E4933E8017B66CDA00B11ACC /* BITHTTPOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = E4933E7E17B66CDA00B11ACC /* BITHTTPOperation.h */; }; - E4933E8117B66CDA00B11ACC /* BITHTTPOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E4933E7F17B66CDA00B11ACC /* BITHTTPOperation.m */; }; - E4B4DB7D17B435550099C67F /* BITAuthenticationViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = E4B4DB7B17B435550099C67F /* BITAuthenticationViewController.h */; }; - E4B4DB7E17B435550099C67F /* BITAuthenticationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E4B4DB7C17B435550099C67F /* BITAuthenticationViewController.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 1E59557D15B6F97100A03429 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E4005611148D79B500EB22B9 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1E59550915B6F45800A03429; - remoteInfo = HockeySDKResources; - }; - 1E754E421621F6290070AB92 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E4005611148D79B500EB22B9 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1E8E66AD15BC3D7700632A2E; - remoteInfo = "HockeySDK Documentation"; - }; - 1EA116FE16F4D302001C015C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E4005611148D79B500EB22B9 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1E5954CB15B6F24A00A03429; - remoteInfo = HockeySDK; - }; - 1EA1170A16F54A5C001C015C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E4005611148D79B500EB22B9 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1E59550915B6F45800A03429; - remoteInfo = HockeySDKResources; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1E0828FF1708F69A0073050E /* BITStoreUpdateManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITStoreUpdateManagerDelegate.h; sourceTree = ""; }; - 1E0FEE26173BDB260061331F /* BITKeychainUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITKeychainUtils.h; sourceTree = ""; }; - 1E0FEE27173BDB260061331F /* BITKeychainUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITKeychainUtils.m; sourceTree = ""; }; - 1E1127BC16580C87007067A2 /* buttonRoundedDelete.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = buttonRoundedDelete.png; sourceTree = ""; }; - 1E1127BD16580C87007067A2 /* buttonRoundedDelete@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "buttonRoundedDelete@2x.png"; sourceTree = ""; }; - 1E1127BE16580C87007067A2 /* buttonRoundedDeleteHighlighted.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = buttonRoundedDeleteHighlighted.png; sourceTree = ""; }; - 1E1127BF16580C87007067A2 /* buttonRoundedDeleteHighlighted@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "buttonRoundedDeleteHighlighted@2x.png"; sourceTree = ""; }; - 1E1127C016580C87007067A2 /* buttonRoundedRegular.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = buttonRoundedRegular.png; sourceTree = ""; }; - 1E1127C116580C87007067A2 /* buttonRoundedRegular@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "buttonRoundedRegular@2x.png"; sourceTree = ""; }; - 1E1127C216580C87007067A2 /* buttonRoundedRegularHighlighted.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = buttonRoundedRegularHighlighted.png; sourceTree = ""; }; - 1E1127C316580C87007067A2 /* buttonRoundedRegularHighlighted@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "buttonRoundedRegularHighlighted@2x.png"; sourceTree = ""; }; - 1E36D8B816667611000B134C /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E49A42D1612223B00463151 /* BITFeedbackComposeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackComposeViewController.h; sourceTree = ""; }; - 1E49A42E1612223B00463151 /* BITFeedbackComposeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackComposeViewController.m; sourceTree = ""; }; - 1E49A42F1612223B00463151 /* BITFeedbackListViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackListViewCell.h; sourceTree = ""; }; - 1E49A4301612223B00463151 /* BITFeedbackListViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackListViewCell.m; sourceTree = ""; }; - 1E49A4311612223B00463151 /* BITFeedbackListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackListViewController.h; sourceTree = ""; }; - 1E49A4321612223B00463151 /* BITFeedbackListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackListViewController.m; sourceTree = ""; }; - 1E49A4331612223B00463151 /* BITFeedbackManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackManager.h; sourceTree = ""; }; - 1E49A4341612223B00463151 /* BITFeedbackManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackManager.m; sourceTree = ""; }; - 1E49A4351612223B00463151 /* BITFeedbackManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackManagerPrivate.h; sourceTree = ""; }; - 1E49A4361612223B00463151 /* BITFeedbackMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackMessage.h; sourceTree = ""; }; - 1E49A4371612223B00463151 /* BITFeedbackMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackMessage.m; sourceTree = ""; }; - 1E49A4381612223B00463151 /* BITFeedbackUserDataViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackUserDataViewController.h; sourceTree = ""; }; - 1E49A4391612223B00463151 /* BITFeedbackUserDataViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackUserDataViewController.m; sourceTree = ""; }; - 1E49A4621612226D00463151 /* BITAppVersionMetaInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITAppVersionMetaInfo.h; sourceTree = ""; }; - 1E49A4631612226D00463151 /* BITAppVersionMetaInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITAppVersionMetaInfo.m; sourceTree = ""; }; - 1E49A4641612226D00463151 /* BITUpdateManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateManager.h; sourceTree = ""; }; - 1E49A4651612226D00463151 /* BITUpdateManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITUpdateManager.m; sourceTree = ""; }; - 1E49A4661612226D00463151 /* BITUpdateManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateManagerDelegate.h; sourceTree = ""; }; - 1E49A4671612226D00463151 /* BITUpdateManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateManagerPrivate.h; sourceTree = ""; }; - 1E49A4681612226D00463151 /* BITUpdateViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateViewController.h; sourceTree = ""; }; - 1E49A4691612226D00463151 /* BITUpdateViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITUpdateViewController.m; sourceTree = ""; }; - 1E49A46A1612226D00463151 /* BITUpdateViewControllerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateViewControllerPrivate.h; sourceTree = ""; }; - 1E49A4A0161222B900463151 /* BITHockeyBaseManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyBaseManager.h; sourceTree = ""; }; - 1E49A4A1161222B900463151 /* BITHockeyBaseManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyBaseManager.m; sourceTree = ""; }; - 1E49A4A2161222B900463151 /* BITHockeyBaseManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyBaseManagerPrivate.h; sourceTree = ""; }; - 1E49A4A3161222B900463151 /* BITHockeyBaseViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyBaseViewController.h; sourceTree = ""; }; - 1E49A4A4161222B900463151 /* BITHockeyBaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyBaseViewController.m; sourceTree = ""; }; - 1E49A4A5161222B900463151 /* BITHockeyHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyHelper.h; sourceTree = ""; }; - 1E49A4A6161222B900463151 /* BITHockeyHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyHelper.m; sourceTree = ""; }; - 1E49A4A7161222B900463151 /* BITAppStoreHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITAppStoreHeader.h; sourceTree = ""; }; - 1E49A4A8161222B900463151 /* BITAppStoreHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITAppStoreHeader.m; sourceTree = ""; }; - 1E49A4A9161222B900463151 /* BITStoreButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITStoreButton.h; sourceTree = ""; }; - 1E49A4AA161222B900463151 /* BITStoreButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITStoreButton.m; sourceTree = ""; }; - 1E49A4AB161222B900463151 /* BITWebTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITWebTableViewCell.h; sourceTree = ""; }; - 1E49A4AC161222B900463151 /* BITWebTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITWebTableViewCell.m; sourceTree = ""; }; - 1E49A4D4161222D400463151 /* HockeySDKPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HockeySDKPrivate.h; sourceTree = ""; }; - 1E49A4D5161222D400463151 /* HockeySDKPrivate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HockeySDKPrivate.m; sourceTree = ""; }; - 1E5954F215B6F24A00A03429 /* libHockeySDK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libHockeySDK.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 1E59550A15B6F45800A03429 /* HockeySDKResources.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HockeySDKResources.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - 1E59556015B6F80E00A03429 /* de */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E59556415B6F81C00A03429 /* es */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E59556615B6F82300A03429 /* fr */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E59556815B6F82A00A03429 /* it */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E59556A15B6F83100A03429 /* ja */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E59557015B6F84700A03429 /* pt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E59557215B6F84D00A03429 /* ru */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E5955BB15B71C8600A03429 /* authorize_denied.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = authorize_denied.png; sourceTree = ""; }; - 1E5955BC15B71C8600A03429 /* authorize_denied@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "authorize_denied@2x.png"; sourceTree = ""; }; - 1E5955BF15B71C8600A03429 /* bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bg.png; sourceTree = ""; }; - 1E5955C015B71C8600A03429 /* buttonHighlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = buttonHighlight.png; sourceTree = ""; }; - 1E5955C115B71C8600A03429 /* buttonHighlight@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "buttonHighlight@2x.png"; sourceTree = ""; }; - 1E5955C415B71C8600A03429 /* IconGradient.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = IconGradient.png; sourceTree = ""; }; - 1E5955C515B71C8600A03429 /* IconGradient@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "IconGradient@2x.png"; sourceTree = ""; }; - 1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyManagerDelegate.h; sourceTree = ""; }; - 1E5A459016F0DFC200B55C04 /* HockeySDKTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HockeySDKTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1E5A459116F0DFC200B55C04 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; - 1E5A459316F0DFC200B55C04 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 1E5A459816F0DFC200B55C04 /* HockeySDKTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "HockeySDKTests-Info.plist"; sourceTree = ""; }; - 1E5A459A16F0DFC200B55C04 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 1E5A459D16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BITStoreUpdateManagerTests.m; sourceTree = ""; }; - 1E5A459F16F0DFC200B55C04 /* HockeySDKTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "HockeySDKTests-Prefix.pch"; sourceTree = ""; }; - 1E66CA9115D4100500F35BED /* buildnumber.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = buildnumber.xcconfig; sourceTree = ""; }; - 1E6DDCEE169E290C0076C65D /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E6F0450167B5E5600ED1C86 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/HockeySDK.strings"; sourceTree = ""; }; - 1E71509A15B5C76F004E88FF /* HockeySDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HockeySDK.h; sourceTree = ""; }; - 1E754DC61621BC170070AB92 /* HockeySDK.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = HockeySDK.xcconfig; sourceTree = ""; }; - 1E754E561621FBB70070AB92 /* BITCrashManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashManager.h; sourceTree = ""; }; - 1E754E571621FBB70070AB92 /* BITCrashManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITCrashManager.m; sourceTree = ""; }; - 1E754E581621FBB70070AB92 /* BITCrashManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashManagerDelegate.h; sourceTree = ""; }; - 1E754E5A1621FBB70070AB92 /* BITCrashReportTextFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashReportTextFormatter.h; sourceTree = ""; }; - 1E754E5B1621FBB70070AB92 /* BITCrashReportTextFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITCrashReportTextFormatter.m; sourceTree = ""; }; - 1E7A45FA16F54FB5005B08F1 /* OCHamcrestIOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = OCHamcrestIOS.framework; sourceTree = ""; }; - 1E7A45FB16F54FB5005B08F1 /* OCMockitoIOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = OCMockitoIOS.framework; sourceTree = ""; }; - 1E94F9DF16E91330006570AD /* BITStoreUpdateManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITStoreUpdateManager.h; sourceTree = ""; }; - 1E94F9E016E91330006570AD /* BITStoreUpdateManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITStoreUpdateManager.m; sourceTree = ""; }; - 1E94F9E316E9136B006570AD /* BITStoreUpdateManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITStoreUpdateManagerPrivate.h; sourceTree = ""; }; - 1EA1170316F53B49001C015C /* StoreBundleIdentifierUnknown.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = StoreBundleIdentifierUnknown.json; sourceTree = ""; }; - 1EA1170516F53B91001C015C /* BITTestHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITTestHelper.h; sourceTree = ""; }; - 1EA1170616F53B91001C015C /* BITTestHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITTestHelper.m; sourceTree = ""; }; - 1EA1170816F53E3A001C015C /* StoreBundleIdentifierKnown.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = StoreBundleIdentifierKnown.json; sourceTree = ""; }; - 1EA512DF167F7EF000FC9FBA /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/HockeySDK.strings"; sourceTree = ""; }; - 1EACC979162F041E007578C5 /* BITAttributedLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITAttributedLabel.h; sourceTree = ""; }; - 1EACC97A162F041E007578C5 /* BITAttributedLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = BITAttributedLabel.m; sourceTree = ""; }; - 1EAF20A4162DC0F600957B1D /* feedbackActivity@2x~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActivity@2x~ipad.png"; sourceTree = ""; }; - 1EAF20A5162DC0F600957B1D /* feedbackActivity~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActivity~ipad.png"; sourceTree = ""; }; - 1EAF20A6162DC0F600957B1D /* feedbackActiviy.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = feedbackActiviy.png; sourceTree = ""; }; - 1EAF20A7162DC0F600957B1D /* feedbackActiviy@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActiviy@2x.png"; sourceTree = ""; }; - 1EB52FC3167B73D400C801D5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/HockeySDK.strings; sourceTree = ""; }; - 1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyManagerPrivate.h; sourceTree = ""; }; - 1EDA60CF15C2C1450032D10B /* HockeySDK-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "HockeySDK-Info.plist"; sourceTree = ""; }; - 1EF95CA4162CB036000AE3AD /* BITFeedbackActivity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackActivity.h; sourceTree = ""; }; - 1EF95CA5162CB036000AE3AD /* BITFeedbackActivity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackActivity.m; sourceTree = ""; }; - 1EF95CA9162CB313000AE3AD /* BITFeedbackComposeViewControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackComposeViewControllerDelegate.h; sourceTree = ""; }; - BEE0207C16C5107E004426EA /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/HockeySDK.strings; sourceTree = ""; }; - E400561D148D79B500EB22B9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - E405266117A2AD300096359C /* BITFeedbackManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackManagerDelegate.h; sourceTree = ""; }; - E41EB465148D7BF50015DEDC /* BITHockeyManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyManager.h; sourceTree = ""; }; - E41EB466148D7BF50015DEDC /* BITHockeyManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyManager.m; sourceTree = ""; }; - E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CrashReporter.framework; path = ../Vendor/CrashReporter.framework; sourceTree = ""; }; - E48A3DEA17B3ED1C00924C3D /* BITAuthenticator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITAuthenticator.h; sourceTree = ""; }; - E48A3DEB17B3ED1C00924C3D /* BITAuthenticator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITAuthenticator.m; sourceTree = ""; }; - E48A3DEE17B3EFF100924C3D /* BITAuthenticatorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITAuthenticatorTests.m; sourceTree = ""; }; - E48A3DF117B408F400924C3D /* BITAuthenticator_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BITAuthenticator_Private.h; sourceTree = ""; }; - E4933E7E17B66CDA00B11ACC /* BITHTTPOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHTTPOperation.h; sourceTree = ""; }; - E4933E7F17B66CDA00B11ACC /* BITHTTPOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHTTPOperation.m; sourceTree = ""; }; - E4B4DB7B17B435550099C67F /* BITAuthenticationViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITAuthenticationViewController.h; sourceTree = ""; }; - E4B4DB7C17B435550099C67F /* BITAuthenticationViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITAuthenticationViewController.m; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1E5954DB15B6F24A00A03429 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1E5954DC15B6F24A00A03429 /* Foundation.framework in Frameworks */, - 1E5954DD15B6F24A00A03429 /* CrashReporter.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1E59550715B6F45800A03429 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1E5A458C16F0DFC200B55C04 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1EA1170016F4D32C001C015C /* libHockeySDK.a in Frameworks */, - 1E5A459216F0DFC200B55C04 /* SenTestingKit.framework in Frameworks */, - 1E5A459416F0DFC200B55C04 /* UIKit.framework in Frameworks */, - 1EA1170116F4D354001C015C /* CrashReporter.framework in Frameworks */, - 1E5A459516F0DFC200B55C04 /* Foundation.framework in Frameworks */, - 1E7A45FC16F54FB5005B08F1 /* OCHamcrestIOS.framework in Frameworks */, - 1E7A45FD16F54FB5005B08F1 /* OCMockitoIOS.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1E5955A415B71BDC00A03429 /* Images */ = { - isa = PBXGroup; - children = ( - 1E5955BB15B71C8600A03429 /* authorize_denied.png */, - 1E5955BC15B71C8600A03429 /* authorize_denied@2x.png */, - 1E5955BF15B71C8600A03429 /* bg.png */, - 1E5955C015B71C8600A03429 /* buttonHighlight.png */, - 1E5955C115B71C8600A03429 /* buttonHighlight@2x.png */, - 1E1127BC16580C87007067A2 /* buttonRoundedDelete.png */, - 1E1127BD16580C87007067A2 /* buttonRoundedDelete@2x.png */, - 1E1127BE16580C87007067A2 /* buttonRoundedDeleteHighlighted.png */, - 1E1127BF16580C87007067A2 /* buttonRoundedDeleteHighlighted@2x.png */, - 1E1127C016580C87007067A2 /* buttonRoundedRegular.png */, - 1E1127C116580C87007067A2 /* buttonRoundedRegular@2x.png */, - 1E1127C216580C87007067A2 /* buttonRoundedRegularHighlighted.png */, - 1E1127C316580C87007067A2 /* buttonRoundedRegularHighlighted@2x.png */, - 1E5955C415B71C8600A03429 /* IconGradient.png */, - 1E5955C515B71C8600A03429 /* IconGradient@2x.png */, - 1EAF20A4162DC0F600957B1D /* feedbackActivity@2x~ipad.png */, - 1EAF20A5162DC0F600957B1D /* feedbackActivity~ipad.png */, - 1EAF20A6162DC0F600957B1D /* feedbackActiviy.png */, - 1EAF20A7162DC0F600957B1D /* feedbackActiviy@2x.png */, - ); - name = Images; - sourceTree = ""; - }; - 1E5A459616F0DFC200B55C04 /* HockeySDKTests */ = { - isa = PBXGroup; - children = ( - 1EA1170216F53B49001C015C /* Fixtures */, - 1E5A459716F0DFC200B55C04 /* Supporting Files */, - 1E5A459D16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m */, - E48A3DEE17B3EFF100924C3D /* BITAuthenticatorTests.m */, - ); - path = HockeySDKTests; - sourceTree = ""; - }; - 1E5A459716F0DFC200B55C04 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 1E7A45FA16F54FB5005B08F1 /* OCHamcrestIOS.framework */, - 1E7A45FB16F54FB5005B08F1 /* OCMockitoIOS.framework */, - 1E5A459816F0DFC200B55C04 /* HockeySDKTests-Info.plist */, - 1E5A459916F0DFC200B55C04 /* InfoPlist.strings */, - 1E5A459F16F0DFC200B55C04 /* HockeySDKTests-Prefix.pch */, - 1EA1170516F53B91001C015C /* BITTestHelper.h */, - 1EA1170616F53B91001C015C /* BITTestHelper.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 1E66CA8F15D40FF600F35BED /* Support */ = { - isa = PBXGroup; - children = ( - 1E754DC61621BC170070AB92 /* HockeySDK.xcconfig */, - 1E66CA9115D4100500F35BED /* buildnumber.xcconfig */, - ); - name = Support; - sourceTree = ""; - }; - 1E754E441621F95E0070AB92 /* Helper */ = { - isa = PBXGroup; - children = ( - 1E49A4D4161222D400463151 /* HockeySDKPrivate.h */, - 1E49A4D5161222D400463151 /* HockeySDKPrivate.m */, - 1E49A4A0161222B900463151 /* BITHockeyBaseManager.h */, - 1E49A4A1161222B900463151 /* BITHockeyBaseManager.m */, - 1E49A4A2161222B900463151 /* BITHockeyBaseManagerPrivate.h */, - 1E49A4A3161222B900463151 /* BITHockeyBaseViewController.h */, - 1E49A4A4161222B900463151 /* BITHockeyBaseViewController.m */, - 1E49A4A5161222B900463151 /* BITHockeyHelper.h */, - 1E49A4A6161222B900463151 /* BITHockeyHelper.m */, - 1E0FEE26173BDB260061331F /* BITKeychainUtils.h */, - 1E0FEE27173BDB260061331F /* BITKeychainUtils.m */, - 1EACC979162F041E007578C5 /* BITAttributedLabel.h */, - 1EACC97A162F041E007578C5 /* BITAttributedLabel.m */, - 1E49A4A7161222B900463151 /* BITAppStoreHeader.h */, - 1E49A4A8161222B900463151 /* BITAppStoreHeader.m */, - 1E49A4A9161222B900463151 /* BITStoreButton.h */, - 1E49A4AA161222B900463151 /* BITStoreButton.m */, - 1E49A4AB161222B900463151 /* BITWebTableViewCell.h */, - 1E49A4AC161222B900463151 /* BITWebTableViewCell.m */, - ); - name = Helper; - sourceTree = ""; - }; - 1E754E461621FA9A0070AB92 /* Feedback */ = { - isa = PBXGroup; - children = ( - 1E49A4361612223B00463151 /* BITFeedbackMessage.h */, - 1E49A4371612223B00463151 /* BITFeedbackMessage.m */, - 1E49A42D1612223B00463151 /* BITFeedbackComposeViewController.h */, - 1E49A42E1612223B00463151 /* BITFeedbackComposeViewController.m */, - 1EF95CA9162CB313000AE3AD /* BITFeedbackComposeViewControllerDelegate.h */, - 1E49A4381612223B00463151 /* BITFeedbackUserDataViewController.h */, - 1E49A4391612223B00463151 /* BITFeedbackUserDataViewController.m */, - 1E49A42F1612223B00463151 /* BITFeedbackListViewCell.h */, - 1E49A4301612223B00463151 /* BITFeedbackListViewCell.m */, - 1E49A4311612223B00463151 /* BITFeedbackListViewController.h */, - 1E49A4321612223B00463151 /* BITFeedbackListViewController.m */, - 1EF95CA4162CB036000AE3AD /* BITFeedbackActivity.h */, - 1EF95CA5162CB036000AE3AD /* BITFeedbackActivity.m */, - 1E49A4331612223B00463151 /* BITFeedbackManager.h */, - 1E49A4341612223B00463151 /* BITFeedbackManager.m */, - E405266117A2AD300096359C /* BITFeedbackManagerDelegate.h */, - 1E49A4351612223B00463151 /* BITFeedbackManagerPrivate.h */, - ); - name = Feedback; - sourceTree = ""; - }; - 1E754E471621FAD00070AB92 /* Update */ = { - isa = PBXGroup; - children = ( - 1E49A4621612226D00463151 /* BITAppVersionMetaInfo.h */, - 1E49A4631612226D00463151 /* BITAppVersionMetaInfo.m */, - 1E49A4641612226D00463151 /* BITUpdateManager.h */, - 1E49A4651612226D00463151 /* BITUpdateManager.m */, - 1E49A4661612226D00463151 /* BITUpdateManagerDelegate.h */, - 1E49A4671612226D00463151 /* BITUpdateManagerPrivate.h */, - 1E49A4681612226D00463151 /* BITUpdateViewController.h */, - 1E49A4691612226D00463151 /* BITUpdateViewController.m */, - 1E49A46A1612226D00463151 /* BITUpdateViewControllerPrivate.h */, - ); - name = Update; - sourceTree = ""; - }; - 1E754E551621FBAF0070AB92 /* CrashReports */ = { - isa = PBXGroup; - children = ( - 1E754E561621FBB70070AB92 /* BITCrashManager.h */, - 1E754E571621FBB70070AB92 /* BITCrashManager.m */, - 1E754E581621FBB70070AB92 /* BITCrashManagerDelegate.h */, - 1E754E5A1621FBB70070AB92 /* BITCrashReportTextFormatter.h */, - 1E754E5B1621FBB70070AB92 /* BITCrashReportTextFormatter.m */, - ); - name = CrashReports; - sourceTree = ""; - }; - 1E94F9DE16E912DD006570AD /* StoreUpdate */ = { - isa = PBXGroup; - children = ( - 1E94F9DF16E91330006570AD /* BITStoreUpdateManager.h */, - 1E94F9E016E91330006570AD /* BITStoreUpdateManager.m */, - 1E94F9E316E9136B006570AD /* BITStoreUpdateManagerPrivate.h */, - 1E0828FF1708F69A0073050E /* BITStoreUpdateManagerDelegate.h */, - ); - name = StoreUpdate; - sourceTree = ""; - }; - 1EA1170216F53B49001C015C /* Fixtures */ = { - isa = PBXGroup; - children = ( - 1EA1170316F53B49001C015C /* StoreBundleIdentifierUnknown.json */, - 1EA1170816F53E3A001C015C /* StoreBundleIdentifierKnown.json */, - ); - path = Fixtures; - sourceTree = ""; - }; - E400560F148D79B500EB22B9 = { - isa = PBXGroup; - children = ( - E41EB489148D7BF90015DEDC /* HockeySDK */, - 1E5A459616F0DFC200B55C04 /* HockeySDKTests */, - E400561C148D79B500EB22B9 /* Frameworks */, - E4005648148D7A3000EB22B9 /* Resources */, - 1E66CA8F15D40FF600F35BED /* Support */, - E400561B148D79B500EB22B9 /* Products */, - ); - sourceTree = ""; - }; - E400561B148D79B500EB22B9 /* Products */ = { - isa = PBXGroup; - children = ( - 1E5954F215B6F24A00A03429 /* libHockeySDK.a */, - 1E59550A15B6F45800A03429 /* HockeySDKResources.bundle */, - 1E5A459016F0DFC200B55C04 /* HockeySDKTests.octest */, - ); - name = Products; - sourceTree = ""; - }; - E400561C148D79B500EB22B9 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */, - E400561D148D79B500EB22B9 /* Foundation.framework */, - 1E5A459116F0DFC200B55C04 /* SenTestingKit.framework */, - 1E5A459316F0DFC200B55C04 /* UIKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - E4005648148D7A3000EB22B9 /* Resources */ = { - isa = PBXGroup; - children = ( - 1EDA60CF15C2C1450032D10B /* HockeySDK-Info.plist */, - 1E5955A415B71BDC00A03429 /* Images */, - 1E59555F15B6F80E00A03429 /* HockeySDK.strings */, - ); - name = Resources; - path = ../Resources; - sourceTree = ""; - }; - E41EB458148D7BF50015DEDC /* Classes */ = { - isa = PBXGroup; - children = ( - E48A3DE917B3ECF900924C3D /* Network */, - 1E754E441621F95E0070AB92 /* Helper */, - 1E754E551621FBAF0070AB92 /* CrashReports */, - 1E754E461621FA9A0070AB92 /* Feedback */, - 1E754E471621FAD00070AB92 /* Update */, - 1E94F9DE16E912DD006570AD /* StoreUpdate */, - E41EB465148D7BF50015DEDC /* BITHockeyManager.h */, - E41EB466148D7BF50015DEDC /* BITHockeyManager.m */, - 1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */, - 1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */, - 1E71509A15B5C76F004E88FF /* HockeySDK.h */, - ); - name = Classes; - path = ../Classes; - sourceTree = ""; - }; - E41EB489148D7BF90015DEDC /* HockeySDK */ = { - isa = PBXGroup; - children = ( - E41EB458148D7BF50015DEDC /* Classes */, - ); - name = HockeySDK; - sourceTree = ""; - }; - E48A3DE917B3ECF900924C3D /* Network */ = { - isa = PBXGroup; - children = ( - E48A3DF017B408D800924C3D /* private */, - E48A3DEA17B3ED1C00924C3D /* BITAuthenticator.h */, - E48A3DEB17B3ED1C00924C3D /* BITAuthenticator.m */, - ); - name = Network; - sourceTree = ""; - }; - E48A3DF017B408D800924C3D /* private */ = { - isa = PBXGroup; - children = ( - E48A3DF117B408F400924C3D /* BITAuthenticator_Private.h */, - E4B4DB7B17B435550099C67F /* BITAuthenticationViewController.h */, - E4B4DB7C17B435550099C67F /* BITAuthenticationViewController.m */, - E4933E7E17B66CDA00B11ACC /* BITHTTPOperation.h */, - E4933E7F17B66CDA00B11ACC /* BITHTTPOperation.m */, - ); - name = private; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 1E59558B15B6FD8800A03429 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1E59559B15B6FDA500A03429 /* HockeySDK.h in Headers */, - 1E59559A15B6FDA500A03429 /* BITHockeyManager.h in Headers */, - 1E5955FD15B7877B00A03429 /* BITHockeyManagerDelegate.h in Headers */, - 1E754E5C1621FBB70070AB92 /* BITCrashManager.h in Headers */, - 1E754E5E1621FBB70070AB92 /* BITCrashManagerDelegate.h in Headers */, - 1E49A4731612226D00463151 /* BITUpdateManager.h in Headers */, - 1E49A4791612226D00463151 /* BITUpdateManagerDelegate.h in Headers */, - 1E49A44E1612223B00463151 /* BITFeedbackManager.h in Headers */, - E4B4DB7D17B435550099C67F /* BITAuthenticationViewController.h in Headers */, - 1E49A4481612223B00463151 /* BITFeedbackListViewController.h in Headers */, - 1E49A47F1612226D00463151 /* BITUpdateViewController.h in Headers */, - 1E49A43C1612223B00463151 /* BITFeedbackComposeViewController.h in Headers */, - 1EF95CAA162CB314000AE3AD /* BITFeedbackComposeViewControllerDelegate.h in Headers */, - 1EF95CA6162CB037000AE3AD /* BITFeedbackActivity.h in Headers */, - 1E49A4AF161222B900463151 /* BITHockeyBaseManager.h in Headers */, - 1E49A4B8161222B900463151 /* BITHockeyBaseViewController.h in Headers */, - 1E49A4421612223B00463151 /* BITFeedbackListViewCell.h in Headers */, - 1E49A4541612223B00463151 /* BITFeedbackManagerPrivate.h in Headers */, - 1E49A4571612223B00463151 /* BITFeedbackMessage.h in Headers */, - 1E49A45D1612223B00463151 /* BITFeedbackUserDataViewController.h in Headers */, - 1E49A46D1612226D00463151 /* BITAppVersionMetaInfo.h in Headers */, - 1E49A47C1612226D00463151 /* BITUpdateManagerPrivate.h in Headers */, - 1E49A4851612226D00463151 /* BITUpdateViewControllerPrivate.h in Headers */, - 1E49A4B5161222B900463151 /* BITHockeyBaseManagerPrivate.h in Headers */, - E4933E8017B66CDA00B11ACC /* BITHTTPOperation.h in Headers */, - 1E49A4BE161222B900463151 /* BITHockeyHelper.h in Headers */, - 1E49A4C4161222B900463151 /* BITAppStoreHeader.h in Headers */, - 1E49A4CA161222B900463151 /* BITStoreButton.h in Headers */, - E405266217A2AD300096359C /* BITFeedbackManagerDelegate.h in Headers */, - 1E49A4D0161222B900463151 /* BITWebTableViewCell.h in Headers */, - 1E49A4D8161222D400463151 /* HockeySDKPrivate.h in Headers */, - 1EC69F601615001500808FD9 /* BITHockeyManagerPrivate.h in Headers */, -<<<<<<< HEAD - 1E754E5F1621FBB70070AB92 /* BITCrashManagerPrivate.h in Headers */, - E48A3DEC17B3ED1C00924C3D /* BITAuthenticator.h in Headers */, -======= ->>>>>>> develop - 1E754E601621FBB70070AB92 /* BITCrashReportTextFormatter.h in Headers */, - 1EACC97B162F041E007578C5 /* BITAttributedLabel.h in Headers */, - 1E0FEE28173BDB260061331F /* BITKeychainUtils.h in Headers */, - 1E94F9E116E91330006570AD /* BITStoreUpdateManager.h in Headers */, - 1E94F9E416E9136B006570AD /* BITStoreUpdateManagerPrivate.h in Headers */, - 1E0829001708F69A0073050E /* BITStoreUpdateManagerDelegate.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 1E5954CB15B6F24A00A03429 /* HockeySDK */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1E5954EF15B6F24A00A03429 /* Build configuration list for PBXNativeTarget "HockeySDK" */; - buildPhases = ( - 1E5954CC15B6F24A00A03429 /* Sources */, - 1E5954DB15B6F24A00A03429 /* Frameworks */, - 1E59558B15B6FD8800A03429 /* Headers */, - 1EE9071A16F6871F003DDE1D /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - 1E59557E15B6F97100A03429 /* PBXTargetDependency */, - ); - name = HockeySDK; - productName = HockeySDK; - productReference = 1E5954F215B6F24A00A03429 /* libHockeySDK.a */; - productType = "com.apple.product-type.library.static"; - }; - 1E59550915B6F45800A03429 /* HockeySDKResources */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1E59551415B6F45800A03429 /* Build configuration list for PBXNativeTarget "HockeySDKResources" */; - buildPhases = ( - 1E59550615B6F45800A03429 /* Sources */, - 1E59550715B6F45800A03429 /* Frameworks */, - 1E59550815B6F45800A03429 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = HockeySDKResources; - productName = HockeySDKBundle; - productReference = 1E59550A15B6F45800A03429 /* HockeySDKResources.bundle */; - productType = "com.apple.product-type.bundle"; - }; - 1E5A458F16F0DFC200B55C04 /* HockeySDKTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1E5A45A216F0DFC200B55C04 /* Build configuration list for PBXNativeTarget "HockeySDKTests" */; - buildPhases = ( - 1E5A458B16F0DFC200B55C04 /* Sources */, - 1E5A458C16F0DFC200B55C04 /* Frameworks */, - 1E5A458D16F0DFC200B55C04 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1EA1170B16F54A5C001C015C /* PBXTargetDependency */, - 1EA116FF16F4D302001C015C /* PBXTargetDependency */, - ); - name = HockeySDKTests; - productName = HockeySDKTests; - productReference = 1E5A459016F0DFC200B55C04 /* HockeySDKTests.octest */; - productType = "com.apple.product-type.bundle"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - E4005611148D79B500EB22B9 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0440; - }; - buildConfigurationList = E4005614148D79B500EB22B9 /* Build configuration list for PBXProject "HockeySDK" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - de, - es, - fr, - it, - ja, - nl, - "pt-PT", - pt, - ru, - sv, - tr, - hr, - zh, - "zh-Hans", - ro, - hu, - ); - mainGroup = E400560F148D79B500EB22B9; - productRefGroup = E400561B148D79B500EB22B9 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1E5954CB15B6F24A00A03429 /* HockeySDK */, - 1E59550915B6F45800A03429 /* HockeySDKResources */, - 1E8E66AD15BC3D7700632A2E /* HockeySDK Documentation */, - 1E4F61E91621AD970033EFC5 /* HockeySDK Framework */, - 1E5A458F16F0DFC200B55C04 /* HockeySDKTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1E59550815B6F45800A03429 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1E5955C615B71C8600A03429 /* authorize_denied.png in Resources */, - 1E5955C715B71C8600A03429 /* authorize_denied@2x.png in Resources */, - 1E5955CA15B71C8600A03429 /* bg.png in Resources */, - 1E5955CB15B71C8600A03429 /* buttonHighlight.png in Resources */, - 1E5955CC15B71C8600A03429 /* buttonHighlight@2x.png in Resources */, - 1E5955CF15B71C8600A03429 /* IconGradient.png in Resources */, - 1E5955D015B71C8600A03429 /* IconGradient@2x.png in Resources */, - 1EAF20A8162DC0F600957B1D /* feedbackActivity@2x~ipad.png in Resources */, - 1EAF20A9162DC0F600957B1D /* feedbackActivity~ipad.png in Resources */, - 1EAF20AA162DC0F600957B1D /* feedbackActiviy.png in Resources */, - 1EAF20AB162DC0F600957B1D /* feedbackActiviy@2x.png in Resources */, - 1E1127C416580C87007067A2 /* buttonRoundedDelete.png in Resources */, - 1E1127C516580C87007067A2 /* buttonRoundedDelete@2x.png in Resources */, - 1E1127C616580C87007067A2 /* buttonRoundedDeleteHighlighted.png in Resources */, - 1E1127C716580C87007067A2 /* buttonRoundedDeleteHighlighted@2x.png in Resources */, - 1E1127C816580C87007067A2 /* buttonRoundedRegular.png in Resources */, - 1E1127C916580C87007067A2 /* buttonRoundedRegular@2x.png in Resources */, - 1E1127CA16580C87007067A2 /* buttonRoundedRegularHighlighted.png in Resources */, - 1E1127CB16580C87007067A2 /* buttonRoundedRegularHighlighted@2x.png in Resources */, - 1EB52FD5167B766100C801D5 /* HockeySDK.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1E5A458D16F0DFC200B55C04 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1EA1170C16F54A64001C015C /* HockeySDKResources.bundle in Resources */, - 1E5A459B16F0DFC200B55C04 /* InfoPlist.strings in Resources */, - 1EA1170416F53B49001C015C /* StoreBundleIdentifierUnknown.json in Resources */, - 1EA1170916F53E3A001C015C /* StoreBundleIdentifierKnown.json in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 1E4F61ED1621ADE70033EFC5 /* Build universal embedded framework */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Build universal embedded framework"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Sets the target folders and the final framework product.\nFMK_NAME=HockeySDK\nFMK_VERSION=A\nFMK_RESOURCE_BUNDLE=HockeySDKResources\n\n# Documentation\nHOCKEYSDK_DOCSET_VERSION_NAME=\"de.bitstadium.${HOCKEYSDK_DOCSET_NAME}-${VERSION_STRING}\"\n\n# Install dir will be the final output to the framework.\n# The following line create it in the root folder of the current project.\nPRODUCTS_DIR=${SRCROOT}/../Products\nTEMP_DIR=${PRODUCTS_DIR}/Temp\nINSTALL_DIR=${TEMP_DIR}/${FMK_NAME}.framework\n\n# Working dir will be deleted after the framework creation.\nWRK_DIR=build\nDEVICE_DIR=${WRK_DIR}/Release-iphoneos\nSIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator\nHEADERS_DIR=${WRK_DIR}/Release-iphoneos/usr/local/include\n\n# Building both architectures.\nxcodebuild -project \"HockeySDK.xcodeproj\" -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphoneos\nxcodebuild -project \"HockeySDK.xcodeproj\" -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphonesimulator\n\n# Cleaning the oldest.\nif [ -d \"${TEMP_DIR}\" ]\nthen\nrm -rf \"${TEMP_DIR}\"\nfi\n\n# Creates and renews the final product folder.\nmkdir -p \"${INSTALL_DIR}\"\nmkdir -p \"${INSTALL_DIR}/Versions\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers\"\n\n# Creates the internal links.\n# It MUST uses relative path, otherwise will not work when the folder is copied/moved.\nln -s \"${FMK_VERSION}\" \"${INSTALL_DIR}/Versions/Current\"\nln -s \"Versions/Current/Headers\" \"${INSTALL_DIR}/Headers\"\nln -s \"Versions/Current/Resources\" \"${INSTALL_DIR}/Resources\"\nln -s \"Versions/Current/${FMK_NAME}\" \"${INSTALL_DIR}/${FMK_NAME}\"\n\n# Copies the headers and resources files to the final product folder.\ncp -R \"${SRCROOT}/build/Release-iphoneos/include/HockeySDK/\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/\"\ncp -R \"${DEVICE_DIR}/${FMK_RESOURCE_BUNDLE}.bundle\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/\"\ncp -f \"${SRCROOT}/${FMK_NAME}.xcconfig\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/\"\n\n# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.\nlipo -create \"${DEVICE_DIR}/lib${FMK_NAME}.a\" \"${SIMULATOR_DIR}/lib${FMK_NAME}.a\" -output \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\"\n\n# Combine the CrashReporter static library into a new Hockey static library file if they are not already present and copy the public headers too\nif [ -z $(otool -L \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" | grep 'libCrashReporter') ]\nthen\nlibtool -static -o \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" \"${SRCROOT}/../Vendor/CrashReporter.framework/Versions/A/CrashReporter\"\nfi\n\nrm -r \"${WRK_DIR}\"\n\n# build embeddedframework folder and move framework into it\nmkdir \"${INSTALL_DIR}/../${FMK_NAME}.embeddedframework\"\nmv \"${INSTALL_DIR}\" \"${INSTALL_DIR}/../${FMK_NAME}.embeddedframework/${FMK_NAME}.framework\"\n\n# link Resources\nNEW_INSTALL_DIR=${TEMP_DIR}/${FMK_NAME}.embeddedframework\nmkdir \"${NEW_INSTALL_DIR}/Resources\"\nln -s \"../${FMK_NAME}.framework/Resources/${FMK_RESOURCE_BUNDLE}.bundle\" \"${NEW_INSTALL_DIR}/Resources/${FMK_RESOURCE_BUNDLE}.bundle\"\nln -s \"../${FMK_NAME}.framework/Resources/${FMK_NAME}.xcconfig\" \"${NEW_INSTALL_DIR}/Resources/${FMK_NAME}.xcconfig\"\n\n# copy license, changelog, documentation\ncp -f \"${SRCROOT}/../Docs/Changelog-template.md\" \"${TEMP_DIR}/CHANGELOG\"\ncp -f \"${SRCROOT}/../Docs/Guide-Installation-Setup-template.md\" \"${TEMP_DIR}/README.md\"\ncp -f \"${SRCROOT}/../LICENSE\" \"${TEMP_DIR}\"\nmkdir \"${TEMP_DIR}/${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\"\ncp -R \"${SRCROOT}/../documentation/docset/Contents\" \"${TEMP_DIR}/${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\"\n\n# build zip\ncd \"${PRODUCTS_DIR}\"\nrm -f \"${FMK_NAME}-iOS-${VERSION_STRING}.zip\"\ncd \"${TEMP_DIR}\"\nzip -yr \"../${FMK_NAME}-iOS-${VERSION_STRING}.zip\" \"./${FMK_NAME}.embeddedframework\" \"./CHANGELOG\" \"./README.md\" \"./LICENSE\" \"./${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\" -x \\*/.*\n\n#copy to output dir on cisimple\nif [ $CISIMPLE ]; then\n if [ ! -d \"${CONFIGURATION_BUILD_DIR}\" ]; then\n mkdir \"${CONFIGURATION_BUILD_DIR}\"\n fi\n cd \"${PRODUCTS_DIR}\"\n cp \"${FMK_NAME}-iOS-${VERSION_STRING}.zip\" \"${CONFIGURATION_BUILD_DIR}/${FMK_NAME}-iOS-${VERSION_STRING}.zip\"\nfi"; - }; - 1E8E66B215BC3D8200632A2E /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/usr/local/bin/appledoc \\\n --output \"${SOURCE_ROOT}/../documentation\" \\\n --ignore Vendor \\\n --ignore Products \\\n --ignore .m \\\n --create-html \\\n --create-docset \\\n --install-docset \\\n --keep-intermediate-files \\\n --project-name \"${HOCKEYSDK_DOCSET_NAME} ${VERSION_STRING}\" \\\n --project-version \"${VERSION_STRING}\" \\\n --project-company \"BitStadium GmbH\" \\\n --company-id \"de.bitstadium\" \\\n --docset-bundle-name \"${HOCKEYSDK_DOCSET_NAME} ${VERSION_STRING}\" \\\n --docset-feed-name \"${HOCKEYSDK_DOCSET_NAME}\" \\\n --docset-desc \"\" \\\n --docset-platform-family \"iphoneos\" \\\n --index-desc \"${SOURCE_ROOT}/../docs/index.md\" \\\n --include \"${SOURCE_ROOT}/../docs/index.html\" \\\n --include \"${SOURCE_ROOT}/../docs/\" \\\n --merge-categories \\\n --no-repeat-first-par \\\n --warn-undocumented-object \\\n --warn-undocumented-member \\\n --warn-empty-description \\\n --warn-unknown-directive \\\n --warn-invalid-crossref \\\n --warn-missing-arg \\\n --logformat xcode \\\n --exit-threshold 2 \\\n \"${SOURCE_ROOT}/../\"\n"; - }; - 1EE9071A16F6871F003DDE1D /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/../Vendor/XcodeCoverage/exportenv.sh\""; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1E5954CC15B6F24A00A03429 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1E5954D315B6F24A00A03429 /* BITHockeyManager.m in Sources */, - 1E49A43F1612223B00463151 /* BITFeedbackComposeViewController.m in Sources */, - 1E49A4451612223B00463151 /* BITFeedbackListViewCell.m in Sources */, - 1E49A44B1612223B00463151 /* BITFeedbackListViewController.m in Sources */, - 1E49A4511612223B00463151 /* BITFeedbackManager.m in Sources */, - E4933E8117B66CDA00B11ACC /* BITHTTPOperation.m in Sources */, - 1E49A45A1612223B00463151 /* BITFeedbackMessage.m in Sources */, - 1E49A4601612223B00463151 /* BITFeedbackUserDataViewController.m in Sources */, - 1E49A4701612226D00463151 /* BITAppVersionMetaInfo.m in Sources */, - 1E49A4761612226D00463151 /* BITUpdateManager.m in Sources */, - 1E49A4821612226D00463151 /* BITUpdateViewController.m in Sources */, - E4B4DB7E17B435550099C67F /* BITAuthenticationViewController.m in Sources */, - 1E49A4B2161222B900463151 /* BITHockeyBaseManager.m in Sources */, - 1E49A4BB161222B900463151 /* BITHockeyBaseViewController.m in Sources */, - 1E49A4C1161222B900463151 /* BITHockeyHelper.m in Sources */, - 1E49A4C7161222B900463151 /* BITAppStoreHeader.m in Sources */, - 1E49A4CD161222B900463151 /* BITStoreButton.m in Sources */, - 1E49A4D3161222B900463151 /* BITWebTableViewCell.m in Sources */, - E48A3DED17B3ED1C00924C3D /* BITAuthenticator.m in Sources */, - 1E49A4DB161222D400463151 /* HockeySDKPrivate.m in Sources */, - 1E754E5D1621FBB70070AB92 /* BITCrashManager.m in Sources */, - 1E754E611621FBB70070AB92 /* BITCrashReportTextFormatter.m in Sources */, - 1EF95CA7162CB037000AE3AD /* BITFeedbackActivity.m in Sources */, - 1EACC97C162F041E007578C5 /* BITAttributedLabel.m in Sources */, - 1E0FEE29173BDB260061331F /* BITKeychainUtils.m in Sources */, - 1E94F9E216E91330006570AD /* BITStoreUpdateManager.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1E59550615B6F45800A03429 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1E5A458B16F0DFC200B55C04 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1E5A459E16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m in Sources */, - E48A3DEF17B3EFF100924C3D /* BITAuthenticatorTests.m in Sources */, - 1EA1170716F53B91001C015C /* BITTestHelper.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 1E59557E15B6F97100A03429 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1E59550915B6F45800A03429 /* HockeySDKResources */; - targetProxy = 1E59557D15B6F97100A03429 /* PBXContainerItemProxy */; - }; - 1E754E431621F6290070AB92 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1E8E66AD15BC3D7700632A2E /* HockeySDK Documentation */; - targetProxy = 1E754E421621F6290070AB92 /* PBXContainerItemProxy */; - }; - 1EA116FF16F4D302001C015C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1E5954CB15B6F24A00A03429 /* HockeySDK */; - targetProxy = 1EA116FE16F4D302001C015C /* PBXContainerItemProxy */; - }; - 1EA1170B16F54A5C001C015C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1E59550915B6F45800A03429 /* HockeySDKResources */; - targetProxy = 1EA1170A16F54A5C001C015C /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 1E59555F15B6F80E00A03429 /* HockeySDK.strings */ = { - isa = PBXVariantGroup; - children = ( - 1E59556015B6F80E00A03429 /* de */, - 1E59556415B6F81C00A03429 /* es */, - 1E59556615B6F82300A03429 /* fr */, - 1E59556815B6F82A00A03429 /* it */, - 1E59556A15B6F83100A03429 /* ja */, - 1E59557015B6F84700A03429 /* pt */, - 1E59557215B6F84D00A03429 /* ru */, - 1E36D8B816667611000B134C /* hr */, - 1E6F0450167B5E5600ED1C86 /* pt-PT */, - 1EB52FC3167B73D400C801D5 /* en */, - 1EA512DF167F7EF000FC9FBA /* zh-Hans */, - 1E6DDCEE169E290C0076C65D /* ro */, - BEE0207C16C5107E004426EA /* hu */, - ); - name = HockeySDK.strings; - sourceTree = ""; - }; - 1E5A459916F0DFC200B55C04 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 1E5A459A16F0DFC200B55C04 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 1E4F61EB1621AD970033EFC5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = HockeySDK.framework; - }; - name = Debug; - }; - 1E4F61EC1621AD970033EFC5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = HockeySDK.framework; - }; - name = Release; - }; - 1E5954F015B6F24A00A03429 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DSTROOT = /tmp/HockeySDK.dst; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/../Vendor\"", - ); - GCC_THUMB_SUPPORT = NO; - PRODUCT_NAME = HockeySDK; - PUBLIC_HEADERS_FOLDER_PATH = "include/$(PRODUCT_NAME)"; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - 1E5954F115B6F24A00A03429 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - DSTROOT = /tmp/HockeySDK.dst; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/../Vendor\"", - ); - GCC_THUMB_SUPPORT = NO; - PRODUCT_NAME = HockeySDK; - PUBLIC_HEADERS_FOLDER_PATH = "include/$(PRODUCT_NAME)"; - SKIP_INSTALL = YES; - }; - name = Release; - }; - 1E59551515B6F45800A03429 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_THUMB_SUPPORT = NO; - INFOPLIST_FILE = "../Resources/HockeySDK-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - 1E59551615B6F45800A03429 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_THUMB_SUPPORT = NO; - INFOPLIST_FILE = "../Resources/HockeySDK-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 1E5A45A016F0DFC200B55C04 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - FRAMEWORK_SEARCH_PATHS = ( - "\"$(SDKROOT)/Developer/Library/Frameworks\"", - "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", - "\"$(SRCROOT)/../Vendor\"", - "\"$(SRCROOT)/HockeySDKTests\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "HockeySDKTests/HockeySDKTests-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_UNINITIALIZED_AUTOS = YES; - INFOPLIST_FILE = "HockeySDKTests/HockeySDKTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/HockeySDKTests\"", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = octest; - }; - name = Debug; - }; - 1E5A45A116F0DFC200B55C04 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - FRAMEWORK_SEARCH_PATHS = ( - "\"$(SDKROOT)/Developer/Library/Frameworks\"", - "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", - "\"$(SRCROOT)/../Vendor\"", - "\"$(SRCROOT)/HockeySDKTests\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "HockeySDKTests/HockeySDKTests-Prefix.pch"; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - INFOPLIST_FILE = "HockeySDKTests/HockeySDKTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/HockeySDKTests\"", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = octest; - }; - name = Release; - }; - 1E68F4A716F7843F00053706 /* CodeCoverage */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1E66CA9115D4100500F35BED /* buildnumber.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_GENERATE_TEST_COVERAGE_FILES = YES; - GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "BITHOCKEY_STATIC_LIBRARY=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = ""; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_STRICT_SELECTOR_MATCH = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "../Resources/HockeySDK-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - MACOSX_DEPLOYMENT_TARGET = 10.5; - RUN_CLANG_STATIC_ANALYZER = YES; - SDKROOT = iphoneos; - }; - name = CodeCoverage; - }; - 1E68F4A816F7843F00053706 /* CodeCoverage */ = { - isa = XCBuildConfiguration; - buildSettings = { - DSTROOT = /tmp/HockeySDK.dst; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/../Vendor\"", - ); - GCC_THUMB_SUPPORT = NO; - PRODUCT_NAME = HockeySDK; - PUBLIC_HEADERS_FOLDER_PATH = "include/$(PRODUCT_NAME)"; - SKIP_INSTALL = YES; - }; - name = CodeCoverage; - }; - 1E68F4A916F7843F00053706 /* CodeCoverage */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_THUMB_SUPPORT = NO; - INFOPLIST_FILE = "../Resources/HockeySDK-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - WRAPPER_EXTENSION = bundle; - }; - name = CodeCoverage; - }; - 1E68F4AA16F7843F00053706 /* CodeCoverage */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_THUMB_SUPPORT = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = CodeCoverage; - }; - 1E68F4AB16F7843F00053706 /* CodeCoverage */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = HockeySDK.framework; - }; - name = CodeCoverage; - }; - 1E68F4AC16F7843F00053706 /* CodeCoverage */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - FRAMEWORK_SEARCH_PATHS = ( - "\"$(SDKROOT)/Developer/Library/Frameworks\"", - "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", - "\"$(SRCROOT)/../Vendor\"", - "\"$(SRCROOT)/HockeySDKTests\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "HockeySDKTests/HockeySDKTests-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_UNINITIALIZED_AUTOS = YES; - INFOPLIST_FILE = "HockeySDKTests/HockeySDKTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/HockeySDKTests\"", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = octest; - }; - name = CodeCoverage; - }; - 1E8E66AE15BC3D7700632A2E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_THUMB_SUPPORT = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 1E8E66AF15BC3D7700632A2E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_THUMB_SUPPORT = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - E400563C148D79B500EB22B9 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1E66CA9115D4100500F35BED /* buildnumber.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "BITHOCKEY_STATIC_LIBRARY=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = ""; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_STRICT_SELECTOR_MATCH = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "../Resources/HockeySDK-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - MACOSX_DEPLOYMENT_TARGET = 10.5; - RUN_CLANG_STATIC_ANALYZER = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - E400563D148D79B500EB22B9 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1E66CA9115D4100500F35BED /* buildnumber.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "BITHOCKEY_STATIC_LIBRARY=1", - "$(inherited)", - ); - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = ""; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_STRICT_SELECTOR_MATCH = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "../Resources/HockeySDK-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - MACOSX_DEPLOYMENT_TARGET = 10.5; - RUN_CLANG_STATIC_ANALYZER = YES; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = NO; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1E4F61EA1621AD970033EFC5 /* Build configuration list for PBXAggregateTarget "HockeySDK Framework" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1E4F61EB1621AD970033EFC5 /* Debug */, - 1E68F4AB16F7843F00053706 /* CodeCoverage */, - 1E4F61EC1621AD970033EFC5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1E5954EF15B6F24A00A03429 /* Build configuration list for PBXNativeTarget "HockeySDK" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1E5954F015B6F24A00A03429 /* Debug */, - 1E68F4A816F7843F00053706 /* CodeCoverage */, - 1E5954F115B6F24A00A03429 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1E59551415B6F45800A03429 /* Build configuration list for PBXNativeTarget "HockeySDKResources" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1E59551515B6F45800A03429 /* Debug */, - 1E68F4A916F7843F00053706 /* CodeCoverage */, - 1E59551615B6F45800A03429 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1E5A45A216F0DFC200B55C04 /* Build configuration list for PBXNativeTarget "HockeySDKTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1E5A45A016F0DFC200B55C04 /* Debug */, - 1E68F4AC16F7843F00053706 /* CodeCoverage */, - 1E5A45A116F0DFC200B55C04 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1E8E66B015BC3D7700632A2E /* Build configuration list for PBXAggregateTarget "HockeySDK Documentation" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1E8E66AE15BC3D7700632A2E /* Debug */, - 1E68F4AA16F7843F00053706 /* CodeCoverage */, - 1E8E66AF15BC3D7700632A2E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - E4005614148D79B500EB22B9 /* Build configuration list for PBXProject "HockeySDK" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - E400563C148D79B500EB22B9 /* Debug */, - 1E68F4A716F7843F00053706 /* CodeCoverage */, - E400563D148D79B500EB22B9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = E4005611148D79B500EB22B9 /* Project object */; -} From 7326fe395cc7b878651fb362cee6d45fc4c1e658 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Tue, 24 Dec 2013 14:48:05 +0100 Subject: [PATCH 44/62] Remove old project.pbxproj.orig file which accidentally got added in a merge --- .../HockeySDK.xcodeproj/project.pbxproj.orig | 1319 ----------------- 1 file changed, 1319 deletions(-) delete mode 100644 Support/HockeySDK.xcodeproj/project.pbxproj.orig diff --git a/Support/HockeySDK.xcodeproj/project.pbxproj.orig b/Support/HockeySDK.xcodeproj/project.pbxproj.orig deleted file mode 100644 index cee7a511fa..0000000000 --- a/Support/HockeySDK.xcodeproj/project.pbxproj.orig +++ /dev/null @@ -1,1319 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXAggregateTarget section */ - 1E4F61E91621AD970033EFC5 /* HockeySDK Framework */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 1E4F61EA1621AD970033EFC5 /* Build configuration list for PBXAggregateTarget "HockeySDK Framework" */; - buildPhases = ( - 1E4F61ED1621ADE70033EFC5 /* Build universal embedded framework */, - ); - dependencies = ( - 1E754E431621F6290070AB92 /* PBXTargetDependency */, - ); - name = "HockeySDK Framework"; - productName = "HockeySDK Framework"; - }; - 1E8E66AD15BC3D7700632A2E /* HockeySDK Documentation */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 1E8E66B015BC3D7700632A2E /* Build configuration list for PBXAggregateTarget "HockeySDK Documentation" */; - buildPhases = ( - 1E8E66B215BC3D8200632A2E /* ShellScript */, - ); - dependencies = ( - ); - name = "HockeySDK Documentation"; - productName = Documentation; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 1E0829001708F69A0073050E /* BITStoreUpdateManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E0828FF1708F69A0073050E /* BITStoreUpdateManagerDelegate.h */; }; - 1E0FEE28173BDB260061331F /* BITKeychainUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E0FEE26173BDB260061331F /* BITKeychainUtils.h */; }; - 1E0FEE29173BDB260061331F /* BITKeychainUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E0FEE27173BDB260061331F /* BITKeychainUtils.m */; }; - 1E1127C416580C87007067A2 /* buttonRoundedDelete.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127BC16580C87007067A2 /* buttonRoundedDelete.png */; }; - 1E1127C516580C87007067A2 /* buttonRoundedDelete@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127BD16580C87007067A2 /* buttonRoundedDelete@2x.png */; }; - 1E1127C616580C87007067A2 /* buttonRoundedDeleteHighlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127BE16580C87007067A2 /* buttonRoundedDeleteHighlighted.png */; }; - 1E1127C716580C87007067A2 /* buttonRoundedDeleteHighlighted@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127BF16580C87007067A2 /* buttonRoundedDeleteHighlighted@2x.png */; }; - 1E1127C816580C87007067A2 /* buttonRoundedRegular.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127C016580C87007067A2 /* buttonRoundedRegular.png */; }; - 1E1127C916580C87007067A2 /* buttonRoundedRegular@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127C116580C87007067A2 /* buttonRoundedRegular@2x.png */; }; - 1E1127CA16580C87007067A2 /* buttonRoundedRegularHighlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127C216580C87007067A2 /* buttonRoundedRegularHighlighted.png */; }; - 1E1127CB16580C87007067A2 /* buttonRoundedRegularHighlighted@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E1127C316580C87007067A2 /* buttonRoundedRegularHighlighted@2x.png */; }; - 1E49A43C1612223B00463151 /* BITFeedbackComposeViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A42D1612223B00463151 /* BITFeedbackComposeViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A43F1612223B00463151 /* BITFeedbackComposeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A42E1612223B00463151 /* BITFeedbackComposeViewController.m */; }; - 1E49A4421612223B00463151 /* BITFeedbackListViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A42F1612223B00463151 /* BITFeedbackListViewCell.h */; }; - 1E49A4451612223B00463151 /* BITFeedbackListViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4301612223B00463151 /* BITFeedbackListViewCell.m */; }; - 1E49A4481612223B00463151 /* BITFeedbackListViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4311612223B00463151 /* BITFeedbackListViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A44B1612223B00463151 /* BITFeedbackListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4321612223B00463151 /* BITFeedbackListViewController.m */; }; - 1E49A44E1612223B00463151 /* BITFeedbackManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4331612223B00463151 /* BITFeedbackManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A4511612223B00463151 /* BITFeedbackManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4341612223B00463151 /* BITFeedbackManager.m */; }; - 1E49A4541612223B00463151 /* BITFeedbackManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4351612223B00463151 /* BITFeedbackManagerPrivate.h */; }; - 1E49A4571612223B00463151 /* BITFeedbackMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4361612223B00463151 /* BITFeedbackMessage.h */; }; - 1E49A45A1612223B00463151 /* BITFeedbackMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4371612223B00463151 /* BITFeedbackMessage.m */; }; - 1E49A45D1612223B00463151 /* BITFeedbackUserDataViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4381612223B00463151 /* BITFeedbackUserDataViewController.h */; }; - 1E49A4601612223B00463151 /* BITFeedbackUserDataViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4391612223B00463151 /* BITFeedbackUserDataViewController.m */; }; - 1E49A46D1612226D00463151 /* BITAppVersionMetaInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4621612226D00463151 /* BITAppVersionMetaInfo.h */; }; - 1E49A4701612226D00463151 /* BITAppVersionMetaInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4631612226D00463151 /* BITAppVersionMetaInfo.m */; }; - 1E49A4731612226D00463151 /* BITUpdateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4641612226D00463151 /* BITUpdateManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A4761612226D00463151 /* BITUpdateManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4651612226D00463151 /* BITUpdateManager.m */; }; - 1E49A4791612226D00463151 /* BITUpdateManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4661612226D00463151 /* BITUpdateManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A47C1612226D00463151 /* BITUpdateManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4671612226D00463151 /* BITUpdateManagerPrivate.h */; }; - 1E49A47F1612226D00463151 /* BITUpdateViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4681612226D00463151 /* BITUpdateViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A4821612226D00463151 /* BITUpdateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4691612226D00463151 /* BITUpdateViewController.m */; }; - 1E49A4851612226D00463151 /* BITUpdateViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A46A1612226D00463151 /* BITUpdateViewControllerPrivate.h */; }; - 1E49A4AF161222B900463151 /* BITHockeyBaseManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A0161222B900463151 /* BITHockeyBaseManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A4B2161222B900463151 /* BITHockeyBaseManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A1161222B900463151 /* BITHockeyBaseManager.m */; }; - 1E49A4B5161222B900463151 /* BITHockeyBaseManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A2161222B900463151 /* BITHockeyBaseManagerPrivate.h */; }; - 1E49A4B8161222B900463151 /* BITHockeyBaseViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A3161222B900463151 /* BITHockeyBaseViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E49A4BB161222B900463151 /* BITHockeyBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A4161222B900463151 /* BITHockeyBaseViewController.m */; }; - 1E49A4BE161222B900463151 /* BITHockeyHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A5161222B900463151 /* BITHockeyHelper.h */; }; - 1E49A4C1161222B900463151 /* BITHockeyHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A6161222B900463151 /* BITHockeyHelper.m */; }; - 1E49A4C4161222B900463151 /* BITAppStoreHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A7161222B900463151 /* BITAppStoreHeader.h */; }; - 1E49A4C7161222B900463151 /* BITAppStoreHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A8161222B900463151 /* BITAppStoreHeader.m */; }; - 1E49A4CA161222B900463151 /* BITStoreButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A9161222B900463151 /* BITStoreButton.h */; }; - 1E49A4CD161222B900463151 /* BITStoreButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4AA161222B900463151 /* BITStoreButton.m */; }; - 1E49A4D0161222B900463151 /* BITWebTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4AB161222B900463151 /* BITWebTableViewCell.h */; }; - 1E49A4D3161222B900463151 /* BITWebTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4AC161222B900463151 /* BITWebTableViewCell.m */; }; - 1E49A4D8161222D400463151 /* HockeySDKPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4D4161222D400463151 /* HockeySDKPrivate.h */; }; - 1E49A4DB161222D400463151 /* HockeySDKPrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4D5161222D400463151 /* HockeySDKPrivate.m */; }; - 1E5954D315B6F24A00A03429 /* BITHockeyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB466148D7BF50015DEDC /* BITHockeyManager.m */; }; - 1E5954DC15B6F24A00A03429 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E400561D148D79B500EB22B9 /* Foundation.framework */; }; - 1E5954DD15B6F24A00A03429 /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */; }; - 1E59559A15B6FDA500A03429 /* BITHockeyManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB465148D7BF50015DEDC /* BITHockeyManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E59559B15B6FDA500A03429 /* HockeySDK.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E71509A15B5C76F004E88FF /* HockeySDK.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E5955C615B71C8600A03429 /* authorize_denied.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955BB15B71C8600A03429 /* authorize_denied.png */; }; - 1E5955C715B71C8600A03429 /* authorize_denied@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955BC15B71C8600A03429 /* authorize_denied@2x.png */; }; - 1E5955CA15B71C8600A03429 /* bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955BF15B71C8600A03429 /* bg.png */; }; - 1E5955CB15B71C8600A03429 /* buttonHighlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955C015B71C8600A03429 /* buttonHighlight.png */; }; - 1E5955CC15B71C8600A03429 /* buttonHighlight@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955C115B71C8600A03429 /* buttonHighlight@2x.png */; }; - 1E5955CF15B71C8600A03429 /* IconGradient.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955C415B71C8600A03429 /* IconGradient.png */; }; - 1E5955D015B71C8600A03429 /* IconGradient@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955C515B71C8600A03429 /* IconGradient@2x.png */; }; - 1E5955FD15B7877B00A03429 /* BITHockeyManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E5A459216F0DFC200B55C04 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E5A459116F0DFC200B55C04 /* SenTestingKit.framework */; }; - 1E5A459416F0DFC200B55C04 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E5A459316F0DFC200B55C04 /* UIKit.framework */; }; - 1E5A459516F0DFC200B55C04 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E400561D148D79B500EB22B9 /* Foundation.framework */; }; - 1E5A459B16F0DFC200B55C04 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1E5A459916F0DFC200B55C04 /* InfoPlist.strings */; }; - 1E5A459E16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E5A459D16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m */; }; - 1E754E5C1621FBB70070AB92 /* BITCrashManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E754E561621FBB70070AB92 /* BITCrashManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E754E5D1621FBB70070AB92 /* BITCrashManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E754E571621FBB70070AB92 /* BITCrashManager.m */; }; - 1E754E5E1621FBB70070AB92 /* BITCrashManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E754E581621FBB70070AB92 /* BITCrashManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E754E601621FBB70070AB92 /* BITCrashReportTextFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E754E5A1621FBB70070AB92 /* BITCrashReportTextFormatter.h */; }; - 1E754E611621FBB70070AB92 /* BITCrashReportTextFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E754E5B1621FBB70070AB92 /* BITCrashReportTextFormatter.m */; }; - 1E7A45FC16F54FB5005B08F1 /* OCHamcrestIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E7A45FA16F54FB5005B08F1 /* OCHamcrestIOS.framework */; }; - 1E7A45FD16F54FB5005B08F1 /* OCMockitoIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E7A45FB16F54FB5005B08F1 /* OCMockitoIOS.framework */; }; - 1E94F9E116E91330006570AD /* BITStoreUpdateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E94F9DF16E91330006570AD /* BITStoreUpdateManager.h */; }; - 1E94F9E216E91330006570AD /* BITStoreUpdateManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E94F9E016E91330006570AD /* BITStoreUpdateManager.m */; }; - 1E94F9E416E9136B006570AD /* BITStoreUpdateManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E94F9E316E9136B006570AD /* BITStoreUpdateManagerPrivate.h */; }; - 1EA1170016F4D32C001C015C /* libHockeySDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E5954F215B6F24A00A03429 /* libHockeySDK.a */; }; - 1EA1170116F4D354001C015C /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */; }; - 1EA1170416F53B49001C015C /* StoreBundleIdentifierUnknown.json in Resources */ = {isa = PBXBuildFile; fileRef = 1EA1170316F53B49001C015C /* StoreBundleIdentifierUnknown.json */; }; - 1EA1170716F53B91001C015C /* BITTestHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EA1170616F53B91001C015C /* BITTestHelper.m */; }; - 1EA1170916F53E3A001C015C /* StoreBundleIdentifierKnown.json in Resources */ = {isa = PBXBuildFile; fileRef = 1EA1170816F53E3A001C015C /* StoreBundleIdentifierKnown.json */; }; - 1EA1170C16F54A64001C015C /* HockeySDKResources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 1E59550A15B6F45800A03429 /* HockeySDKResources.bundle */; }; - 1EACC97B162F041E007578C5 /* BITAttributedLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EACC979162F041E007578C5 /* BITAttributedLabel.h */; }; - 1EACC97C162F041E007578C5 /* BITAttributedLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EACC97A162F041E007578C5 /* BITAttributedLabel.m */; }; - 1EAF20A8162DC0F600957B1D /* feedbackActivity@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A4162DC0F600957B1D /* feedbackActivity@2x~ipad.png */; }; - 1EAF20A9162DC0F600957B1D /* feedbackActivity~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A5162DC0F600957B1D /* feedbackActivity~ipad.png */; }; - 1EAF20AA162DC0F600957B1D /* feedbackActiviy.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A6162DC0F600957B1D /* feedbackActiviy.png */; }; - 1EAF20AB162DC0F600957B1D /* feedbackActiviy@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A7162DC0F600957B1D /* feedbackActiviy@2x.png */; }; - 1EB52FD5167B766100C801D5 /* HockeySDK.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1E59555F15B6F80E00A03429 /* HockeySDK.strings */; }; - 1EC69F601615001500808FD9 /* BITHockeyManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */; }; - 1EF95CA6162CB037000AE3AD /* BITFeedbackActivity.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EF95CA4162CB036000AE3AD /* BITFeedbackActivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1EF95CA7162CB037000AE3AD /* BITFeedbackActivity.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EF95CA5162CB036000AE3AD /* BITFeedbackActivity.m */; }; - 1EF95CAA162CB314000AE3AD /* BITFeedbackComposeViewControllerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EF95CA9162CB313000AE3AD /* BITFeedbackComposeViewControllerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E405266217A2AD300096359C /* BITFeedbackManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = E405266117A2AD300096359C /* BITFeedbackManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E48A3DEC17B3ED1C00924C3D /* BITAuthenticator.h in Headers */ = {isa = PBXBuildFile; fileRef = E48A3DEA17B3ED1C00924C3D /* BITAuthenticator.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E48A3DED17B3ED1C00924C3D /* BITAuthenticator.m in Sources */ = {isa = PBXBuildFile; fileRef = E48A3DEB17B3ED1C00924C3D /* BITAuthenticator.m */; }; - E48A3DEF17B3EFF100924C3D /* BITAuthenticatorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E48A3DEE17B3EFF100924C3D /* BITAuthenticatorTests.m */; }; - E4933E8017B66CDA00B11ACC /* BITHTTPOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = E4933E7E17B66CDA00B11ACC /* BITHTTPOperation.h */; }; - E4933E8117B66CDA00B11ACC /* BITHTTPOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E4933E7F17B66CDA00B11ACC /* BITHTTPOperation.m */; }; - E4B4DB7D17B435550099C67F /* BITAuthenticationViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = E4B4DB7B17B435550099C67F /* BITAuthenticationViewController.h */; }; - E4B4DB7E17B435550099C67F /* BITAuthenticationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E4B4DB7C17B435550099C67F /* BITAuthenticationViewController.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 1E59557D15B6F97100A03429 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E4005611148D79B500EB22B9 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1E59550915B6F45800A03429; - remoteInfo = HockeySDKResources; - }; - 1E754E421621F6290070AB92 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E4005611148D79B500EB22B9 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1E8E66AD15BC3D7700632A2E; - remoteInfo = "HockeySDK Documentation"; - }; - 1EA116FE16F4D302001C015C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E4005611148D79B500EB22B9 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1E5954CB15B6F24A00A03429; - remoteInfo = HockeySDK; - }; - 1EA1170A16F54A5C001C015C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E4005611148D79B500EB22B9 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1E59550915B6F45800A03429; - remoteInfo = HockeySDKResources; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1E0828FF1708F69A0073050E /* BITStoreUpdateManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITStoreUpdateManagerDelegate.h; sourceTree = ""; }; - 1E0FEE26173BDB260061331F /* BITKeychainUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITKeychainUtils.h; sourceTree = ""; }; - 1E0FEE27173BDB260061331F /* BITKeychainUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITKeychainUtils.m; sourceTree = ""; }; - 1E1127BC16580C87007067A2 /* buttonRoundedDelete.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = buttonRoundedDelete.png; sourceTree = ""; }; - 1E1127BD16580C87007067A2 /* buttonRoundedDelete@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "buttonRoundedDelete@2x.png"; sourceTree = ""; }; - 1E1127BE16580C87007067A2 /* buttonRoundedDeleteHighlighted.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = buttonRoundedDeleteHighlighted.png; sourceTree = ""; }; - 1E1127BF16580C87007067A2 /* buttonRoundedDeleteHighlighted@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "buttonRoundedDeleteHighlighted@2x.png"; sourceTree = ""; }; - 1E1127C016580C87007067A2 /* buttonRoundedRegular.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = buttonRoundedRegular.png; sourceTree = ""; }; - 1E1127C116580C87007067A2 /* buttonRoundedRegular@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "buttonRoundedRegular@2x.png"; sourceTree = ""; }; - 1E1127C216580C87007067A2 /* buttonRoundedRegularHighlighted.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = buttonRoundedRegularHighlighted.png; sourceTree = ""; }; - 1E1127C316580C87007067A2 /* buttonRoundedRegularHighlighted@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "buttonRoundedRegularHighlighted@2x.png"; sourceTree = ""; }; - 1E36D8B816667611000B134C /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E49A42D1612223B00463151 /* BITFeedbackComposeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackComposeViewController.h; sourceTree = ""; }; - 1E49A42E1612223B00463151 /* BITFeedbackComposeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackComposeViewController.m; sourceTree = ""; }; - 1E49A42F1612223B00463151 /* BITFeedbackListViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackListViewCell.h; sourceTree = ""; }; - 1E49A4301612223B00463151 /* BITFeedbackListViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackListViewCell.m; sourceTree = ""; }; - 1E49A4311612223B00463151 /* BITFeedbackListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackListViewController.h; sourceTree = ""; }; - 1E49A4321612223B00463151 /* BITFeedbackListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackListViewController.m; sourceTree = ""; }; - 1E49A4331612223B00463151 /* BITFeedbackManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackManager.h; sourceTree = ""; }; - 1E49A4341612223B00463151 /* BITFeedbackManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackManager.m; sourceTree = ""; }; - 1E49A4351612223B00463151 /* BITFeedbackManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackManagerPrivate.h; sourceTree = ""; }; - 1E49A4361612223B00463151 /* BITFeedbackMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackMessage.h; sourceTree = ""; }; - 1E49A4371612223B00463151 /* BITFeedbackMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackMessage.m; sourceTree = ""; }; - 1E49A4381612223B00463151 /* BITFeedbackUserDataViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackUserDataViewController.h; sourceTree = ""; }; - 1E49A4391612223B00463151 /* BITFeedbackUserDataViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackUserDataViewController.m; sourceTree = ""; }; - 1E49A4621612226D00463151 /* BITAppVersionMetaInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITAppVersionMetaInfo.h; sourceTree = ""; }; - 1E49A4631612226D00463151 /* BITAppVersionMetaInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITAppVersionMetaInfo.m; sourceTree = ""; }; - 1E49A4641612226D00463151 /* BITUpdateManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateManager.h; sourceTree = ""; }; - 1E49A4651612226D00463151 /* BITUpdateManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITUpdateManager.m; sourceTree = ""; }; - 1E49A4661612226D00463151 /* BITUpdateManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateManagerDelegate.h; sourceTree = ""; }; - 1E49A4671612226D00463151 /* BITUpdateManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateManagerPrivate.h; sourceTree = ""; }; - 1E49A4681612226D00463151 /* BITUpdateViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateViewController.h; sourceTree = ""; }; - 1E49A4691612226D00463151 /* BITUpdateViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITUpdateViewController.m; sourceTree = ""; }; - 1E49A46A1612226D00463151 /* BITUpdateViewControllerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateViewControllerPrivate.h; sourceTree = ""; }; - 1E49A4A0161222B900463151 /* BITHockeyBaseManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyBaseManager.h; sourceTree = ""; }; - 1E49A4A1161222B900463151 /* BITHockeyBaseManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyBaseManager.m; sourceTree = ""; }; - 1E49A4A2161222B900463151 /* BITHockeyBaseManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyBaseManagerPrivate.h; sourceTree = ""; }; - 1E49A4A3161222B900463151 /* BITHockeyBaseViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyBaseViewController.h; sourceTree = ""; }; - 1E49A4A4161222B900463151 /* BITHockeyBaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyBaseViewController.m; sourceTree = ""; }; - 1E49A4A5161222B900463151 /* BITHockeyHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyHelper.h; sourceTree = ""; }; - 1E49A4A6161222B900463151 /* BITHockeyHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyHelper.m; sourceTree = ""; }; - 1E49A4A7161222B900463151 /* BITAppStoreHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITAppStoreHeader.h; sourceTree = ""; }; - 1E49A4A8161222B900463151 /* BITAppStoreHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITAppStoreHeader.m; sourceTree = ""; }; - 1E49A4A9161222B900463151 /* BITStoreButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITStoreButton.h; sourceTree = ""; }; - 1E49A4AA161222B900463151 /* BITStoreButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITStoreButton.m; sourceTree = ""; }; - 1E49A4AB161222B900463151 /* BITWebTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITWebTableViewCell.h; sourceTree = ""; }; - 1E49A4AC161222B900463151 /* BITWebTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITWebTableViewCell.m; sourceTree = ""; }; - 1E49A4D4161222D400463151 /* HockeySDKPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HockeySDKPrivate.h; sourceTree = ""; }; - 1E49A4D5161222D400463151 /* HockeySDKPrivate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HockeySDKPrivate.m; sourceTree = ""; }; - 1E5954F215B6F24A00A03429 /* libHockeySDK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libHockeySDK.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 1E59550A15B6F45800A03429 /* HockeySDKResources.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HockeySDKResources.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - 1E59556015B6F80E00A03429 /* de */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E59556415B6F81C00A03429 /* es */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E59556615B6F82300A03429 /* fr */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E59556815B6F82A00A03429 /* it */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E59556A15B6F83100A03429 /* ja */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E59557015B6F84700A03429 /* pt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E59557215B6F84D00A03429 /* ru */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E5955BB15B71C8600A03429 /* authorize_denied.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = authorize_denied.png; sourceTree = ""; }; - 1E5955BC15B71C8600A03429 /* authorize_denied@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "authorize_denied@2x.png"; sourceTree = ""; }; - 1E5955BF15B71C8600A03429 /* bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bg.png; sourceTree = ""; }; - 1E5955C015B71C8600A03429 /* buttonHighlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = buttonHighlight.png; sourceTree = ""; }; - 1E5955C115B71C8600A03429 /* buttonHighlight@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "buttonHighlight@2x.png"; sourceTree = ""; }; - 1E5955C415B71C8600A03429 /* IconGradient.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = IconGradient.png; sourceTree = ""; }; - 1E5955C515B71C8600A03429 /* IconGradient@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "IconGradient@2x.png"; sourceTree = ""; }; - 1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyManagerDelegate.h; sourceTree = ""; }; - 1E5A459016F0DFC200B55C04 /* HockeySDKTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HockeySDKTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1E5A459116F0DFC200B55C04 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; - 1E5A459316F0DFC200B55C04 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 1E5A459816F0DFC200B55C04 /* HockeySDKTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "HockeySDKTests-Info.plist"; sourceTree = ""; }; - 1E5A459A16F0DFC200B55C04 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 1E5A459D16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BITStoreUpdateManagerTests.m; sourceTree = ""; }; - 1E5A459F16F0DFC200B55C04 /* HockeySDKTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "HockeySDKTests-Prefix.pch"; sourceTree = ""; }; - 1E66CA9115D4100500F35BED /* buildnumber.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = buildnumber.xcconfig; sourceTree = ""; }; - 1E6DDCEE169E290C0076C65D /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/HockeySDK.strings; sourceTree = ""; }; - 1E6F0450167B5E5600ED1C86 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/HockeySDK.strings"; sourceTree = ""; }; - 1E71509A15B5C76F004E88FF /* HockeySDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HockeySDK.h; sourceTree = ""; }; - 1E754DC61621BC170070AB92 /* HockeySDK.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = HockeySDK.xcconfig; sourceTree = ""; }; - 1E754E561621FBB70070AB92 /* BITCrashManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashManager.h; sourceTree = ""; }; - 1E754E571621FBB70070AB92 /* BITCrashManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITCrashManager.m; sourceTree = ""; }; - 1E754E581621FBB70070AB92 /* BITCrashManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashManagerDelegate.h; sourceTree = ""; }; - 1E754E5A1621FBB70070AB92 /* BITCrashReportTextFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashReportTextFormatter.h; sourceTree = ""; }; - 1E754E5B1621FBB70070AB92 /* BITCrashReportTextFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITCrashReportTextFormatter.m; sourceTree = ""; }; - 1E7A45FA16F54FB5005B08F1 /* OCHamcrestIOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = OCHamcrestIOS.framework; sourceTree = ""; }; - 1E7A45FB16F54FB5005B08F1 /* OCMockitoIOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = OCMockitoIOS.framework; sourceTree = ""; }; - 1E94F9DF16E91330006570AD /* BITStoreUpdateManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITStoreUpdateManager.h; sourceTree = ""; }; - 1E94F9E016E91330006570AD /* BITStoreUpdateManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITStoreUpdateManager.m; sourceTree = ""; }; - 1E94F9E316E9136B006570AD /* BITStoreUpdateManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITStoreUpdateManagerPrivate.h; sourceTree = ""; }; - 1EA1170316F53B49001C015C /* StoreBundleIdentifierUnknown.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = StoreBundleIdentifierUnknown.json; sourceTree = ""; }; - 1EA1170516F53B91001C015C /* BITTestHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITTestHelper.h; sourceTree = ""; }; - 1EA1170616F53B91001C015C /* BITTestHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITTestHelper.m; sourceTree = ""; }; - 1EA1170816F53E3A001C015C /* StoreBundleIdentifierKnown.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = StoreBundleIdentifierKnown.json; sourceTree = ""; }; - 1EA512DF167F7EF000FC9FBA /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/HockeySDK.strings"; sourceTree = ""; }; - 1EACC979162F041E007578C5 /* BITAttributedLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITAttributedLabel.h; sourceTree = ""; }; - 1EACC97A162F041E007578C5 /* BITAttributedLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = BITAttributedLabel.m; sourceTree = ""; }; - 1EAF20A4162DC0F600957B1D /* feedbackActivity@2x~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActivity@2x~ipad.png"; sourceTree = ""; }; - 1EAF20A5162DC0F600957B1D /* feedbackActivity~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActivity~ipad.png"; sourceTree = ""; }; - 1EAF20A6162DC0F600957B1D /* feedbackActiviy.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = feedbackActiviy.png; sourceTree = ""; }; - 1EAF20A7162DC0F600957B1D /* feedbackActiviy@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActiviy@2x.png"; sourceTree = ""; }; - 1EB52FC3167B73D400C801D5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/HockeySDK.strings; sourceTree = ""; }; - 1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyManagerPrivate.h; sourceTree = ""; }; - 1EDA60CF15C2C1450032D10B /* HockeySDK-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "HockeySDK-Info.plist"; sourceTree = ""; }; - 1EF95CA4162CB036000AE3AD /* BITFeedbackActivity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackActivity.h; sourceTree = ""; }; - 1EF95CA5162CB036000AE3AD /* BITFeedbackActivity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackActivity.m; sourceTree = ""; }; - 1EF95CA9162CB313000AE3AD /* BITFeedbackComposeViewControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackComposeViewControllerDelegate.h; sourceTree = ""; }; - BEE0207C16C5107E004426EA /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/HockeySDK.strings; sourceTree = ""; }; - E400561D148D79B500EB22B9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - E405266117A2AD300096359C /* BITFeedbackManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackManagerDelegate.h; sourceTree = ""; }; - E41EB465148D7BF50015DEDC /* BITHockeyManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyManager.h; sourceTree = ""; }; - E41EB466148D7BF50015DEDC /* BITHockeyManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyManager.m; sourceTree = ""; }; - E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CrashReporter.framework; path = ../Vendor/CrashReporter.framework; sourceTree = ""; }; - E48A3DEA17B3ED1C00924C3D /* BITAuthenticator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITAuthenticator.h; sourceTree = ""; }; - E48A3DEB17B3ED1C00924C3D /* BITAuthenticator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITAuthenticator.m; sourceTree = ""; }; - E48A3DEE17B3EFF100924C3D /* BITAuthenticatorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITAuthenticatorTests.m; sourceTree = ""; }; - E48A3DF117B408F400924C3D /* BITAuthenticator_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BITAuthenticator_Private.h; sourceTree = ""; }; - E4933E7E17B66CDA00B11ACC /* BITHTTPOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHTTPOperation.h; sourceTree = ""; }; - E4933E7F17B66CDA00B11ACC /* BITHTTPOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHTTPOperation.m; sourceTree = ""; }; - E4B4DB7B17B435550099C67F /* BITAuthenticationViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITAuthenticationViewController.h; sourceTree = ""; }; - E4B4DB7C17B435550099C67F /* BITAuthenticationViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITAuthenticationViewController.m; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1E5954DB15B6F24A00A03429 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1E5954DC15B6F24A00A03429 /* Foundation.framework in Frameworks */, - 1E5954DD15B6F24A00A03429 /* CrashReporter.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1E59550715B6F45800A03429 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1E5A458C16F0DFC200B55C04 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1EA1170016F4D32C001C015C /* libHockeySDK.a in Frameworks */, - 1E5A459216F0DFC200B55C04 /* SenTestingKit.framework in Frameworks */, - 1E5A459416F0DFC200B55C04 /* UIKit.framework in Frameworks */, - 1EA1170116F4D354001C015C /* CrashReporter.framework in Frameworks */, - 1E5A459516F0DFC200B55C04 /* Foundation.framework in Frameworks */, - 1E7A45FC16F54FB5005B08F1 /* OCHamcrestIOS.framework in Frameworks */, - 1E7A45FD16F54FB5005B08F1 /* OCMockitoIOS.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1E5955A415B71BDC00A03429 /* Images */ = { - isa = PBXGroup; - children = ( - 1E5955BB15B71C8600A03429 /* authorize_denied.png */, - 1E5955BC15B71C8600A03429 /* authorize_denied@2x.png */, - 1E5955BF15B71C8600A03429 /* bg.png */, - 1E5955C015B71C8600A03429 /* buttonHighlight.png */, - 1E5955C115B71C8600A03429 /* buttonHighlight@2x.png */, - 1E1127BC16580C87007067A2 /* buttonRoundedDelete.png */, - 1E1127BD16580C87007067A2 /* buttonRoundedDelete@2x.png */, - 1E1127BE16580C87007067A2 /* buttonRoundedDeleteHighlighted.png */, - 1E1127BF16580C87007067A2 /* buttonRoundedDeleteHighlighted@2x.png */, - 1E1127C016580C87007067A2 /* buttonRoundedRegular.png */, - 1E1127C116580C87007067A2 /* buttonRoundedRegular@2x.png */, - 1E1127C216580C87007067A2 /* buttonRoundedRegularHighlighted.png */, - 1E1127C316580C87007067A2 /* buttonRoundedRegularHighlighted@2x.png */, - 1E5955C415B71C8600A03429 /* IconGradient.png */, - 1E5955C515B71C8600A03429 /* IconGradient@2x.png */, - 1EAF20A4162DC0F600957B1D /* feedbackActivity@2x~ipad.png */, - 1EAF20A5162DC0F600957B1D /* feedbackActivity~ipad.png */, - 1EAF20A6162DC0F600957B1D /* feedbackActiviy.png */, - 1EAF20A7162DC0F600957B1D /* feedbackActiviy@2x.png */, - ); - name = Images; - sourceTree = ""; - }; - 1E5A459616F0DFC200B55C04 /* HockeySDKTests */ = { - isa = PBXGroup; - children = ( - 1EA1170216F53B49001C015C /* Fixtures */, - 1E5A459716F0DFC200B55C04 /* Supporting Files */, - 1E5A459D16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m */, - E48A3DEE17B3EFF100924C3D /* BITAuthenticatorTests.m */, - ); - path = HockeySDKTests; - sourceTree = ""; - }; - 1E5A459716F0DFC200B55C04 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 1E7A45FA16F54FB5005B08F1 /* OCHamcrestIOS.framework */, - 1E7A45FB16F54FB5005B08F1 /* OCMockitoIOS.framework */, - 1E5A459816F0DFC200B55C04 /* HockeySDKTests-Info.plist */, - 1E5A459916F0DFC200B55C04 /* InfoPlist.strings */, - 1E5A459F16F0DFC200B55C04 /* HockeySDKTests-Prefix.pch */, - 1EA1170516F53B91001C015C /* BITTestHelper.h */, - 1EA1170616F53B91001C015C /* BITTestHelper.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 1E66CA8F15D40FF600F35BED /* Support */ = { - isa = PBXGroup; - children = ( - 1E754DC61621BC170070AB92 /* HockeySDK.xcconfig */, - 1E66CA9115D4100500F35BED /* buildnumber.xcconfig */, - ); - name = Support; - sourceTree = ""; - }; - 1E754E441621F95E0070AB92 /* Helper */ = { - isa = PBXGroup; - children = ( - 1E49A4D4161222D400463151 /* HockeySDKPrivate.h */, - 1E49A4D5161222D400463151 /* HockeySDKPrivate.m */, - 1E49A4A0161222B900463151 /* BITHockeyBaseManager.h */, - 1E49A4A1161222B900463151 /* BITHockeyBaseManager.m */, - 1E49A4A2161222B900463151 /* BITHockeyBaseManagerPrivate.h */, - 1E49A4A3161222B900463151 /* BITHockeyBaseViewController.h */, - 1E49A4A4161222B900463151 /* BITHockeyBaseViewController.m */, - 1E49A4A5161222B900463151 /* BITHockeyHelper.h */, - 1E49A4A6161222B900463151 /* BITHockeyHelper.m */, - 1E0FEE26173BDB260061331F /* BITKeychainUtils.h */, - 1E0FEE27173BDB260061331F /* BITKeychainUtils.m */, - 1EACC979162F041E007578C5 /* BITAttributedLabel.h */, - 1EACC97A162F041E007578C5 /* BITAttributedLabel.m */, - 1E49A4A7161222B900463151 /* BITAppStoreHeader.h */, - 1E49A4A8161222B900463151 /* BITAppStoreHeader.m */, - 1E49A4A9161222B900463151 /* BITStoreButton.h */, - 1E49A4AA161222B900463151 /* BITStoreButton.m */, - 1E49A4AB161222B900463151 /* BITWebTableViewCell.h */, - 1E49A4AC161222B900463151 /* BITWebTableViewCell.m */, - ); - name = Helper; - sourceTree = ""; - }; - 1E754E461621FA9A0070AB92 /* Feedback */ = { - isa = PBXGroup; - children = ( - 1E49A4361612223B00463151 /* BITFeedbackMessage.h */, - 1E49A4371612223B00463151 /* BITFeedbackMessage.m */, - 1E49A42D1612223B00463151 /* BITFeedbackComposeViewController.h */, - 1E49A42E1612223B00463151 /* BITFeedbackComposeViewController.m */, - 1EF95CA9162CB313000AE3AD /* BITFeedbackComposeViewControllerDelegate.h */, - 1E49A4381612223B00463151 /* BITFeedbackUserDataViewController.h */, - 1E49A4391612223B00463151 /* BITFeedbackUserDataViewController.m */, - 1E49A42F1612223B00463151 /* BITFeedbackListViewCell.h */, - 1E49A4301612223B00463151 /* BITFeedbackListViewCell.m */, - 1E49A4311612223B00463151 /* BITFeedbackListViewController.h */, - 1E49A4321612223B00463151 /* BITFeedbackListViewController.m */, - 1EF95CA4162CB036000AE3AD /* BITFeedbackActivity.h */, - 1EF95CA5162CB036000AE3AD /* BITFeedbackActivity.m */, - 1E49A4331612223B00463151 /* BITFeedbackManager.h */, - 1E49A4341612223B00463151 /* BITFeedbackManager.m */, - E405266117A2AD300096359C /* BITFeedbackManagerDelegate.h */, - 1E49A4351612223B00463151 /* BITFeedbackManagerPrivate.h */, - ); - name = Feedback; - sourceTree = ""; - }; - 1E754E471621FAD00070AB92 /* Update */ = { - isa = PBXGroup; - children = ( - 1E49A4621612226D00463151 /* BITAppVersionMetaInfo.h */, - 1E49A4631612226D00463151 /* BITAppVersionMetaInfo.m */, - 1E49A4641612226D00463151 /* BITUpdateManager.h */, - 1E49A4651612226D00463151 /* BITUpdateManager.m */, - 1E49A4661612226D00463151 /* BITUpdateManagerDelegate.h */, - 1E49A4671612226D00463151 /* BITUpdateManagerPrivate.h */, - 1E49A4681612226D00463151 /* BITUpdateViewController.h */, - 1E49A4691612226D00463151 /* BITUpdateViewController.m */, - 1E49A46A1612226D00463151 /* BITUpdateViewControllerPrivate.h */, - ); - name = Update; - sourceTree = ""; - }; - 1E754E551621FBAF0070AB92 /* CrashReports */ = { - isa = PBXGroup; - children = ( - 1E754E561621FBB70070AB92 /* BITCrashManager.h */, - 1E754E571621FBB70070AB92 /* BITCrashManager.m */, - 1E754E581621FBB70070AB92 /* BITCrashManagerDelegate.h */, - 1E754E5A1621FBB70070AB92 /* BITCrashReportTextFormatter.h */, - 1E754E5B1621FBB70070AB92 /* BITCrashReportTextFormatter.m */, - ); - name = CrashReports; - sourceTree = ""; - }; - 1E94F9DE16E912DD006570AD /* StoreUpdate */ = { - isa = PBXGroup; - children = ( - 1E94F9DF16E91330006570AD /* BITStoreUpdateManager.h */, - 1E94F9E016E91330006570AD /* BITStoreUpdateManager.m */, - 1E94F9E316E9136B006570AD /* BITStoreUpdateManagerPrivate.h */, - 1E0828FF1708F69A0073050E /* BITStoreUpdateManagerDelegate.h */, - ); - name = StoreUpdate; - sourceTree = ""; - }; - 1EA1170216F53B49001C015C /* Fixtures */ = { - isa = PBXGroup; - children = ( - 1EA1170316F53B49001C015C /* StoreBundleIdentifierUnknown.json */, - 1EA1170816F53E3A001C015C /* StoreBundleIdentifierKnown.json */, - ); - path = Fixtures; - sourceTree = ""; - }; - E400560F148D79B500EB22B9 = { - isa = PBXGroup; - children = ( - E41EB489148D7BF90015DEDC /* HockeySDK */, - 1E5A459616F0DFC200B55C04 /* HockeySDKTests */, - E400561C148D79B500EB22B9 /* Frameworks */, - E4005648148D7A3000EB22B9 /* Resources */, - 1E66CA8F15D40FF600F35BED /* Support */, - E400561B148D79B500EB22B9 /* Products */, - ); - sourceTree = ""; - }; - E400561B148D79B500EB22B9 /* Products */ = { - isa = PBXGroup; - children = ( - 1E5954F215B6F24A00A03429 /* libHockeySDK.a */, - 1E59550A15B6F45800A03429 /* HockeySDKResources.bundle */, - 1E5A459016F0DFC200B55C04 /* HockeySDKTests.octest */, - ); - name = Products; - sourceTree = ""; - }; - E400561C148D79B500EB22B9 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */, - E400561D148D79B500EB22B9 /* Foundation.framework */, - 1E5A459116F0DFC200B55C04 /* SenTestingKit.framework */, - 1E5A459316F0DFC200B55C04 /* UIKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - E4005648148D7A3000EB22B9 /* Resources */ = { - isa = PBXGroup; - children = ( - 1EDA60CF15C2C1450032D10B /* HockeySDK-Info.plist */, - 1E5955A415B71BDC00A03429 /* Images */, - 1E59555F15B6F80E00A03429 /* HockeySDK.strings */, - ); - name = Resources; - path = ../Resources; - sourceTree = ""; - }; - E41EB458148D7BF50015DEDC /* Classes */ = { - isa = PBXGroup; - children = ( - E48A3DE917B3ECF900924C3D /* Network */, - 1E754E441621F95E0070AB92 /* Helper */, - 1E754E551621FBAF0070AB92 /* CrashReports */, - 1E754E461621FA9A0070AB92 /* Feedback */, - 1E754E471621FAD00070AB92 /* Update */, - 1E94F9DE16E912DD006570AD /* StoreUpdate */, - E41EB465148D7BF50015DEDC /* BITHockeyManager.h */, - E41EB466148D7BF50015DEDC /* BITHockeyManager.m */, - 1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */, - 1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */, - 1E71509A15B5C76F004E88FF /* HockeySDK.h */, - ); - name = Classes; - path = ../Classes; - sourceTree = ""; - }; - E41EB489148D7BF90015DEDC /* HockeySDK */ = { - isa = PBXGroup; - children = ( - E41EB458148D7BF50015DEDC /* Classes */, - ); - name = HockeySDK; - sourceTree = ""; - }; - E48A3DE917B3ECF900924C3D /* Network */ = { - isa = PBXGroup; - children = ( - E48A3DF017B408D800924C3D /* private */, - E48A3DEA17B3ED1C00924C3D /* BITAuthenticator.h */, - E48A3DEB17B3ED1C00924C3D /* BITAuthenticator.m */, - ); - name = Network; - sourceTree = ""; - }; - E48A3DF017B408D800924C3D /* private */ = { - isa = PBXGroup; - children = ( - E48A3DF117B408F400924C3D /* BITAuthenticator_Private.h */, - E4B4DB7B17B435550099C67F /* BITAuthenticationViewController.h */, - E4B4DB7C17B435550099C67F /* BITAuthenticationViewController.m */, - E4933E7E17B66CDA00B11ACC /* BITHTTPOperation.h */, - E4933E7F17B66CDA00B11ACC /* BITHTTPOperation.m */, - ); - name = private; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 1E59558B15B6FD8800A03429 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1E59559B15B6FDA500A03429 /* HockeySDK.h in Headers */, - 1E59559A15B6FDA500A03429 /* BITHockeyManager.h in Headers */, - 1E5955FD15B7877B00A03429 /* BITHockeyManagerDelegate.h in Headers */, - 1E754E5C1621FBB70070AB92 /* BITCrashManager.h in Headers */, - 1E754E5E1621FBB70070AB92 /* BITCrashManagerDelegate.h in Headers */, - 1E49A4731612226D00463151 /* BITUpdateManager.h in Headers */, - 1E49A4791612226D00463151 /* BITUpdateManagerDelegate.h in Headers */, - 1E49A44E1612223B00463151 /* BITFeedbackManager.h in Headers */, - E4B4DB7D17B435550099C67F /* BITAuthenticationViewController.h in Headers */, - 1E49A4481612223B00463151 /* BITFeedbackListViewController.h in Headers */, - 1E49A47F1612226D00463151 /* BITUpdateViewController.h in Headers */, - 1E49A43C1612223B00463151 /* BITFeedbackComposeViewController.h in Headers */, - 1EF95CAA162CB314000AE3AD /* BITFeedbackComposeViewControllerDelegate.h in Headers */, - 1EF95CA6162CB037000AE3AD /* BITFeedbackActivity.h in Headers */, - 1E49A4AF161222B900463151 /* BITHockeyBaseManager.h in Headers */, - 1E49A4B8161222B900463151 /* BITHockeyBaseViewController.h in Headers */, - 1E49A4421612223B00463151 /* BITFeedbackListViewCell.h in Headers */, - 1E49A4541612223B00463151 /* BITFeedbackManagerPrivate.h in Headers */, - 1E49A4571612223B00463151 /* BITFeedbackMessage.h in Headers */, - 1E49A45D1612223B00463151 /* BITFeedbackUserDataViewController.h in Headers */, - 1E49A46D1612226D00463151 /* BITAppVersionMetaInfo.h in Headers */, - 1E49A47C1612226D00463151 /* BITUpdateManagerPrivate.h in Headers */, - 1E49A4851612226D00463151 /* BITUpdateViewControllerPrivate.h in Headers */, - 1E49A4B5161222B900463151 /* BITHockeyBaseManagerPrivate.h in Headers */, - E4933E8017B66CDA00B11ACC /* BITHTTPOperation.h in Headers */, - 1E49A4BE161222B900463151 /* BITHockeyHelper.h in Headers */, - 1E49A4C4161222B900463151 /* BITAppStoreHeader.h in Headers */, - 1E49A4CA161222B900463151 /* BITStoreButton.h in Headers */, - E405266217A2AD300096359C /* BITFeedbackManagerDelegate.h in Headers */, - 1E49A4D0161222B900463151 /* BITWebTableViewCell.h in Headers */, - 1E49A4D8161222D400463151 /* HockeySDKPrivate.h in Headers */, - 1EC69F601615001500808FD9 /* BITHockeyManagerPrivate.h in Headers */, -<<<<<<< HEAD - 1E754E5F1621FBB70070AB92 /* BITCrashManagerPrivate.h in Headers */, - E48A3DEC17B3ED1C00924C3D /* BITAuthenticator.h in Headers */, -======= ->>>>>>> develop - 1E754E601621FBB70070AB92 /* BITCrashReportTextFormatter.h in Headers */, - 1EACC97B162F041E007578C5 /* BITAttributedLabel.h in Headers */, - 1E0FEE28173BDB260061331F /* BITKeychainUtils.h in Headers */, - 1E94F9E116E91330006570AD /* BITStoreUpdateManager.h in Headers */, - 1E94F9E416E9136B006570AD /* BITStoreUpdateManagerPrivate.h in Headers */, - 1E0829001708F69A0073050E /* BITStoreUpdateManagerDelegate.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 1E5954CB15B6F24A00A03429 /* HockeySDK */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1E5954EF15B6F24A00A03429 /* Build configuration list for PBXNativeTarget "HockeySDK" */; - buildPhases = ( - 1E5954CC15B6F24A00A03429 /* Sources */, - 1E5954DB15B6F24A00A03429 /* Frameworks */, - 1E59558B15B6FD8800A03429 /* Headers */, - 1EE9071A16F6871F003DDE1D /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - 1E59557E15B6F97100A03429 /* PBXTargetDependency */, - ); - name = HockeySDK; - productName = HockeySDK; - productReference = 1E5954F215B6F24A00A03429 /* libHockeySDK.a */; - productType = "com.apple.product-type.library.static"; - }; - 1E59550915B6F45800A03429 /* HockeySDKResources */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1E59551415B6F45800A03429 /* Build configuration list for PBXNativeTarget "HockeySDKResources" */; - buildPhases = ( - 1E59550615B6F45800A03429 /* Sources */, - 1E59550715B6F45800A03429 /* Frameworks */, - 1E59550815B6F45800A03429 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = HockeySDKResources; - productName = HockeySDKBundle; - productReference = 1E59550A15B6F45800A03429 /* HockeySDKResources.bundle */; - productType = "com.apple.product-type.bundle"; - }; - 1E5A458F16F0DFC200B55C04 /* HockeySDKTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1E5A45A216F0DFC200B55C04 /* Build configuration list for PBXNativeTarget "HockeySDKTests" */; - buildPhases = ( - 1E5A458B16F0DFC200B55C04 /* Sources */, - 1E5A458C16F0DFC200B55C04 /* Frameworks */, - 1E5A458D16F0DFC200B55C04 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1EA1170B16F54A5C001C015C /* PBXTargetDependency */, - 1EA116FF16F4D302001C015C /* PBXTargetDependency */, - ); - name = HockeySDKTests; - productName = HockeySDKTests; - productReference = 1E5A459016F0DFC200B55C04 /* HockeySDKTests.octest */; - productType = "com.apple.product-type.bundle"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - E4005611148D79B500EB22B9 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0440; - }; - buildConfigurationList = E4005614148D79B500EB22B9 /* Build configuration list for PBXProject "HockeySDK" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - de, - es, - fr, - it, - ja, - nl, - "pt-PT", - pt, - ru, - sv, - tr, - hr, - zh, - "zh-Hans", - ro, - hu, - ); - mainGroup = E400560F148D79B500EB22B9; - productRefGroup = E400561B148D79B500EB22B9 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1E5954CB15B6F24A00A03429 /* HockeySDK */, - 1E59550915B6F45800A03429 /* HockeySDKResources */, - 1E8E66AD15BC3D7700632A2E /* HockeySDK Documentation */, - 1E4F61E91621AD970033EFC5 /* HockeySDK Framework */, - 1E5A458F16F0DFC200B55C04 /* HockeySDKTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1E59550815B6F45800A03429 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1E5955C615B71C8600A03429 /* authorize_denied.png in Resources */, - 1E5955C715B71C8600A03429 /* authorize_denied@2x.png in Resources */, - 1E5955CA15B71C8600A03429 /* bg.png in Resources */, - 1E5955CB15B71C8600A03429 /* buttonHighlight.png in Resources */, - 1E5955CC15B71C8600A03429 /* buttonHighlight@2x.png in Resources */, - 1E5955CF15B71C8600A03429 /* IconGradient.png in Resources */, - 1E5955D015B71C8600A03429 /* IconGradient@2x.png in Resources */, - 1EAF20A8162DC0F600957B1D /* feedbackActivity@2x~ipad.png in Resources */, - 1EAF20A9162DC0F600957B1D /* feedbackActivity~ipad.png in Resources */, - 1EAF20AA162DC0F600957B1D /* feedbackActiviy.png in Resources */, - 1EAF20AB162DC0F600957B1D /* feedbackActiviy@2x.png in Resources */, - 1E1127C416580C87007067A2 /* buttonRoundedDelete.png in Resources */, - 1E1127C516580C87007067A2 /* buttonRoundedDelete@2x.png in Resources */, - 1E1127C616580C87007067A2 /* buttonRoundedDeleteHighlighted.png in Resources */, - 1E1127C716580C87007067A2 /* buttonRoundedDeleteHighlighted@2x.png in Resources */, - 1E1127C816580C87007067A2 /* buttonRoundedRegular.png in Resources */, - 1E1127C916580C87007067A2 /* buttonRoundedRegular@2x.png in Resources */, - 1E1127CA16580C87007067A2 /* buttonRoundedRegularHighlighted.png in Resources */, - 1E1127CB16580C87007067A2 /* buttonRoundedRegularHighlighted@2x.png in Resources */, - 1EB52FD5167B766100C801D5 /* HockeySDK.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1E5A458D16F0DFC200B55C04 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1EA1170C16F54A64001C015C /* HockeySDKResources.bundle in Resources */, - 1E5A459B16F0DFC200B55C04 /* InfoPlist.strings in Resources */, - 1EA1170416F53B49001C015C /* StoreBundleIdentifierUnknown.json in Resources */, - 1EA1170916F53E3A001C015C /* StoreBundleIdentifierKnown.json in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 1E4F61ED1621ADE70033EFC5 /* Build universal embedded framework */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Build universal embedded framework"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Sets the target folders and the final framework product.\nFMK_NAME=HockeySDK\nFMK_VERSION=A\nFMK_RESOURCE_BUNDLE=HockeySDKResources\n\n# Documentation\nHOCKEYSDK_DOCSET_VERSION_NAME=\"de.bitstadium.${HOCKEYSDK_DOCSET_NAME}-${VERSION_STRING}\"\n\n# Install dir will be the final output to the framework.\n# The following line create it in the root folder of the current project.\nPRODUCTS_DIR=${SRCROOT}/../Products\nTEMP_DIR=${PRODUCTS_DIR}/Temp\nINSTALL_DIR=${TEMP_DIR}/${FMK_NAME}.framework\n\n# Working dir will be deleted after the framework creation.\nWRK_DIR=build\nDEVICE_DIR=${WRK_DIR}/Release-iphoneos\nSIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator\nHEADERS_DIR=${WRK_DIR}/Release-iphoneos/usr/local/include\n\n# Building both architectures.\nxcodebuild -project \"HockeySDK.xcodeproj\" -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphoneos\nxcodebuild -project \"HockeySDK.xcodeproj\" -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphonesimulator\n\n# Cleaning the oldest.\nif [ -d \"${TEMP_DIR}\" ]\nthen\nrm -rf \"${TEMP_DIR}\"\nfi\n\n# Creates and renews the final product folder.\nmkdir -p \"${INSTALL_DIR}\"\nmkdir -p \"${INSTALL_DIR}/Versions\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers\"\n\n# Creates the internal links.\n# It MUST uses relative path, otherwise will not work when the folder is copied/moved.\nln -s \"${FMK_VERSION}\" \"${INSTALL_DIR}/Versions/Current\"\nln -s \"Versions/Current/Headers\" \"${INSTALL_DIR}/Headers\"\nln -s \"Versions/Current/Resources\" \"${INSTALL_DIR}/Resources\"\nln -s \"Versions/Current/${FMK_NAME}\" \"${INSTALL_DIR}/${FMK_NAME}\"\n\n# Copies the headers and resources files to the final product folder.\ncp -R \"${SRCROOT}/build/Release-iphoneos/include/HockeySDK/\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/\"\ncp -R \"${DEVICE_DIR}/${FMK_RESOURCE_BUNDLE}.bundle\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/\"\ncp -f \"${SRCROOT}/${FMK_NAME}.xcconfig\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/\"\n\n# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.\nlipo -create \"${DEVICE_DIR}/lib${FMK_NAME}.a\" \"${SIMULATOR_DIR}/lib${FMK_NAME}.a\" -output \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\"\n\n# Combine the CrashReporter static library into a new Hockey static library file if they are not already present and copy the public headers too\nif [ -z $(otool -L \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" | grep 'libCrashReporter') ]\nthen\nlibtool -static -o \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" \"${SRCROOT}/../Vendor/CrashReporter.framework/Versions/A/CrashReporter\"\nfi\n\nrm -r \"${WRK_DIR}\"\n\n# build embeddedframework folder and move framework into it\nmkdir \"${INSTALL_DIR}/../${FMK_NAME}.embeddedframework\"\nmv \"${INSTALL_DIR}\" \"${INSTALL_DIR}/../${FMK_NAME}.embeddedframework/${FMK_NAME}.framework\"\n\n# link Resources\nNEW_INSTALL_DIR=${TEMP_DIR}/${FMK_NAME}.embeddedframework\nmkdir \"${NEW_INSTALL_DIR}/Resources\"\nln -s \"../${FMK_NAME}.framework/Resources/${FMK_RESOURCE_BUNDLE}.bundle\" \"${NEW_INSTALL_DIR}/Resources/${FMK_RESOURCE_BUNDLE}.bundle\"\nln -s \"../${FMK_NAME}.framework/Resources/${FMK_NAME}.xcconfig\" \"${NEW_INSTALL_DIR}/Resources/${FMK_NAME}.xcconfig\"\n\n# copy license, changelog, documentation\ncp -f \"${SRCROOT}/../Docs/Changelog-template.md\" \"${TEMP_DIR}/CHANGELOG\"\ncp -f \"${SRCROOT}/../Docs/Guide-Installation-Setup-template.md\" \"${TEMP_DIR}/README.md\"\ncp -f \"${SRCROOT}/../LICENSE\" \"${TEMP_DIR}\"\nmkdir \"${TEMP_DIR}/${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\"\ncp -R \"${SRCROOT}/../documentation/docset/Contents\" \"${TEMP_DIR}/${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\"\n\n# build zip\ncd \"${PRODUCTS_DIR}\"\nrm -f \"${FMK_NAME}-iOS-${VERSION_STRING}.zip\"\ncd \"${TEMP_DIR}\"\nzip -yr \"../${FMK_NAME}-iOS-${VERSION_STRING}.zip\" \"./${FMK_NAME}.embeddedframework\" \"./CHANGELOG\" \"./README.md\" \"./LICENSE\" \"./${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\" -x \\*/.*\n\n#copy to output dir on cisimple\nif [ $CISIMPLE ]; then\n if [ ! -d \"${CONFIGURATION_BUILD_DIR}\" ]; then\n mkdir \"${CONFIGURATION_BUILD_DIR}\"\n fi\n cd \"${PRODUCTS_DIR}\"\n cp \"${FMK_NAME}-iOS-${VERSION_STRING}.zip\" \"${CONFIGURATION_BUILD_DIR}/${FMK_NAME}-iOS-${VERSION_STRING}.zip\"\nfi"; - }; - 1E8E66B215BC3D8200632A2E /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/usr/local/bin/appledoc \\\n --output \"${SOURCE_ROOT}/../documentation\" \\\n --ignore Vendor \\\n --ignore Products \\\n --ignore .m \\\n --create-html \\\n --create-docset \\\n --install-docset \\\n --keep-intermediate-files \\\n --project-name \"${HOCKEYSDK_DOCSET_NAME} ${VERSION_STRING}\" \\\n --project-version \"${VERSION_STRING}\" \\\n --project-company \"BitStadium GmbH\" \\\n --company-id \"de.bitstadium\" \\\n --docset-bundle-name \"${HOCKEYSDK_DOCSET_NAME} ${VERSION_STRING}\" \\\n --docset-feed-name \"${HOCKEYSDK_DOCSET_NAME}\" \\\n --docset-desc \"\" \\\n --docset-platform-family \"iphoneos\" \\\n --index-desc \"${SOURCE_ROOT}/../docs/index.md\" \\\n --include \"${SOURCE_ROOT}/../docs/index.html\" \\\n --include \"${SOURCE_ROOT}/../docs/\" \\\n --merge-categories \\\n --no-repeat-first-par \\\n --warn-undocumented-object \\\n --warn-undocumented-member \\\n --warn-empty-description \\\n --warn-unknown-directive \\\n --warn-invalid-crossref \\\n --warn-missing-arg \\\n --logformat xcode \\\n --exit-threshold 2 \\\n \"${SOURCE_ROOT}/../\"\n"; - }; - 1EE9071A16F6871F003DDE1D /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/../Vendor/XcodeCoverage/exportenv.sh\""; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1E5954CC15B6F24A00A03429 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1E5954D315B6F24A00A03429 /* BITHockeyManager.m in Sources */, - 1E49A43F1612223B00463151 /* BITFeedbackComposeViewController.m in Sources */, - 1E49A4451612223B00463151 /* BITFeedbackListViewCell.m in Sources */, - 1E49A44B1612223B00463151 /* BITFeedbackListViewController.m in Sources */, - 1E49A4511612223B00463151 /* BITFeedbackManager.m in Sources */, - E4933E8117B66CDA00B11ACC /* BITHTTPOperation.m in Sources */, - 1E49A45A1612223B00463151 /* BITFeedbackMessage.m in Sources */, - 1E49A4601612223B00463151 /* BITFeedbackUserDataViewController.m in Sources */, - 1E49A4701612226D00463151 /* BITAppVersionMetaInfo.m in Sources */, - 1E49A4761612226D00463151 /* BITUpdateManager.m in Sources */, - 1E49A4821612226D00463151 /* BITUpdateViewController.m in Sources */, - E4B4DB7E17B435550099C67F /* BITAuthenticationViewController.m in Sources */, - 1E49A4B2161222B900463151 /* BITHockeyBaseManager.m in Sources */, - 1E49A4BB161222B900463151 /* BITHockeyBaseViewController.m in Sources */, - 1E49A4C1161222B900463151 /* BITHockeyHelper.m in Sources */, - 1E49A4C7161222B900463151 /* BITAppStoreHeader.m in Sources */, - 1E49A4CD161222B900463151 /* BITStoreButton.m in Sources */, - 1E49A4D3161222B900463151 /* BITWebTableViewCell.m in Sources */, - E48A3DED17B3ED1C00924C3D /* BITAuthenticator.m in Sources */, - 1E49A4DB161222D400463151 /* HockeySDKPrivate.m in Sources */, - 1E754E5D1621FBB70070AB92 /* BITCrashManager.m in Sources */, - 1E754E611621FBB70070AB92 /* BITCrashReportTextFormatter.m in Sources */, - 1EF95CA7162CB037000AE3AD /* BITFeedbackActivity.m in Sources */, - 1EACC97C162F041E007578C5 /* BITAttributedLabel.m in Sources */, - 1E0FEE29173BDB260061331F /* BITKeychainUtils.m in Sources */, - 1E94F9E216E91330006570AD /* BITStoreUpdateManager.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1E59550615B6F45800A03429 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1E5A458B16F0DFC200B55C04 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1E5A459E16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m in Sources */, - E48A3DEF17B3EFF100924C3D /* BITAuthenticatorTests.m in Sources */, - 1EA1170716F53B91001C015C /* BITTestHelper.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 1E59557E15B6F97100A03429 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1E59550915B6F45800A03429 /* HockeySDKResources */; - targetProxy = 1E59557D15B6F97100A03429 /* PBXContainerItemProxy */; - }; - 1E754E431621F6290070AB92 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1E8E66AD15BC3D7700632A2E /* HockeySDK Documentation */; - targetProxy = 1E754E421621F6290070AB92 /* PBXContainerItemProxy */; - }; - 1EA116FF16F4D302001C015C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1E5954CB15B6F24A00A03429 /* HockeySDK */; - targetProxy = 1EA116FE16F4D302001C015C /* PBXContainerItemProxy */; - }; - 1EA1170B16F54A5C001C015C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1E59550915B6F45800A03429 /* HockeySDKResources */; - targetProxy = 1EA1170A16F54A5C001C015C /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 1E59555F15B6F80E00A03429 /* HockeySDK.strings */ = { - isa = PBXVariantGroup; - children = ( - 1E59556015B6F80E00A03429 /* de */, - 1E59556415B6F81C00A03429 /* es */, - 1E59556615B6F82300A03429 /* fr */, - 1E59556815B6F82A00A03429 /* it */, - 1E59556A15B6F83100A03429 /* ja */, - 1E59557015B6F84700A03429 /* pt */, - 1E59557215B6F84D00A03429 /* ru */, - 1E36D8B816667611000B134C /* hr */, - 1E6F0450167B5E5600ED1C86 /* pt-PT */, - 1EB52FC3167B73D400C801D5 /* en */, - 1EA512DF167F7EF000FC9FBA /* zh-Hans */, - 1E6DDCEE169E290C0076C65D /* ro */, - BEE0207C16C5107E004426EA /* hu */, - ); - name = HockeySDK.strings; - sourceTree = ""; - }; - 1E5A459916F0DFC200B55C04 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 1E5A459A16F0DFC200B55C04 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 1E4F61EB1621AD970033EFC5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = HockeySDK.framework; - }; - name = Debug; - }; - 1E4F61EC1621AD970033EFC5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = HockeySDK.framework; - }; - name = Release; - }; - 1E5954F015B6F24A00A03429 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DSTROOT = /tmp/HockeySDK.dst; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/../Vendor\"", - ); - GCC_THUMB_SUPPORT = NO; - PRODUCT_NAME = HockeySDK; - PUBLIC_HEADERS_FOLDER_PATH = "include/$(PRODUCT_NAME)"; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - 1E5954F115B6F24A00A03429 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - DSTROOT = /tmp/HockeySDK.dst; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/../Vendor\"", - ); - GCC_THUMB_SUPPORT = NO; - PRODUCT_NAME = HockeySDK; - PUBLIC_HEADERS_FOLDER_PATH = "include/$(PRODUCT_NAME)"; - SKIP_INSTALL = YES; - }; - name = Release; - }; - 1E59551515B6F45800A03429 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_THUMB_SUPPORT = NO; - INFOPLIST_FILE = "../Resources/HockeySDK-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - 1E59551615B6F45800A03429 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_THUMB_SUPPORT = NO; - INFOPLIST_FILE = "../Resources/HockeySDK-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 1E5A45A016F0DFC200B55C04 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - FRAMEWORK_SEARCH_PATHS = ( - "\"$(SDKROOT)/Developer/Library/Frameworks\"", - "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", - "\"$(SRCROOT)/../Vendor\"", - "\"$(SRCROOT)/HockeySDKTests\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "HockeySDKTests/HockeySDKTests-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_UNINITIALIZED_AUTOS = YES; - INFOPLIST_FILE = "HockeySDKTests/HockeySDKTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/HockeySDKTests\"", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = octest; - }; - name = Debug; - }; - 1E5A45A116F0DFC200B55C04 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - FRAMEWORK_SEARCH_PATHS = ( - "\"$(SDKROOT)/Developer/Library/Frameworks\"", - "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", - "\"$(SRCROOT)/../Vendor\"", - "\"$(SRCROOT)/HockeySDKTests\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "HockeySDKTests/HockeySDKTests-Prefix.pch"; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - INFOPLIST_FILE = "HockeySDKTests/HockeySDKTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/HockeySDKTests\"", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = octest; - }; - name = Release; - }; - 1E68F4A716F7843F00053706 /* CodeCoverage */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1E66CA9115D4100500F35BED /* buildnumber.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_GENERATE_TEST_COVERAGE_FILES = YES; - GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "BITHOCKEY_STATIC_LIBRARY=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = ""; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_STRICT_SELECTOR_MATCH = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "../Resources/HockeySDK-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - MACOSX_DEPLOYMENT_TARGET = 10.5; - RUN_CLANG_STATIC_ANALYZER = YES; - SDKROOT = iphoneos; - }; - name = CodeCoverage; - }; - 1E68F4A816F7843F00053706 /* CodeCoverage */ = { - isa = XCBuildConfiguration; - buildSettings = { - DSTROOT = /tmp/HockeySDK.dst; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/../Vendor\"", - ); - GCC_THUMB_SUPPORT = NO; - PRODUCT_NAME = HockeySDK; - PUBLIC_HEADERS_FOLDER_PATH = "include/$(PRODUCT_NAME)"; - SKIP_INSTALL = YES; - }; - name = CodeCoverage; - }; - 1E68F4A916F7843F00053706 /* CodeCoverage */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_THUMB_SUPPORT = NO; - INFOPLIST_FILE = "../Resources/HockeySDK-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - WRAPPER_EXTENSION = bundle; - }; - name = CodeCoverage; - }; - 1E68F4AA16F7843F00053706 /* CodeCoverage */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_THUMB_SUPPORT = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = CodeCoverage; - }; - 1E68F4AB16F7843F00053706 /* CodeCoverage */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = HockeySDK.framework; - }; - name = CodeCoverage; - }; - 1E68F4AC16F7843F00053706 /* CodeCoverage */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - FRAMEWORK_SEARCH_PATHS = ( - "\"$(SDKROOT)/Developer/Library/Frameworks\"", - "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", - "\"$(SRCROOT)/../Vendor\"", - "\"$(SRCROOT)/HockeySDKTests\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "HockeySDKTests/HockeySDKTests-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_UNINITIALIZED_AUTOS = YES; - INFOPLIST_FILE = "HockeySDKTests/HockeySDKTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/HockeySDKTests\"", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = octest; - }; - name = CodeCoverage; - }; - 1E8E66AE15BC3D7700632A2E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_THUMB_SUPPORT = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 1E8E66AF15BC3D7700632A2E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_THUMB_SUPPORT = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - E400563C148D79B500EB22B9 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1E66CA9115D4100500F35BED /* buildnumber.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "BITHOCKEY_STATIC_LIBRARY=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = ""; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_STRICT_SELECTOR_MATCH = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "../Resources/HockeySDK-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - MACOSX_DEPLOYMENT_TARGET = 10.5; - RUN_CLANG_STATIC_ANALYZER = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - E400563D148D79B500EB22B9 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1E66CA9115D4100500F35BED /* buildnumber.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "BITHOCKEY_STATIC_LIBRARY=1", - "$(inherited)", - ); - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = ""; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_STRICT_SELECTOR_MATCH = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "../Resources/HockeySDK-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - MACOSX_DEPLOYMENT_TARGET = 10.5; - RUN_CLANG_STATIC_ANALYZER = YES; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = NO; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1E4F61EA1621AD970033EFC5 /* Build configuration list for PBXAggregateTarget "HockeySDK Framework" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1E4F61EB1621AD970033EFC5 /* Debug */, - 1E68F4AB16F7843F00053706 /* CodeCoverage */, - 1E4F61EC1621AD970033EFC5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1E5954EF15B6F24A00A03429 /* Build configuration list for PBXNativeTarget "HockeySDK" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1E5954F015B6F24A00A03429 /* Debug */, - 1E68F4A816F7843F00053706 /* CodeCoverage */, - 1E5954F115B6F24A00A03429 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1E59551415B6F45800A03429 /* Build configuration list for PBXNativeTarget "HockeySDKResources" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1E59551515B6F45800A03429 /* Debug */, - 1E68F4A916F7843F00053706 /* CodeCoverage */, - 1E59551615B6F45800A03429 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1E5A45A216F0DFC200B55C04 /* Build configuration list for PBXNativeTarget "HockeySDKTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1E5A45A016F0DFC200B55C04 /* Debug */, - 1E68F4AC16F7843F00053706 /* CodeCoverage */, - 1E5A45A116F0DFC200B55C04 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1E8E66B015BC3D7700632A2E /* Build configuration list for PBXAggregateTarget "HockeySDK Documentation" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1E8E66AE15BC3D7700632A2E /* Debug */, - 1E68F4AA16F7843F00053706 /* CodeCoverage */, - 1E8E66AF15BC3D7700632A2E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - E4005614148D79B500EB22B9 /* Build configuration list for PBXProject "HockeySDK" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - E400563C148D79B500EB22B9 /* Debug */, - 1E68F4A716F7843F00053706 /* CodeCoverage */, - E400563D148D79B500EB22B9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = E4005611148D79B500EB22B9 /* Project object */; -} From 252e7e9ded004cdb2a8ce380e636fe2affc1cfc1 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Sun, 29 Dec 2013 02:01:27 +0100 Subject: [PATCH 45/62] Fix unit tests not running any longer due to removed private header file --- Support/HockeySDKTests/BITCrashManagerTests.m | 1 - 1 file changed, 1 deletion(-) diff --git a/Support/HockeySDKTests/BITCrashManagerTests.m b/Support/HockeySDKTests/BITCrashManagerTests.m index 757c0e6bf9..aa39447289 100644 --- a/Support/HockeySDKTests/BITCrashManagerTests.m +++ b/Support/HockeySDKTests/BITCrashManagerTests.m @@ -20,7 +20,6 @@ #import "BITCrashManagerPrivate.h" #import "BITHockeyBaseManager.h" #import "BITHockeyBaseManagerPrivate.h" -#import "BITHockeyManagerPrivate.h" #import "BITTestHelper.h" From d19455a108e15c44d610f4adbd93b41320ddd50a Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Mon, 30 Dec 2013 00:39:27 +0100 Subject: [PATCH 46/62] Add public methods to get the SDKs version and build number as strings --- Classes/BITHockeyManager.h | 15 +++++++++++++++ Classes/BITHockeyManager.m | 9 +++++++++ Support/buildnumber.xcconfig | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Classes/BITHockeyManager.h b/Classes/BITHockeyManager.h index c53bcb5b3a..8d2bc8d770 100644 --- a/Classes/BITHockeyManager.h +++ b/Classes/BITHockeyManager.h @@ -336,4 +336,19 @@ @property (nonatomic, assign, getter=isDebugLogEnabled) BOOL debugLogEnabled; +///----------------------------------------------------------------------------- +/// @name Meta +///----------------------------------------------------------------------------- + +/** + Returns the SDK Version (CFBundleShortVersionString). + */ +- (NSString *)version; + +/** + Returns the SDK Build (CFBundleVersion) as a string. + */ +- (NSString *)build; + + @end diff --git a/Classes/BITHockeyManager.m b/Classes/BITHockeyManager.m index 7d60c8f6db..f256593380 100644 --- a/Classes/BITHockeyManager.m +++ b/Classes/BITHockeyManager.m @@ -307,6 +307,15 @@ } +- (NSString *)version { + return BITHOCKEY_VERSION; +} + +- (NSString *)build { + return BITHOCKEY_BUILD; +} + + #pragma mark - KVO #if HOCKEYSDK_FEATURE_UPDATES diff --git a/Support/buildnumber.xcconfig b/Support/buildnumber.xcconfig index c10975ce40..893857b3bd 100644 --- a/Support/buildnumber.xcconfig +++ b/Support/buildnumber.xcconfig @@ -2,7 +2,7 @@ BUILD_NUMBER = 23 VERSION_STRING = 3.5.0 -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) BITHOCKEY_VERSION="@\""$(VERSION_STRING)"\"" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) BITHOCKEY_VERSION="@\""$(VERSION_STRING)"\"" BITHOCKEY_BUILD="@\""$(BUILD_NUMBER)"\"" BIT_ARM_ARCHS = armv7 armv7s arm64 BIT_SIM_ARCHS = x86_64 i386 ARCHS = $(BIT_ARM_ARCHS) From e6929bbdf55851f68398faacdaceb5011774a2dc Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Mon, 30 Dec 2013 02:39:09 +0100 Subject: [PATCH 47/62] Copy PLCR header files into the framework when packaging, since these are now public --- Support/HockeySDK.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Support/HockeySDK.xcodeproj/project.pbxproj b/Support/HockeySDK.xcodeproj/project.pbxproj index 5690421221..0f68610a56 100644 --- a/Support/HockeySDK.xcodeproj/project.pbxproj +++ b/Support/HockeySDK.xcodeproj/project.pbxproj @@ -837,7 +837,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# Sets the target folders and the final framework product.\nFMK_NAME=HockeySDK\nFMK_VERSION=A\nFMK_RESOURCE_BUNDLE=HockeySDKResources\n\n# Documentation\nHOCKEYSDK_DOCSET_VERSION_NAME=\"de.bitstadium.${HOCKEYSDK_DOCSET_NAME}-${VERSION_STRING}\"\n\n# Install dir will be the final output to the framework.\n# The following line create it in the root folder of the current project.\nPRODUCTS_DIR=${SRCROOT}/../Products\nTEMP_DIR=${PRODUCTS_DIR}/Temp\nINSTALL_DIR=${TEMP_DIR}/${FMK_NAME}.framework\n\n# Working dir will be deleted after the framework creation.\nWRK_DIR=build\nDEVICE_DIR=${WRK_DIR}/Release-iphoneos\nSIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator\nHEADERS_DIR=${WRK_DIR}/Release-iphoneos/usr/local/include\n\n# Building both architectures.\nxcodebuild -project \"HockeySDK.xcodeproj\" -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphoneos\nxcodebuild -project \"HockeySDK.xcodeproj\" -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphonesimulator\n\n# Cleaning the oldest.\nif [ -d \"${TEMP_DIR}\" ]\nthen\nrm -rf \"${TEMP_DIR}\"\nfi\n\n# Creates and renews the final product folder.\nmkdir -p \"${INSTALL_DIR}\"\nmkdir -p \"${INSTALL_DIR}/Versions\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers\"\n\n# Creates the internal links.\n# It MUST uses relative path, otherwise will not work when the folder is copied/moved.\nln -s \"${FMK_VERSION}\" \"${INSTALL_DIR}/Versions/Current\"\nln -s \"Versions/Current/Headers\" \"${INSTALL_DIR}/Headers\"\nln -s \"Versions/Current/Resources\" \"${INSTALL_DIR}/Resources\"\nln -s \"Versions/Current/${FMK_NAME}\" \"${INSTALL_DIR}/${FMK_NAME}\"\n\n# Copies the headers and resources files to the final product folder.\ncp -R \"${SRCROOT}/build/Release-iphoneos/include/HockeySDK/\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/\"\ncp -R \"${DEVICE_DIR}/${FMK_RESOURCE_BUNDLE}.bundle\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/\"\ncp -f \"${SRCROOT}/${FMK_NAME}.xcconfig\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/\"\n\n# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.\nlipo -create \"${DEVICE_DIR}/lib${FMK_NAME}.a\" \"${SIMULATOR_DIR}/lib${FMK_NAME}.a\" -output \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\"\n\n# Combine the CrashReporter static library into a new Hockey static library file if they are not already present and copy the public headers too\nif [ -z $(otool -L \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" | grep 'libCrashReporter') ]\nthen\nlibtool -static -o \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" \"${SRCROOT}/../Vendor/CrashReporter.framework/Versions/A/CrashReporter\"\nfi\n\nrm -r \"${WRK_DIR}\"\n\n# build embeddedframework folder and move framework into it\nmkdir \"${INSTALL_DIR}/../${FMK_NAME}.embeddedframework\"\nmv \"${INSTALL_DIR}\" \"${INSTALL_DIR}/../${FMK_NAME}.embeddedframework/${FMK_NAME}.framework\"\n\n# link Resources\nNEW_INSTALL_DIR=${TEMP_DIR}/${FMK_NAME}.embeddedframework\nmkdir \"${NEW_INSTALL_DIR}/Resources\"\nln -s \"../${FMK_NAME}.framework/Resources/${FMK_RESOURCE_BUNDLE}.bundle\" \"${NEW_INSTALL_DIR}/Resources/${FMK_RESOURCE_BUNDLE}.bundle\"\nln -s \"../${FMK_NAME}.framework/Resources/${FMK_NAME}.xcconfig\" \"${NEW_INSTALL_DIR}/Resources/${FMK_NAME}.xcconfig\"\n\n# copy license, changelog, documentation\ncp -f \"${SRCROOT}/../Docs/Changelog-template.md\" \"${TEMP_DIR}/CHANGELOG\"\ncp -f \"${SRCROOT}/../Docs/Guide-Installation-Setup-template.md\" \"${TEMP_DIR}/README.md\"\ncp -f \"${SRCROOT}/../LICENSE\" \"${TEMP_DIR}\"\nmkdir \"${TEMP_DIR}/${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\"\ncp -R \"${SRCROOT}/../documentation/docset/Contents\" \"${TEMP_DIR}/${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\"\n\n# build zip\ncd \"${PRODUCTS_DIR}\"\nrm -f \"${FMK_NAME}-iOS-${VERSION_STRING}.zip\"\ncd \"${TEMP_DIR}\"\nzip -yr \"../${FMK_NAME}-iOS-${VERSION_STRING}.zip\" \"./${FMK_NAME}.embeddedframework\" \"./CHANGELOG\" \"./README.md\" \"./LICENSE\" \"./${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\" -x \\*/.*\n\n#copy to output dir on cisimple\nif [ $CISIMPLE ]; then\n if [ ! -d \"${CONFIGURATION_BUILD_DIR}\" ]; then\n mkdir \"${CONFIGURATION_BUILD_DIR}\"\n fi\n cd \"${PRODUCTS_DIR}\"\n cp \"${FMK_NAME}-iOS-${VERSION_STRING}.zip\" \"${CONFIGURATION_BUILD_DIR}/${FMK_NAME}-iOS-${VERSION_STRING}.zip\"\nfi"; + shellScript = "# Sets the target folders and the final framework product.\nFMK_NAME=HockeySDK\nFMK_VERSION=A\nFMK_RESOURCE_BUNDLE=HockeySDKResources\n\n# Documentation\nHOCKEYSDK_DOCSET_VERSION_NAME=\"de.bitstadium.${HOCKEYSDK_DOCSET_NAME}-${VERSION_STRING}\"\n\n# Install dir will be the final output to the framework.\n# The following line create it in the root folder of the current project.\nPRODUCTS_DIR=${SRCROOT}/../Products\nPLCR_DIR=${SRCROOT}/../Vendor/CrashReporter.framework\nTEMP_DIR=${PRODUCTS_DIR}/Temp\nINSTALL_DIR=${TEMP_DIR}/${FMK_NAME}.framework\n\n# Working dir will be deleted after the framework creation.\nWRK_DIR=build\nDEVICE_DIR=${WRK_DIR}/Release-iphoneos\nSIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator\nHEADERS_DIR=${WRK_DIR}/Release-iphoneos/usr/local/include\n\n# Building both architectures.\nxcodebuild -project \"HockeySDK.xcodeproj\" -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphoneos\nxcodebuild -project \"HockeySDK.xcodeproj\" -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphonesimulator\n\n# Cleaning the oldest.\nif [ -d \"${TEMP_DIR}\" ]\nthen\nrm -rf \"${TEMP_DIR}\"\nfi\n\n# Creates and renews the final product folder.\nmkdir -p \"${INSTALL_DIR}\"\nmkdir -p \"${INSTALL_DIR}/Versions\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers\"\n\n# Creates the internal links.\n# It MUST uses relative path, otherwise will not work when the folder is copied/moved.\nln -s \"${FMK_VERSION}\" \"${INSTALL_DIR}/Versions/Current\"\nln -s \"Versions/Current/Headers\" \"${INSTALL_DIR}/Headers\"\nln -s \"Versions/Current/Resources\" \"${INSTALL_DIR}/Resources\"\nln -s \"Versions/Current/${FMK_NAME}\" \"${INSTALL_DIR}/${FMK_NAME}\"\n\n# Copies the headers and resources files to the final product folder.\ncp -R \"${SRCROOT}/build/Release-iphoneos/include/HockeySDK/\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/\"\ncp -R \"${PLCR_DIR}/Versions/A/Headers/\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/\"\ncp -R \"${DEVICE_DIR}/${FMK_RESOURCE_BUNDLE}.bundle\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/\"\ncp -f \"${SRCROOT}/${FMK_NAME}.xcconfig\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/\"\n\n# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.\nlipo -create \"${DEVICE_DIR}/lib${FMK_NAME}.a\" \"${SIMULATOR_DIR}/lib${FMK_NAME}.a\" -output \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\"\n\n# Combine the CrashReporter static library into a new Hockey static library file if they are not already present and copy the public headers too\nif [ -z $(otool -L \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" | grep 'libCrashReporter') ]\nthen\nlibtool -static -o \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" \"${SRCROOT}/../Vendor/CrashReporter.framework/Versions/A/CrashReporter\"\nfi\n\nrm -r \"${WRK_DIR}\"\n\n# build embeddedframework folder and move framework into it\nmkdir \"${INSTALL_DIR}/../${FMK_NAME}.embeddedframework\"\nmv \"${INSTALL_DIR}\" \"${INSTALL_DIR}/../${FMK_NAME}.embeddedframework/${FMK_NAME}.framework\"\n\n# link Resources\nNEW_INSTALL_DIR=${TEMP_DIR}/${FMK_NAME}.embeddedframework\nmkdir \"${NEW_INSTALL_DIR}/Resources\"\nln -s \"../${FMK_NAME}.framework/Resources/${FMK_RESOURCE_BUNDLE}.bundle\" \"${NEW_INSTALL_DIR}/Resources/${FMK_RESOURCE_BUNDLE}.bundle\"\nln -s \"../${FMK_NAME}.framework/Resources/${FMK_NAME}.xcconfig\" \"${NEW_INSTALL_DIR}/Resources/${FMK_NAME}.xcconfig\"\n\n# copy license, changelog, documentation\ncp -f \"${SRCROOT}/../Docs/Changelog-template.md\" \"${TEMP_DIR}/CHANGELOG\"\ncp -f \"${SRCROOT}/../Docs/Guide-Installation-Setup-template.md\" \"${TEMP_DIR}/README.md\"\ncp -f \"${SRCROOT}/../LICENSE\" \"${TEMP_DIR}\"\nmkdir \"${TEMP_DIR}/${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\"\ncp -R \"${SRCROOT}/../documentation/docset/Contents\" \"${TEMP_DIR}/${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\"\n\n# build zip\ncd \"${PRODUCTS_DIR}\"\nrm -f \"${FMK_NAME}-iOS-${VERSION_STRING}.zip\"\ncd \"${TEMP_DIR}\"\nzip -yr \"../${FMK_NAME}-iOS-${VERSION_STRING}.zip\" \"./${FMK_NAME}.embeddedframework\" \"./CHANGELOG\" \"./README.md\" \"./LICENSE\" \"./${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\" -x \\*/.*\n\n#copy to output dir on cisimple\nif [ $CISIMPLE ]; then\n if [ ! -d \"${CONFIGURATION_BUILD_DIR}\" ]; then\n mkdir \"${CONFIGURATION_BUILD_DIR}\"\n fi\n cd \"${PRODUCTS_DIR}\"\n cp \"${FMK_NAME}-iOS-${VERSION_STRING}.zip\" \"${CONFIGURATION_BUILD_DIR}/${FMK_NAME}-iOS-${VERSION_STRING}.zip\"\nfi"; }; 1E8E66B215BC3D8200632A2E /* ShellScript */ = { isa = PBXShellScriptBuildPhase; From cd631af9ba66aca38275e3c518d91718e3ba9a3e Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Mon, 30 Dec 2013 02:57:10 +0100 Subject: [PATCH 48/62] Import the PLCR header depending on the location We need this check depending on integrating as a subproject or using the binary distribution --- Classes/BITCrashManager.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Classes/BITCrashManager.h b/Classes/BITCrashManager.h index b3dc982639..9689d380a5 100644 --- a/Classes/BITCrashManager.h +++ b/Classes/BITCrashManager.h @@ -32,7 +32,13 @@ #import "BITHockeyBaseManager.h" +// We need this check depending on integrating as a subproject or using the binary distribution +#if __has_include("CrashReporter.h") +#import "CrashReporter.h" +#else #import +#endif + /** * Crash Manager status From 07bf41b232eca09ba63ed73f40d69e8e1a10989b Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Mon, 6 Jan 2014 15:35:37 +0100 Subject: [PATCH 49/62] Zip the framework in a "HockeySDK-iOS" subfolder when bundling the package --- Support/HockeySDK.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Support/HockeySDK.xcodeproj/project.pbxproj b/Support/HockeySDK.xcodeproj/project.pbxproj index eca8a9a0d5..7f5b4a710c 100644 --- a/Support/HockeySDK.xcodeproj/project.pbxproj +++ b/Support/HockeySDK.xcodeproj/project.pbxproj @@ -833,7 +833,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# Sets the target folders and the final framework product.\nFMK_NAME=HockeySDK\nFMK_VERSION=A\nFMK_RESOURCE_BUNDLE=HockeySDKResources\n\n# Documentation\nHOCKEYSDK_DOCSET_VERSION_NAME=\"de.bitstadium.${HOCKEYSDK_DOCSET_NAME}-${VERSION_STRING}\"\n\n# Install dir will be the final output to the framework.\n# The following line create it in the root folder of the current project.\nPRODUCTS_DIR=${SRCROOT}/../Products\nPLCR_DIR=${SRCROOT}/../Vendor/CrashReporter.framework\nTEMP_DIR=${PRODUCTS_DIR}/Temp\nINSTALL_DIR=${TEMP_DIR}/${FMK_NAME}.framework\n\n# Working dir will be deleted after the framework creation.\nWRK_DIR=build\nDEVICE_DIR=${WRK_DIR}/Release-iphoneos\nSIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator\nHEADERS_DIR=${WRK_DIR}/Release-iphoneos/usr/local/include\n\n# Building both architectures.\nxcodebuild -project \"HockeySDK.xcodeproj\" -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphoneos\nxcodebuild -project \"HockeySDK.xcodeproj\" -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphonesimulator\n\n# Cleaning the oldest.\nif [ -d \"${TEMP_DIR}\" ]\nthen\nrm -rf \"${TEMP_DIR}\"\nfi\n\n# Creates and renews the final product folder.\nmkdir -p \"${INSTALL_DIR}\"\nmkdir -p \"${INSTALL_DIR}/Versions\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers\"\n\n# Creates the internal links.\n# It MUST uses relative path, otherwise will not work when the folder is copied/moved.\nln -s \"${FMK_VERSION}\" \"${INSTALL_DIR}/Versions/Current\"\nln -s \"Versions/Current/Headers\" \"${INSTALL_DIR}/Headers\"\nln -s \"Versions/Current/Resources\" \"${INSTALL_DIR}/Resources\"\nln -s \"Versions/Current/${FMK_NAME}\" \"${INSTALL_DIR}/${FMK_NAME}\"\n\n# Copies the headers and resources files to the final product folder.\ncp -R \"${SRCROOT}/build/Release-iphoneos/include/HockeySDK/\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/\"\ncp -R \"${PLCR_DIR}/Versions/A/Headers/\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/\"\ncp -R \"${DEVICE_DIR}/${FMK_RESOURCE_BUNDLE}.bundle\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/\"\ncp -f \"${SRCROOT}/${FMK_NAME}.xcconfig\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/\"\n\n# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.\nlipo -create \"${DEVICE_DIR}/lib${FMK_NAME}.a\" \"${SIMULATOR_DIR}/lib${FMK_NAME}.a\" -output \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\"\n\n# Combine the CrashReporter static library into a new Hockey static library file if they are not already present and copy the public headers too\nif [ -z $(otool -L \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" | grep 'libCrashReporter') ]\nthen\nlibtool -static -o \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" \"${SRCROOT}/../Vendor/CrashReporter.framework/Versions/A/CrashReporter\"\nfi\n\nrm -r \"${WRK_DIR}\"\n\n# build embeddedframework folder and move framework into it\nmkdir \"${INSTALL_DIR}/../${FMK_NAME}.embeddedframework\"\nmv \"${INSTALL_DIR}\" \"${INSTALL_DIR}/../${FMK_NAME}.embeddedframework/${FMK_NAME}.framework\"\n\n# link Resources\nNEW_INSTALL_DIR=${TEMP_DIR}/${FMK_NAME}.embeddedframework\nmkdir \"${NEW_INSTALL_DIR}/Resources\"\nln -s \"../${FMK_NAME}.framework/Resources/${FMK_RESOURCE_BUNDLE}.bundle\" \"${NEW_INSTALL_DIR}/Resources/${FMK_RESOURCE_BUNDLE}.bundle\"\nln -s \"../${FMK_NAME}.framework/Resources/${FMK_NAME}.xcconfig\" \"${NEW_INSTALL_DIR}/Resources/${FMK_NAME}.xcconfig\"\n\n# copy license, changelog, documentation\ncp -f \"${SRCROOT}/../Docs/Changelog-template.md\" \"${TEMP_DIR}/CHANGELOG\"\ncp -f \"${SRCROOT}/../Docs/Guide-Installation-Setup-template.md\" \"${TEMP_DIR}/README.md\"\ncp -f \"${SRCROOT}/../LICENSE\" \"${TEMP_DIR}\"\nmkdir \"${TEMP_DIR}/${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\"\ncp -R \"${SRCROOT}/../documentation/docset/Contents\" \"${TEMP_DIR}/${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\"\n\n# build zip\ncd \"${PRODUCTS_DIR}\"\nrm -f \"${FMK_NAME}-iOS-${VERSION_STRING}.zip\"\ncd \"${TEMP_DIR}\"\nzip -yr \"../${FMK_NAME}-iOS-${VERSION_STRING}.zip\" \"./${FMK_NAME}.embeddedframework\" \"./CHANGELOG\" \"./README.md\" \"./LICENSE\" \"./${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\" -x \\*/.*\n\n#copy to output dir on cisimple\nif [ $CISIMPLE ]; then\n if [ ! -d \"${CONFIGURATION_BUILD_DIR}\" ]; then\n mkdir \"${CONFIGURATION_BUILD_DIR}\"\n fi\n cd \"${PRODUCTS_DIR}\"\n cp \"${FMK_NAME}-iOS-${VERSION_STRING}.zip\" \"${CONFIGURATION_BUILD_DIR}/${FMK_NAME}-iOS-${VERSION_STRING}.zip\"\nfi"; + shellScript = "# Sets the target folders and the final framework product.\nFMK_NAME=HockeySDK\nFMK_VERSION=A\nFMK_RESOURCE_BUNDLE=HockeySDKResources\n\n# Documentation\nHOCKEYSDK_DOCSET_VERSION_NAME=\"de.bitstadium.${HOCKEYSDK_DOCSET_NAME}-${VERSION_STRING}\"\n\n# Install dir will be the final output to the framework.\n# The following line create it in the root folder of the current project.\nPRODUCTS_DIR=${SRCROOT}/../Products\nPLCR_DIR=${SRCROOT}/../Vendor/CrashReporter.framework\nZIP_FOLDER=HockeySDK-iOS\nTEMP_DIR=${PRODUCTS_DIR}/${ZIP_FOLDER}\nINSTALL_DIR=${TEMP_DIR}/${FMK_NAME}.framework\n\n# Working dir will be deleted after the framework creation.\nWRK_DIR=build\nDEVICE_DIR=${WRK_DIR}/Release-iphoneos\nSIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator\nHEADERS_DIR=${WRK_DIR}/Release-iphoneos/usr/local/include\n\n# Building both architectures.\nxcodebuild -project \"HockeySDK.xcodeproj\" -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphoneos\nxcodebuild -project \"HockeySDK.xcodeproj\" -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphonesimulator\n\n# Cleaning the oldest.\nif [ -d \"${TEMP_DIR}\" ]\nthen\nrm -rf \"${TEMP_DIR}\"\nfi\n\n# Creates and renews the final product folder.\nmkdir -p \"${INSTALL_DIR}\"\nmkdir -p \"${INSTALL_DIR}/Versions\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources\"\nmkdir -p \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers\"\n\n# Creates the internal links.\n# It MUST uses relative path, otherwise will not work when the folder is copied/moved.\nln -s \"${FMK_VERSION}\" \"${INSTALL_DIR}/Versions/Current\"\nln -s \"Versions/Current/Headers\" \"${INSTALL_DIR}/Headers\"\nln -s \"Versions/Current/Resources\" \"${INSTALL_DIR}/Resources\"\nln -s \"Versions/Current/${FMK_NAME}\" \"${INSTALL_DIR}/${FMK_NAME}\"\n\n# Copies the headers and resources files to the final product folder.\ncp -R \"${SRCROOT}/build/Release-iphoneos/include/HockeySDK/\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/\"\ncp -R \"${PLCR_DIR}/Versions/A/Headers/\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/\"\ncp -R \"${DEVICE_DIR}/${FMK_RESOURCE_BUNDLE}.bundle\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/\"\ncp -f \"${SRCROOT}/${FMK_NAME}.xcconfig\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/\"\n\n# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.\nlipo -create \"${DEVICE_DIR}/lib${FMK_NAME}.a\" \"${SIMULATOR_DIR}/lib${FMK_NAME}.a\" -output \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\"\n\n# Combine the CrashReporter static library into a new Hockey static library file if they are not already present and copy the public headers too\nif [ -z $(otool -L \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" | grep 'libCrashReporter') ]\nthen\nlibtool -static -o \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" \"${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}\" \"${SRCROOT}/../Vendor/CrashReporter.framework/Versions/A/CrashReporter\"\nfi\n\nrm -r \"${WRK_DIR}\"\n\n# build embeddedframework folder and move framework into it\nmkdir \"${INSTALL_DIR}/../${FMK_NAME}.embeddedframework\"\nmv \"${INSTALL_DIR}\" \"${INSTALL_DIR}/../${FMK_NAME}.embeddedframework/${FMK_NAME}.framework\"\n\n# link Resources\nNEW_INSTALL_DIR=${TEMP_DIR}/${FMK_NAME}.embeddedframework\nmkdir \"${NEW_INSTALL_DIR}/Resources\"\nln -s \"../${FMK_NAME}.framework/Resources/${FMK_RESOURCE_BUNDLE}.bundle\" \"${NEW_INSTALL_DIR}/Resources/${FMK_RESOURCE_BUNDLE}.bundle\"\nln -s \"../${FMK_NAME}.framework/Resources/${FMK_NAME}.xcconfig\" \"${NEW_INSTALL_DIR}/Resources/${FMK_NAME}.xcconfig\"\n\n# copy license, changelog, documentation, integration json\ncp -f \"${SRCROOT}/../Docs/Changelog-template.md\" \"${TEMP_DIR}/CHANGELOG\"\ncp -f \"${SRCROOT}/../Docs/Guide-Installation-Setup-template.md\" \"${TEMP_DIR}/README.md\"\ncp -f \"${SRCROOT}/../LICENSE\" \"${TEMP_DIR}\"\nmkdir \"${TEMP_DIR}/${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\"\ncp -R \"${SRCROOT}/../documentation/docset/Contents\" \"${TEMP_DIR}/${HOCKEYSDK_DOCSET_VERSION_NAME}.docset\"\n\n# build zip\ncd \"${PRODUCTS_DIR}\"\nrm -f \"${FMK_NAME}-iOS-${VERSION_STRING}.zip\"\nzip -yr \"${FMK_NAME}-iOS-${VERSION_STRING}.zip\" \"${ZIP_FOLDER}\" -x \\*/.*\n\n#copy to output dir on cisimple\nif [ $CISIMPLE ]; then\n if [ ! -d \"${CONFIGURATION_BUILD_DIR}\" ]; then\n mkdir \"${CONFIGURATION_BUILD_DIR}\"\n fi\n cd \"${PRODUCTS_DIR}\"\n cp \"${FMK_NAME}-iOS-${VERSION_STRING}.zip\" \"${CONFIGURATION_BUILD_DIR}/${FMK_NAME}-iOS-${VERSION_STRING}.zip\"\nfi"; }; 1E8E66B215BC3D8200632A2E /* ShellScript */ = { isa = PBXShellScriptBuildPhase; From 5ff12626af92710d165c0f07c9d7e35d3821f13b Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Tue, 7 Jan 2014 19:20:38 +0100 Subject: [PATCH 50/62] Provide alert option to show mandatory update details The user will then not be able to dismiss to modal presentation and has to install the update from there. --- Classes/BITUpdateManager.m | 15 ++++++++------- Classes/BITUpdateViewController.m | 5 ++++- Classes/BITUpdateViewControllerPrivate.h | 3 ++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Classes/BITUpdateManager.m b/Classes/BITUpdateManager.m index 5332f1d227..6deabd1640 100644 --- a/Classes/BITUpdateManager.m +++ b/Classes/BITUpdateManager.m @@ -513,7 +513,12 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { if ([self isPreiOS7Environment]) self.barStyle = UIBarStyleBlack; - [self showView:[self hockeyViewController:YES]]; + + BITUpdateViewController *updateViewController = [self hockeyViewController:YES]; + if ([self hasNewerMandatoryVersion]) { + [updateViewController setMandatoryUpdate: YES]; + } + [self showView:updateViewController]; } @@ -527,7 +532,7 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { message:[NSString stringWithFormat:BITHockeyLocalizedString(@"UpdateAlertMandatoryTextWithAppVersion"), [self.newestAppVersion nameAndVersionString]] delegate:self cancelButtonTitle:BITHockeyLocalizedString(@"UpdateInstall") - otherButtonTitles:nil + otherButtonTitles:BITHockeyLocalizedString(@"UpdateShow"), nil ]; [alertView setTag:BITUpdateAlertViewTagMandatoryUpdate]; [alertView show]; @@ -1015,11 +1020,7 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { // invoke the selected action from the action sheet for a location element - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { - if ([alertView tag] == BITUpdateAlertViewTagMandatoryUpdate) { - (void)[self initiateAppDownload]; - _updateAlertShowing = NO; - return; - } else if ([alertView tag] == BITUpdateAlertViewTagNeverEndingAlertView) { + if ([alertView tag] == BITUpdateAlertViewTagNeverEndingAlertView) { [self alertFallback:[alertView message]]; return; } diff --git a/Classes/BITUpdateViewController.m b/Classes/BITUpdateViewController.m index 1f0968e5e2..c154247c3e 100644 --- a/Classes/BITUpdateViewController.m +++ b/Classes/BITUpdateViewController.m @@ -364,8 +364,11 @@ } - (void)viewWillAppear:(BOOL)animated { - if (_isAppStoreEnvironment) + if (_isAppStoreEnvironment) { self.appStoreButtonState = AppStoreButtonStateOffline; + } else if (self.mandatoryUpdate) { + self.navigationItem.leftBarButtonItem = nil; + } _updateManager.currentHockeyViewController = self; [super viewWillAppear:animated]; [self redrawTableView]; diff --git a/Classes/BITUpdateViewControllerPrivate.h b/Classes/BITUpdateViewControllerPrivate.h index 26b07244dd..1a078456c7 100644 --- a/Classes/BITUpdateViewControllerPrivate.h +++ b/Classes/BITUpdateViewControllerPrivate.h @@ -69,7 +69,8 @@ typedef NS_ENUM(NSUInteger, AppStoreButtonState) { } @property (nonatomic, weak) BITUpdateManager *updateManager; -@property (nonatomic, readwrite) BOOL modal; + +@property (nonatomic, readwrite) BOOL mandatoryUpdate; @property (nonatomic, assign) AppStoreButtonState appStoreButtonState; From 0bd80c91bea2e78ee00a4a1b23a1550b3dbb058e Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Tue, 7 Jan 2014 21:47:48 +0100 Subject: [PATCH 51/62] Added button to expired page (and alert) that lets the user check for a new version - Added option to disable the option via new `disableUpdateCheckOptionWhenExpired` property --- Classes/BITHockeyBaseManagerPrivate.h | 1 + Classes/BITUpdateManager.h | 18 ++++++ Classes/BITUpdateManager.m | 87 ++++++++++++++++++--------- 3 files changed, 77 insertions(+), 29 deletions(-) diff --git a/Classes/BITHockeyBaseManagerPrivate.h b/Classes/BITHockeyBaseManagerPrivate.h index 23f784a92e..6c557f92f1 100644 --- a/Classes/BITHockeyBaseManagerPrivate.h +++ b/Classes/BITHockeyBaseManagerPrivate.h @@ -48,6 +48,7 @@ - (NSString *)executableUUID; // UI helpers +- (UIWindow *)findVisibleWindow; - (UINavigationController *)customNavigationControllerWithRootViewController:(UIViewController *)viewController presentationStyle:(UIModalPresentationStyle)presentationStyle; - (void)showView:(UIViewController *)viewController; diff --git a/Classes/BITUpdateManager.h b/Classes/BITUpdateManager.h index 6013fe1a4a..959804f1c6 100644 --- a/Classes/BITUpdateManager.h +++ b/Classes/BITUpdateManager.h @@ -200,12 +200,30 @@ typedef NS_ENUM (NSUInteger, BITUpdateSetting) { When running the app from the App Store, this setting is ignored. *Default*: nil + @see disableUpdateCheckOptionWhenExpired @see [BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:] @see [BITUpdateManagerDelegate didDisplayExpiryAlertForUpdateManager:] @warning This only works when using Ad-Hoc provisioning profiles! */ @property (nonatomic, strong) NSDate *expiryDate; +/** + Disable the update check button from expiry screen or alerts + + If do not want your users to be able to check for updates once a version is expired, + then enable this property. + + If this is not enabled, the users will be able to check for updates and install them + if any is available for the current device. + + *Default*: NO + @see expiryDate + @see [BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:] + @see [BITUpdateManagerDelegate didDisplayExpiryAlertForUpdateManager:] + @warning This only works when using Ad-Hoc provisioning profiles! +*/ +@property (nonatomic) BOOL disableUpdateCheckOptionWhenExpired; + ///----------------------------------------------------------------------------- /// @name User Interface diff --git a/Classes/BITUpdateManager.m b/Classes/BITUpdateManager.m index 6deabd1640..71c82a0d81 100644 --- a/Classes/BITUpdateManager.m +++ b/Classes/BITUpdateManager.m @@ -74,6 +74,9 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { NSNumber *_versionID; NSString *_versionUUID; NSString *_uuid; + + NSString *_blockingScreenMessage; + NSDate *_lastUpdateCheckFromBlockingScreen; } @@ -191,7 +194,9 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { if (shouldShowDefaultAlert) { NSString *appName = bit_appName(BITHockeyLocalizedString(@"HockeyAppNamePlaceholder")); - [self showBlockingScreen:[NSString stringWithFormat:BITHockeyLocalizedString(@"UpdateExpired"), appName] image:@"authorize_denied.png"]; + if (!_blockingScreenMessage) + _blockingScreenMessage = [NSString stringWithFormat:BITHockeyLocalizedString(@"UpdateExpired"), appName]; + [self showBlockingScreen:_blockingScreenMessage image:@"authorize_denied.png"]; if (self.delegate != nil && [self.delegate respondsToSelector:@selector(didDisplayExpiryAlertForUpdateManager:)]) { [self.delegate didDisplayExpiryAlertForUpdateManager:self]; @@ -377,29 +382,6 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { [[NSUserDefaults standardUserDefaults] synchronize]; } -#pragma mark - Window Helper - -- (UIWindow *)findVisibleWindow { - UIWindow *visibleWindow = nil; - - // if the rootViewController property (available >= iOS 4.0) of the main window is set, we present the modal view controller on top of the rootViewController - NSArray *windows = [[UIApplication sharedApplication] windows]; - for (UIWindow *window in windows) { - if (!window.hidden && !visibleWindow) { - visibleWindow = window; - } - if ([UIWindow instancesRespondToSelector:@selector(rootViewController)]) { - if ([window rootViewController]) { - visibleWindow = window; - BITHockeyLog(@"INFO: UIWindow with rootViewController found: %@", visibleWindow); - break; - } - } - } - - return visibleWindow; -} - #pragma mark - Init @@ -515,7 +497,7 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { self.barStyle = UIBarStyleBlack; BITUpdateViewController *updateViewController = [self hockeyViewController:YES]; - if ([self hasNewerMandatoryVersion]) { + if ([self hasNewerMandatoryVersion] || [self expiryDateReached]) { [updateViewController setMandatoryUpdate: YES]; } [self showView:updateViewController]; @@ -580,9 +562,19 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { [self.blockingView addSubview:imageView]; } + if (!self.disableUpdateCheckOptionWhenExpired) { + UIButton *checkForUpdateButton = [UIButton buttonWithType:kBITButtonTypeSystem]; + checkForUpdateButton.frame = CGRectMake((frame.size.width - 140) / 2.f, frame.size.height - 100, 140, 25); + [checkForUpdateButton setTitle:BITHockeyLocalizedString(@"UpdateButtonCheck") forState:UIControlStateNormal]; + [checkForUpdateButton addTarget:self + action:@selector(checkForUpdateForExpiredVersion) + forControlEvents:UIControlEventTouchUpInside]; + [self.blockingView addSubview:checkForUpdateButton]; + } + if (message != nil) { frame.origin.x = 20; - frame.origin.y = frame.size.height - 140; + frame.origin.y = frame.size.height - 180; frame.size.width -= 40; frame.size.height = 70; @@ -599,6 +591,16 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { [visibleWindow addSubview:self.blockingView]; } +- (void)checkForUpdateForExpiredVersion { + if (!self.checkInProgress) { + + if (!_lastUpdateCheckFromBlockingScreen || + abs([NSDate timeIntervalSinceReferenceDate] - [_lastUpdateCheckFromBlockingScreen timeIntervalSinceReferenceDate]) > 60) { + _lastUpdateCheckFromBlockingScreen = [NSDate date]; + [self checkForUpdateShowFeedback:NO]; + } + } +} // nag the user with neverending alerts if we cannot find out the window for presenting the covering sheet - (void)alertFallback:(NSString *)message { @@ -608,6 +610,11 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { cancelButtonTitle:BITHockeyLocalizedString(@"HockeyOK") otherButtonTitles:nil ]; + + if (!self.disableUpdateCheckOptionWhenExpired && [message isEqualToString:_blockingScreenMessage]) { + [alertView addButtonWithTitle:BITHockeyLocalizedString(@"UpdateButtonCheck")]; + } + [alertView setTag:BITUpdateAlertViewTagNeverEndingAlertView]; [alertView show]; } @@ -813,7 +820,13 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { self.receivedData = nil; self.urlConnection = nil; self.checkInProgress = NO; - [self reportError:error]; + if ([self expiryDateReached]) { + if (!self.blockingView) { + [self alertFallback:_blockingScreenMessage]; + } + } else { + [self reportError:error]; + } } // api call returned, parsing @@ -910,11 +923,16 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { } _showFeedback = NO; } - } else { + } else if (![self expiryDateReached]) { [self reportError:[NSError errorWithDomain:kBITUpdateErrorDomain code:BITUpdateAPIServerReturnedEmptyResponse userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"Server returned an empty response.", NSLocalizedDescriptionKey, nil]]]; } + + if (!_updateAlertShowing && [self expiryDateReached] && !self.blockingView) { + [self alertFallback:_blockingScreenMessage]; + } + self.receivedData = nil; self.urlConnection = nil; } @@ -1021,17 +1039,28 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { // invoke the selected action from the action sheet for a location element - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { if ([alertView tag] == BITUpdateAlertViewTagNeverEndingAlertView) { - [self alertFallback:[alertView message]]; + if (buttonIndex == 1) { + [self checkForUpdateForExpiredVersion]; + } else { + [self alertFallback:_blockingScreenMessage]; + } return; } _updateAlertShowing = NO; if (buttonIndex == [alertView firstOtherButtonIndex]) { // YES button has been clicked + if (self.blockingView) { + [self.blockingView removeFromSuperview]; + } [self showUpdateView]; } else if (buttonIndex == [alertView firstOtherButtonIndex] + 1) { // YES button has been clicked (void)[self initiateAppDownload]; + } else { + if ([self expiryDateReached] && !self.blockingView) { + [self alertFallback:_blockingScreenMessage]; + } } } From 7608f8253d18794a20dd8d04cd215e0fc7c071c0 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Thu, 9 Jan 2014 15:44:21 +0100 Subject: [PATCH 52/62] Set the tintColor in the auth view and modal views navigation controller on iOS 7 - The authentication controller now sets the buttons tintColor always to the default blue color. This fixes white UIWindow tintColor, since the auth view is using white as background. - Navigation controllers for modal views now also set the tintColor of the navigationBar to the default blue color on iOS 7, if the developer did not set the `navigationBarTintColor`. This fixes white UIWindow tintColor for feedback and beta update modal views as they are defined to use the default style. --- Classes/BITAuthenticationViewController.m | 3 +++ Classes/BITHockeyBaseManager.m | 12 ++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Classes/BITAuthenticationViewController.m b/Classes/BITAuthenticationViewController.m index 789c63e933..28cbf8ce41 100644 --- a/Classes/BITAuthenticationViewController.m +++ b/Classes/BITAuthenticationViewController.m @@ -122,6 +122,9 @@ buttonSize.width, buttonSize.height); button.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; + if ([UIButton instancesRespondToSelector:(NSSelectorFromString(@"setTintColor:"))]) { + [button setTitleColor:BIT_RGBCOLOR(0, 122, 255) forState:UIControlStateNormal]; + } [containerView addSubview:button]; [button addTarget:self action:@selector(handleWebLoginButton:) diff --git a/Classes/BITHockeyBaseManager.m b/Classes/BITHockeyBaseManager.m index a33e66383a..76c9209963 100644 --- a/Classes/BITHockeyBaseManager.m +++ b/Classes/BITHockeyBaseManager.m @@ -196,8 +196,16 @@ - (UINavigationController *)customNavigationControllerWithRootViewController:(UIViewController *)viewController presentationStyle:(UIModalPresentationStyle)modalPresentationStyle { UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; navController.navigationBar.barStyle = self.barStyle; - if (self.navigationBarTintColor) + if (self.navigationBarTintColor) { navController.navigationBar.tintColor = self.navigationBarTintColor; + } else { + // in case of iOS 7 we overwrite the tint color on the navigation bar + if (![self isPreiOS7Environment]) { + if ([UIWindow instancesRespondToSelector:NSSelectorFromString(@"tintColor")]) { + [navController.navigationBar setTintColor:BIT_RGBCOLOR(0, 122, 255)]; + } + } + } navController.modalPresentationStyle = self.modalPresentationStyle; return navController; @@ -205,7 +213,7 @@ - (void)showView:(UIViewController *)viewController { UIViewController *parentViewController = nil; - + if ([[BITHockeyManager sharedHockeyManager].delegate respondsToSelector:@selector(viewControllerForHockeyManager:componentManager:)]) { parentViewController = [[BITHockeyManager sharedHockeyManager].delegate viewControllerForHockeyManager:[BITHockeyManager sharedHockeyManager] componentManager:self]; } From 6a07ee6a602523c5a773e0f89ed8bc3bccd454e4 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Thu, 9 Jan 2014 16:40:07 +0100 Subject: [PATCH 53/62] testIntegration call should also send SDK name and version --- Classes/BITHockeyManager.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Classes/BITHockeyManager.m b/Classes/BITHockeyManager.m index 98e964ed22..d3f8f960e2 100644 --- a/Classes/BITHockeyManager.m +++ b/Classes/BITHockeyManager.m @@ -451,7 +451,9 @@ BITHockeyLog(@"INFO: Sending integration workflow ping to %@", integrationPath); [[self hockeyAppClient] postPath:integrationPath - parameters:@{@"timestamp": timeString} + parameters:@{@"timestamp": timeString, + @"sdk": BITHOCKEY_NAME, + @"sdk_version": BITHOCKEY_VERSION} completion:^(BITHTTPOperation *operation, NSData* responseData, NSError *error) { switch (operation.response.statusCode) { case 400: From a0bfdfbaecbf39171b9336e842f65bdaad516a97 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Fri, 10 Jan 2014 02:27:51 +0100 Subject: [PATCH 54/62] Issue #85: Replace kNilOptions with 0 Thanks to Jonathan! --- Classes/BITFeedbackManager.m | 2 +- Classes/BITStoreUpdateManager.m | 2 +- Classes/BITUpdateManager.m | 2 +- Support/HockeySDKTests/BITAuthenticatorTests.m | 2 +- Support/HockeySDKTests/BITHockeyAppClientTests.m | 2 +- Support/HockeySDKTests/BITStoreUpdateManagerTests.m | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Classes/BITFeedbackManager.m b/Classes/BITFeedbackManager.m index 72698086f8..d6fa05bf75 100644 --- a/Classes/BITFeedbackManager.m +++ b/Classes/BITFeedbackManager.m @@ -881,7 +881,7 @@ if (responseString && [responseString dataUsingEncoding:NSUTF8StringEncoding]) { NSError *error = NULL; - NSDictionary *feedDict = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:[responseString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error]; + NSDictionary *feedDict = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:[responseString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error]; // server returned empty response? if (error) { diff --git a/Classes/BITStoreUpdateManager.m b/Classes/BITStoreUpdateManager.m index 2d14ccbc65..c6b2247ca5 100644 --- a/Classes/BITStoreUpdateManager.m +++ b/Classes/BITStoreUpdateManager.m @@ -273,7 +273,7 @@ NSData *data = [responseString dataUsingEncoding:NSUTF8StringEncoding]; NSError *error = nil; - NSDictionary *json = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; + NSDictionary *json = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if (error) { BITHockeyLog(@"ERROR: Invalid JSON string. %@", [error localizedDescription]); diff --git a/Classes/BITUpdateManager.m b/Classes/BITUpdateManager.m index 71c82a0d81..c8ff8cd34a 100644 --- a/Classes/BITUpdateManager.m +++ b/Classes/BITUpdateManager.m @@ -844,7 +844,7 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { } NSError *error = nil; - NSDictionary *json = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:[responseString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error]; + NSDictionary *json = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:[responseString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error]; self.trackerConfig = (([self checkForTracker] && [[json valueForKey:@"tracker"] isKindOfClass:[NSDictionary class]]) ? [json valueForKey:@"tracker"] : nil); self.companyName = (([[json valueForKey:@"company"] isKindOfClass:[NSString class]]) ? [json valueForKey:@"company"] : nil); diff --git a/Support/HockeySDKTests/BITAuthenticatorTests.m b/Support/HockeySDKTests/BITAuthenticatorTests.m index 96ea679369..023d7302fd 100644 --- a/Support/HockeySDKTests/BITAuthenticatorTests.m +++ b/Support/HockeySDKTests/BITAuthenticatorTests.m @@ -77,7 +77,7 @@ static void *kInstallationIdentification = &kInstallationIdentification; NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; NSError *error = nil; - NSDictionary *json = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; + NSDictionary *json = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; return json; } diff --git a/Support/HockeySDKTests/BITHockeyAppClientTests.m b/Support/HockeySDKTests/BITHockeyAppClientTests.m index d009de2c00..41a63aac04 100644 --- a/Support/HockeySDKTests/BITHockeyAppClientTests.m +++ b/Support/HockeySDKTests/BITHockeyAppClientTests.m @@ -50,7 +50,7 @@ NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; NSError *error = nil; - NSDictionary *json = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; + NSDictionary *json = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; return json; } diff --git a/Support/HockeySDKTests/BITStoreUpdateManagerTests.m b/Support/HockeySDKTests/BITStoreUpdateManagerTests.m index 1efceca31a..ffff07bfed 100644 --- a/Support/HockeySDKTests/BITStoreUpdateManagerTests.m +++ b/Support/HockeySDKTests/BITStoreUpdateManagerTests.m @@ -61,7 +61,7 @@ NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; NSError *error = nil; - NSDictionary *json = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; + NSDictionary *json = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; return json; } From 0b01f8e897b632d125a16a94972decdbac9ca141 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Fri, 10 Jan 2014 14:52:56 +0100 Subject: [PATCH 55/62] Add apps CFBundleVersion to the testIdentifier call --- Classes/BITHockeyManager.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Classes/BITHockeyManager.m b/Classes/BITHockeyManager.m index d3f8f960e2..5b752435fd 100644 --- a/Classes/BITHockeyManager.m +++ b/Classes/BITHockeyManager.m @@ -453,7 +453,9 @@ [[self hockeyAppClient] postPath:integrationPath parameters:@{@"timestamp": timeString, @"sdk": BITHOCKEY_NAME, - @"sdk_version": BITHOCKEY_VERSION} + @"sdk_version": BITHOCKEY_VERSION, + @"bundle_version": [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"] + } completion:^(BITHTTPOperation *operation, NSData* responseData, NSError *error) { switch (operation.response.statusCode) { case 400: From d5a6553357de83143ac4e8d34d8f72835fe49dc2 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Fri, 10 Jan 2014 19:36:57 +0100 Subject: [PATCH 56/62] Make sure the authentication window is always correctly dismissed If there would not be any rootViewController (which iOS now requires though), it could happen that the auth window would not disappear upon successful authentication. The app would have had to be killed and started again to proceed. --- Classes/BITAuthenticator.m | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/Classes/BITAuthenticator.m b/Classes/BITAuthenticator.m index aa41b63c1f..be5e38fe2f 100644 --- a/Classes/BITAuthenticator.m +++ b/Classes/BITAuthenticator.m @@ -84,6 +84,23 @@ static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; } #pragma mark - +- (void)dismissAuthenticationControllerAnimated:(BOOL)animated completion:(void (^)(void))completion { + if (!_authenticationController) return; + + UIViewController *presentingViewController = [_authenticationController presentingViewController]; + + // If there is no presenting view controller just remove view + if (presentingViewController) { + [_authenticationController dismissViewControllerAnimated:animated completion:completion]; + } else { + [_authenticationController.navigationController.view removeFromSuperview]; + if (completion) { + completion(); + } + } + _authenticationController = nil; +} + - (void)authenticateInstallation { //disabled in the appStore if([self isAppStoreEnvironment]) return; @@ -112,8 +129,7 @@ static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; if([self needsValidation]) { [self validate]; } else { - [_authenticationController dismissViewControllerAnimated:YES completion:nil]; - _authenticationController = nil; + [self dismissAuthenticationControllerAnimated:YES completion:nil]; } } else { BITHockeyLog(@"Failed to identify. Error: %@", error); @@ -222,8 +238,7 @@ static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; - (void) validate { [self validateWithCompletion:^(BOOL validated, NSError *error) { if(validated) { - [_authenticationController dismissViewControllerAnimated:YES completion:nil]; - _authenticationController = nil; + [self dismissAuthenticationControllerAnimated:YES completion:nil]; } else { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:error.localizedDescription @@ -380,8 +395,7 @@ static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; if(authToken) { identified = YES; [strongSelf storeInstallationIdentifier:authToken withType:strongSelf.identificationType]; - [strongSelf->_authenticationController dismissViewControllerAnimated:YES - completion:nil]; + [strongSelf dismissAuthenticationControllerAnimated:YES completion:nil]; strongSelf->_authenticationController = nil; [self addStringValueToKeychain:email forKey:kBITAuthenticatorUserEmailKey]; } else { @@ -579,8 +593,7 @@ static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; if(installationIdentifier){ if(NO == self.restrictApplicationUsage) { - [_authenticationController dismissViewControllerAnimated:YES completion:nil]; - _authenticationController = nil; + [self dismissAuthenticationControllerAnimated:YES completion:nil]; } [self storeInstallationIdentifier:installationIdentifier withType:self.identificationType]; self.identified = YES; From dde368a95221798707305bdf423e62cf499287c5 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Fri, 10 Jan 2014 19:47:50 +0100 Subject: [PATCH 57/62] Show an alert if the authentication token could not be stored into the keychain If this occurs, the user has to authenticate every time the app starts or even when the app comes into foreground, depending on the `restrictionEnforcementFrequency` setting --- Classes/BITAuthenticator.m | 38 ++++++++++++++++++----- Resources/de.lproj/HockeySDK.strings | 3 ++ Resources/en.lproj/HockeySDK.strings | 2 ++ Resources/es.lproj/HockeySDK.strings | 3 ++ Resources/fr.lproj/HockeySDK.strings | 3 ++ Resources/hr.lproj/HockeySDK.strings | 3 ++ Resources/hu.lproj/HockeySDK.strings | 3 ++ Resources/it.lproj/HockeySDK.strings | 3 ++ Resources/ja.lproj/HockeySDK.strings | 3 ++ Resources/nl.lproj/HockeySDK.strings | 3 ++ Resources/pt-PT.lproj/HockeySDK.strings | 3 ++ Resources/pt.lproj/HockeySDK.strings | 3 ++ Resources/ro.lproj/HockeySDK.strings | 3 ++ Resources/ru.lproj/HockeySDK.strings | 3 ++ Resources/zh-Hans.lproj/HockeySDK.strings | 3 ++ 15 files changed, 71 insertions(+), 8 deletions(-) diff --git a/Classes/BITAuthenticator.m b/Classes/BITAuthenticator.m index be5e38fe2f..eebbdb26f6 100644 --- a/Classes/BITAuthenticator.m +++ b/Classes/BITAuthenticator.m @@ -153,6 +153,17 @@ static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; } return NO; } + +- (void)alertOnFailureStoringTokenInKeychain { + UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil + message:BITHockeyLocalizedString(@"HockeyAuthenticationViewControllerStorageError") + delegate:self + cancelButtonTitle:BITHockeyLocalizedString(@"HockeyOK") + otherButtonTitles:nil]; + [alertView setTag:1]; + [alertView show]; +} + - (void) identifyWithCompletion:(void (^)(BOOL identified, NSError *))completion { if(_authenticationController) { BITHockeyLog(@"Authentication controller already visible. Ingoring identify request"); @@ -245,6 +256,7 @@ static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; delegate:self cancelButtonTitle:BITHockeyLocalizedString(@"HockeyOK") otherButtonTitles:nil]; + [alertView setTag:0]; [alertView show]; } }]; @@ -397,7 +409,10 @@ static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; [strongSelf storeInstallationIdentifier:authToken withType:strongSelf.identificationType]; [strongSelf dismissAuthenticationControllerAnimated:YES completion:nil]; strongSelf->_authenticationController = nil; - [self addStringValueToKeychain:email forKey:kBITAuthenticatorUserEmailKey]; + BOOL success = [self addStringValueToKeychain:email forKey:kBITAuthenticatorUserEmailKey]; + if (!success) { + [strongSelf alertOnFailureStoringTokenInKeychain]; + } } else { identified = NO; } @@ -572,7 +587,10 @@ static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; NSString *email = nil; [self.class email:&email andIUID:&installationIdentifier fromOpenURL:url]; if(email) { - [self addStringValueToKeychain:email forKey:kBITAuthenticatorUserEmailKey]; + BOOL success = [self addStringValueToKeychain:email forKey:kBITAuthenticatorUserEmailKey]; + if (!success) { + [self alertOnFailureStoringTokenInKeychain]; + } } else { BITHockeyLog(@"No email found in URL: %@", url); } @@ -767,13 +785,15 @@ static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; [self removeKeyFromKeychain:kBITAuthenticatorIdentifierKey]; [self removeKeyFromKeychain:kBITAuthenticatorIdentifierTypeKey]; } else { - BOOL success = [self addStringValueToKeychainForThisDeviceOnly:installationIdentifier + BOOL success1 = [self addStringValueToKeychainForThisDeviceOnly:installationIdentifier forKey:kBITAuthenticatorIdentifierKey]; - NSParameterAssert(success); - success = [self addStringValueToKeychainForThisDeviceOnly:[self.class stringForIdentificationType:type] + NSParameterAssert(success1); + BOOL success2 = [self addStringValueToKeychainForThisDeviceOnly:[self.class stringForIdentificationType:type] forKey:kBITAuthenticatorIdentifierTypeKey]; - NSParameterAssert(success); -#pragma unused(success) + NSParameterAssert(success2); + if (!success1 || !success2) { + [self alertOnFailureStoringTokenInKeychain]; + } } } @@ -851,6 +871,8 @@ static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; #pragma mark - UIAlertViewDelegate - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { - [self validate]; + if (alertView.tag == 0) { + [self validate]; + } } @end diff --git a/Resources/de.lproj/HockeySDK.strings b/Resources/de.lproj/HockeySDK.strings index 8529703ebb..8a4b45b734 100644 --- a/Resources/de.lproj/HockeySDK.strings +++ b/Resources/de.lproj/HockeySDK.strings @@ -257,6 +257,9 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "Die Autorisierung ist fehlgeschlagen, da Ihr Gerät anscheinend nicht mit dem Internet verbunden ist. Bitte erneut versuchen."; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; + "HockeyAuthenticationFailedAuthenticate" = "Autorisierung fehlgeschlagen. Bitte erneut versuchen oder an den Entwickler dieser App wenden."; "HockeyAuthenticationNotMember" = "Sie sind nicht berechtigt, diese App zu nutzen. Bitte wenden Sie sich an den Entwickler dieser App."; diff --git a/Resources/en.lproj/HockeySDK.strings b/Resources/en.lproj/HockeySDK.strings index c6e2ac4bc8..25229c843d 100644 --- a/Resources/en.lproj/HockeySDK.strings +++ b/Resources/en.lproj/HockeySDK.strings @@ -257,6 +257,8 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "Failed to authorize because your device appears to be disconnected from the Internet. Please try again."; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; "HockeyAuthenticationFailedAuthenticate" = "Failed to authorize. Please try again or contact the developer of this app."; "HockeyAuthenticationNotMember" = "You are not authorized to use this app. Please contact the developer of this app."; diff --git a/Resources/es.lproj/HockeySDK.strings b/Resources/es.lproj/HockeySDK.strings index a3551572f8..514fd282f8 100644 --- a/Resources/es.lproj/HockeySDK.strings +++ b/Resources/es.lproj/HockeySDK.strings @@ -257,6 +257,9 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "No se ha podido realizar la autorización porque su dispositivo parece no estar conectado a Internet. Vuelva a intentarlo."; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; + "HockeyAuthenticationFailedAuthenticate" = "Error de autorización. Vuelva a intentarlo o póngase en contacto con el desarrollador de la app."; "HockeyAuthenticationNotMember" = "No tiene autorización para usar esta app. Póngase en contacto con el desarrollador de la app."; diff --git a/Resources/fr.lproj/HockeySDK.strings b/Resources/fr.lproj/HockeySDK.strings index 9677af296a..a231bf4f4d 100644 --- a/Resources/fr.lproj/HockeySDK.strings +++ b/Resources/fr.lproj/HockeySDK.strings @@ -257,6 +257,9 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "Échec de l'autorisation. Votre appareil semble déconnecté d'Internet. Réessayez."; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; + "HockeyAuthenticationFailedAuthenticate" = "Échec de l'autorisation. Réessayez ou contactez le développeur de l'application."; "HockeyAuthenticationNotMember" = "Vous n'êtes pas autorisé à utiliser cette application. Contactez le développeur de l'application."; diff --git a/Resources/hr.lproj/HockeySDK.strings b/Resources/hr.lproj/HockeySDK.strings index 1b9d07ddca..9f5a7520c8 100644 --- a/Resources/hr.lproj/HockeySDK.strings +++ b/Resources/hr.lproj/HockeySDK.strings @@ -257,6 +257,9 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "Autorizacija nije uspjela. Vaš uređaj nema pristup internetu. Molimo Vas pokušajte iznova."; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; + "HockeyAuthenticationFailedAuthenticate" = "Autorizacija nije uspjela. Molimo Vas pokušajte iznova ili kontaktirajte razvojnog programera ove aplikacije."; "HockeyAuthenticationNotMember" = "Vi niste autorizirani za korištenje ove aplikacije. Molimo Vas kontaktirajte razvojnog programera ove aplikacije."; diff --git a/Resources/hu.lproj/HockeySDK.strings b/Resources/hu.lproj/HockeySDK.strings index 88eaa7a5b7..7ecaea350b 100644 --- a/Resources/hu.lproj/HockeySDK.strings +++ b/Resources/hu.lproj/HockeySDK.strings @@ -257,6 +257,9 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "A hitelesítés sikertelen, mert készüléke nem csatlakozik az internethez. Kérjük, próbálja meg később újra."; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; + "HockeyAuthenticationFailedAuthenticate" = "A hitelesítés sikertelen. Kérjük, próbálja meg később újra vagy lépjen kapcsolatba az alkalmazás fejlesztőjével."; "HockeyAuthenticationNotMember" = "Nem jogosult az alkalmazás használatára. Kérjük, lépjen kapcsolatba az alkalmazás fejlesztőjével."; diff --git a/Resources/it.lproj/HockeySDK.strings b/Resources/it.lproj/HockeySDK.strings index 1a125239a4..75753bab84 100644 --- a/Resources/it.lproj/HockeySDK.strings +++ b/Resources/it.lproj/HockeySDK.strings @@ -257,6 +257,9 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "Autorizzazione non riuscita. Pare che il dispositivo non sia connesso a Internet. Riprova."; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; + "HockeyAuthenticationFailedAuthenticate" = "Autorizzazione non riuscita. Riprova o contatta lo sviluppatore di questa app."; "HockeyAuthenticationNotMember" = "Non sei autorizzato a usare questa app. Contatta lo sviluppatore di questa app."; diff --git a/Resources/ja.lproj/HockeySDK.strings b/Resources/ja.lproj/HockeySDK.strings index 865df99f3b..4532f8a583 100644 --- a/Resources/ja.lproj/HockeySDK.strings +++ b/Resources/ja.lproj/HockeySDK.strings @@ -257,6 +257,9 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "デバイスがインターネットに接続されていないため、認証できません。やり直してください。"; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; + "HockeyAuthenticationFailedAuthenticate" = "認証できませんでした。やり直すか、このAppのデベロッパに連絡してください。"; "HockeyAuthenticationNotMember" = "このAppの使用を認証されていません。このAppのデベロッパに連絡してください。"; diff --git a/Resources/nl.lproj/HockeySDK.strings b/Resources/nl.lproj/HockeySDK.strings index cd2b2336c7..0d37d47206 100755 --- a/Resources/nl.lproj/HockeySDK.strings +++ b/Resources/nl.lproj/HockeySDK.strings @@ -257,6 +257,9 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "Identiteitscontrole mislukt omdat uw apparaat niet is verbonden met het internet. Probeer opnieuw."; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; + "HockeyAuthenticationFailedAuthenticate" = "Identiteitscontrole mislukt. Probeer opnieuw of neem contact op met de ontwikkelaar van deze app."; "HockeyAuthenticationNotMember" = "U bent niet gemachtigd om deze app te gebruiken. Neem contact op met de ontwikkelaar van deze app."; diff --git a/Resources/pt-PT.lproj/HockeySDK.strings b/Resources/pt-PT.lproj/HockeySDK.strings index 2273ca2267..70928c4dcb 100644 --- a/Resources/pt-PT.lproj/HockeySDK.strings +++ b/Resources/pt-PT.lproj/HockeySDK.strings @@ -257,6 +257,9 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "Falha ao autorizar porque provavelmente o dispositivo não tem ligação à Internet. Tente novamente."; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; + "HockeyAuthenticationFailedAuthenticate" = "Falha ao autorizar. Tente novamente ou contacte o programador desta aplicação."; "HockeyAuthenticationNotMember" = "Não está autorizado a utilizar esta aplicação. Contacte o programador desta aplicação."; diff --git a/Resources/pt.lproj/HockeySDK.strings b/Resources/pt.lproj/HockeySDK.strings index b4ff7f97e5..1e09c89615 100644 --- a/Resources/pt.lproj/HockeySDK.strings +++ b/Resources/pt.lproj/HockeySDK.strings @@ -257,6 +257,9 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "Não foi possível autorizar porque seu dispositivo parece estar desconectado da Internet. Tente novamente."; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; + "HockeyAuthenticationFailedAuthenticate" = "Falha ao autorizar. Tente novamente ou contate o desenvolvedor deste aplicativo."; "HockeyAuthenticationNotMember" = "Você não tem autorização para usar este aplicativo. Contate o desenvolvedor deste aplicativo."; diff --git a/Resources/ro.lproj/HockeySDK.strings b/Resources/ro.lproj/HockeySDK.strings index aae2a983bc..6c0225cf8d 100755 --- a/Resources/ro.lproj/HockeySDK.strings +++ b/Resources/ro.lproj/HockeySDK.strings @@ -257,6 +257,9 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "Failed to authorize because your device appears to be disconnected from the Internet. Please try again."; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; + "HockeyAuthenticationFailedAuthenticate" = "Failed to authorize. Please try again or contact the developer of this app."; "HockeyAuthenticationNotMember" = "You are not authorized to use this app. Please contact the developer of this app."; diff --git a/Resources/ru.lproj/HockeySDK.strings b/Resources/ru.lproj/HockeySDK.strings index e0ca880402..da77e3f87b 100644 --- a/Resources/ru.lproj/HockeySDK.strings +++ b/Resources/ru.lproj/HockeySDK.strings @@ -257,6 +257,9 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "Не удалось авторизоваться, так как ваше устройство не подключено к интернету. Попробуйте еще раз "; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; + "HockeyAuthenticationFailedAuthenticate" = "Авторизация не удалась. Попробуйте еще раз или свяжитесь с разработчиком приложения."; "HockeyAuthenticationNotMember" = "У вас нет разрешения использовать это приложение. Обратитесь к разработчику приложения."; diff --git a/Resources/zh-Hans.lproj/HockeySDK.strings b/Resources/zh-Hans.lproj/HockeySDK.strings index daaa3aa17c..fc8859be3c 100644 --- a/Resources/zh-Hans.lproj/HockeySDK.strings +++ b/Resources/zh-Hans.lproj/HockeySDK.strings @@ -257,6 +257,9 @@ /* Error presented to the user if authentication failed because of networking issues */ "HockeyAuthenticationViewControllerNetworkError" = "你设备的 Internet 连接似乎已断开,导致授权失败。请再试一次。"; +/* Error presented to the user if authentication could not be stored on the device */ +"HockeyAuthenticationViewControllerStorageError" = "Your authentication token could not be stored due to a keychain error. Please contact the developer of the app."; + "HockeyAuthenticationFailedAuthenticate" = "授权错误。请再试一次或联系这个 app 的开发人员。"; "HockeyAuthenticationNotMember" = "你未获授权使用这个程序。请联系这个 app 的开发人员。"; From 0712b8fa63fbc804f1ec9714d551c993d94a7150 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Sun, 12 Jan 2014 19:15:28 +0100 Subject: [PATCH 58/62] Use the correct User-Agent name when sending crash reports --- Classes/BITCrashManager.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/BITCrashManager.m b/Classes/BITCrashManager.m index 5c4c182b24..48b6814e28 100644 --- a/Classes/BITCrashManager.m +++ b/Classes/BITCrashManager.m @@ -909,7 +909,7 @@ NSString *const kBITCrashManagerStatus = @"BITCrashManagerStatus"; ]]; [request setCachePolicy: NSURLRequestReloadIgnoringLocalCacheData]; - [request setValue:@"Quincy/iOS" forHTTPHeaderField:@"User-Agent"]; + [request setValue:@"HockeySDK/iOS" forHTTPHeaderField:@"User-Agent"]; [request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"]; [request setTimeoutInterval: 15]; [request setHTTPMethod:@"POST"]; From 235f7ac9fec2fbc00c4dfbea114eb40de10e5c25 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Sun, 12 Jan 2014 19:25:22 +0100 Subject: [PATCH 59/62] Updated copyright for 2014 --- Classes/BITAppStoreHeader.h | 2 +- Classes/BITAppStoreHeader.m | 2 +- Classes/BITAppVersionMetaInfo.h | 2 +- Classes/BITAppVersionMetaInfo.m | 2 +- Classes/BITAuthenticationViewController.h | 2 +- Classes/BITAuthenticationViewController.m | 2 +- Classes/BITAuthenticator.h | 2 +- Classes/BITAuthenticator.m | 2 +- Classes/BITAuthenticator_Private.h | 5 +-- Classes/BITCrashManager.h | 2 +- Classes/BITCrashManager.m | 2 +- Classes/BITCrashManagerDelegate.h | 2 +- Classes/BITCrashManagerPrivate.h | 2 +- Classes/BITCrashReportTextFormatter.h | 2 +- Classes/BITCrashReportTextFormatter.m | 2 +- Classes/BITFeedbackActivity.h | 34 +++++++++++++++---- Classes/BITFeedbackActivity.m | 34 +++++++++++++++---- Classes/BITFeedbackComposeViewController.h | 2 +- Classes/BITFeedbackComposeViewController.m | 2 +- ...BITFeedbackComposeViewControllerDelegate.h | 34 +++++++++++++++---- Classes/BITFeedbackListViewCell.h | 2 +- Classes/BITFeedbackListViewCell.m | 2 +- Classes/BITFeedbackListViewController.h | 2 +- Classes/BITFeedbackListViewController.m | 2 +- Classes/BITFeedbackManager.h | 2 +- Classes/BITFeedbackManager.m | 2 +- Classes/BITFeedbackManagerDelegate.h | 34 +++++++++++++++---- Classes/BITFeedbackManagerPrivate.h | 2 +- Classes/BITFeedbackMessage.h | 2 +- Classes/BITFeedbackMessage.m | 2 +- Classes/BITFeedbackUserDataViewController.h | 2 +- Classes/BITFeedbackUserDataViewController.m | 2 +- Classes/BITHTTPOperation.h | 2 +- Classes/BITHTTPOperation.m | 2 +- Classes/BITHockeyAppClient.h | 2 +- Classes/BITHockeyAppClient.m | 2 +- Classes/BITHockeyBaseManager.h | 2 +- Classes/BITHockeyBaseManager.m | 2 +- Classes/BITHockeyBaseManagerPrivate.h | 34 +++++++++++++++---- Classes/BITHockeyBaseViewController.h | 34 +++++++++++++++---- Classes/BITHockeyBaseViewController.m | 34 +++++++++++++++---- Classes/BITHockeyHelper.h | 2 +- Classes/BITHockeyHelper.m | 2 +- Classes/BITHockeyManager.h | 2 +- Classes/BITHockeyManager.m | 2 +- Classes/BITHockeyManagerDelegate.h | 2 +- Classes/BITStoreButton.h | 2 +- Classes/BITStoreButton.m | 2 +- Classes/BITStoreUpdateManager.h | 2 +- Classes/BITStoreUpdateManager.m | 2 +- Classes/BITStoreUpdateManagerDelegate.h | 2 +- Classes/BITStoreUpdateManagerPrivate.h | 2 +- Classes/BITUpdateManager.h | 2 +- Classes/BITUpdateManager.m | 2 +- Classes/BITUpdateManagerDelegate.h | 2 +- Classes/BITUpdateManagerPrivate.h | 2 +- Classes/BITUpdateViewController.h | 2 +- Classes/BITUpdateViewController.m | 2 +- Classes/BITUpdateViewControllerPrivate.h | 2 +- Classes/BITWebTableViewCell.h | 2 +- Classes/BITWebTableViewCell.m | 2 +- Classes/HockeySDK.h | 2 +- Classes/HockeySDKFeatureConfig.h | 2 +- Classes/HockeySDKPrivate.m | 2 +- LICENSE | 6 ++-- 65 files changed, 249 insertions(+), 112 deletions(-) diff --git a/Classes/BITAppStoreHeader.h b/Classes/BITAppStoreHeader.h index e1ad092bc2..b08ada493c 100644 --- a/Classes/BITAppStoreHeader.h +++ b/Classes/BITAppStoreHeader.h @@ -2,7 +2,7 @@ * Author: Andreas Linde * Peter Steinberger * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011-2012 Peter Steinberger. * All rights reserved. * diff --git a/Classes/BITAppStoreHeader.m b/Classes/BITAppStoreHeader.m index 7c7d667548..08a48cc0bf 100644 --- a/Classes/BITAppStoreHeader.m +++ b/Classes/BITAppStoreHeader.m @@ -2,7 +2,7 @@ * Author: Andreas Linde * Peter Steinberger * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011-2012 Peter Steinberger. * All rights reserved. * diff --git a/Classes/BITAppVersionMetaInfo.h b/Classes/BITAppVersionMetaInfo.h index 8b86fe7375..2143e02a72 100644 --- a/Classes/BITAppVersionMetaInfo.h +++ b/Classes/BITAppVersionMetaInfo.h @@ -2,7 +2,7 @@ * Author: Peter Steinberger * Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde, Peter Steinberger. * All rights reserved. * diff --git a/Classes/BITAppVersionMetaInfo.m b/Classes/BITAppVersionMetaInfo.m index 804dc9aa60..1689ac99f1 100644 --- a/Classes/BITAppVersionMetaInfo.m +++ b/Classes/BITAppVersionMetaInfo.m @@ -2,7 +2,7 @@ * Author: Peter Steinberger * Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde, Peter Steinberger. * All rights reserved. * diff --git a/Classes/BITAuthenticationViewController.h b/Classes/BITAuthenticationViewController.h index ef11f01dda..784701e2c1 100644 --- a/Classes/BITAuthenticationViewController.h +++ b/Classes/BITAuthenticationViewController.h @@ -1,7 +1,7 @@ /* * Author: Stephan Diederich * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITAuthenticationViewController.m b/Classes/BITAuthenticationViewController.m index 28cbf8ce41..84937016c6 100644 --- a/Classes/BITAuthenticationViewController.m +++ b/Classes/BITAuthenticationViewController.m @@ -1,7 +1,7 @@ /* * Author: Stephan Diederich * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITAuthenticator.h b/Classes/BITAuthenticator.h index 784ba5e7ac..240e415a28 100644 --- a/Classes/BITAuthenticator.h +++ b/Classes/BITAuthenticator.h @@ -1,7 +1,7 @@ /* * Author: Stephan Diederich, Andreas Linde * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITAuthenticator.m b/Classes/BITAuthenticator.m index eebbdb26f6..a171af2ab1 100644 --- a/Classes/BITAuthenticator.m +++ b/Classes/BITAuthenticator.m @@ -1,7 +1,7 @@ /* * Author: Stephan Diederich * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITAuthenticator_Private.h b/Classes/BITAuthenticator_Private.h index 86064cc836..2836b92b5d 100644 --- a/Classes/BITAuthenticator_Private.h +++ b/Classes/BITAuthenticator_Private.h @@ -1,10 +1,7 @@ -// -// BITAuthenticator_Private.h -// HockeySDK /* * Author: Stephan Diederich * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITCrashManager.h b/Classes/BITCrashManager.h index 9689d380a5..c93ac7f675 100644 --- a/Classes/BITCrashManager.h +++ b/Classes/BITCrashManager.h @@ -2,7 +2,7 @@ * Author: Andreas Linde * Kent Sutherland * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde & Kent Sutherland. * All rights reserved. * diff --git a/Classes/BITCrashManager.m b/Classes/BITCrashManager.m index 48b6814e28..a0e7e64422 100644 --- a/Classes/BITCrashManager.m +++ b/Classes/BITCrashManager.m @@ -2,7 +2,7 @@ * Author: Andreas Linde * Kent Sutherland * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde & Kent Sutherland. * All rights reserved. * diff --git a/Classes/BITCrashManagerDelegate.h b/Classes/BITCrashManagerDelegate.h index fb3e88f5ca..e2792b5ce4 100644 --- a/Classes/BITCrashManagerDelegate.h +++ b/Classes/BITCrashManagerDelegate.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITCrashManagerPrivate.h b/Classes/BITCrashManagerPrivate.h index f1963926a0..f2231342f4 100644 --- a/Classes/BITCrashManagerPrivate.h +++ b/Classes/BITCrashManagerPrivate.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITCrashReportTextFormatter.h b/Classes/BITCrashReportTextFormatter.h index 786cd2d975..13ab19f964 100644 --- a/Classes/BITCrashReportTextFormatter.h +++ b/Classes/BITCrashReportTextFormatter.h @@ -6,7 +6,7 @@ * * Copyright (c) 2008-2013 Plausible Labs Cooperative, Inc. * Copyright (c) 2010 MOSO Corporation, Pty Ltd. - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITCrashReportTextFormatter.m b/Classes/BITCrashReportTextFormatter.m index 0816ee4f87..6094affc23 100644 --- a/Classes/BITCrashReportTextFormatter.m +++ b/Classes/BITCrashReportTextFormatter.m @@ -6,7 +6,7 @@ * * Copyright (c) 2008-2013 Plausible Labs Cooperative, Inc. * Copyright (c) 2010 MOSO Corporation, Pty Ltd. - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITFeedbackActivity.h b/Classes/BITFeedbackActivity.h index d801529f45..f9289c8df0 100644 --- a/Classes/BITFeedbackActivity.h +++ b/Classes/BITFeedbackActivity.h @@ -1,10 +1,30 @@ -// -// BITFeedbackActivity.h -// HockeySDK -// -// Created by Andreas Linde on 15.10.12. -// -// +/* + * Author: Andreas Linde + * + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ #import diff --git a/Classes/BITFeedbackActivity.m b/Classes/BITFeedbackActivity.m index e3f78ef74d..814dc0c63f 100644 --- a/Classes/BITFeedbackActivity.m +++ b/Classes/BITFeedbackActivity.m @@ -1,10 +1,30 @@ -// -// BITFeedbackActivity.m -// HockeySDK -// -// Created by Andreas Linde on 15.10.12. -// -// +/* + * Author: Andreas Linde + * + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ #import "HockeySDK.h" diff --git a/Classes/BITFeedbackComposeViewController.h b/Classes/BITFeedbackComposeViewController.h index 1fce15b42e..488e3004e6 100644 --- a/Classes/BITFeedbackComposeViewController.h +++ b/Classes/BITFeedbackComposeViewController.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITFeedbackComposeViewController.m b/Classes/BITFeedbackComposeViewController.m index e2759be7c6..c4eda0230c 100644 --- a/Classes/BITFeedbackComposeViewController.m +++ b/Classes/BITFeedbackComposeViewController.m @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITFeedbackComposeViewControllerDelegate.h b/Classes/BITFeedbackComposeViewControllerDelegate.h index ab6f2aba9a..58438d4fef 100644 --- a/Classes/BITFeedbackComposeViewControllerDelegate.h +++ b/Classes/BITFeedbackComposeViewControllerDelegate.h @@ -1,10 +1,30 @@ -// -// BITFeedbackComposeViewControllerDelegate.h -// HockeySDK -// -// Created by Andreas Linde on 15.10.12. -// -// +/* + * Author: Andreas Linde + * + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ #import diff --git a/Classes/BITFeedbackListViewCell.h b/Classes/BITFeedbackListViewCell.h index 61d8394543..1a71800af1 100644 --- a/Classes/BITFeedbackListViewCell.h +++ b/Classes/BITFeedbackListViewCell.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITFeedbackListViewCell.m b/Classes/BITFeedbackListViewCell.m index 759128926d..8c8e90bddb 100644 --- a/Classes/BITFeedbackListViewCell.m +++ b/Classes/BITFeedbackListViewCell.m @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITFeedbackListViewController.h b/Classes/BITFeedbackListViewController.h index 07b401d2c6..0a513904cf 100644 --- a/Classes/BITFeedbackListViewController.h +++ b/Classes/BITFeedbackListViewController.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITFeedbackListViewController.m b/Classes/BITFeedbackListViewController.m index 0b2e6b226b..633fca095b 100644 --- a/Classes/BITFeedbackListViewController.m +++ b/Classes/BITFeedbackListViewController.m @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITFeedbackManager.h b/Classes/BITFeedbackManager.h index 4c96ec1c4b..46b47494a0 100644 --- a/Classes/BITFeedbackManager.h +++ b/Classes/BITFeedbackManager.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITFeedbackManager.m b/Classes/BITFeedbackManager.m index d6fa05bf75..685cdc74cf 100644 --- a/Classes/BITFeedbackManager.m +++ b/Classes/BITFeedbackManager.m @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITFeedbackManagerDelegate.h b/Classes/BITFeedbackManagerDelegate.h index f592a92be8..dce3fb70c5 100644 --- a/Classes/BITFeedbackManagerDelegate.h +++ b/Classes/BITFeedbackManagerDelegate.h @@ -1,10 +1,30 @@ -// -// BITFeedbackManagerDelegate.h -// HockeySDK -// -// Created by Stephan Diederich on 26.07.13. -// -// +/* + * Author: Stephan Diederich + * + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ #import diff --git a/Classes/BITFeedbackManagerPrivate.h b/Classes/BITFeedbackManagerPrivate.h index 679a2f34ab..dd5f03a13f 100644 --- a/Classes/BITFeedbackManagerPrivate.h +++ b/Classes/BITFeedbackManagerPrivate.h @@ -2,7 +2,7 @@ * Author: Andreas Linde * Kent Sutherland * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde & Kent Sutherland. * All rights reserved. * diff --git a/Classes/BITFeedbackMessage.h b/Classes/BITFeedbackMessage.h index dde73d6e12..c938e21722 100644 --- a/Classes/BITFeedbackMessage.h +++ b/Classes/BITFeedbackMessage.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITFeedbackMessage.m b/Classes/BITFeedbackMessage.m index aeb595abdb..a5b0e0d8b2 100644 --- a/Classes/BITFeedbackMessage.m +++ b/Classes/BITFeedbackMessage.m @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITFeedbackUserDataViewController.h b/Classes/BITFeedbackUserDataViewController.h index 6c301b5ae1..84128d086d 100644 --- a/Classes/BITFeedbackUserDataViewController.h +++ b/Classes/BITFeedbackUserDataViewController.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITFeedbackUserDataViewController.m b/Classes/BITFeedbackUserDataViewController.m index ee17f4fbbe..2f6fed7696 100644 --- a/Classes/BITFeedbackUserDataViewController.m +++ b/Classes/BITFeedbackUserDataViewController.m @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITHTTPOperation.h b/Classes/BITHTTPOperation.h index c03fb6b9a3..e1b3f95b61 100644 --- a/Classes/BITHTTPOperation.h +++ b/Classes/BITHTTPOperation.h @@ -1,7 +1,7 @@ /* * Author: Stephan Diederich * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITHTTPOperation.m b/Classes/BITHTTPOperation.m index c6458dcfde..322f97697e 100644 --- a/Classes/BITHTTPOperation.m +++ b/Classes/BITHTTPOperation.m @@ -1,7 +1,7 @@ /* * Author: Stephan Diederich * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITHockeyAppClient.h b/Classes/BITHockeyAppClient.h index ab23aaf037..a8d5fdbd15 100644 --- a/Classes/BITHockeyAppClient.h +++ b/Classes/BITHockeyAppClient.h @@ -1,7 +1,7 @@ /* * Author: Stephan Diederich * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITHockeyAppClient.m b/Classes/BITHockeyAppClient.m index b8ed66fe7b..168162b47c 100644 --- a/Classes/BITHockeyAppClient.m +++ b/Classes/BITHockeyAppClient.m @@ -1,7 +1,7 @@ /* * Author: Stephan Diederich * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITHockeyBaseManager.h b/Classes/BITHockeyBaseManager.h index 3b2cb346af..ed5284d4d2 100644 --- a/Classes/BITHockeyBaseManager.h +++ b/Classes/BITHockeyBaseManager.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITHockeyBaseManager.m b/Classes/BITHockeyBaseManager.m index 76c9209963..434a596c85 100644 --- a/Classes/BITHockeyBaseManager.m +++ b/Classes/BITHockeyBaseManager.m @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITHockeyBaseManagerPrivate.h b/Classes/BITHockeyBaseManagerPrivate.h index 6c557f92f1..938d55e0a6 100644 --- a/Classes/BITHockeyBaseManagerPrivate.h +++ b/Classes/BITHockeyBaseManagerPrivate.h @@ -1,10 +1,30 @@ -// -// CNSHockeyBaseManager+Private.h -// HockeySDK -// -// Created by Andreas Linde on 04.06.12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// +/* + * Author: Andreas Linde + * + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ #import #import diff --git a/Classes/BITHockeyBaseViewController.h b/Classes/BITHockeyBaseViewController.h index e096f5a506..d7701036be 100644 --- a/Classes/BITHockeyBaseViewController.h +++ b/Classes/BITHockeyBaseViewController.h @@ -1,10 +1,30 @@ -// -// CNSHockeyBaseViewController.h -// HockeySDK -// -// Created by Andreas Linde on 04.06.12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// +/* + * Author: Andreas Linde + * + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ #import diff --git a/Classes/BITHockeyBaseViewController.m b/Classes/BITHockeyBaseViewController.m index 8f6c9220e0..99611a558d 100644 --- a/Classes/BITHockeyBaseViewController.m +++ b/Classes/BITHockeyBaseViewController.m @@ -1,10 +1,30 @@ -// -// CNSHockeyBaseViewController.m -// HockeySDK -// -// Created by Andreas Linde on 04.06.12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// +/* + * Author: Andreas Linde + * + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ #import "BITHockeyBaseViewController.h" #import "HockeySDKPrivate.h" diff --git a/Classes/BITHockeyHelper.h b/Classes/BITHockeyHelper.h index e4bac71c74..22d6dbdaf6 100644 --- a/Classes/BITHockeyHelper.h +++ b/Classes/BITHockeyHelper.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITHockeyHelper.m b/Classes/BITHockeyHelper.m index 025fe40199..843283a17f 100644 --- a/Classes/BITHockeyHelper.m +++ b/Classes/BITHockeyHelper.m @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITHockeyManager.h b/Classes/BITHockeyManager.h index 2779afe7c6..0102cc9dc9 100644 --- a/Classes/BITHockeyManager.h +++ b/Classes/BITHockeyManager.h @@ -2,7 +2,7 @@ * Author: Andreas Linde * Kent Sutherland * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITHockeyManager.m b/Classes/BITHockeyManager.m index 5b752435fd..e8f2f9108c 100644 --- a/Classes/BITHockeyManager.m +++ b/Classes/BITHockeyManager.m @@ -2,7 +2,7 @@ * Author: Andreas Linde * Kent Sutherland * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITHockeyManagerDelegate.h b/Classes/BITHockeyManagerDelegate.h index 6e6db34121..76ade83ad7 100644 --- a/Classes/BITHockeyManagerDelegate.h +++ b/Classes/BITHockeyManagerDelegate.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITStoreButton.h b/Classes/BITStoreButton.h index e68d53ea9d..207b109b62 100644 --- a/Classes/BITStoreButton.h +++ b/Classes/BITStoreButton.h @@ -2,7 +2,7 @@ * Author: Andreas Linde * Peter Steinberger * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011-2012 Peter Steinberger. * All rights reserved. * diff --git a/Classes/BITStoreButton.m b/Classes/BITStoreButton.m index 36da84f781..cf4f0be388 100644 --- a/Classes/BITStoreButton.m +++ b/Classes/BITStoreButton.m @@ -2,7 +2,7 @@ * Author: Andreas Linde * Peter Steinberger * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011-2012 Peter Steinberger. * All rights reserved. * diff --git a/Classes/BITStoreUpdateManager.h b/Classes/BITStoreUpdateManager.h index b415a13543..4ba813315e 100644 --- a/Classes/BITStoreUpdateManager.h +++ b/Classes/BITStoreUpdateManager.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITStoreUpdateManager.m b/Classes/BITStoreUpdateManager.m index c6b2247ca5..0536f17830 100644 --- a/Classes/BITStoreUpdateManager.m +++ b/Classes/BITStoreUpdateManager.m @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITStoreUpdateManagerDelegate.h b/Classes/BITStoreUpdateManagerDelegate.h index 4051cfd458..0d629dc0d5 100644 --- a/Classes/BITStoreUpdateManagerDelegate.h +++ b/Classes/BITStoreUpdateManagerDelegate.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITStoreUpdateManagerPrivate.h b/Classes/BITStoreUpdateManagerPrivate.h index f44c100549..26e354e7aa 100644 --- a/Classes/BITStoreUpdateManagerPrivate.h +++ b/Classes/BITStoreUpdateManagerPrivate.h @@ -2,7 +2,7 @@ * Author: Andreas Linde * Peter Steinberger * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde. * All rights reserved. * diff --git a/Classes/BITUpdateManager.h b/Classes/BITUpdateManager.h index 959804f1c6..4425363d03 100644 --- a/Classes/BITUpdateManager.h +++ b/Classes/BITUpdateManager.h @@ -2,7 +2,7 @@ * Author: Andreas Linde * Peter Steinberger * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde. * All rights reserved. * diff --git a/Classes/BITUpdateManager.m b/Classes/BITUpdateManager.m index c8ff8cd34a..6cbea70175 100644 --- a/Classes/BITUpdateManager.m +++ b/Classes/BITUpdateManager.m @@ -2,7 +2,7 @@ * Author: Andreas Linde * Peter Steinberger * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde. * All rights reserved. * diff --git a/Classes/BITUpdateManagerDelegate.h b/Classes/BITUpdateManagerDelegate.h index a277a50807..4d12646a41 100644 --- a/Classes/BITUpdateManagerDelegate.h +++ b/Classes/BITUpdateManagerDelegate.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/BITUpdateManagerPrivate.h b/Classes/BITUpdateManagerPrivate.h index 208003b3b8..7519185360 100644 --- a/Classes/BITUpdateManagerPrivate.h +++ b/Classes/BITUpdateManagerPrivate.h @@ -2,7 +2,7 @@ * Author: Andreas Linde * Peter Steinberger * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde. * All rights reserved. * diff --git a/Classes/BITUpdateViewController.h b/Classes/BITUpdateViewController.h index 9f100f193c..e36f318270 100644 --- a/Classes/BITUpdateViewController.h +++ b/Classes/BITUpdateViewController.h @@ -2,7 +2,7 @@ * Author: Andreas Linde * Peter Steinberger * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde, Peter Steinberger. * All rights reserved. * diff --git a/Classes/BITUpdateViewController.m b/Classes/BITUpdateViewController.m index c154247c3e..41633df0ef 100644 --- a/Classes/BITUpdateViewController.m +++ b/Classes/BITUpdateViewController.m @@ -2,7 +2,7 @@ * Author: Andreas Linde * Peter Steinberger * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde, Peter Steinberger. * All rights reserved. * diff --git a/Classes/BITUpdateViewControllerPrivate.h b/Classes/BITUpdateViewControllerPrivate.h index 1a078456c7..26747a8288 100644 --- a/Classes/BITUpdateViewControllerPrivate.h +++ b/Classes/BITUpdateViewControllerPrivate.h @@ -2,7 +2,7 @@ * Author: Andreas Linde * Peter Steinberger * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde, Peter Steinberger. * All rights reserved. * diff --git a/Classes/BITWebTableViewCell.h b/Classes/BITWebTableViewCell.h index 2c9a980fe0..c1706d2fdb 100644 --- a/Classes/BITWebTableViewCell.h +++ b/Classes/BITWebTableViewCell.h @@ -2,7 +2,7 @@ * Author: Andreas Linde * Peter Steinberger * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011-2012 Peter Steinberger. * All rights reserved. * diff --git a/Classes/BITWebTableViewCell.m b/Classes/BITWebTableViewCell.m index 8b58aa5aa3..3435bb81b6 100644 --- a/Classes/BITWebTableViewCell.m +++ b/Classes/BITWebTableViewCell.m @@ -2,7 +2,7 @@ * Author: Andreas Linde * Peter Steinberger * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011-2012 Peter Steinberger. * All rights reserved. * diff --git a/Classes/HockeySDK.h b/Classes/HockeySDK.h index 991dbd6398..aa1c4da3ff 100644 --- a/Classes/HockeySDK.h +++ b/Classes/HockeySDK.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde. * All rights reserved. * diff --git a/Classes/HockeySDKFeatureConfig.h b/Classes/HockeySDKFeatureConfig.h index a7fe78f3c3..d5cba7e04c 100644 --- a/Classes/HockeySDKFeatureConfig.h +++ b/Classes/HockeySDKFeatureConfig.h @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. * All rights reserved. * * Permission is hereby granted, free of charge, to any person diff --git a/Classes/HockeySDKPrivate.m b/Classes/HockeySDKPrivate.m index 381fddf894..f74fb89bef 100644 --- a/Classes/HockeySDKPrivate.m +++ b/Classes/HockeySDKPrivate.m @@ -1,7 +1,7 @@ /* * Author: Andreas Linde * - * Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. * Copyright (c) 2011 Andreas Linde. * All rights reserved. * diff --git a/LICENSE b/LICENSE index 4121519cd4..4c97598d23 100755 --- a/LICENSE +++ b/LICENSE @@ -3,7 +3,7 @@ The Hockey SDK is provided under the following license: The MIT License - Copyright (c) 2012-2013 HockeyApp, Bit Stadium GmbH. + Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. All rights reserved. Permission is hereby granted, free of charge, to any person @@ -30,8 +30,8 @@ The Hockey SDK is provided under the following license: Except as noted below, PLCrashReporter is provided under the following license: - Copyright (c) 2008 - 2013 Plausible Labs Cooperative, Inc. - Copyright (c) 2012 - 2013 HockeyApp, Bit Stadium GmbH. + Copyright (c) 2008 - 2014 Plausible Labs Cooperative, Inc. + Copyright (c) 2012 - 2014 HockeyApp, Bit Stadium GmbH. All rights reserved. Permission is hereby granted, free of charge, to any person From 670e376e9e7dba34c1cc3065d63de785fc5e8c9a Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Sun, 12 Jan 2014 21:08:53 +0100 Subject: [PATCH 60/62] Change the default of crashmanagers `showAlways` property to YES This results in crash report alerts by default showing the `Always` button, so they will never be asked again and future crash reports will be send automatically. --- Classes/BITCrashManager.h | 10 +++++----- Classes/BITCrashManager.m | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Classes/BITCrashManager.h b/Classes/BITCrashManager.h index c93ac7f675..64f695d60f 100644 --- a/Classes/BITCrashManager.h +++ b/Classes/BITCrashManager.h @@ -127,10 +127,9 @@ typedef NS_ENUM(NSUInteger, BITCrashManagerStatus) { sending each crash report or send crash reportings automatically without asking. - The default value is `BITCrashManagerStatusAlwaysAsk`. You can allow the user - to switch from `BITCrashManagerStatusAlwaysAsk` to - `BITCrashManagerStatusAutoSend` by setting `showAlwaysButton` - to _YES_. + The default value is `BITCrashManagerStatusAlwaysAsk`. The user can switch to + `BITCrashManagerStatusAutoSend` by choosing "Always" in the dialog (since + `showAlwaysButton` default is _YES_). The current value is always stored in User Defaults with the key `BITCrashManagerStatus`. @@ -200,8 +199,9 @@ typedef NS_ENUM(NSUInteger, BITCrashManagerStatus) { If If `crashManagerStatus` is set to `BITCrashManagerStatusAutoSend`, this property has no effect, since no alert will be presented. + + Default: _YES_ - @warning This will cause the dialog not to show the alert description text landscape mode! @see crashManagerStatus */ @property (nonatomic, assign, getter=shouldShowAlwaysButton) BOOL showAlwaysButton; diff --git a/Classes/BITCrashManager.m b/Classes/BITCrashManager.m index a0e7e64422..fa1c8bcac9 100644 --- a/Classes/BITCrashManager.m +++ b/Classes/BITCrashManager.m @@ -91,7 +91,7 @@ NSString *const kBITCrashManagerStatus = @"BITCrashManagerStatus"; - (id)init { if ((self = [super init])) { _delegate = nil; - _showAlwaysButton = NO; + _showAlwaysButton = YES; _isSetup = NO; _plCrashReporter = nil; From a0573368af46f381e38ff2f3ae18abe29767b462 Mon Sep 17 00:00:00 2001 From: Andreas Linde Date: Tue, 14 Jan 2014 15:01:33 +0100 Subject: [PATCH 61/62] 3.5.1 release and documentation updates --- HockeySDK.podspec | 2 +- README.md | 14 ++--- Support/buildnumber.xcconfig | 4 +- docs/Changelog-template.md | 52 +++++++++++++++++++ ...de-Installation-Setup-Advanced-template.md | 28 ++++------ docs/Guide-Installation-Setup-template.md | 30 ++++------- 6 files changed, 83 insertions(+), 47 deletions(-) diff --git a/HockeySDK.podspec b/HockeySDK.podspec index fa978bd129..b800df1bb3 100644 --- a/HockeySDK.podspec +++ b/HockeySDK.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'HockeySDK' - s.version = '3.5.0' + s.version = '3.5.1' s.license = 'MIT' s.platform = :ios, '5.0' s.summary = 'Distribute beta apps and collect crash reports with HockeyApp.' diff --git a/README.md b/README.md index 1a4c9c970c..0fc4dc7787 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -## Version 3.5.0 +## Version 3.5.1 -- [Changelog](http://www.hockeyapp.net/help/sdk/ios/3.5.0/docs/docs/Changelog.html) +- [Changelog](http://www.hockeyapp.net/help/sdk/ios/3.5.1/docs/docs/Changelog.html) ## Introduction @@ -31,10 +31,10 @@ The main SDK class is `BITHockeyManager`. It initializes all modules and provide ## Installation & Setup -- [Installation & Setup](http://www.hockeyapp.net/help/sdk/ios/3.5.0/docs/docs/Guide-Installation-Setup.html) (Recommended) -- [Installation & Setup Advanced](http://www.hockeyapp.net/help/sdk/ios/3.5.0/docs/docs/Guide-Installation-Setup-Advanced.html) (Using Git submodule and Xcode sub-project) -- [Identify and authenticate users of Ad-Hoc or Enterprise builds](http://www.hockeyapp.net/help/sdk/ios/3.5.0rc3/docs/docs/HowTo-Authenticating-Users-on-iOS.html) -- [Migration from previous SDK Versions](http://www.hockeyapp.net/help/sdk/ios/3.5.0/docs/docs/Guide-Migration-Kits.html) +- [Installation & Setup](http://www.hockeyapp.net/help/sdk/ios/3.5.1/docs/docs/Guide-Installation-Setup.html) (Recommended) +- [Installation & Setup Advanced](http://www.hockeyapp.net/help/sdk/ios/3.5.1/docs/docs/Guide-Installation-Setup-Advanced.html) (Using Git submodule and Xcode sub-project) +- [Identify and authenticate users of Ad-Hoc or Enterprise builds](http://www.hockeyapp.net/help/sdk/ios/3.5.1/docs/docs/HowTo-Authenticating-Users-on-iOS.html) +- [Migration from previous SDK Versions](http://www.hockeyapp.net/help/sdk/ios/3.5.1/docs/docs/Guide-Migration-Kits.html) - [Mac Desktop Uploader](http://support.hockeyapp.net/kb/how-tos/how-to-upload-to-hockeyapp-on-a-mac) @@ -48,4 +48,4 @@ This documentation provides integrated help in Xcode for all public APIs and a s 3. Copy the content into ~`/Library/Developer/Shared/Documentation/DocSet` -The documentation is also available via the following URL: [http://hockeyapp.net/help/sdk/ios/3.5.0/](http://hockeyapp.net/help/sdk/ios/3.5.0/) +The documentation is also available via the following URL: [http://hockeyapp.net/help/sdk/ios/3.5.1/](http://hockeyapp.net/help/sdk/ios/3.5.1/) diff --git a/Support/buildnumber.xcconfig b/Support/buildnumber.xcconfig index 893857b3bd..28a621bdeb 100644 --- a/Support/buildnumber.xcconfig +++ b/Support/buildnumber.xcconfig @@ -1,7 +1,7 @@ #include "HockeySDK.xcconfig" -BUILD_NUMBER = 23 -VERSION_STRING = 3.5.0 +BUILD_NUMBER = 24 +VERSION_STRING = 3.5.1 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) BITHOCKEY_VERSION="@\""$(VERSION_STRING)"\"" BITHOCKEY_BUILD="@\""$(BUILD_NUMBER)"\"" BIT_ARM_ARCHS = armv7 armv7s arm64 BIT_SIM_ARCHS = x86_64 i386 diff --git a/docs/Changelog-template.md b/docs/Changelog-template.md index 89752be9a6..751f994a2d 100644 --- a/docs/Changelog-template.md +++ b/docs/Changelog-template.md @@ -1,3 +1,55 @@ +## Version 3.5.1 + +- General + + - [NEW] Add new initialize to make the configuration easier: `[BITHockeyManager configureWithIdentifier:]` + - [NEW] Add `[BITHockeyManager testIdentifier]` to check if the SDK reaches the server. The result is shown on the HockeyApp website on success. + - [UPDATE] `delegate` can now also be defined using the property directly (instead of using the configureWith methods) + - [UPDATE] Use system provided Base64 encoding implementation + - [UPDATE] Improved logic to choose the right `UIWindow` instance for dialogs + - [BUGFIX] Fix compile issues when excluding all modules but crash reporting + - [BUGFIX] Fix warning on implicit conversion from `CGImageAlphaInfo` to `CGBitmapInfo` + - [BUGFIX] Fix warnings for implicit conversions of `UITextAlignment` and `UILineBreakMode` + - [BUGFIX] Various additional smaller bug fixes +

+ +- Crash Reporting + + - [NEW] Integrated PLCrashReporter 1.2 RC 2 + - [NEW] Add `generateTestCrash` method to more quickly test the crash reporting (automatically disabled in App Store environment!) + - [NEW] Add PLCR header files to the public headers in the framework + - [NEW] Add the option to define callbacks that will be executed prior to program termination after a crash has occurred. Callback code has to be async-safe! + - [UPDATE] Change the default of `showAlwaysButton` property to `YES` + - [BUGFIX] Always format date and timestamps in crash report in `en_US_POSIX` locale. +

+ +- Feedback + + - [UPDATE] Use only one activity view controller per UIActivity + - [BUGFIX] Fix delete button appearance in feedback list view on iOS 7 when swiping a feedback message + - [BUGFIX] Comply to -[UIActivity activityDidFinish:] requirements + - [BUGFIX] Use non-deprecated delegate method for `BITFeedbackActivity` +

+ +- Ad-Hoc/Enterprise Authentication + + - [NEW] Automatic authorization when app was installed over the air. This still requires to call `[BITAuthenticator authenticateInstallation];` after calling `startManager`! + - [UPDATE] Set the tintColor in the auth view and modal views navigation controller on iOS 7 + - [UPDATE] Show an alert if the authentication token could not be stored into the keychain + - [UPDATE] Use UTF8 encoding for auth data + - [UPDATE] Replace email placeholder texts + - [BUGFIX] Make sure the authentication window is always correctly dismissed + - [BUGFIX] Fixed memory issues +

+ +- Ad-Hoc/Enterprise Updates + + - [NEW] Provide alert option to show mandatory update details + - [NEW] Add button to expired page (and alert) that lets the user check for a new version (can be disabled using `disableUpdateCheckOptionWhenExpired`) + - [UPDATE] Usage metrics are now stored in an independent file instead of using `NSUserDefaults` +

+ + ## Version 3.5.0 - General diff --git a/docs/Guide-Installation-Setup-Advanced-template.md b/docs/Guide-Installation-Setup-Advanced-template.md index 6282f5e506..c23cb1bc24 100644 --- a/docs/Guide-Installation-Setup-Advanced-template.md +++ b/docs/Guide-Installation-Setup-Advanced-template.md @@ -1,6 +1,6 @@ -## Version 3.5.0 +## Version 3.5.1 -- [Changelog](http://www.hockeyapp.net/help/sdk/ios/3.5.0/docs/docs/Changelog.html) +- [Changelog](http://www.hockeyapp.net/help/sdk/ios/3.5.1/docs/docs/Changelog.html) ## Introduction @@ -85,25 +85,17 @@ The SDK runs on devices with iOS 5.0 or higher. #import "HockeySDK.h" -3. Let the AppDelegate implement the protocols `BITHockeyManagerDelegate`: +3. Search for the method `application:didFinishLaunchingWithOptions:` -
@interface AppDelegate(HockeyProtocols) < BITHockeyManagerDelegate > {}
-   @end
+4. Add the following lines: -4. Search for the method `application:didFinishLaunchingWithOptions:` - -5. Add the following lines: - - [[BITHockeyManager sharedHockeyManager] configureWithBetaIdentifier:@"BETA_IDENTIFIER" - liveIdentifier:@"LIVE_IDENTIFIER" - delegate:self]; + [[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"APP_IDENTIFIER"]; [[BITHockeyManager sharedHockeyManager] startManager]; + [[BITHockeyManager sharedHockeyManager].authenticator authenticateInstallation]; -6. Replace `BETA_IDENTIFIER` with the app identifier of your beta app. If you don't know what the app identifier is or how to find it, please read [this how-to](http://support.hockeyapp.net/kb/how-tos/how-to-find-the-app-identifier). +5. Replace `APP_IDENTIFIER` with the app identifier of your beta app. If you don't know what the app identifier is or how to find it, please read [this how-to](http://support.hockeyapp.net/kb/how-tos/how-to-find-the-app-identifier). -7. Replace `LIVE_IDENTIFIER` with the app identifier of your release app. We suggest to setup different apps on HockeyApp for your test and production builds. You usually will have way more test versions, but your production version usually has way more crash reports. This helps to keep data separated, getting a better overview and less trouble setting the right app versions downloadable for your beta users. - -8. If you want to use the beta distribution feature on iOS 7 or later with In-App Updates, restrict versions to specific users or want to know who is actually testing your app, you need to follow the instructions on our guide [Identify and authenticate users of Ad-Hoc or Enterprise builds](HowTo-Authenticating-Users-on-iOS) +6. If you want to see beta analytics, use the beta distribution feature with in-app updates, restrict versions to specific users, or want to know who is actually testing your app, you need to follow the instructions on our guide [Identify and authenticate users of Ad-Hoc or Enterprise builds](HowTo-Authenticating-Users-on-iOS) *Note:* The SDK is optimized to defer everything possible to a later time while making sure e.g. crashes on startup can also be caught and each module executes other code with a delay some seconds. This ensures that applicationDidFinishLaunching will process as fast as possible and the SDK will not block the startup sequence resulting in a possible kill by the watchdog process. @@ -116,7 +108,7 @@ The Mac Desktop Uploader can provide easy uploading of your app versions to Hock ### Xcode Documentation -This documentation provides integrated help in Xcode for all public APIs and a set of additional tutorials and HowTos. +This documentation provides integrated help in Xcode for all public APIs and a set of additional tutorials and how-tos. 1. Download the [HockeySDK-iOS documentation](http://hockeyapp.net/releases/). @@ -124,7 +116,7 @@ This documentation provides integrated help in Xcode for all public APIs and a s 3. Copy the content into ~`/Library/Developer/Shared/Documentation/DocSet` -The documentation is also available via the following URL: [http://hockeyapp.net/help/sdk/ios/3.5.0/](http://hockeyapp.net/help/sdk/ios/3.5.0/) +The documentation is also available via the following URL: [http://hockeyapp.net/help/sdk/ios/3.5.1/](http://hockeyapp.net/help/sdk/ios/3.5.1/) ### Set up with xcconfig diff --git a/docs/Guide-Installation-Setup-template.md b/docs/Guide-Installation-Setup-template.md index 3bd5b840e0..c33d1f0210 100644 --- a/docs/Guide-Installation-Setup-template.md +++ b/docs/Guide-Installation-Setup-template.md @@ -1,6 +1,6 @@ -## Version 3.5.0 +## Version 3.5.1 -- [Changelog](http://www.hockeyapp.net/help/sdk/ios/3.5.0/docs/docs/Changelog.html) +- [Changelog](http://www.hockeyapp.net/help/sdk/ios/3.5.1/docs/docs/Changelog.html) ## Introduction @@ -65,25 +65,17 @@ The SDK runs on devices with iOS 5.0 or higher. #import -3. Let the AppDelegate implement the protocols `BITHockeyManagerDelegate`: +3. Search for the method `application:didFinishLaunchingWithOptions:` -
@interface AppDelegate(HockeyProtocols) < BITHockeyManagerDelegate > {}
-   @end
+4. Add the following lines: -4. Search for the method `application:didFinishLaunchingWithOptions:` - -5. Add the following lines: - - [[BITHockeyManager sharedHockeyManager] configureWithBetaIdentifier:@"BETA_IDENTIFIER" - liveIdentifier:@"LIVE_IDENTIFIER" - delegate:self]; + [[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"APP_IDENTIFIER"]; [[BITHockeyManager sharedHockeyManager] startManager]; + [[BITHockeyManager sharedHockeyManager].authenticator authenticateInstallation]; -6. Replace `BETA_IDENTIFIER` with the app identifier of your beta app. If you don't know what the app identifier is or how to find it, please read [this how-to](http://support.hockeyapp.net/kb/how-tos/how-to-find-the-app-identifier). +5. Replace `APP_IDENTIFIER` with the app identifier of your app. If you don't know what the app identifier is or how to find it, please read [this how-to](http://support.hockeyapp.net/kb/how-tos/how-to-find-the-app-identifier). -7. Replace `LIVE_IDENTIFIER` with the app identifier of your release app. We suggest to setup different apps on HockeyApp for your test and production builds. You usually will have way more test versions, but your production version usually has way more crash reports. This helps to keep data separated, getting a better overview and less trouble setting the right app versions downloadable for your beta users. - -8. If you want to use the beta distribution feature on iOS 7 or later with In-App Updates, restrict versions to specific users or want to know who is actually testing your app, you need to follow the instructions on our guide [Identify and authenticate users of Ad-Hoc or Enterprise builds](HowTo-Authenticating-Users-on-iOS) +6. If you want to see beta analytics, use the beta distribution feature with in-app updates, restrict versions to specific users, or want to know who is actually testing your app, you need to follow the instructions on our guide [Identify and authenticate users of Ad-Hoc or Enterprise builds](HowTo-Authenticating-Users-on-iOS) *Note:* The SDK is optimized to defer everything possible to a later time while making sure e.g. crashes on startup can also be caught and each module executes other code with a delay some seconds. This ensures that applicationDidFinishLaunching will process as fast as possible and the SDK will not block the startup sequence resulting in a possible kill by the watchdog process. @@ -96,11 +88,11 @@ The Mac Desktop Uploader can provide easy uploading of your app versions to Hock ### Xcode Documentation -This documentation provides integrated help in Xcode for all public APIs and a set of additional tutorials and HowTos. +This documentation provides integrated help in Xcode for all public APIs and a set of additional tutorials and how-tos. -1. Copy `de.bitstadium.HockeySDK-iOS-3.5.0.docset` into ~`/Library/Developer/Shared/Documentation/DocSet` +1. Copy `de.bitstadium.HockeySDK-iOS-3.5.1.docset` into ~`/Library/Developer/Shared/Documentation/DocSet` -The documentation is also available via the following URL: [http://hockeyapp.net/help/sdk/ios/3.5.0/](http://hockeyapp.net/help/sdk/ios/3.5.0/) +The documentation is also available via the following URL: [http://hockeyapp.net/help/sdk/ios/3.5.1/](http://hockeyapp.net/help/sdk/ios/3.5.1/) ### Set up with xcconfig From e4010ea8ef5eab52a3bad5ef517aee7a3989216f Mon Sep 17 00:00:00 2001 From: Thomas Dohmke Date: Tue, 14 Jan 2014 19:03:53 +0100 Subject: [PATCH 62/62] Add some more checks to avoid problems when iTunesArtwork is not a .png. --- Classes/BITAuthenticator.m | 53 ++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/Classes/BITAuthenticator.m b/Classes/BITAuthenticator.m index a171af2ab1..3a46eb1669 100644 --- a/Classes/BITAuthenticator.m +++ b/Classes/BITAuthenticator.m @@ -48,6 +48,7 @@ static NSString* const kBITAuthenticatorAuthTokenKey = @"BITAuthenticatorAuthTok static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAuthTokenTypeKey"; typedef unsigned int bit_uint32; +static unsigned char kBITPNGHeader[8] = {137, 80, 78, 71, 13, 10, 26, 10}; static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; @implementation BITAuthenticator { @@ -699,44 +700,56 @@ static unsigned char kBITPNGEndChunk[4] = {0x49, 0x45, 0x4e, 0x44}; free(source); return; } + + if ((fs.st_size < 20) || (memcmp(source, kBITPNGHeader, 8))) { + // Not a PNG + free(source); + return; + } + buffer = source + 8; + + NSString *result = nil; bit_uint32 length; unsigned char *name; unsigned char *data; - NSString *result = nil; - - buffer = source + 8; - int index = 0; + int chunk_index = 0; + long long bytes_left = fs.st_size - 8; do { memcpy(&length, buffer, 4); length = ntohl(length); - name = (unsigned char *)malloc(4); buffer += 4; - + name = (unsigned char *)malloc(4); memcpy(name, buffer, 4); + buffer += 4; data = (unsigned char *)malloc(length + 1); - memcpy(data, buffer, length); - buffer += length; - buffer += 4; - if (!strcmp((const char *)name, "tEXt")) { - data[length] = 0; - NSString *key = [NSString stringWithCString:(char *)data encoding:NSUTF8StringEncoding]; + if (bytes_left >= length) { + memcpy(data, buffer, length); + + buffer += length; + buffer += 4; + if (!strcmp((const char *)name, "tEXt")) { + data[length] = 0; + NSString *key = [NSString stringWithCString:(char *)data encoding:NSUTF8StringEncoding]; + + if ([key isEqualToString:@"Data"]) { + result = [NSString stringWithCString:(char *)(data + key.length + 1) encoding:NSUTF8StringEncoding]; + } + } - if ([key isEqualToString:@"Data"]) { - result = [NSString stringWithCString:(char *)(data + key.length + 1) encoding:NSUTF8StringEncoding]; + if (!memcmp(name, kBITPNGEndChunk, 4)){ + chunk_index = 128; } } - - if (!memcmp(name, kBITPNGEndChunk, 4)){ - index = 128; - } - + free(data); free(name); - } while (index++ < 128); + + bytes_left -= (length + 3 * 4); + } while ((chunk_index++ < 128) && (bytes_left > 8)); free(source);