diff --git a/Podfile b/Podfile index 95f18a729868..8e3f16a32584 100644 --- a/Podfile +++ b/Podfile @@ -54,7 +54,6 @@ def shared_with_all_pods pod 'CocoaLumberjack', '3.5.2' pod 'FormatterKit/TimeIntervalFormatter', '1.8.2' pod 'NSObject-SafeExpectations', '0.0.3' - pod 'Sentry', '4.3.1' end def shared_with_networking_pods @@ -147,7 +146,7 @@ target 'WordPress' do ## # Production - pod 'Automattic-Tracks-iOS', '0.3.5' + pod 'Automattic-Tracks-iOS', '~> 0.4' # While in PR # pod 'Automattic-Tracks-iOS', :git => 'https://github.com/Automattic/Automattic-Tracks-iOS.git', :commit => 'a15db91a24499913affae84243d45be0e353472a' diff --git a/Podfile.lock b/Podfile.lock index 7c78fcf6fb8e..50257a48587f 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -3,9 +3,10 @@ PODS: - Alamofire (4.7.3) - AlamofireNetworkActivityIndicator (2.3.0): - Alamofire (~> 4.7) - - Automattic-Tracks-iOS (0.3.5): + - Automattic-Tracks-iOS (0.4.0): - CocoaLumberjack (~> 3.5.2) - Reachability (~> 3.1) + - Sentry (~> 4) - UIDeviceIdentifier (~> 1.1.4) - boost-for-react-native (1.63.0) - Charts (3.2.2): @@ -170,9 +171,9 @@ PODS: - RNTAztecView (1.7.0): - React - WordPress-Aztec-iOS - - Sentry (4.3.1): - - Sentry/Core (= 4.3.1) - - Sentry/Core (4.3.1) + - Sentry (4.3.4): + - Sentry/Core (= 4.3.4) + - Sentry/Core (4.3.4) - SimulatorStatusMagic (2.4.1) - Starscream (3.0.6) - SVProgressHUD (2.2.5) @@ -222,7 +223,7 @@ DEPENDENCIES: - 1PasswordExtension (= 1.8.5) - Alamofire (= 4.7.3) - AlamofireNetworkActivityIndicator (~> 2.3) - - Automattic-Tracks-iOS (= 0.3.5) + - Automattic-Tracks-iOS (~> 0.4) - Charts (~> 3.2.2) - CocoaLumberjack (= 3.5.2) - Down (~> 0.6.6) @@ -249,7 +250,6 @@ DEPENDENCIES: - react-native-video (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.7.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-video.podspec.json`) - RNSVG (from `https://github.com/wordpress-mobile/react-native-svg.git`, tag `9.3.3-gb`) - RNTAztecView (from `http://github.com/wordpress-mobile/gutenberg-mobile/`, tag `v1.7.0`) - - Sentry (= 4.3.1) - SimulatorStatusMagic - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) @@ -353,7 +353,7 @@ SPEC CHECKSUMS: 1PasswordExtension: 0e95bdea64ec8ff2f4f693be5467a09fac42a83d Alamofire: c7287b6e5d7da964a70935e5db17046b7fde6568 AlamofireNetworkActivityIndicator: 18346ff6d770d9513d0ac6f2d99706f40f93dbaa - Automattic-Tracks-iOS: 1ba339ac16d6aff577b7f0ec16546be2a7ccd64a + Automattic-Tracks-iOS: f7a8284999a5ce2f4e768717d86a640a32f43b7c boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c Charts: f69cf0518b6d1d62608ca504248f1bbe0b6ae77e CocoaLumberjack: 118bf4a820efc641f79fa487b75ed928dccfae23 @@ -386,7 +386,7 @@ SPEC CHECKSUMS: react-native-video: 9aecbfc4628128838187df9d9c9f630670cfb1d1 RNSVG: 978db19eaef499d9ebffb74a091ca0abf209c8c1 RNTAztecView: 92830994c0bb32c16d4560cc7510d8dccbefacfe - Sentry: 5267d493a398663538317e4dcc438c12c66202ed + Sentry: 26f0e6492b103e87434d1a5eea2d241a36f2c2a2 SimulatorStatusMagic: 28d4a9d1a500ac7cea0b2b5a43c1c6ddb40ba56c Starscream: ef3ece99d765eeccb67de105bfa143f929026cf5 SVProgressHUD: 1428aafac632c1f86f62aa4243ec12008d7a51d6 @@ -404,6 +404,6 @@ SPEC CHECKSUMS: ZendeskSDK: cbd49d65efb2f2cdbdcaac84e618896ae87b861e ZIPFoundation: 89df685c971926b0323087952320bdfee9f0b6ef -PODFILE CHECKSUM: 8f2fed4847583c44ab9cacc157a7967bc96eb5bc +PODFILE CHECKSUM: 45f26098de3819b588803c244735587c011a53ff COCOAPODS: 1.6.1 diff --git a/WordPress/Classes/System/WordPressAppDelegate+openURL.swift b/WordPress/Classes/System/WordPressAppDelegate+openURL.swift index 0761cc61b58b..6bf14c7f009c 100644 --- a/WordPress/Classes/System/WordPressAppDelegate+openURL.swift +++ b/WordPress/Classes/System/WordPressAppDelegate+openURL.swift @@ -1,4 +1,5 @@ import WordPressAuthenticator +import AutomatticTracks @objc extension WordPressAppDelegate { internal func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { @@ -111,7 +112,7 @@ import WordPressAuthenticator } if debugKey == ApiCredentials.debuggingKey(), debugType == "force_crash" { - WPCrashLogging.crash() + CrashLogging.crash() } return true diff --git a/WordPress/Classes/System/WordPressAppDelegate.swift b/WordPress/Classes/System/WordPressAppDelegate.swift index 0e94691eb205..818c2d73833f 100644 --- a/WordPress/Classes/System/WordPressAppDelegate.swift +++ b/WordPress/Classes/System/WordPressAppDelegate.swift @@ -14,6 +14,9 @@ class WordPressAppDelegate: UIResponder, UIApplicationDelegate { var analytics: WPAppAnalytics? var hockey: HockeyManager? + private lazy var crashLoggingProvider: WPCrashLoggingProvider = { + return WPCrashLoggingProvider() + }() @objc var logger: WPLogger? @objc var internetReachability: Reachability? @@ -190,7 +193,7 @@ class WordPressAppDelegate: UIResponder, UIApplicationDelegate { logger = WPLogger() - WPCrashLogging.start() + CrashLogging.start(withDataProvider: crashLoggingProvider) configureHockeySDK() configureAppRatingUtility() @@ -337,10 +340,6 @@ extension WordPressAppDelegate { }) } - @objc func configureCrashLogging() { - WPCrashLogging.start() - } - @objc func configureHockeySDK() { hockey = HockeyManager() hockey?.configure() diff --git a/WordPress/Classes/Utility/Logging/WPCrashLogging.swift b/WordPress/Classes/Utility/Logging/WPCrashLogging.swift deleted file mode 100644 index b252391f7769..000000000000 --- a/WordPress/Classes/Utility/Logging/WPCrashLogging.swift +++ /dev/null @@ -1,135 +0,0 @@ -import Foundation -import Sentry - -fileprivate let UserOptedOutKey = "crashlytics_opt_out" - -class WPCrashLogging { - - fileprivate static let sharedInstance = WPCrashLogging() - - static func start() { - // Create a Sentry client and start crash handler - do { - - Client.shared = try Client(dsn: ApiCredentials.sentryDSN()) - - // Store lots of breadcrumbs to trace errors - Client.shared?.breadcrumbs.maxBreadcrumbs = 500 - - // Automatically track screen transitions - Client.shared?.enableAutomaticBreadcrumbTracking() - - // Automatically track low-memory events - Client.shared?.trackMemoryPressureAsEvent() - - try Client.shared?.startCrashHandler() - - // Override event serialization to append the logs, if needed - Client.shared?.beforeSerializeEvent = sharedInstance.beforeSerializeEvent - Client.shared?.shouldSendEvent = sharedInstance.shouldSendEvent - - } catch let error { - print("\(error)") - } - } - - func beforeSerializeEvent(_ event: Event) { - event.tags?["locale"] = NSLocale.current.languageCode - } - - func shouldSendEvent(_ event: Event?) -> Bool { - return !userHasOptedOut - } - - var userHasOptedOut: Bool = false - - static var userHasOptedOut: Bool { - get { - let value = UserDefaults.standard.bool(forKey: UserOptedOutKey) - sharedInstance.userHasOptedOut = value - - return value - } - set(didOptIn) { - UserDefaults.standard.set(didOptIn, forKey: UserOptedOutKey) - sharedInstance.userHasOptedOut = didOptIn - - sharedInstance.applyUserTrackingPreferences() - } - } - - static func crash() { - Client.shared?.crash() - } -} - -// Manual Error Logging -extension WPCrashLogging { - static func logError(_ error: Error) { - let event = Event(level: .error) - event.message = error.localizedDescription - - Client.shared?.appendStacktrace(to: event) - Client.shared?.send(event: event) - } - - static func logMessage(_ message: String, properties: [String: Any]? = nil) { - let event = Event(level: .info) - event.message = message - event.extra = properties - Client.shared?.send(event: event) - } -} - -// User Tracking -extension WPCrashLogging { - - func applyUserTrackingPreferences() { - - if !WPCrashLogging.userHasOptedOut { - enableUserTracking() - } - else { - disableUserTracking() - } - - Client.shared?.releaseName = releaseName - Client.shared?.environment = buildType - } - - func enableUserTracking() { - - let context = ContextManager.sharedInstance().mainContext - let accountService = AccountService(managedObjectContext: context) - let blogService = BlogService(managedObjectContext: context) - let defaultAccount = accountService.defaultWordPressComAccount() - - let userID = defaultAccount?.userID.intValue ?? 0 - let username = defaultAccount?.username ?? "anonymous" - let displayName = defaultAccount?.displayName ?? "anon" - - let user = Sentry.User(userId: username) - user.email = defaultAccount?.email - user.extra = [ - "display_name": displayName, - "user_id": userID, - "number_of_blogs": blogService.blogCountForAllAccounts(), - "logged_in": defaultAccount == nil, - "connected_to_dotcom": defaultAccount == nil, - ] - - Client.shared?.user = user - } - - func disableUserTracking() { - Client.shared?.clearContext() - } - - var releaseName: String { - return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String - } - - var buildType: String { - return BuildConfiguration.current.rawValue - } -} diff --git a/WordPress/Classes/Utility/Logging/WPCrashLoggingProvider.swift b/WordPress/Classes/Utility/Logging/WPCrashLoggingProvider.swift new file mode 100644 index 000000000000..97f250a4f350 --- /dev/null +++ b/WordPress/Classes/Utility/Logging/WPCrashLoggingProvider.swift @@ -0,0 +1,26 @@ +import Foundation +import AutomatticTracks + +fileprivate let UserOptedOutKey = "crashlytics_opt_out" + +class WPCrashLoggingProvider: CrashLoggingDataProvider { + + var sentryDSN: String = ApiCredentials.sentryDSN() + + var buildType: String = BuildConfiguration.current.rawValue + + var userHasOptedOut: Bool { + return UserDefaults.standard.bool(forKey: UserOptedOutKey) + } + + var currentUser: TracksUser? { + + let context = ContextManager.sharedInstance().mainContext + let service = AccountService(managedObjectContext: context) + guard let account = service.defaultWordPressComAccount() else { + return nil + } + + return TracksUser(userID: account.userID.stringValue, email: account.email, username: account.username) + } +} diff --git a/WordPress/Classes/ViewRelated/Aztec/ViewControllers/AztecPostViewController.swift b/WordPress/Classes/ViewRelated/Aztec/ViewControllers/AztecPostViewController.swift index 84c120c6d5b1..f095d83fea1e 100644 --- a/WordPress/Classes/ViewRelated/Aztec/ViewControllers/AztecPostViewController.swift +++ b/WordPress/Classes/ViewRelated/Aztec/ViewControllers/AztecPostViewController.swift @@ -10,7 +10,7 @@ import WordPressEditor import WPMediaPicker import AVKit import MobileCoreServices - +import AutomatticTracks // MARK: - Aztec's Native Editor! // @@ -1030,7 +1030,7 @@ extension AztecPostViewController { guard let action = self.postEditorStateContext.secondaryPublishButtonAction else { // If the user tapped on the secondary publish action button, it means we should have a secondary publish action. let error = NSError(domain: errorDomain, code: ErrorCode.expectedSecondaryAction.rawValue, userInfo: nil) - WPCrashLogging.logError(error) + CrashLogging.logError(error) return } diff --git a/WordPress/Classes/ViewRelated/Gutenberg/GutenbergViewController+MoreActions.swift b/WordPress/Classes/ViewRelated/Gutenberg/GutenbergViewController+MoreActions.swift index 68c1c18030ef..4ecb75e319a6 100644 --- a/WordPress/Classes/ViewRelated/Gutenberg/GutenbergViewController+MoreActions.swift +++ b/WordPress/Classes/ViewRelated/Gutenberg/GutenbergViewController+MoreActions.swift @@ -1,4 +1,5 @@ import Foundation +import AutomatticTracks /// This extension handles the "more" actions triggered by the top right /// navigation bar button of Gutenberg editor. @@ -68,7 +69,7 @@ extension GutenbergViewController { guard let action = self.postEditorStateContext.secondaryPublishButtonAction else { // If the user tapped on the secondary publish action button, it means we should have a secondary publish action. let error = NSError(domain: errorDomain, code: ErrorCode.expectedSecondaryAction.rawValue, userInfo: nil) - WPCrashLogging.logError(error) + CrashLogging.logError(error) return } diff --git a/WordPress/Classes/ViewRelated/Me/PrivacySettingsViewController.swift b/WordPress/Classes/ViewRelated/Me/PrivacySettingsViewController.swift index c4039169411c..f7fb0b99dd3e 100644 --- a/WordPress/Classes/ViewRelated/Me/PrivacySettingsViewController.swift +++ b/WordPress/Classes/ViewRelated/Me/PrivacySettingsViewController.swift @@ -1,5 +1,6 @@ import Gridicons import UIKit +import AutomatticTracks class PrivacySettingsViewController: UITableViewController { fileprivate var handler: ImmuTableViewHandler! @@ -113,7 +114,7 @@ class PrivacySettingsViewController: UITableViewController { let accountService = AccountService(managedObjectContext: ContextManager.sharedInstance().mainContext) AccountSettingsHelper(accountService: accountService).updateTracksOptOutSetting(!enabled) - WPCrashLogging.userHasOptedOut = !enabled + CrashLogging.setNeedsDataRefresh() } } diff --git a/WordPress/Classes/ViewRelated/Post/PostPreviewGenerator.swift b/WordPress/Classes/ViewRelated/Post/PostPreviewGenerator.swift index a96209481b52..a2442884ef51 100644 --- a/WordPress/Classes/ViewRelated/Post/PostPreviewGenerator.swift +++ b/WordPress/Classes/ViewRelated/Post/PostPreviewGenerator.swift @@ -1,4 +1,5 @@ import Foundation +import AutomatticTracks @objc protocol PostPreviewGeneratorDelegate { @@ -39,7 +40,7 @@ class PostPreviewGenerator: NSObject { @objc func previewRequestFailed(reason: String) { let message = "Preview failed" let properties = ["reason": reason] - WPCrashLogging.logMessage(message, properties: properties) + CrashLogging.logMessage(message, properties: properties) delegate?.previewFailed(self, message: NSLocalizedString("There has been an error while trying to reach your site.", comment: "An error message.")) } diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index d5bec5b53381..17c6432f2e7d 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1742,7 +1742,7 @@ F1D690171F82914200200E30 /* BuildConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1D690141F828FF000200E30 /* BuildConfiguration.swift */; }; F1DB8D292288C14400906E2F /* Uploader.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1DB8D282288C14400906E2F /* Uploader.swift */; }; F1DB8D2B2288C24500906E2F /* UploadsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1DB8D2A2288C24500906E2F /* UploadsManager.swift */; }; - F928EDA3226140620030D451 /* WPCrashLogging.swift in Sources */ = {isa = PBXBuildFile; fileRef = F928EDA2226140620030D451 /* WPCrashLogging.swift */; }; + F928EDA3226140620030D451 /* WPCrashLoggingProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F928EDA2226140620030D451 /* WPCrashLoggingProvider.swift */; }; F9463A7321C05EE90081F11E /* ScreenshotCredentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9463A7221C05EE90081F11E /* ScreenshotCredentials.swift */; }; F98C58192228849E0073D752 /* XCTest+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF2716A01CABC7D40006E2D4 /* XCTest+Extensions.swift */; }; F9941D1822A805F600788F33 /* UIImage+XCAssetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9941D1722A805F600788F33 /* UIImage+XCAssetTests.swift */; }; @@ -3974,7 +3974,7 @@ F373612EEEEF10E500093FF3 /* Pods-WordPress.release-alpha.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WordPress.release-alpha.xcconfig"; path = "../Pods/Target Support Files/Pods-WordPress/Pods-WordPress.release-alpha.xcconfig"; sourceTree = ""; }; F47DB4A8EC2E6844E213A3FA /* Pods_WordPressShareExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WordPressShareExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F7E3CC306AECBBCB71D2E19C /* Pods_WordPressDraftActionExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WordPressDraftActionExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F928EDA2226140620030D451 /* WPCrashLogging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WPCrashLogging.swift; sourceTree = ""; }; + F928EDA2226140620030D451 /* WPCrashLoggingProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WPCrashLoggingProvider.swift; sourceTree = ""; }; F9463A7221C05EE90081F11E /* ScreenshotCredentials.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScreenshotCredentials.swift; sourceTree = ""; }; F9941D1722A805F600788F33 /* UIImage+XCAssetTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+XCAssetTests.swift"; sourceTree = ""; }; FA1ACAA11BC6E45D00DDDCE2 /* WPStyleGuide+Themes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "WPStyleGuide+Themes.swift"; sourceTree = ""; }; @@ -5128,7 +5128,7 @@ 59DD94311AC479DC0032DD6B /* Logging */ = { isa = PBXGroup; children = ( - F928EDA2226140620030D451 /* WPCrashLogging.swift */, + F928EDA2226140620030D451 /* WPCrashLoggingProvider.swift */, 938CF3DB1EF1BE6800AF838E /* CocoaLumberjack.swift */, 59DD94321AC479ED0032DD6B /* WPLogger.h */, 59DD94331AC479ED0032DD6B /* WPLogger.m */, @@ -9419,7 +9419,6 @@ "${BUILT_PRODUCTS_DIR}/FormatterKit/FormatterKit.framework", "${BUILT_PRODUCTS_DIR}/NSObject-SafeExpectations/NSObject_SafeExpectations.framework", "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework", - "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework", "${BUILT_PRODUCTS_DIR}/UIDeviceIdentifier/UIDeviceIdentifier.framework", "${BUILT_PRODUCTS_DIR}/WordPressKit/WordPressKit.framework", "${BUILT_PRODUCTS_DIR}/WordPressShared/WordPressShared.framework", @@ -9436,7 +9435,6 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FormatterKit.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NSObject_SafeExpectations.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/UIDeviceIdentifier.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WordPressKit.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WordPressShared.framework", @@ -10119,7 +10117,7 @@ B54346961C6A707D0010B3AD /* LanguageViewController.swift in Sources */, 43D74AD020F906EE004AD934 /* InlineEditableNameValueCell.swift in Sources */, 4089C51122371B120031CE78 /* TodayStatsRecordValue+CoreDataProperties.swift in Sources */, - F928EDA3226140620030D451 /* WPCrashLogging.swift in Sources */, + F928EDA3226140620030D451 /* WPCrashLoggingProvider.swift in Sources */, D8A3A5B3206A49BF00992576 /* StockPhotosMedia.swift in Sources */, 176BB87F20D0068500751DCE /* FancyAlertViewController+SavedPosts.swift in Sources */, E6805D321DCD399600168E4F /* WPRichTextMediaAttachment.swift in Sources */, diff --git a/WordPressComStatsiOS/WordPressComStatsiOS.xcodeproj/project.pbxproj b/WordPressComStatsiOS/WordPressComStatsiOS.xcodeproj/project.pbxproj index 5fbd8a057837..5bc9cacd22c1 100644 --- a/WordPressComStatsiOS/WordPressComStatsiOS.xcodeproj/project.pbxproj +++ b/WordPressComStatsiOS/WordPressComStatsiOS.xcodeproj/project.pbxproj @@ -1856,7 +1856,6 @@ "${BUILT_PRODUCTS_DIR}/FormatterKit/FormatterKit.framework", "${BUILT_PRODUCTS_DIR}/NSObject-SafeExpectations/NSObject_SafeExpectations.framework", "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework", - "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework", "${BUILT_PRODUCTS_DIR}/UIDeviceIdentifier/UIDeviceIdentifier.framework", "${BUILT_PRODUCTS_DIR}/WordPressKit/WordPressKit.framework", "${BUILT_PRODUCTS_DIR}/WordPressShared/WordPressShared.framework", @@ -1870,7 +1869,6 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FormatterKit.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NSObject_SafeExpectations.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/UIDeviceIdentifier.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WordPressKit.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WordPressShared.framework",