diff --git a/Classes/BITAttributedLabel.m b/Classes/BITAttributedLabel.m
index 64f9795d..e4dfa79f 100644
--- a/Classes/BITAttributedLabel.m
+++ b/Classes/BITAttributedLabel.m
@@ -957,41 +957,41 @@ - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
- if (self.activeLink) {
+ NSTextCheckingResult *activeLink = self.activeLink;
+ if (activeLink) {
UITouch *touch = [touches anyObject];
- if (self.activeLink == [self linkAtPoint:[touch locationInView:self]]) {
- [self setLinkActive:NO withTextCheckingResult:self.activeLink];
+ if (activeLink == [self linkAtPoint:[touch locationInView:self]]) {
+ [self setLinkActive:NO withTextCheckingResult:activeLink];
if (!self.delegate) {
return;
}
- NSTextCheckingResult *result = self.activeLink;
- switch (result.resultType) {
+ switch (activeLink.resultType) {
case NSTextCheckingTypeLink:
if ([self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithURL:)]) {
- [self.delegate attributedLabel:self didSelectLinkWithURL:result.URL];
+ [self.delegate attributedLabel:self didSelectLinkWithURL:activeLink.URL];
return;
}
break;
case NSTextCheckingTypeAddress:
if ([self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithAddress:)]) {
- [self.delegate attributedLabel:self didSelectLinkWithAddress:result.addressComponents];
+ [self.delegate attributedLabel:self didSelectLinkWithAddress:activeLink.addressComponents];
return;
}
break;
case NSTextCheckingTypePhoneNumber:
if ([self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithPhoneNumber:)]) {
- [self.delegate attributedLabel:self didSelectLinkWithPhoneNumber:result.phoneNumber];
+ [self.delegate attributedLabel:self didSelectLinkWithPhoneNumber:activeLink.phoneNumber];
return;
}
break;
case NSTextCheckingTypeDate:
- if (result.timeZone && [self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithDate:timeZone:duration:)]) {
- [self.delegate attributedLabel:self didSelectLinkWithDate:result.date timeZone:result.timeZone duration:result.duration];
+ if (activeLink.timeZone && [self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithDate:timeZone:duration:)]) {
+ [self.delegate attributedLabel:self didSelectLinkWithDate:activeLink.date timeZone:activeLink.timeZone duration:activeLink.duration];
return;
} else if ([self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithDate:)]) {
- [self.delegate attributedLabel:self didSelectLinkWithDate:result.date];
+ [self.delegate attributedLabel:self didSelectLinkWithDate:activeLink.date];
return;
}
break;
@@ -1001,7 +1001,7 @@ - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
// Fallback to `attributedLabel:didSelectLinkWithTextCheckingResult:` if no other delegate method matched.
if ([self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithTextCheckingResult:)]) {
- [self.delegate attributedLabel:self didSelectLinkWithTextCheckingResult:result];
+ [self.delegate attributedLabel:self didSelectLinkWithTextCheckingResult:activeLink];
}
}
} else {
diff --git a/Classes/BITCrashManager.m b/Classes/BITCrashManager.m
index 21408ba9..1b766bcc 100644
--- a/Classes/BITCrashManager.m
+++ b/Classes/BITCrashManager.m
@@ -197,19 +197,19 @@ - (void)setCrashManagerStatus:(BITCrashManagerStatus)crashManagerStatus {
* This saves the list of approved crash reports
*/
- (void)saveSettings {
- NSString *errorString = nil;
+ NSError *error = nil;
NSMutableDictionary *rootObj = [NSMutableDictionary dictionaryWithCapacity:2];
if (_approvedCrashReports && [_approvedCrashReports count] > 0) {
[rootObj setObject:_approvedCrashReports forKey:kBITCrashApprovedReports];
}
- NSData *plist = [NSPropertyListSerialization dataFromPropertyList:(id)rootObj
- format:NSPropertyListBinaryFormat_v1_0
- errorDescription:&errorString];
+
+ NSData *plist = [NSPropertyListSerialization dataWithPropertyList:(id)rootObj format:NSPropertyListBinaryFormat_v1_0 options:0 error:&error];
+
if (plist) {
[plist writeToFile:_settingsFile atomically:YES];
} else {
- BITHockeyLog(@"ERROR: Writing settings. %@", errorString);
+ BITHockeyLog(@"ERROR: Writing settings. %@", [error description]);
}
}
@@ -219,7 +219,7 @@ - (void)saveSettings {
* This contains the list of approved crash reports
*/
- (void)loadSettings {
- NSString *errorString = nil;
+ NSError *error = nil;
NSPropertyListFormat format;
if (![_fileManager fileExistsAtPath:_settingsFile])
@@ -228,10 +228,10 @@ - (void)loadSettings {
NSData *plist = [NSData dataWithContentsOfFile:_settingsFile];
if (plist) {
NSDictionary *rootObj = (NSDictionary *)[NSPropertyListSerialization
- propertyListFromData:plist
- mutabilityOption:NSPropertyListMutableContainersAndLeaves
+ propertyListWithData:plist
+ options:NSPropertyListMutableContainersAndLeaves
format:&format
- errorDescription:&errorString];
+ error:&error];
if ([rootObj objectForKey:kBITCrashApprovedReports])
[_approvedCrashReports setDictionary:[rootObj objectForKey:kBITCrashApprovedReports]];
@@ -689,7 +689,6 @@ - (void)storeMetaDataForCrashReportFilename:(NSString *)filename {
NSError *error = NULL;
NSMutableDictionary *metaDict = [NSMutableDictionary dictionaryWithCapacity:4];
NSString *applicationLog = @"";
- NSString *errorString = nil;
[self addStringValueToKeychain:[self userNameForCrashReport] forKey:[NSString stringWithFormat:@"%@.%@", filename, kBITCrashMetaUserName]];
[self addStringValueToKeychain:[self userEmailForCrashReport] forKey:[NSString stringWithFormat:@"%@.%@", filename, kBITCrashMetaUserEmail]];
@@ -708,9 +707,10 @@ - (void)storeMetaDataForCrashReportFilename:(NSString *)filename {
}
}
- NSData *plist = [NSPropertyListSerialization dataFromPropertyList:(id)metaDict
+ NSData *plist = [NSPropertyListSerialization dataWithPropertyList:(id)metaDict
format:NSPropertyListBinaryFormat_v1_0
- errorDescription:&errorString];
+ options:0
+ error:&error];
if (plist) {
[plist writeToFile:[_crashesDir stringByAppendingPathComponent: [filename stringByAppendingPathExtension:@"meta"]] atomically:YES];
} else {
@@ -1173,7 +1173,7 @@ - (void)createCrashReportForAppKill {
NSString *fakeReportFilename = [NSString stringWithFormat: @"%.0f", [NSDate timeIntervalSinceReferenceDate]];
- NSString *errorString = nil;
+ NSError *error = nil;
NSMutableDictionary *rootObj = [NSMutableDictionary dictionaryWithCapacity:2];
[rootObj setObject:fakeReportUUID forKey:kBITFakeCrashUUID];
@@ -1196,15 +1196,16 @@ - (void)createCrashReportForAppKill {
appBuild:fakeReportAppVersion
];
- NSData *plist = [NSPropertyListSerialization dataFromPropertyList:(id)rootObj
+ NSData *plist = [NSPropertyListSerialization dataWithPropertyList:(id)rootObj
format:NSPropertyListBinaryFormat_v1_0
- errorDescription:&errorString];
+ options:0
+ error:&error];
if (plist) {
if ([plist writeToFile:[_crashesDir stringByAppendingPathComponent:[fakeReportFilename stringByAppendingPathExtension:@"fake"]] atomically:YES]) {
[self storeMetaDataForCrashReportFilename:fakeReportFilename];
}
} else {
- BITHockeyLog(@"ERROR: Writing fake crash report. %@", errorString);
+ BITHockeyLog(@"ERROR: Writing fake crash report. %@", [error description]);
}
}
@@ -1240,15 +1241,14 @@ - (void)sendNextCrashReport {
NSString *appBinaryUUIDs = nil;
NSString *metaFilename = nil;
- NSString *errorString = nil;
NSPropertyListFormat format;
if ([[cacheFilename pathExtension] isEqualToString:@"fake"]) {
NSDictionary *fakeReportDict = (NSDictionary *)[NSPropertyListSerialization
- propertyListFromData:crashData
- mutabilityOption:NSPropertyListMutableContainersAndLeaves
+ propertyListWithData:crashData
+ options:NSPropertyListMutableContainersAndLeaves
format:&format
- errorDescription:&errorString];
+ error:&error];
crashLogString = [fakeReportDict objectForKey:kBITFakeCrashReport];
crashUUID = [fakeReportDict objectForKey:kBITFakeCrashUUID];
@@ -1307,10 +1307,10 @@ - (void)sendNextCrashReport {
NSData *plist = [NSData dataWithContentsOfFile:[_crashesDir stringByAppendingPathComponent:metaFilename]];
if (plist) {
NSDictionary *metaDict = (NSDictionary *)[NSPropertyListSerialization
- propertyListFromData:plist
- mutabilityOption:NSPropertyListMutableContainersAndLeaves
+ propertyListWithData:plist
+ options:NSPropertyListMutableContainersAndLeaves
format:&format
- errorDescription:&errorString];
+ error:&error];
username = [self stringValueFromKeychainForKey:[NSString stringWithFormat:@"%@.%@", cacheFilename, kBITCrashMetaUserName]] ?: @"";
useremail = [self stringValueFromKeychainForKey:[NSString stringWithFormat:@"%@.%@", cacheFilename, kBITCrashMetaUserEmail]] ?: @"";
@@ -1330,7 +1330,7 @@ - (void)sendNextCrashReport {
}
}
- crashXML = [NSString stringWithFormat:@"%@%@%@%@%@%@%@%@%@%@%@%@",
+ crashXML = [NSString stringWithFormat:@"%@%@%@%@%@%@%@%@%@%@%@",
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleExecutable"],
appBinaryUUIDs,
appBundleIdentifier,
@@ -1468,10 +1468,10 @@ - (void)sendCrashReportWithFilename:(NSString *)filename xml:(NSString*)xml atta
[strongSelf cleanCrashReportWithFilename:filename];
// HockeyApp uses PList XML format
- NSMutableDictionary *response = [NSPropertyListSerialization propertyListFromData:responseData
- mutabilityOption:NSPropertyListMutableContainersAndLeaves
+ NSMutableDictionary *response = [NSPropertyListSerialization propertyListWithData:responseData
+ options:NSPropertyListMutableContainersAndLeaves
format:nil
- errorDescription:NULL];
+ error:&error];
BITHockeyLog(@"INFO: Received API response: %@", response);
if (strongSelf.delegate != nil &&
diff --git a/Classes/BITCrashReportTextFormatter.m b/Classes/BITCrashReportTextFormatter.m
index 01c9ea68..02a1a629 100644
--- a/Classes/BITCrashReportTextFormatter.m
+++ b/Classes/BITCrashReportTextFormatter.m
@@ -539,8 +539,13 @@ + (NSString *)stringValueForCrashReport:(BITPLCrashReport *)report crashReporter
NSString *imagePath = [imageInfo.imageName stringByStandardizingPath];
NSString *appBundleContentsPath = [[report.processInfo.processPath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent];
- if ([imagePath isEqual: report.processInfo.processPath] || [imagePath hasPrefix:appBundleContentsPath])
- binaryDesignator = @"+";
+ // exclude iOS swift dylibs
+ if ([imageInfo.imageName rangeOfString:@".app/Frameworks/libswift"].location == NSNotFound) {
+ if ([imagePath isEqual: report.processInfo.processPath] ||
+ [imagePath hasPrefix:appBundleContentsPath] ||
+ [imageInfo.imageName hasPrefix:appBundleContentsPath]) // Fix issue with iOS 8 `stringByStandardizingPath` removing leading `/private` path (when not running in the debugger only)
+ binaryDesignator = @"+";
+ }
/* base_address - terminating_address [designator]file_name arch file_path */
NSString *fmt = nil;
diff --git a/Classes/BITFeedbackComposeViewController.m b/Classes/BITFeedbackComposeViewController.m
index b3b3565f..3c6be199 100644
--- a/Classes/BITFeedbackComposeViewController.m
+++ b/Classes/BITFeedbackComposeViewController.m
@@ -144,9 +144,17 @@ - (void)keyboardWasShown:(NSNotification*)aNotification {
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
+ BOOL isPortraitOrientation = NO;
+
+#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
+ isPortraitOrientation = UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]);
+#else
+ isPortraitOrientation = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
+#endif
+
CGRect frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) {
- if (!bit_isPreiOS8Environment() || UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
+ if (!bit_isPreiOS8Environment() || isPortraitOrientation) {
frame.size.height -= kbSize.height;
} else {
frame.size.height -= kbSize.width;
@@ -156,7 +164,7 @@ - (void)keyboardWasShown:(NSNotification*)aNotification {
CGFloat windowHeight = windowSize.height - 20;
CGFloat navBarHeight = self.navigationController.navigationBar.frame.size.height;
- if (!bit_isPreiOS8Environment() || UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
+ if (!bit_isPreiOS8Environment() || isPortraitOrientation) {
CGFloat modalGap = (windowHeight - self.view.bounds.size.height) / 2;
frame.size.height = windowHeight - navBarHeight - kbSize.height;
if (bit_isPreiOS8Environment()) {
@@ -261,7 +269,7 @@ - (void)viewWillAppear:(BOOL)animated {
[[UIApplication sharedApplication] setStatusBarStyle:(self.navigationController.navigationBar.barStyle == UIBarStyleDefault) ? UIStatusBarStyleDefault : UIStatusBarStyleBlackOpaque];
#endif
- if (_text) {
+ if (_text && self.textView.text.length == 0) {
self.textView.text = _text;
}
diff --git a/Classes/BITFeedbackListViewCell.m b/Classes/BITFeedbackListViewCell.m
index 2e9519a0..d55e2789 100644
--- a/Classes/BITFeedbackListViewCell.m
+++ b/Classes/BITFeedbackListViewCell.m
@@ -134,7 +134,12 @@ - (UIColor *)backgroundColor {
- (BOOL)isSameDayWithDate1:(NSDate*)date1 date2:(NSDate*)date2 {
NSCalendar* calendar = [NSCalendar currentCalendar];
+#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
+ unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
+#else
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
+#endif
+
NSDateComponents *dateComponent1 = [calendar components:unitFlags fromDate:date1];
NSDateComponents *dateComponent2 = [calendar components:unitFlags fromDate:date2];
diff --git a/Classes/BITFeedbackManager.h b/Classes/BITFeedbackManager.h
index b7902964..c9fe10e3 100644
--- a/Classes/BITFeedbackManager.h
+++ b/Classes/BITFeedbackManager.h
@@ -72,7 +72,7 @@ typedef NS_ENUM(NSInteger, BITFeedbackObservationMode) {
*/
BITFeedbackObservationModeOnScreenshot = 1,
/**
- * Triggers when the user taps with three fingers for three seconds on the screen.
+ * Triggers when the user taps with three fingers on the screen.
*/
BITFeedbackObservationModeThreeFingerTap = 2
};
diff --git a/Classes/BITFeedbackManager.m b/Classes/BITFeedbackManager.m
index b9fa70cb..86222ed1 100644
--- a/Classes/BITFeedbackManager.m
+++ b/Classes/BITFeedbackManager.m
@@ -1088,7 +1088,9 @@ - (void)setFeedbackObservationMode:(BITFeedbackObservationMode)feedbackObservati
self.tapRecognizer.delegate = self;
dispatch_async(dispatch_get_main_queue(), ^{
- [[UIApplication sharedApplication].keyWindow addGestureRecognizer:self.tapRecognizer];
+ if (self.tapRecognizer) {
+ [[UIApplication sharedApplication].keyWindow addGestureRecognizer:self.tapRecognizer];
+ }
});
}
@@ -1103,7 +1105,10 @@ - (void)setFeedbackObservationMode:(BITFeedbackObservationMode)feedbackObservati
}
-(void)screenshotNotificationReceived:(NSNotification *)notification {
- dispatch_async(dispatch_get_main_queue(), ^{
+ double amountOfSeconds = 0.5;
+ dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(amountOfSeconds * NSEC_PER_SEC));
+
+ dispatch_after(delayTime, dispatch_get_main_queue(), ^{
[self extractLastPictureFromLibraryAndLaunchFeedback];
});
}
diff --git a/Classes/BITHockeyBaseManager.m b/Classes/BITHockeyBaseManager.m
index 818f7158..96b34639 100644
--- a/Classes/BITHockeyBaseManager.m
+++ b/Classes/BITHockeyBaseManager.m
@@ -33,7 +33,9 @@
#import "BITHockeyBaseManager.h"
#import "BITHockeyBaseManagerPrivate.h"
+#if HOCKEYSDK_FEATURE_AUTHENTICATOR || HOCKEYSDK_FEATURE_UPDATES || HOCKEYSDK_FEATURE_FEEDBACK
#import "BITHockeyBaseViewController.h"
+#endif
#import "BITKeychainUtils.h"
@@ -199,6 +201,9 @@ - (UINavigationController *)customNavigationControllerWithRootViewController:(UI
}
- (void)showView:(UIViewController *)viewController {
+ // if we compile Crash only, then BITHockeyBaseViewController is not included
+ // in the headers and will cause a warning with the modulemap file
+#if HOCKEYSDK_FEATURE_AUTHENTICATOR || HOCKEYSDK_FEATURE_UPDATES || HOCKEYSDK_FEATURE_FEEDBACK
UIViewController *parentViewController = nil;
if ([[BITHockeyManager sharedHockeyManager].delegate respondsToSelector:@selector(viewControllerForHockeyManager:componentManager:)]) {
@@ -259,6 +264,7 @@ - (void)showView:(UIViewController *)viewController {
[(BITHockeyBaseViewController *)viewController setModalAnimated:NO];
[visibleWindow addSubview:_navController.view];
}
+#endif
}
- (BOOL)addStringValueToKeychain:(NSString *)stringValue forKey:(NSString *)key {
diff --git a/Classes/BITHockeyHelper.m b/Classes/BITHockeyHelper.m
index 8da51ca0..45ae60c9 100644
--- a/Classes/BITHockeyHelper.m
+++ b/Classes/BITHockeyHelper.m
@@ -195,20 +195,23 @@ NSComparisonResult bit_versionCompare(NSString *stringA, NSString *stringB) {
// first check if we already have an install string in the keychain
NSString *appAnonIDKey = @"appAnonID";
- NSError *error = nil;
+ __block NSError *error = nil;
appAnonID = [BITKeychainUtils getPasswordForUsername:appAnonIDKey andServiceName:bit_keychainHockeySDKServiceName() error:&error];
if (!appAnonID) {
appAnonID = bit_UUID();
-
// store this UUID in the keychain (on this device only) so we can be sure to always have the same ID upon app startups
if (appAnonID) {
- [BITKeychainUtils storeUsername:appAnonIDKey
- andPassword:appAnonID
- forServiceName:bit_keychainHockeySDKServiceName()
- updateExisting:YES
- accessibility:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
- error:&error];
+ // add to keychain in a background thread, since we got reports that storing to the keychain may take several seconds sometimes and cause the app to be killed
+ // and we don't care about the result anyway
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
+ [BITKeychainUtils storeUsername:appAnonIDKey
+ andPassword:appAnonID
+ forServiceName:bit_keychainHockeySDKServiceName()
+ updateExisting:YES
+ accessibility:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
+ error:&error];
+ });
}
}
});
diff --git a/Classes/BITImageAnnotationViewController.m b/Classes/BITImageAnnotationViewController.m
index 14069964..3fc15cb6 100644
--- a/Classes/BITImageAnnotationViewController.m
+++ b/Classes/BITImageAnnotationViewController.m
@@ -113,8 +113,13 @@ - (void)viewDidLoad {
self.imageView.userInteractionEnabled = YES;
+#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
+ self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc ] initWithImage:bit_imageNamed(@"Cancel.png", BITHOCKEYSDK_BUNDLE) landscapeImagePhone:bit_imageNamed(@"Cancel.png", BITHOCKEYSDK_BUNDLE) style:UIBarButtonItemStylePlain target:self action:@selector(discard:)];
+ self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc ] initWithImage:bit_imageNamed(@"Ok.png", BITHOCKEYSDK_BUNDLE) landscapeImagePhone:bit_imageNamed(@"Ok.png", BITHOCKEYSDK_BUNDLE) style:UIBarButtonItemStylePlain target:self action:@selector(save:)];
+#else
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc ] initWithImage:bit_imageNamed(@"Cancel.png", BITHOCKEYSDK_BUNDLE) landscapeImagePhone:bit_imageNamed(@"Cancel.png", BITHOCKEYSDK_BUNDLE) style:UIBarButtonItemStyleBordered target:self action:@selector(discard:)];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc ] initWithImage:bit_imageNamed(@"Ok.png", BITHOCKEYSDK_BUNDLE) landscapeImagePhone:bit_imageNamed(@"Ok.png", BITHOCKEYSDK_BUNDLE) style:UIBarButtonItemStyleBordered target:self action:@selector(save:)];
+#endif
self.view.autoresizesSubviews = NO;
}
diff --git a/Classes/BITUpdateManager.m b/Classes/BITUpdateManager.m
index f7e0c127..f5887885 100644
--- a/Classes/BITUpdateManager.m
+++ b/Classes/BITUpdateManager.m
@@ -113,6 +113,10 @@ - (void)didBecomeActiveActions {
// we only care about iOS 8 or later
if (bit_isPreiOS8Environment()) return;
+ if (self.delegate != nil && [self.delegate respondsToSelector:@selector(updateManagerWillExitApp:)]) {
+ [self.delegate updateManagerWillExitApp:self];
+ }
+
// for now we simply exit the app, later SDK versions might optionally show an alert with localized text
// describing the user to press the home button to start the update process
exit(0);
@@ -279,6 +283,7 @@ - (void)startUsage {
}
- (void)stopUsage {
+ if ([self isAppStoreEnvironment]) return;
if ([self expiryDateReached]) return;
double timeDifference = [[NSDate date] timeIntervalSinceReferenceDate] - [_usageStartTimestamp timeIntervalSinceReferenceDate];
@@ -288,6 +293,8 @@ - (void)stopUsage {
}
- (void) storeUsageTimeForCurrentVersion:(NSNumber *)usageTime {
+ if ([self isAppStoreEnvironment]) return;
+
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
diff --git a/Classes/BITUpdateManagerDelegate.h b/Classes/BITUpdateManagerDelegate.h
index 4d12646a..4a1ac9bf 100644
--- a/Classes/BITUpdateManagerDelegate.h
+++ b/Classes/BITUpdateManagerDelegate.h
@@ -106,6 +106,22 @@
- (BOOL)updateManagerShouldSendUsageData:(BITUpdateManager *)updateManager;
+///-----------------------------------------------------------------------------
+/// @name Privacy
+///-----------------------------------------------------------------------------
+
+/**
+ Invoked right before the app will exit to allow app update to start (>= iOS8 only)
+
+ The iOS installation mechanism only starts if the app the should be updated is currently
+ not running. On all iOS versions up to iOS 7, the system did automatically exit the app
+ in these cases. Since iOS 8 this isn't done any longer.
+
+ @param updateManager The `BITUpdateManager` instance invoking this delegate
+ */
+- (void)updateManagerWillExitApp:(BITUpdateManager *)updateManager;
+
+
#pragma mark - Deprecated
///-----------------------------------------------------------------------------
diff --git a/Classes/HockeySDKPrivate.h b/Classes/HockeySDKPrivate.h
index 49d48646..49b9d283 100644
--- a/Classes/HockeySDKPrivate.h
+++ b/Classes/HockeySDKPrivate.h
@@ -75,6 +75,10 @@ NSBundle *BITHockeyBundle(void);
NSString *BITHockeyLocalizedString(NSString *stringToken);
NSString *BITHockeyMD5(NSString *str);
+#ifndef __IPHONE_8_0
+#define __IPHONE_8_0 80000
+#endif
+
#ifdef __IPHONE_6_0
#define kBITTextLabelAlignmentCenter NSTextAlignmentCenter
diff --git a/HockeySDK.podspec b/HockeySDK.podspec
index 64467acf..54f6ac61 100644
--- a/HockeySDK.podspec
+++ b/HockeySDK.podspec
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'HockeySDK'
- s.version = '3.6.1'
+ s.version = '3.6.2'
s.summary = 'Collect live crash reports, get feedback from your users, distribute your betas, and analyze your test coverage with HockeyApp.'
s.description = <<-DESC
@@ -12,7 +12,7 @@ Pod::Spec.new do |s|
DESC
s.homepage = 'http://hockeyapp.net/'
- s.documentation_url = 'http://hockeyapp.net/help/sdk/ios/3.6.1/'
+ s.documentation_url = 'http://hockeyapp.net/help/sdk/ios/3.6.2/'
s.license = 'MIT'
s.author = { 'Andreas Linde' => 'mail@andreaslinde.de', 'Thomas Dohmke' => "thomas@dohmke.de" }
@@ -24,7 +24,7 @@ Pod::Spec.new do |s|
s.frameworks = 'AssetsLibrary', 'CoreText', 'CoreGraphics', 'MobileCoreServices', 'QuartzCore', 'QuickLook', 'Security', 'SystemConfiguration', 'UIKit'
s.ios.vendored_frameworks = 'Vendor/CrashReporter.framework'
- s.xcconfig = {'GCC_PREPROCESSOR_DEFINITIONS' => %{$(inherited) BITHOCKEY_VERSION="@\\"#{s.version}\\"" BITHOCKEY_C_VERSION="\\"#{s.version}\\"" BITHOCKEY_BUILD="@\\"34\\"" BITHOCKEY_C_BUILD="\\"34\\""} }
+ s.xcconfig = {'GCC_PREPROCESSOR_DEFINITIONS' => %{$(inherited) BITHOCKEY_VERSION="@\\"#{s.version}\\"" BITHOCKEY_C_VERSION="\\"#{s.version}\\"" BITHOCKEY_BUILD="@\\"35\\"" BITHOCKEY_C_BUILD="\\"35\\""} }
s.resource_bundle = { 'HockeySDKResources' => ['Resources/*.png', 'Resources/*.lproj'] }
s.preserve_paths = 'Resources', 'Support'
diff --git a/README.md b/README.md
index 90c6ecc9..7b6164b5 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-## Version 3.6.1
+## Version 3.6.2
-- [Changelog](http://www.hockeyapp.net/help/sdk/ios/3.6.1/docs/docs/Changelog.html)
+- [Changelog](http://www.hockeyapp.net/help/sdk/ios/3.6.2/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.6.1/docs/docs/Guide-Installation-Setup.html) (Recommended)
-- [Installation & Setup Advanced](http://www.hockeyapp.net/help/sdk/ios/3.6.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.6.1/docs/docs/HowTo-Authenticating-Users-on-iOS.html)
-- [Migration from previous SDK Versions](http://www.hockeyapp.net/help/sdk/ios/3.6.1/docs/docs/Guide-Migration-Kits.html)
+- [Installation & Setup](http://www.hockeyapp.net/help/sdk/ios/3.6.2/docs/docs/Guide-Installation-Setup.html) (Recommended)
+- [Installation & Setup Advanced](http://www.hockeyapp.net/help/sdk/ios/3.6.2/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.6.2/docs/docs/HowTo-Authenticating-Users-on-iOS.html)
+- [Migration from previous SDK Versions](http://www.hockeyapp.net/help/sdk/ios/3.6.2/docs/docs/Guide-Migration-Kits.html)
## Xcode Documentation
@@ -47,4 +47,4 @@ This documentation provides integrated help in Xcode for all public APIs and a s
3. Copy the content into ~`/Library/Developer/Shared/Documentation/DocSets`
-The documentation is also available via the following URL: [http://hockeyapp.net/help/sdk/ios/3.6.1/](http://hockeyapp.net/help/sdk/ios/3.6.1/)
+The documentation is also available via the following URL: [http://hockeyapp.net/help/sdk/ios/3.6.2/](http://hockeyapp.net/help/sdk/ios/3.6.2/)
diff --git a/Resources/feedbackActiviy.png b/Resources/feedbackActiviy.png
deleted file mode 100644
index cb8faf4d..00000000
Binary files a/Resources/feedbackActiviy.png and /dev/null differ
diff --git a/Resources/feedbackActiviy@2x.png b/Resources/feedbackActiviy@2x.png
deleted file mode 100644
index 3868d59c..00000000
Binary files a/Resources/feedbackActiviy@2x.png and /dev/null differ
diff --git a/Support/HockeySDK.xcodeproj/project.pbxproj b/Support/HockeySDK.xcodeproj/project.pbxproj
index 4dff5ac6..bf4a871f 100644
--- a/Support/HockeySDK.xcodeproj/project.pbxproj
+++ b/Support/HockeySDK.xcodeproj/project.pbxproj
@@ -88,7 +88,6 @@
1E4CD1E819D17EAD00019DD4 /* Cancel@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E4CD1E719D17EAD00019DD4 /* Cancel@3x.png */; };
1E4CD1EA19D17EB700019DD4 /* Ok@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E4CD1E919D17EB700019DD4 /* Ok@3x.png */; };
1E4CD1EC19D17EBE00019DD4 /* Rectangle@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E4CD1EB19D17EBE00019DD4 /* Rectangle@3x.png */; };
- 1E4CD1EE19D17ECF00019DD4 /* feedbackActivity@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E4CD1ED19D17ECF00019DD4 /* feedbackActivity@3x.png */; };
1E4CD1F019D17EE400019DD4 /* authorize_denied@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E4CD1EF19D17EE400019DD4 /* authorize_denied@3x.png */; };
1E5954D315B6F24A00A03429 /* BITHockeyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB466148D7BF50015DEDC /* BITHockeyManager.m */; };
1E5954DC15B6F24A00A03429 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E400561D148D79B500EB22B9 /* Foundation.framework */; };
@@ -117,6 +116,11 @@
1E7A45FC16F54FB5005B08F1 /* OCHamcrestIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E7A45FA16F54FB5005B08F1 /* OCHamcrestIOS.framework */; };
1E7A45FD16F54FB5005B08F1 /* OCMockitoIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E7A45FB16F54FB5005B08F1 /* OCMockitoIOS.framework */; };
1E84DB3417E099BA00AC83FD /* HockeySDKFeatureConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E84DB3317E0977C00AC83FD /* HockeySDKFeatureConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1E90D97F19DAD8A800188C43 /* feedbackActivity.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E90D97A19DAD8A800188C43 /* feedbackActivity.png */; };
+ 1E90D98019DAD8A800188C43 /* feedbackActivity@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E90D97B19DAD8A800188C43 /* feedbackActivity@2x.png */; };
+ 1E90D98119DAD8A800188C43 /* feedbackActivity@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E90D97C19DAD8A800188C43 /* feedbackActivity@2x~ipad.png */; };
+ 1E90D98219DAD8A800188C43 /* feedbackActivity@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E90D97D19DAD8A800188C43 /* feedbackActivity@3x.png */; };
+ 1E90D98319DAD8A800188C43 /* feedbackActivity~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E90D97E19DAD8A800188C43 /* feedbackActivity~ipad.png */; };
1E90FD7318EDB86400CF0417 /* BITCrashDetails.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E90FD7118EDB86400CF0417 /* BITCrashDetails.h */; settings = {ATTRIBUTES = (Public, ); }; };
1E90FD7418EDB86400CF0417 /* BITCrashDetails.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E90FD7218EDB86400CF0417 /* BITCrashDetails.m */; };
1E94F9E116E91330006570AD /* BITStoreUpdateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E94F9DF16E91330006570AD /* BITStoreUpdateManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -130,10 +134,6 @@
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 */; };
1EB92E731955C38C0093C8B6 /* BITHockeyAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB92E711955C38C0093C8B6 /* BITHockeyAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; };
1EB92E741955C38C0093C8B6 /* BITHockeyAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB92E721955C38C0093C8B6 /* BITHockeyAttachment.m */; };
@@ -278,7 +278,6 @@
1E4CD1E719D17EAD00019DD4 /* Cancel@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Cancel@3x.png"; sourceTree = ""; };
1E4CD1E919D17EB700019DD4 /* Ok@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Ok@3x.png"; sourceTree = ""; };
1E4CD1EB19D17EBE00019DD4 /* Rectangle@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Rectangle@3x.png"; sourceTree = ""; };
- 1E4CD1ED19D17ECF00019DD4 /* feedbackActivity@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActivity@3x.png"; sourceTree = ""; };
1E4CD1EF19D17EE400019DD4 /* authorize_denied@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "authorize_denied@3x.png"; 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; };
@@ -318,6 +317,11 @@
1E7A45FB16F54FB5005B08F1 /* OCMockitoIOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = OCMockitoIOS.framework; sourceTree = ""; };
1E7DE39619D44DC6009AB8E5 /* crashonly.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = crashonly.xcconfig; sourceTree = ""; };
1E84DB3317E0977C00AC83FD /* HockeySDKFeatureConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HockeySDKFeatureConfig.h; sourceTree = ""; };
+ 1E90D97A19DAD8A800188C43 /* feedbackActivity.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = feedbackActivity.png; sourceTree = ""; };
+ 1E90D97B19DAD8A800188C43 /* feedbackActivity@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActivity@2x.png"; sourceTree = ""; };
+ 1E90D97C19DAD8A800188C43 /* feedbackActivity@2x~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActivity@2x~ipad.png"; sourceTree = ""; };
+ 1E90D97D19DAD8A800188C43 /* feedbackActivity@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActivity@3x.png"; sourceTree = ""; };
+ 1E90D97E19DAD8A800188C43 /* feedbackActivity~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActivity~ipad.png"; sourceTree = ""; };
1E90FD7118EDB86400CF0417 /* BITCrashDetails.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashDetails.h; sourceTree = ""; };
1E90FD7218EDB86400CF0417 /* BITCrashDetails.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITCrashDetails.m; sourceTree = ""; };
1E91D84619B924E600E9616D /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; };
@@ -331,10 +335,6 @@
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 = ""; };
1EB92E711955C38C0093C8B6 /* BITHockeyAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyAttachment.h; sourceTree = ""; };
1EB92E721955C38C0093C8B6 /* BITHockeyAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyAttachment.m; sourceTree = ""; };
@@ -469,11 +469,11 @@
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 */,
- 1E4CD1ED19D17ECF00019DD4 /* feedbackActivity@3x.png */,
+ 1E90D97A19DAD8A800188C43 /* feedbackActivity.png */,
+ 1E90D97B19DAD8A800188C43 /* feedbackActivity@2x.png */,
+ 1E90D97C19DAD8A800188C43 /* feedbackActivity@2x~ipad.png */,
+ 1E90D97D19DAD8A800188C43 /* feedbackActivity@3x.png */,
+ 1E90D97E19DAD8A800188C43 /* feedbackActivity~ipad.png */,
);
name = Images;
sourceTree = "";
@@ -947,21 +947,20 @@
97F0F9FD18ABAECD00EF50AA /* iconCamera.png in Resources */,
9782023618F81BFC00A98D8B /* Cancel.png in Resources */,
9782023318F81BFC00A98D8B /* Arrow@2x.png in Resources */,
+ 1E90D98119DAD8A800188C43 /* feedbackActivity@2x~ipad.png in Resources */,
9782023818F81BFC00A98D8B /* Ok.png in Resources */,
+ 1E90D98219DAD8A800188C43 /* feedbackActivity@3x.png in Resources */,
1E5955CF15B71C8600A03429 /* IconGradient.png in Resources */,
1E5955D015B71C8600A03429 /* IconGradient@2x.png in Resources */,
+ 1E90D98019DAD8A800188C43 /* feedbackActivity@2x.png in Resources */,
9782023218F81BFC00A98D8B /* Arrow.png in Resources */,
9782023A18F81BFC00A98D8B /* Rectangle.png in Resources */,
- 1EAF20A8162DC0F600957B1D /* feedbackActivity@2x~ipad.png in Resources */,
- 1EAF20A9162DC0F600957B1D /* feedbackActivity~ipad.png in Resources */,
9782023918F81BFC00A98D8B /* Ok@2x.png in Resources */,
9782023418F81BFC00A98D8B /* Blur.png in Resources */,
- 1EAF20AA162DC0F600957B1D /* feedbackActiviy.png in Resources */,
- 1E4CD1EE19D17ECF00019DD4 /* feedbackActivity@3x.png in Resources */,
- 1EAF20AB162DC0F600957B1D /* feedbackActiviy@2x.png in Resources */,
9782023518F81BFC00A98D8B /* Blur@2x.png in Resources */,
1E1127C416580C87007067A2 /* buttonRoundedDelete.png in Resources */,
1E1127C516580C87007067A2 /* buttonRoundedDelete@2x.png in Resources */,
+ 1E90D97F19DAD8A800188C43 /* feedbackActivity.png in Resources */,
1E1127C616580C87007067A2 /* buttonRoundedDeleteHighlighted.png in Resources */,
9782023718F81BFC00A98D8B /* Cancel@2x.png in Resources */,
1E1127C716580C87007067A2 /* buttonRoundedDeleteHighlighted@2x.png in Resources */,
@@ -974,6 +973,7 @@
1E1127CA16580C87007067A2 /* buttonRoundedRegularHighlighted.png in Resources */,
1E1127CB16580C87007067A2 /* buttonRoundedRegularHighlighted@2x.png in Resources */,
1E4CD1EC19D17EBE00019DD4 /* Rectangle@3x.png in Resources */,
+ 1E90D98319DAD8A800188C43 /* feedbackActivity~ipad.png in Resources */,
1EB52FD5167B766100C801D5 /* HockeySDK.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
diff --git a/Support/HockeySDKTests/Licenses.txt b/Support/HockeySDKTests/Licenses.txt
new file mode 100644
index 00000000..2a70dd69
--- /dev/null
+++ b/Support/HockeySDKTests/Licenses.txt
@@ -0,0 +1,38 @@
+License for OCHamcrest.framework:
+
+OCHamcrest
+Copyright 2014 hamcrest.org
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+Neither the name of Hamcrest nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+
+License for OCMockito.framework:
+
+OCMockito
+Copyright (c) 2014 Jonathan M. Reid
+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.
+-----
+TPDWeakProxy:
+Copyright (c) 2013 Tetherpad
+
+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.
diff --git a/Support/buildnumber.xcconfig b/Support/buildnumber.xcconfig
index 54d47146..dce5fa67 100644
--- a/Support/buildnumber.xcconfig
+++ b/Support/buildnumber.xcconfig
@@ -1,7 +1,7 @@
#include "HockeySDK.xcconfig"
-BUILD_NUMBER = 34
-VERSION_STRING = 3.6.1
+BUILD_NUMBER = 35
+VERSION_STRING = 3.6.2
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) BITHOCKEY_VERSION="@\""$(VERSION_STRING)"\"" BITHOCKEY_BUILD="@\""$(BUILD_NUMBER)"\"" BITHOCKEY_C_VERSION="\""$(VERSION_STRING)"\"" BITHOCKEY_C_BUILD="\""$(BUILD_NUMBER)"\""
BIT_ARM_ARCHS = armv7 armv7s arm64
BIT_SIM_ARCHS = x86_64 i386
diff --git a/docs/Changelog-template.md b/docs/Changelog-template.md
index f940f1fd..d976c63d 100644
--- a/docs/Changelog-template.md
+++ b/docs/Changelog-template.md
@@ -1,3 +1,16 @@
+## Version 3.6.2
+
+- [UPDATE] Store anonymous UUID asynchronously into the keychain to work around rare keychain blocking behavior
+- [UPDATE] `BITCrashManager`: Improved detecting app specific binary images in crash report for improved crash grouping on the server
+- [UPDATE] `BITUpdateManager`: Added new `updateManagerWillExitApp` delegate method
+- [UPDATE] `BITUpdateManager`: Don't save any file when app was installed from App Store
+- [BUGFIX] `BITCrashManager`: Fixed issues with sending crash reports for apps with xml tags in the app name
+- [BUGFIX] `BITFeedbackManager`: Fixed screenshot trigger issue not always fetching the last taken image
+- [BUGFIX] `BITFeedbackManager`: Fixed compose view issue with predefined text
+- [BUGFIX] Fixed a warning when integrating the binary framework for only crash reporting
+- [BUGFIX] Fixed compiler warnings
+- [BUGFIX] Various additional fixes
+
## Version 3.6.1
- [BUGFIX] Fixed feedback compose view to correctly show the text in landscape on iOS 8
diff --git a/docs/Guide-Installation-Setup-Advanced-template.md b/docs/Guide-Installation-Setup-Advanced-template.md
index 67d2179c..a9f4d422 100644
--- a/docs/Guide-Installation-Setup-Advanced-template.md
+++ b/docs/Guide-Installation-Setup-Advanced-template.md
@@ -1,6 +1,6 @@
-## Version 3.6.1
+## Version 3.6.2
-- [Changelog](http://www.hockeyapp.net/help/sdk/ios/3.6.1/docs/docs/Changelog.html)
+- [Changelog](http://www.hockeyapp.net/help/sdk/ios/3.6.2/docs/docs/Changelog.html)
## Introduction
@@ -166,7 +166,7 @@ This documentation provides integrated help in Xcode for all public APIs and a s
3. Copy the content into ~`/Library/Developer/Shared/Documentation/DocSets`
-The documentation is also available via the following URL: [http://hockeyapp.net/help/sdk/ios/3.6.1/](http://hockeyapp.net/help/sdk/ios/3.6.1/)
+The documentation is also available via the following URL: [http://hockeyapp.net/help/sdk/ios/3.6.2/](http://hockeyapp.net/help/sdk/ios/3.6.2/)
### Set up with xcconfig
diff --git a/docs/Guide-Installation-Setup-template.md b/docs/Guide-Installation-Setup-template.md
index 3bc5dbeb..6078c758 100644
--- a/docs/Guide-Installation-Setup-template.md
+++ b/docs/Guide-Installation-Setup-template.md
@@ -1,6 +1,6 @@
-## Version 3.6.1
+## Version 3.6.2
-- [Changelog](http://www.hockeyapp.net/help/sdk/ios/3.6.1/docs/docs/Changelog.html)
+- [Changelog](http://www.hockeyapp.net/help/sdk/ios/3.6.2/docs/docs/Changelog.html)
## Introduction
@@ -144,7 +144,7 @@ This documentation provides integrated help in Xcode for all public APIs and a s
1. Copy `de.bitstadium.HockeySDK-iOS-3.6.1.docset` into ~`/Library/Developer/Shared/Documentation/DocSets`
-The documentation is also available via the following URL: [http://hockeyapp.net/help/sdk/ios/3.6.1/](http://hockeyapp.net/help/sdk/ios/3.6.1/)
+The documentation is also available via the following URL: [http://hockeyapp.net/help/sdk/ios/3.6.2/](http://hockeyapp.net/help/sdk/ios/3.6.2/)
### Set up with xcconfig