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/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/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/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 789c63e933..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 @@ -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/BITAuthenticator.h b/Classes/BITAuthenticator.h index c14cf9bd7c..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 @@ -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` * diff --git a/Classes/BITAuthenticator.m b/Classes/BITAuthenticator.m index a12a41983c..3a46eb1669 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 @@ -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,15 @@ static NSString* const kBITAuthenticatorUserEmailKey = @"BITAuthenticatorUserEma static NSString* const kBITAuthenticatorAuthTokenKey = @"BITAuthenticatorAuthTokenKey"; 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 { id _appDidBecomeActiveObserver; - id _appWillResignActiveObserver; + id _appDidEnterBackgroundOberser; UIViewController *_authenticationController; - + BOOL _isSetup; } @@ -80,6 +85,23 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut } #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; @@ -108,8 +130,7 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut 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); @@ -133,6 +154,17 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut } 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"); @@ -155,6 +187,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) { @@ -212,14 +250,14 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut - (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 delegate:self cancelButtonTitle:BITHockeyLocalizedString(@"HockeyOK") otherButtonTitles:nil]; + [alertView setTag:0]; [alertView show]; } }]; @@ -270,9 +308,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; @@ -281,7 +317,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; @@ -372,14 +408,16 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut 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]; + BOOL success = [self addStringValueToKeychain:email forKey:kBITAuthenticatorUserEmailKey]; + if (!success) { + [strongSelf alertOnFailureStoringTokenInKeychain]; + } } else { identified = NO; } - self.identified = identified; + strongSelf.identified = identified; completion(identified, authParseError); if(strongSelf.identificationCompletion) strongSelf.identificationCompletion(identified, authParseError); strongSelf.identificationCompletion = nil; @@ -407,7 +445,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"]; } @@ -516,7 +554,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 +580,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) { @@ -551,7 +588,10 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut 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); } @@ -572,8 +612,7 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut 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; @@ -627,6 +666,7 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut } #pragma mark - Private helpers + - (void) cleanupInternalStorage { [self removeKeyFromKeychain:kBITAuthenticatorIdentifierTypeKey]; [self removeKeyFromKeychain:kBITAuthenticatorIdentifierKey]; @@ -639,6 +679,85 @@ 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; + } + + 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; + int chunk_index = 0; + long long bytes_left = fs.st_size - 8; + do { + memcpy(&length, buffer, 4); + length = ntohl(length); + + buffer += 4; + name = (unsigned char *)malloc(4); + memcpy(name, buffer, 4); + + buffer += 4; + data = (unsigned char *)malloc(length + 1); + + 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 (!memcmp(name, kBITPNGEndChunk, 4)){ + chunk_index = 128; + } + } + + free(data); + free(name); + + bytes_left -= (length + 3 * 4); + } while ((chunk_index++ < 128) && (bytes_left > 8)); + + free(source); + + if (result) { + [self handleOpenURL:[NSURL URLWithString:result] sourceApplication:nil annotation:nil]; + } +} + #pragma mark - KVO - (void) registerObservers { __weak typeof(self) weakSelf = self; @@ -651,14 +770,14 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut [strongSelf applicationDidBecomeActive:note]; }]; } - if(nil == _appWillResignActiveObserver) { - _appWillResignActiveObserver = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillResignActiveNotification - object:nil - queue:NSOperationQueue.mainQueue - usingBlock:^(NSNotification *note) { - typeof(self) strongSelf = weakSelf; - [strongSelf applicationWillResignActive:note]; - }]; + if(nil == _appDidEnterBackgroundOberser) { + _appDidEnterBackgroundOberser = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification + object:nil + queue:NSOperationQueue.mainQueue + usingBlock:^(NSNotification *note) { + typeof(self) strongSelf = weakSelf; + [strongSelf applicationDidEnterBackground:note]; + }]; } } @@ -667,9 +786,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; } } @@ -679,13 +798,15 @@ static NSString* const kBITAuthenticatorAuthTokenTypeKey = @"BITAuthenticatorAut [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]; + } } } @@ -755,17 +876,16 @@ 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; } } #pragma mark - UIAlertViewDelegate - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { - [self validate]; + if (alertView.tag == 0) { + [self validate]; + } } @end diff --git a/Classes/BITAuthenticator_Private.h b/Classes/BITAuthenticator_Private.h index c41134600a..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 @@ -60,11 +57,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 diff --git a/Classes/BITCrashManager.h b/Classes/BITCrashManager.h index acae8c57a8..64f695d60f 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. * @@ -32,6 +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 @@ -120,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`. @@ -160,6 +166,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 @@ -168,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; @@ -227,4 +259,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..fa1c8bcac9 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. * @@ -38,7 +38,6 @@ #import "HockeySDKPrivate.h" #import "BITHockeyHelper.h" -#import "BITHockeyManagerPrivate.h" #import "BITHockeyBaseManagerPrivate.h" #import "BITCrashManagerPrivate.h" #import "BITCrashReportTextFormatter.h" @@ -72,6 +71,8 @@ NSString *const kBITCrashManagerStatus = @"BITCrashManagerStatus"; NSString *_analyzerInProgressFile; NSFileManager *_fileManager; + PLCrashReporterCallbacks *_crashCallBacks; + BOOL _crashIdenticalCurrentVersion; NSMutableData *_responseData; @@ -90,11 +91,12 @@ NSString *const kBITCrashManagerStatus = @"BITCrashManagerStatus"; - (id)init { if ((self = [super init])) { _delegate = nil; - _showAlwaysButton = NO; + _showAlwaysButton = YES; _isSetup = NO; _plCrashReporter = nil; _exceptionHandler = nil; + _crashCallBacks = nil; _crashIdenticalCurrentVersion = YES; _urlConnection = nil; @@ -385,6 +387,11 @@ NSString *const kBITCrashManagerStatus = @"BITCrashManagerStatus"; #pragma mark - Public + +- (void)setCrashCallbacks: (PLCrashReporterCallbacks *) callbacks { + _crashCallBacks = callbacks; +} + /** * Check if the debugger is attached * @@ -419,6 +426,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 /** @@ -690,6 +709,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]); @@ -885,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"]; 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 dfc471156a..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 @@ -31,8 +31,6 @@ #if HOCKEYSDK_FEATURE_CRASH_REPORTER -#import - @interface BITCrashManager () { } 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 f0c8748c63..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 @@ -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; +} /** @@ -249,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"]; } @@ -289,7 +302,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 +319,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 +378,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 +438,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]; @@ -511,11 +524,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 +616,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 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 c7d9390a90..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" @@ -28,6 +48,9 @@ @implementation BITFeedbackActivity +{ + UIViewController *_activityViewController; +} #pragma mark - NSObject @@ -92,22 +115,23 @@ } - (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)feedbackComposeViewControllerDidFinish:(BITFeedbackComposeViewController *)composeViewController { - [self activityDidFinish:YES]; +- (void)feedbackComposeViewController:(BITFeedbackComposeViewController *)composeViewController didFinishWithResult:(BITFeedbackComposeResult)composeResult { + [self activityDidFinish:composeResult == BITFeedbackComposeResultSubmitted]; } 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 22a7ceeded..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 @@ -178,7 +178,9 @@ } // background for deletion accessory view - [self addSubview:accessoryViewBackground]; + if (self.style == BITFeedbackListViewCellPresentatationStyleDefault) { + [self addSubview:accessoryViewBackground]; + } // header NSString *dateString = @""; 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 c1219b9f7a..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 @@ -37,8 +37,6 @@ #import "BITFeedbackManagerPrivate.h" #import "BITHockeyBaseManagerPrivate.h" -#import "BITHockeyManagerPrivate.h" - #import "BITHockeyHelper.h" #import "BITHockeyAppClient.h" @@ -883,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/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 9614ecefa8..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 @@ -35,7 +35,6 @@ #import "BITHockeyBaseManagerPrivate.h" #import "BITHockeyBaseViewController.h" -#import "BITHockeyManagerPrivate.h" #import "BITKeychainUtils.h" #import @@ -162,7 +161,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 +174,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; @@ -193,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; @@ -202,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]; } diff --git a/Classes/BITHockeyBaseManagerPrivate.h b/Classes/BITHockeyBaseManagerPrivate.h index 23f784a92e..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 @@ -48,6 +68,7 @@ - (NSString *)executableUUID; // UI helpers +- (UIWindow *)findVisibleWindow; - (UINavigationController *)customNavigationControllerWithRootViewController:(UIViewController *)viewController presentationStyle:(UIModalPresentationStyle)presentationStyle; - (void)showView:(UIViewController *)viewController; 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 1f39fdab29..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 @@ -32,7 +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); diff --git a/Classes/BITHockeyHelper.m b/Classes/BITHockeyHelper.m index 03311465e3..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 @@ -33,12 +33,13 @@ #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', '+', '/' -}; + +#if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000 +@interface NSData (BITHockeySDKiOS7) +- (NSString *)base64Encoding; +@end +#endif + #pragma mark NSString helpers @@ -59,61 +60,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:"); @@ -121,7 +67,10 @@ NSString *bit_base64String(NSData * data, unsigned long length) { return [data base64EncodedStringWithOptions:0]; } else { #endif - return bit_base64StringPreiOS7(data, length); +#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 @@ -278,7 +227,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 +370,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/Classes/BITHockeyManager.h b/Classes/BITHockeyManager.h index 5a64ad13fa..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 @@ -75,7 +75,7 @@ #pragma mark - Public Methods ///----------------------------------------------------------------------------- -/// @name Initializion +/// @name Initialization ///----------------------------------------------------------------------------- /** @@ -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 @@ -336,4 +367,37 @@ @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; + + +///----------------------------------------------------------------------------- +/// @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 a4b755035d..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 @@ -30,10 +30,10 @@ #import "HockeySDK.h" #import "HockeySDKPrivate.h" -#import "BITHockeyManagerPrivate.h" #import "BITHockeyBaseManagerPrivate.h" #import "BITHockeyHelper.h" +#import "BITHockeyAppClient.h" #if HOCKEYSDK_FEATURE_CRASH_REPORTER @@ -54,7 +54,6 @@ #if HOCKEYSDK_FEATURE_AUTHENTICATOR #import "BITAuthenticator_Private.h" -#import "BITHockeyAppClient.h" #endif /* HOCKEYSDK_FEATURE_AUTHENTICATOR */ @interface BITHockeyManager () @@ -70,12 +69,15 @@ @implementation BITHockeyManager { NSString *_appIdentifier; + NSString *_liveIdentifier; BOOL _validAppIdentifier; BOOL _startManagerIsInvoked; BOOL _startUpdateManagerIsInvoked; + + BITHockeyAppClient *_hockeyAppClient; } #pragma mark - Private Class Methods @@ -122,6 +124,8 @@ _serverURL = nil; _delegate = nil; + _hockeyAppClient = nil; + _disableCrashManager = NO; _disableUpdateManager = NO; _disableFeedbackManager = NO; @@ -132,6 +136,7 @@ _startManagerIsInvoked = NO; _startUpdateManagerIsInvoked = NO; + _liveIdentifier = nil; _installString = bit_appAnonID(); #if !TARGET_IPHONE_SIMULATOR @@ -149,6 +154,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]; @@ -162,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]) { @@ -298,12 +310,67 @@ aServerURL = [NSString stringWithFormat:@"%@/", aServerURL]; } -#if HOCKEYSDK_FEATURE_AUTHENTICATOR if (_serverURL != aServerURL) { _serverURL = [aServerURL copy]; - _authenticator.hockeyAppClient.baseURL = [NSURL URLWithString:_serverURL ? _serverURL : BITHOCKEYSDK_URL]; + + if (_hockeyAppClient) { + _hockeyAppClient.baseURL = [NSURL URLWithString:_serverURL ? _serverURL : BITHOCKEYSDK_URL]; + } } +} + + +- (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 */ + } +} + +- (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]; + } +} + + +- (NSString *)version { + return BITHOCKEY_VERSION; +} + +- (NSString *)build { + return BITHOCKEY_BUILD; } @@ -340,6 +407,73 @@ #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 appIdentifier:(NSString *)appIdentifier { + 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, + @"sdk": BITHOCKEY_NAME, + @"sdk_version": BITHOCKEY_VERSION, + @"bundle_version": [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"] + } + 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) { @@ -424,11 +558,14 @@ _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.hockeyAppClient = [self hockeyAppClient]; _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 +577,15 @@ [self performSelector:@selector(configureJMC) withObject:nil afterDelay:0]; } #endif /* HOCKEYSDK_FEATURE_JIRA_MOBILE_CONNECT */ - + +#endif /* HOCKEYSDK_FEATURE_UPDATES */ + + if (![self isAppStoreEnvironment]) { + NSString *integrationFlowTime = [self integrationFlowTimeString]; + if (integrationFlowTime && [self integrationFlowStartedWithTimeString:integrationFlowTime]) { + [self pingServerForIntegrationStartWorkflowWithTimeString:integrationFlowTime appIdentifier:_appIdentifier]; + } + } } else { [self logInvalidIdentifier:@"app identifier"]; } 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/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/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 2d14ccbc65..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 @@ -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/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 6013fe1a4a..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. * @@ -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 62c591f0d1..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. * @@ -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; @@ -70,6 +74,9 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { NSNumber *_versionID; NSString *_versionUUID; NSString *_uuid; + + NSString *_blockingScreenMessage; + NSDate *_lastUpdateCheckFromBlockingScreen; } @@ -187,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]; @@ -200,10 +209,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 +228,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 { @@ -339,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 @@ -384,6 +404,7 @@ typedef NS_ENUM(NSInteger, BITUpdateAlertViewTag) { _checkForTracker = NO; _firstStartAfterInstall = NO; _companyName = nil; + _currentAppVersionUsageTime = @0; // set defaults self.showDirectInstallOption = NO; @@ -411,10 +432,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]; @@ -458,7 +495,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] || [self expiryDateReached]) { + [updateViewController setMandatoryUpdate: YES]; + } + [self showView:updateViewController]; } @@ -472,7 +514,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]; @@ -520,16 +562,27 @@ 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 = 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]; @@ -538,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 { @@ -547,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]; } @@ -752,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 @@ -770,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); @@ -849,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; } @@ -959,22 +1038,29 @@ 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) { - [self alertFallback:[alertView message]]; + if ([alertView tag] == BITUpdateAlertViewTagNeverEndingAlertView) { + 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]; + } } } 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 17b8dd05ff..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. * @@ -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/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 1f0968e5e2..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. * @@ -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..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. * @@ -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; 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.h b/Classes/HockeySDKPrivate.h index 2b694b9c66..aad75baafd 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" @@ -56,6 +58,8 @@ #define kBITStoreUpdateLastUUID @"BITStoreUpdateLastUUID" #define kBITStoreUpdateIgnoreVersion @"BITStoreUpdateIgnoredVersion" +#define BITHOCKEY_INTEGRATIONFLOW_TIMESTAMP @"BITIntegrationFlowStartTimestamp" + #define BITHOCKEYSDK_BUNDLE @"HockeySDKResources.bundle" #define BITHOCKEYSDK_URL @"https://sdk.hockeyapp.net/" @@ -67,21 +71,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 diff --git a/Classes/HockeySDKPrivate.m b/Classes/HockeySDKPrivate.m index 6307434adf..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. * @@ -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; } 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/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 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/Resources/de.lproj/HockeySDK.strings b/Resources/de.lproj/HockeySDK.strings index dd3d6342b7..8a4b45b734 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"; @@ -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 2b8e620795..25229c843d 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"; @@ -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 c9b1276bdd..514fd282f8 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"; @@ -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 3fe5bd098e..a231bf4f4d 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"; @@ -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 682ddc7a5e..9f5a7520c8 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"; @@ -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 8ba8262fd8..7ecaea350b 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ó"; @@ -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 eb485608bb..75753bab84 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"; @@ -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 4f22449ac5..4532f8a583 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" = "パスワード"; @@ -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 a3a508f56a..0d37d47206 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"; @@ -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 31c8e476c9..70928c4dcb 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"; @@ -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 4016350c71..1e09c89615 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"; @@ -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 dd8d561752..6c0225cf8d 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"; @@ -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 bb459e0329..da77e3f87b 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" = "Пароль"; @@ -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 36d530a99a..fc8859be3c 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" = "密码"; @@ -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 的开发人员。"; diff --git a/Support/HockeySDK.xcodeproj/project.pbxproj b/Support/HockeySDK.xcodeproj/project.pbxproj index 55a039f4e1..7f5b4a710c 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 = ""; }; @@ -544,6 +542,7 @@ indentWidth = 2; sourceTree = ""; tabWidth = 2; + usesTabs = 0; }; E400561B148D79B500EB22B9 /* Products */ = { isa = PBXGroup; @@ -589,7 +588,6 @@ 1E94F9DE16E912DD006570AD /* StoreUpdate */, E41EB465148D7BF50015DEDC /* BITHockeyManager.h */, E41EB466148D7BF50015DEDC /* BITHockeyManager.m */, - 1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */, 1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */, 1E71509A15B5C76F004E88FF /* HockeySDK.h */, 1E84DB3317E0977C00AC83FD /* HockeySDKFeatureConfig.h */, @@ -666,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 */, @@ -836,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\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\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; @@ -1131,6 +1128,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 +1263,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 +1298,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.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 */; -} 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"> + + + + + + + + + + + + + + diff --git a/Support/HockeySDKTests/BITAuthenticatorTests.m b/Support/HockeySDKTests/BITAuthenticatorTests.m index af68b0c490..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; } @@ -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)); @@ -259,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)); }]; } @@ -301,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; 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" diff --git a/Support/HockeySDKTests/BITHockeyAppClientTests.m b/Support/HockeySDKTests/BITHockeyAppClientTests.m index e9502e095b..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; } @@ -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 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; 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; } diff --git a/Support/buildnumber.xcconfig b/Support/buildnumber.xcconfig index c10975ce40..28a621bdeb 100644 --- a/Support/buildnumber.xcconfig +++ b/Support/buildnumber.xcconfig @@ -1,8 +1,8 @@ #include "HockeySDK.xcconfig" -BUILD_NUMBER = 23 -VERSION_STRING = 3.5.0 -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) BITHOCKEY_VERSION="@\""$(VERSION_STRING)"\"" +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 ARCHS = $(BIT_ARM_ARCHS) diff --git a/Vendor/CrashReporter.framework/Versions/A/CrashReporter b/Vendor/CrashReporter.framework/Versions/A/CrashReporter index b44e082e46..ef9fc8e724 100644 Binary files a/Vendor/CrashReporter.framework/Versions/A/CrashReporter and b/Vendor/CrashReporter.framework/Versions/A/CrashReporter differ diff --git a/Vendor/CrashReporter.framework/Versions/A/Headers/PLCrashFeatureConfig.h b/Vendor/CrashReporter.framework/Versions/A/Headers/PLCrashFeatureConfig.h index 6d9e16c4cb..a4880481e4 100644 --- a/Vendor/CrashReporter.framework/Versions/A/Headers/PLCrashFeatureConfig.h +++ b/Vendor/CrashReporter.framework/Versions/A/Headers/PLCrashFeatureConfig.h @@ -50,11 +50,10 @@ /* * For release builds, disable unused unwind implementations on targets that do not use them. For non-release - * builds, we include the unwind implementations to allow testing on a broader range of targets; it's possible - * that both compact and/or DWARF unwinding could be implemented by Apple for iOS/ARM in the future. + * builds, we include the unwind implementations to allow testing on a broader range of targets. */ #ifdef PLCF_RELEASE_BUILD -# if TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR +# if defined(__arm__) # ifndef PLCRASH_FEATURE_UNWIND_DWARF # define PLCRASH_FEATURE_UNWIND_DWARF 0 # endif @@ -88,13 +87,13 @@ #endif #ifndef PLCRASH_FEATURE_UNWIND_DWARF -/** If true, enable DWARF unwinding support. DWARF unwinding is currently only used by Mac OS X. */ +/** If true, enable DWARF unwinding support. */ # define PLCRASH_FEATURE_UNWIND_DWARF 1 #endif #ifndef PLCRASH_FEATURE_UNWIND_COMPACT -/** If true, enable compact unwinding support. This is only used by Mac OS X. */ +/** If true, enable compact unwinding support. */ # define PLCRASH_FEATURE_UNWIND_COMPACT 1 #endif diff --git a/Vendor/CrashReporter.framework/Versions/A/Resources/Info.plist b/Vendor/CrashReporter.framework/Versions/A/Resources/Info.plist index 367ca4f9c7..c147c0f734 100644 --- a/Vendor/CrashReporter.framework/Versions/A/Resources/Info.plist +++ b/Vendor/CrashReporter.framework/Versions/A/Resources/Info.plist @@ -3,7 +3,7 @@ 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 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