From b1698a077ac4ab437714bd86af6cdd2ae0f74125 Mon Sep 17 00:00:00 2001 From: Diego Rey Mendez Date: Thu, 26 Mar 2015 11:21:10 -0300 Subject: [PATCH 1/4] Modularized the crashlytics code that was previously in our app delegate. --- .../Classes/System/WordPressAppDelegate.m | 47 ++------ WordPress/Classes/Utility/WPCrashlytics.h | 19 ++++ WordPress/Classes/Utility/WPCrashlytics.m | 106 ++++++++++++++++++ WordPress/WordPress.xcodeproj/project.pbxproj | 12 +- 4 files changed, 142 insertions(+), 42 deletions(-) create mode 100644 WordPress/Classes/Utility/WPCrashlytics.h create mode 100644 WordPress/Classes/Utility/WPCrashlytics.m diff --git a/WordPress/Classes/System/WordPressAppDelegate.m b/WordPress/Classes/System/WordPressAppDelegate.m index 8427ecf69d4b..82c2e6007c34 100644 --- a/WordPress/Classes/System/WordPressAppDelegate.m +++ b/WordPress/Classes/System/WordPressAppDelegate.m @@ -30,6 +30,7 @@ #import "ReaderTopicService.h" #import "SVProgressHUD.h" #import "TodayExtensionService.h" +#import "WPCrashlytics.h" #import "WPTabBarController.h" #import "BlogListViewController.h" @@ -69,9 +70,10 @@ int ddLogLevel = LOG_LEVEL_INFO; static NSString * const MustShowWhatsNewPopup = @"MustShowWhatsNewPopup"; -@interface WordPressAppDelegate () +@interface WordPressAppDelegate () @property (nonatomic, strong, readwrite) WPAppAnalytics *analytics; +@property (nonatomic, strong, readwrite) WPCrashlytics *crashlytics; @property (nonatomic, strong, readwrite) Reachability *internetReachability; @property (nonatomic, strong, readwrite) DDFileLogger *fileLogger; @property (nonatomic, strong, readwrite) Simperium *simperium; @@ -644,7 +646,7 @@ - (void)changeCurrentDirectory [fileManager changeCurrentDirectoryPath:currentDirectoryPath]; } -#pragma mark - Crash reporting +#pragma mark - Crashlytics configuration - (void)configureCrashlytics { @@ -652,42 +654,11 @@ - (void)configureCrashlytics return; #endif - if ([[WordPressComApiCredentials crashlyticsApiKey] length] == 0) { - return; - } - - [Crashlytics startWithAPIKey:[WordPressComApiCredentials crashlyticsApiKey]]; - [[Crashlytics sharedInstance] setDelegate:self]; - - [self setCommonCrashlyticsParameters]; -} - -- (void)crashlytics:(Crashlytics *)crashlytics didDetectCrashDuringPreviousExecution:(id)crash -{ - DDLogMethod(); - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSInteger crashCount = [defaults integerForKey:@"crashCount"]; - crashCount += 1; - [defaults setInteger:crashCount forKey:@"crashCount"]; - [defaults synchronize]; -} - -- (void)setCommonCrashlyticsParameters -{ -#if defined(INTERNAL_BUILD) || defined(DEBUG) - return; -#endif + NSString* apiKey = [WordPressComApiCredentials crashlyticsApiKey]; - NSManagedObjectContext *context = [[ContextManager sharedInstance] mainContext]; - AccountService *accountService = [[AccountService alloc] initWithManagedObjectContext:context]; - BlogService *blogService = [[BlogService alloc] initWithManagedObjectContext:context]; - WPAccount *defaultAccount = [accountService defaultWordPressComAccount]; - - BOOL loggedIn = defaultAccount != nil; - [Crashlytics setUserName:defaultAccount.username]; - [Crashlytics setObjectValue:@(loggedIn) forKey:@"logged_in"]; - [Crashlytics setObjectValue:@(loggedIn) forKey:@"connected_to_dotcom"]; - [Crashlytics setObjectValue:@([blogService blogCountForAllAccounts]) forKey:@"number_of_blogs"]; + if (apiKey) { + self.crashlytics = [[WPCrashlytics alloc] initWithAPIKey:apiKey]; + } } - (void)configureHockeySDK @@ -871,7 +842,6 @@ - (NSString *)notificationsBucketNameFromLaunchOptions:(NSDictionary *)launchOpt return name ?: WPNotificationsBucketName; } - #pragma mark - Keychain + (void)fixKeychainAccess @@ -1138,7 +1108,6 @@ - (void)handleDefaultAccountChangedNote:(NSNotification *)notification } [self toggleExtraDebuggingIfNeeded]; - [self setCommonCrashlyticsParameters]; [self setupSingleSignOn]; [WPAnalytics track:WPAnalyticsStatDefaultAccountChanged]; diff --git a/WordPress/Classes/Utility/WPCrashlytics.h b/WordPress/Classes/Utility/WPCrashlytics.h new file mode 100644 index 000000000000..79b799b04100 --- /dev/null +++ b/WordPress/Classes/Utility/WPCrashlytics.h @@ -0,0 +1,19 @@ +// +// WPCrashlytics.h +// WordPress +// +// Created by Diego E. Rey Mendez on 3/26/15. +// Copyright (c) 2015 WordPress. All rights reserved. +// + +#import + +/** + * @class WPCrashlytics + * @brief This module contains the crashlytics logic for WPiOS. + */ +@interface WPCrashlytics : NSObject + +- (instancetype)initWithAPIKey:(NSString*)apiKey; + +@end diff --git a/WordPress/Classes/Utility/WPCrashlytics.m b/WordPress/Classes/Utility/WPCrashlytics.m new file mode 100644 index 000000000000..10d94c5d0a2a --- /dev/null +++ b/WordPress/Classes/Utility/WPCrashlytics.m @@ -0,0 +1,106 @@ +// +// WPCrashlytics.m +// WordPress +// +// Created by Diego E. Rey Mendez on 3/26/15. +// Copyright (c) 2015 WordPress. All rights reserved. +// + +#import "WPCrashlytics.h" + +#import +#import "AccountService.h" +#import "BlogService.h" +#import "ContextManager.h" +#import "WPAccount.h" + +@interface WPCrashlytics () +@end + +@implementation WPCrashlytics + +#pragma mark - Dealloc + +- (void)dealloc +{ + [self stopObservingNotifications]; +} + +#pragma mark - Initialization + +- (instancetype)initWithAPIKey:(NSString*)apiKey +{ + NSParameterAssert(apiKey); + + self = [super init]; + + if (self) { + [Crashlytics startWithAPIKey:apiKey]; + [[Crashlytics sharedInstance] setDelegate:self]; + + [self setCommonCrashlyticsParameters]; + + [self startObservingNotifications]; + } + + return self; +} + +#pragma mark - Notifications + +- (void)startObservingNotifications +{ + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter addObserver:self + selector:@selector(handleDefaultAccountChangedNotification:) + name:WPAccountDefaultWordPressComAccountChangedNotification + object:nil]; +} + +- (void)stopObservingNotifications +{ + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter removeObserver:self]; +} + +- (void)handleDefaultAccountChangedNotification:(NSNotification*)notification +{ + [self setCommonCrashlyticsParameters]; +} + +#pragma mark - Common crashlytics parameters + +- (void)setCommonCrashlyticsParameters +{ +#if defined(INTERNAL_BUILD) || defined(DEBUG) + return; +#endif + + NSManagedObjectContext *context = [[ContextManager sharedInstance] mainContext]; + AccountService *accountService = [[AccountService alloc] initWithManagedObjectContext:context]; + BlogService *blogService = [[BlogService alloc] initWithManagedObjectContext:context]; + WPAccount *defaultAccount = [accountService defaultWordPressComAccount]; + + BOOL loggedIn = defaultAccount != nil; + [Crashlytics setUserName:defaultAccount.username]; + [Crashlytics setObjectValue:@(loggedIn) forKey:@"logged_in"]; + [Crashlytics setObjectValue:@(loggedIn) forKey:@"connected_to_dotcom"]; + [Crashlytics setObjectValue:@([blogService blogCountForAllAccounts]) forKey:@"number_of_blogs"]; +} + +#pragma mark - CrashlyticsDelegate + +- (void)crashlytics:(Crashlytics *)crashlytics didDetectCrashDuringPreviousExecution:(id)crash +{ + DDLogMethod(); + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSInteger crashCount = [defaults integerForKey:@"crashCount"]; + crashCount += 1; + [defaults setInteger:crashCount forKey:@"crashCount"]; + [defaults synchronize]; +} + + +@end diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 44e2a7e23662..687025fc0df7 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -73,9 +73,10 @@ 5903AE1B19B60A98009D5354 /* WPButtonForNavigationBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 5903AE1A19B60A98009D5354 /* WPButtonForNavigationBar.m */; }; 591A428C1A6DC1B0003807A6 /* WPBackgroundDimmerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 591A428B1A6DC1B0003807A6 /* WPBackgroundDimmerView.m */; }; 591A428F1A6DC6F2003807A6 /* WPGUIConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 591A428E1A6DC6F2003807A6 /* WPGUIConstants.m */; }; - 594DB2951AB891A200E2E456 /* WPUserAgent.m in Sources */ = {isa = PBXBuildFile; fileRef = 594DB2941AB891A200E2E456 /* WPUserAgent.m */; }; + 5926E1E31AC4468300964783 /* WPCrashlytics.m in Sources */ = {isa = PBXBuildFile; fileRef = 5926E1E21AC4468300964783 /* WPCrashlytics.m */; }; 5948AD0E1AB734F2006E8882 /* WPAppAnalytics.m in Sources */ = {isa = PBXBuildFile; fileRef = 5948AD0D1AB734F2006E8882 /* WPAppAnalytics.m */; }; 5948AD111AB73D19006E8882 /* WPAppAnalyticsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5948AD101AB73D19006E8882 /* WPAppAnalyticsTests.m */; }; + 594DB2951AB891A200E2E456 /* WPUserAgent.m in Sources */ = {isa = PBXBuildFile; fileRef = 594DB2941AB891A200E2E456 /* WPUserAgent.m */; }; 595B02221A6C4ECD00415A30 /* WPWhatsNewView.m in Sources */ = {isa = PBXBuildFile; fileRef = 595B02211A6C4ECD00415A30 /* WPWhatsNewView.m */; }; 595B02271A6C504400415A30 /* WPWhatsNewView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 595B02261A6C504400415A30 /* WPWhatsNewView.xib */; }; 5981FE051AB8A89A0009E080 /* WPUserAgentTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5981FE041AB8A89A0009E080 /* WPUserAgentTests.m */; }; @@ -625,11 +626,13 @@ 591A428B1A6DC1B0003807A6 /* WPBackgroundDimmerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WPBackgroundDimmerView.m; sourceTree = ""; }; 591A428D1A6DC6F2003807A6 /* WPGUIConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WPGUIConstants.h; sourceTree = ""; }; 591A428E1A6DC6F2003807A6 /* WPGUIConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WPGUIConstants.m; sourceTree = ""; }; - 594DB2931AB891A200E2E456 /* WPUserAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WPUserAgent.h; sourceTree = ""; }; - 594DB2941AB891A200E2E456 /* WPUserAgent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WPUserAgent.m; sourceTree = ""; }; + 5926E1E11AC4468300964783 /* WPCrashlytics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WPCrashlytics.h; sourceTree = ""; }; + 5926E1E21AC4468300964783 /* WPCrashlytics.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WPCrashlytics.m; sourceTree = ""; }; 5948AD0C1AB734F2006E8882 /* WPAppAnalytics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WPAppAnalytics.h; sourceTree = ""; }; 5948AD0D1AB734F2006E8882 /* WPAppAnalytics.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WPAppAnalytics.m; sourceTree = ""; }; 5948AD101AB73D19006E8882 /* WPAppAnalyticsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WPAppAnalyticsTests.m; sourceTree = ""; }; + 594DB2931AB891A200E2E456 /* WPUserAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WPUserAgent.h; sourceTree = ""; }; + 594DB2941AB891A200E2E456 /* WPUserAgent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WPUserAgent.m; sourceTree = ""; }; 595B02201A6C4ECD00415A30 /* WPWhatsNewView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WPWhatsNewView.h; path = WhatsNew/WPWhatsNewView.h; sourceTree = ""; }; 595B02211A6C4ECD00415A30 /* WPWhatsNewView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WPWhatsNewView.m; path = WhatsNew/WPWhatsNewView.m; sourceTree = ""; }; 595B02261A6C504400415A30 /* WPWhatsNewView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = WPWhatsNewView.xib; path = Resources/WhatsNew/WPWhatsNewView.xib; sourceTree = ""; }; @@ -2169,6 +2172,8 @@ 8525398A171761D9003F6B32 /* WPComLanguages.m */, E183BD7217621D85000B0822 /* WPCookie.h */, E183BD7317621D86000B0822 /* WPCookie.m */, + 5926E1E11AC4468300964783 /* WPCrashlytics.h */, + 5926E1E21AC4468300964783 /* WPCrashlytics.m */, E114D798153D85A800984182 /* WPError.h */, E114D799153D85A800984182 /* WPError.m */, 5DA3EE0E192508F700294E0B /* WPImageOptimizer.h */, @@ -3496,6 +3501,7 @@ E1D04D8419374F2C002FADD7 /* BlogServiceRemoteREST.m in Sources */, A25EBD87156E330600530E3D /* WPTableViewController.m in Sources */, 5DEB61B4156FCD3400242C35 /* WPWebView.m in Sources */, + 5926E1E31AC4468300964783 /* WPCrashlytics.m in Sources */, B55853F31962337500FAF6C3 /* NSScanner+Helpers.m in Sources */, 5D49B03B19BE3CAD00703A9B /* SafeReaderTopicToReaderTopic.m in Sources */, 5DEB61B8156FCD5200242C35 /* WPChromelessWebViewController.m in Sources */, From 399898cb808af5b51b6e6041e79d24f6e16a768e Mon Sep 17 00:00:00 2001 From: Diego Rey Mendez Date: Thu, 26 Mar 2015 11:56:15 -0300 Subject: [PATCH 2/4] Removed some unnecessary code. --- WordPress/Classes/Utility/WPCrashlytics.m | 4 ---- 1 file changed, 4 deletions(-) diff --git a/WordPress/Classes/Utility/WPCrashlytics.m b/WordPress/Classes/Utility/WPCrashlytics.m index 10d94c5d0a2a..e9d042f104b6 100644 --- a/WordPress/Classes/Utility/WPCrashlytics.m +++ b/WordPress/Classes/Utility/WPCrashlytics.m @@ -74,10 +74,6 @@ - (void)handleDefaultAccountChangedNotification:(NSNotification*)notification - (void)setCommonCrashlyticsParameters { -#if defined(INTERNAL_BUILD) || defined(DEBUG) - return; -#endif - NSManagedObjectContext *context = [[ContextManager sharedInstance] mainContext]; AccountService *accountService = [[AccountService alloc] initWithManagedObjectContext:context]; BlogService *blogService = [[BlogService alloc] initWithManagedObjectContext:context]; From 81ba29edd9e09524c16c3bc05e6e520e7a9506ec Mon Sep 17 00:00:00 2001 From: Diego Rey Mendez Date: Fri, 27 Mar 2015 12:01:23 -0300 Subject: [PATCH 3/4] Removed unnecessary headers. --- WordPress/Classes/Utility/WPCrashlytics.h | 8 -------- WordPress/Classes/Utility/WPCrashlytics.m | 8 -------- 2 files changed, 16 deletions(-) diff --git a/WordPress/Classes/Utility/WPCrashlytics.h b/WordPress/Classes/Utility/WPCrashlytics.h index 79b799b04100..af625910bc3c 100644 --- a/WordPress/Classes/Utility/WPCrashlytics.h +++ b/WordPress/Classes/Utility/WPCrashlytics.h @@ -1,11 +1,3 @@ -// -// WPCrashlytics.h -// WordPress -// -// Created by Diego E. Rey Mendez on 3/26/15. -// Copyright (c) 2015 WordPress. All rights reserved. -// - #import /** diff --git a/WordPress/Classes/Utility/WPCrashlytics.m b/WordPress/Classes/Utility/WPCrashlytics.m index e9d042f104b6..2f31e0aa5bd8 100644 --- a/WordPress/Classes/Utility/WPCrashlytics.m +++ b/WordPress/Classes/Utility/WPCrashlytics.m @@ -1,11 +1,3 @@ -// -// WPCrashlytics.m -// WordPress -// -// Created by Diego E. Rey Mendez on 3/26/15. -// Copyright (c) 2015 WordPress. All rights reserved. -// - #import "WPCrashlytics.h" #import From a35ed841e67fdfecec3fc30821706b45efb48c9f Mon Sep 17 00:00:00 2001 From: Diego Rey Mendez Date: Fri, 27 Mar 2015 12:03:37 -0300 Subject: [PATCH 4/4] Standardized the style a bit. --- WordPress/Classes/Utility/WPCrashlytics.h | 2 +- WordPress/Classes/Utility/WPCrashlytics.m | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/Utility/WPCrashlytics.h b/WordPress/Classes/Utility/WPCrashlytics.h index af625910bc3c..f93331aac318 100644 --- a/WordPress/Classes/Utility/WPCrashlytics.h +++ b/WordPress/Classes/Utility/WPCrashlytics.h @@ -6,6 +6,6 @@ */ @interface WPCrashlytics : NSObject -- (instancetype)initWithAPIKey:(NSString*)apiKey; +- (instancetype)initWithAPIKey:(NSString *)apiKey; @end diff --git a/WordPress/Classes/Utility/WPCrashlytics.m b/WordPress/Classes/Utility/WPCrashlytics.m index 2f31e0aa5bd8..99bf7837df9d 100644 --- a/WordPress/Classes/Utility/WPCrashlytics.m +++ b/WordPress/Classes/Utility/WPCrashlytics.m @@ -20,7 +20,7 @@ - (void)dealloc #pragma mark - Initialization -- (instancetype)initWithAPIKey:(NSString*)apiKey +- (instancetype)initWithAPIKey:(NSString *)apiKey { NSParameterAssert(apiKey); @@ -57,7 +57,7 @@ - (void)stopObservingNotifications [notificationCenter removeObserver:self]; } -- (void)handleDefaultAccountChangedNotification:(NSNotification*)notification +- (void)handleDefaultAccountChangedNotification:(NSNotification *)notification { [self setCommonCrashlyticsParameters]; }