diff --git a/Podfile b/Podfile
index 9240e60c55..061581fed0 100644
--- a/Podfile
+++ b/Podfile
@@ -10,11 +10,11 @@ def database_pods
end
def ui_pods
- pod 'MBProgressHUD', '~> 1.1.0'
+ pod 'MBProgressHUD'
end
def diff_pods
- pod 'DifferenceKit', '~> 1.0'
+ pod 'DifferenceKit'
end
def jitsi_pods
@@ -46,13 +46,13 @@ def shared_pods
database_pods
# Network
- pod 'Nuke', '~> 7.6'
+ pod 'Nuke'
pod 'Nuke-FLAnimatedImage-Plugin'
pod 'Starscream', '~> 3'
pod 'ReachabilitySwift'
# Authentication SDKs
- pod 'OAuthSwift'
+ pod 'OAuthSwift', '1.2.2'
pod '1PasswordExtension'
# Debugging
@@ -81,7 +81,6 @@ post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
- config.build_settings['SWIFT_VERSION'] = '4.1'
config.build_settings['ENABLE_BITCODE'] = 'NO'
if config.name == 'Debug'
diff --git a/Podfile.lock b/Podfile.lock
index c721d8bf3d..d58e9b66ab 100644
--- a/Podfile.lock
+++ b/Podfile.lock
@@ -1,107 +1,122 @@
PODS:
- - 1PasswordExtension (1.8.5)
- - Crashlytics (3.11.1):
- - Fabric (~> 1.8.1)
- - DifferenceKit (1.1.3):
- - DifferenceKit/Core (= 1.1.3)
- - DifferenceKit/UIKitExtension (= 1.1.3)
- - DifferenceKit/Core (1.1.3)
- - DifferenceKit/UIKitExtension (1.1.3):
+ - 1PasswordExtension (1.8.6)
+ - Crashlytics (3.14.0):
+ - Fabric (~> 1.10.2)
+ - DifferenceKit (1.1.5):
+ - DifferenceKit/Core (= 1.1.5)
+ - DifferenceKit/UIKitExtension (= 1.1.5)
+ - DifferenceKit/Core (1.1.5)
+ - DifferenceKit/UIKitExtension (1.1.5):
- DifferenceKit/Core
- - Fabric (1.8.2)
- - Firebase/Core (5.12.0):
+ - Fabric (1.10.2)
+ - Firebase/Core (6.22.0):
- Firebase/CoreOnly
- - FirebaseAnalytics (= 5.3.0)
- - Firebase/CoreOnly (5.12.0):
- - FirebaseCore (= 5.1.7)
- - FirebaseAnalytics (5.3.0):
- - FirebaseCore (~> 5.1)
- - FirebaseInstanceID (~> 3.3)
- - GoogleAppMeasurement (~> 5.3)
- - GoogleUtilities/AppDelegateSwizzler (~> 5.2)
- - GoogleUtilities/MethodSwizzler (~> 5.2)
- - GoogleUtilities/Network (~> 5.2)
- - "GoogleUtilities/NSData+zlib (~> 5.2)"
- - nanopb (~> 0.3)
- - FirebaseCore (5.1.7):
- - GoogleUtilities/Logger (~> 5.2)
- - FirebaseInstanceID (3.3.0):
- - FirebaseCore (~> 5.1)
- - GoogleUtilities/Environment (~> 5.3)
- - GoogleUtilities/UserDefaults (~> 5.3)
+ - FirebaseAnalytics (= 6.4.1)
+ - Firebase/CoreOnly (6.22.0):
+ - FirebaseCore (= 6.6.6)
+ - FirebaseAnalytics (6.4.1):
+ - FirebaseCore (~> 6.6)
+ - FirebaseInstallations (~> 1.1)
+ - GoogleAppMeasurement (= 6.4.1)
+ - GoogleUtilities/AppDelegateSwizzler (~> 6.0)
+ - GoogleUtilities/MethodSwizzler (~> 6.0)
+ - GoogleUtilities/Network (~> 6.0)
+ - "GoogleUtilities/NSData+zlib (~> 6.0)"
+ - nanopb (= 0.3.9011)
+ - FirebaseCore (6.6.6):
+ - FirebaseCoreDiagnostics (~> 1.2)
+ - FirebaseCoreDiagnosticsInterop (~> 1.2)
+ - GoogleUtilities/Environment (~> 6.5)
+ - GoogleUtilities/Logger (~> 6.5)
+ - FirebaseCoreDiagnostics (1.2.3):
+ - FirebaseCoreDiagnosticsInterop (~> 1.2)
+ - GoogleDataTransportCCTSupport (~> 2.0)
+ - GoogleUtilities/Environment (~> 6.5)
+ - GoogleUtilities/Logger (~> 6.5)
+ - nanopb (~> 0.3.901)
+ - FirebaseCoreDiagnosticsInterop (1.2.0)
+ - FirebaseInstallations (1.1.1):
+ - FirebaseCore (~> 6.6)
+ - GoogleUtilities/UserDefaults (~> 6.5)
+ - PromisesObjC (~> 1.2)
- FLAnimatedImage (1.0.12)
- FLEX (2.4.0)
- - GoogleAppMeasurement (5.3.0):
- - GoogleUtilities/AppDelegateSwizzler (~> 5.2)
- - GoogleUtilities/MethodSwizzler (~> 5.2)
- - GoogleUtilities/Network (~> 5.2)
- - "GoogleUtilities/NSData+zlib (~> 5.2)"
- - nanopb (~> 0.3)
- - GoogleUtilities/AppDelegateSwizzler (5.3.4):
+ - GoogleAppMeasurement (6.4.1):
+ - GoogleUtilities/AppDelegateSwizzler (~> 6.0)
+ - GoogleUtilities/MethodSwizzler (~> 6.0)
+ - GoogleUtilities/Network (~> 6.0)
+ - "GoogleUtilities/NSData+zlib (~> 6.0)"
+ - nanopb (= 0.3.9011)
+ - GoogleDataTransport (5.1.1)
+ - GoogleDataTransportCCTSupport (2.0.2):
+ - GoogleDataTransport (~> 5.1)
+ - nanopb (~> 0.3.901)
+ - GoogleUtilities/AppDelegateSwizzler (6.5.2):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- - GoogleUtilities/Environment (5.3.4)
- - GoogleUtilities/Logger (5.3.4):
+ - GoogleUtilities/Environment (6.5.2)
+ - GoogleUtilities/Logger (6.5.2):
- GoogleUtilities/Environment
- - GoogleUtilities/MethodSwizzler (5.3.4):
+ - GoogleUtilities/MethodSwizzler (6.5.2):
- GoogleUtilities/Logger
- - GoogleUtilities/Network (5.3.4):
+ - GoogleUtilities/Network (6.5.2):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Reachability
- - "GoogleUtilities/NSData+zlib (5.3.4)"
- - GoogleUtilities/Reachability (5.3.4):
+ - "GoogleUtilities/NSData+zlib (6.5.2)"
+ - GoogleUtilities/Reachability (6.5.2):
- GoogleUtilities/Logger
- - GoogleUtilities/UserDefaults (5.3.4):
+ - GoogleUtilities/UserDefaults (6.5.2):
- GoogleUtilities/Logger
- - JitsiMeetSDK (2.4.2)
- - MBProgressHUD (1.1.0)
+ - JitsiMeetSDK (2.7.0)
+ - MBProgressHUD (1.2.0)
- MobilePlayer (1.4.0)
- - nanopb (0.3.901):
- - nanopb/decode (= 0.3.901)
- - nanopb/encode (= 0.3.901)
- - nanopb/decode (0.3.901)
- - nanopb/encode (0.3.901)
- - Nuke (7.6.3)
- - Nuke-FLAnimatedImage-Plugin (6.0):
+ - nanopb (0.3.9011):
+ - nanopb/decode (= 0.3.9011)
+ - nanopb/encode (= 0.3.9011)
+ - nanopb/decode (0.3.9011)
+ - nanopb/encode (0.3.9011)
+ - Nuke (8.4.1)
+ - Nuke-FLAnimatedImage-Plugin (6.2):
- FLAnimatedImage (~> 1.0)
- - Nuke (~> 7.5)
+ - Nuke (~> 8.0)
- OAuthSwift (1.2.2)
+ - PromisesObjC (1.2.8)
- RCMarkdownParser (3.0.7)
- - ReachabilitySwift (4.2.1)
- - Realm (3.21.0):
- - Realm/Headers (= 3.21.0)
- - Realm/Headers (3.21.0)
- - RealmSwift (3.21.0):
- - Realm (= 3.21.0)
- - RocketChatViewController (1.0.0):
- - RocketChatViewController/Composer (= 1.0.0)
- - RocketChatViewController/ViewController (= 1.0.0)
- - RocketChatViewController/Composer (1.0.0)
- - RocketChatViewController/ViewController (1.0.0):
- - DifferenceKit (~> 1.0)
+ - ReachabilitySwift (5.0.0)
+ - Realm (4.4.0):
+ - Realm/Headers (= 4.4.0)
+ - Realm/Headers (4.4.0)
+ - RealmSwift (4.4.0):
+ - Realm (= 4.4.0)
+ - RocketChatViewController (1.0.1):
+ - RocketChatViewController/Composer (= 1.0.1)
+ - RocketChatViewController/ViewController (= 1.0.1)
+ - RocketChatViewController/Composer (1.0.1)
+ - RocketChatViewController/ViewController (1.0.1):
+ - DifferenceKit (~> 1.1)
- semver (1.1.0)
- SimpleImageViewer (1.2.0):
- FLAnimatedImage
- - Starscream (3.0.6)
- - SwiftLint (0.27.0)
- - SwiftyJSON (4.2.0)
- - SwipeCellKit (2.6.0)
+ - Starscream (3.1.1)
+ - SwiftLint (0.39.2)
+ - SwiftyJSON (5.0.0)
+ - SwipeCellKit (2.7.1)
DEPENDENCIES:
- 1PasswordExtension
- Crashlytics
- - DifferenceKit (~> 1.0)
+ - DifferenceKit
- Fabric
- Firebase/Core
- FLEX (~> 2.0)
- JitsiMeetSDK
- - MBProgressHUD (~> 1.1.0)
+ - MBProgressHUD
- MobilePlayer (from `https://github.com/RocketChat/RCiOSMobilePlayer`)
- - Nuke (~> 7.6)
+ - Nuke
- Nuke-FLAnimatedImage-Plugin
- - OAuthSwift
+ - OAuthSwift (= 1.2.2)
- RCMarkdownParser (from `https://github.com/RocketChat/RCMarkdownParser.git`)
- ReachabilitySwift
- RealmSwift
@@ -114,7 +129,7 @@ DEPENDENCIES:
- SwipeCellKit
SPEC REPOS:
- https://github.com/cocoapods/specs.git:
+ https://github.com/CocoaPods/Specs.git:
- 1PasswordExtension
- Crashlytics
- DifferenceKit
@@ -122,10 +137,14 @@ SPEC REPOS:
- Firebase
- FirebaseAnalytics
- FirebaseCore
- - FirebaseInstanceID
+ - FirebaseCoreDiagnostics
+ - FirebaseCoreDiagnosticsInterop
+ - FirebaseInstallations
- FLAnimatedImage
- FLEX
- GoogleAppMeasurement
+ - GoogleDataTransport
+ - GoogleDataTransportCCTSupport
- GoogleUtilities
- JitsiMeetSDK
- MBProgressHUD
@@ -133,6 +152,7 @@ SPEC REPOS:
- Nuke
- Nuke-FLAnimatedImage-Plugin
- OAuthSwift
+ - PromisesObjC
- ReachabilitySwift
- Realm
- RealmSwift
@@ -160,44 +180,49 @@ CHECKOUT OPTIONS:
:commit: 7c4ec046817df378b694bebdbcfe3565869ce82e
:git: https://github.com/RocketChat/RCMarkdownParser.git
RocketChatViewController:
- :commit: ff8b2f080e05e10286f1d84304f0713375c3f952
+ :commit: 20b09477f1e15173c10b99a8b67e78b04102546c
:git: https://github.com/RocketChat/RocketChatViewController
SimpleImageViewer:
:commit: 8222c338de0f285ca0c2d556c5d8dedd4a365b52
:git: https://github.com/cardoso/SimpleImageViewer.git
SPEC CHECKSUMS:
- 1PasswordExtension: 0e95bdea64ec8ff2f4f693be5467a09fac42a83d
- Crashlytics: ca7ab4bc304aa216bdc2e4c1a96389ee77252203
- DifferenceKit: 5018791b6c1fc839921a3c171a0a539ace6ea60c
- Fabric: d2b22f443ba195d8a7cc204da230977c72733b40
- Firebase: 9190018e296139d938b99521cde0c15a6e8d2946
- FirebaseAnalytics: 63202d2665de4e6adcbdce189135255d8b5962ba
- FirebaseCore: 027d350adc039aa5483357c6f56556f117c5170e
- FirebaseInstanceID: e2fa4cb35ef5558c200f7f0ad8a53e212215f93e
+ 1PasswordExtension: f97cc80ae58053c331b2b6dc8843ba7103b33794
+ Crashlytics: 540b7e5f5da5a042647227a5e3ac51d85eed06df
+ DifferenceKit: 516f12e336ed65a3a0665847b5c3cb5cad4bd4ea
+ Fabric: 706c8b8098fff96c33c0db69cbf81f9c551d0d74
+ Firebase: 32f9520684e87c7af3f0704f7f88042626d6b536
+ FirebaseAnalytics: 83f822fd0d33a46f49f89b8c3ab16ab4d89df08a
+ FirebaseCore: 9aca0f1fffb405176ba15311a5621fcde4106fcf
+ FirebaseCoreDiagnostics: 13a6564cd6d5375066bbc8940cc1753af24497f3
+ FirebaseCoreDiagnosticsInterop: 296e2c5f5314500a850ad0b83e9e7c10b011a850
+ FirebaseInstallations: acb3216eb9784d3b1d2d2d635ff74fa892cc0c44
FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31
FLEX: bd1a39e55b56bb413b6f1b34b3c10a0dc44ef079
- GoogleAppMeasurement: 5029d78f2b438bd30ffb44e6c558b57c21622727
- GoogleUtilities: abb092d2c12e817fa3e0e7b274987dd72fb86ec3
- JitsiMeetSDK: 0111509f659c1d93a1ad09697161136af3122bda
- MBProgressHUD: e7baa36a220447d8aeb12769bf0585582f3866d9
+ GoogleAppMeasurement: e49be3954045b17d046f271b9cc1ec052bad9702
+ GoogleDataTransport: 6ffa4dd0b6d547f8d27b91bd92fa9e197a3f5f1f
+ GoogleDataTransportCCTSupport: 12f02e5c8f09c055615de90bcd5ba2c375546051
+ GoogleUtilities: ad0f3b691c67909d03a3327cc205222ab8f42e0e
+ JitsiMeetSDK: e09c2864b89fb3ac5f6733f6f85218bccb2c50be
+ MBProgressHUD: 3ee5efcc380f6a79a7cc9b363dd669c5e1ae7406
MobilePlayer: 6c1df67588b247f80554ba60e67734215ab31a87
- nanopb: 2901f78ea1b7b4015c860c2fdd1ea2fee1a18d48
- Nuke: 44130e95e09463f8773ae4b96b90de1eba6b3350
- Nuke-FLAnimatedImage-Plugin: e4c39d13061a08ac0bdcb0cd7a23882f4a43f4a6
+ nanopb: 18003b5e52dab79db540fe93fe9579f399bd1ccd
+ Nuke: d780e3507a86b86c589ab3cc5cd302d5456f06fb
+ Nuke-FLAnimatedImage-Plugin: c6e8f6cffd57659953a149ff1682370b9040d09d
OAuthSwift: 27b34fe80b76b67cd8f45571e0be2432bc9f6de1
+ PromisesObjC: c119f3cd559f50b7ae681fa59dc1acd19173b7e6
RCMarkdownParser: f107c58b83065d001e20c988443e6eab9c0a1e26
- ReachabilitySwift: 35720ffea59c1c76d15f885be77fd33e33985427
- Realm: 38e9dcb19104b58407167d99f70d4995f7c16023
- RealmSwift: 3183cc1ad48378fbcd634311b22c0e6c44021152
- RocketChatViewController: 8c9fa96502913d268bcecf6d15830f1ffd711e7b
+ ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
+ Realm: e125f464884cda953ebefe70c671b75b03b81b9b
+ RealmSwift: 33656a42bd300959a081fc13347376bc478071af
+ RocketChatViewController: ab532fa2810a165dc4f8e79a337253c09434cce6
semver: 11ae3bc4a6036efbc86b5863ef5fa32c065c8bbd
SimpleImageViewer: 6ed0d2acf7c166a5b4e795bccc7b9ea1b225ff9b
- Starscream: ef3ece99d765eeccb67de105bfa143f929026cf5
- SwiftLint: 3207c1faa2240bf8973b191820a116113cd11073
- SwiftyJSON: c4bcba26dd9ec7a027fc8eade48e2c911f229e96
- SwipeCellKit: 935ca28c187ec6e1ffb2b578cf8ddca842bfdcbb
+ Starscream: 4bb2f9942274833f7b4d296a55504dcfc7edb7b0
+ SwiftLint: 22ccbbe3b8008684be5955693bab135e0ed6a447
+ SwiftyJSON: 36413e04c44ee145039d332b4f4e2d3e8d6c4db7
+ SwipeCellKit: 3972254a826da74609926daf59b08d6c72e619ea
-PODFILE CHECKSUM: d269dc70e4ec3c574e7cd282bba50ba0c4f7a868
+PODFILE CHECKSUM: b10caf0bb2791a9d36dbf06be978f728fdcadbf5
-COCOAPODS: 1.5.3
+COCOAPODS: 1.9.0
diff --git a/Pods/1PasswordExtension/LICENSE.txt b/Pods/1PasswordExtension/LICENSE.txt
index fbe2df3c89..a2ee23cd0a 100644
--- a/Pods/1PasswordExtension/LICENSE.txt
+++ b/Pods/1PasswordExtension/LICENSE.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2014 AgileBits Inc.
+Copyright (c) 2014-2020 AgileBits Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/Pods/1PasswordExtension/OnePasswordExtension.h b/Pods/1PasswordExtension/OnePasswordExtension.h
index 25d63dc838..db7256c030 100644
--- a/Pods/1PasswordExtension/OnePasswordExtension.h
+++ b/Pods/1PasswordExtension/OnePasswordExtension.h
@@ -1,9 +1,22 @@
+//Copyright (c) 2014-2020 AgileBits Inc.
//
-// 1Password Extension
+//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:
//
-// Lovingly handcrafted by Dave Teare, Michael Fey, Rad Azzouz, and Roustem Karimov.
-// Copyright (c) 2014 AgileBits. All rights reserved.
+//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
@@ -23,36 +36,39 @@ NS_ASSUME_NONNULL_BEGIN
#endif
// Login Dictionary keys - Used to get or set the properties of a 1Password Login
-#define AppExtensionURLStringKey @"url_string"
-#define AppExtensionUsernameKey @"username"
-#define AppExtensionPasswordKey @"password"
-#define AppExtensionTOTPKey @"totp"
-#define AppExtensionTitleKey @"login_title"
-#define AppExtensionNotesKey @"notes"
-#define AppExtensionSectionTitleKey @"section_title"
-#define AppExtensionFieldsKey @"fields"
-#define AppExtensionReturnedFieldsKey @"returned_fields"
-#define AppExtensionOldPasswordKey @"old_password"
-#define AppExtensionPasswordGeneratorOptionsKey @"password_generator_options"
+
+FOUNDATION_EXPORT NSString *const AppExtensionURLStringKey;
+FOUNDATION_EXPORT NSString *const AppExtensionUsernameKey;
+FOUNDATION_EXPORT NSString *const AppExtensionPasswordKey;
+FOUNDATION_EXPORT NSString *const AppExtensionTOTPKey;
+FOUNDATION_EXPORT NSString *const AppExtensionTitleKey;
+FOUNDATION_EXPORT NSString *const AppExtensionNotesKey;
+FOUNDATION_EXPORT NSString *const AppExtensionSectionTitleKey;
+FOUNDATION_EXPORT NSString *const AppExtensionFieldsKey;
+FOUNDATION_EXPORT NSString *const AppExtensionReturnedFieldsKey;
+FOUNDATION_EXPORT NSString *const AppExtensionOldPasswordKey;
+FOUNDATION_EXPORT NSString *const AppExtensionPasswordGeneratorOptionsKey;
// Password Generator options - Used to set the 1Password Password Generator options when saving a new Login or when changing the password for for an existing Login
-#define AppExtensionGeneratedPasswordMinLengthKey @"password_min_length"
-#define AppExtensionGeneratedPasswordMaxLengthKey @"password_max_length"
-#define AppExtensionGeneratedPasswordRequireDigitsKey @"password_require_digits"
-#define AppExtensionGeneratedPasswordRequireSymbolsKey @"password_require_symbols"
-#define AppExtensionGeneratedPasswordForbiddenCharactersKey @"password_forbidden_characters"
+FOUNDATION_EXPORT NSString *const AppExtensionGeneratedPasswordMinLengthKey;
+FOUNDATION_EXPORT NSString *const AppExtensionGeneratedPasswordMaxLengthKey;
+FOUNDATION_EXPORT NSString *const AppExtensionGeneratedPasswordRequireDigitsKey;
+FOUNDATION_EXPORT NSString *const AppExtensionGeneratedPasswordRequireSymbolsKey;
+FOUNDATION_EXPORT NSString *const AppExtensionGeneratedPasswordForbiddenCharactersKey;
// Errors codes
-#define AppExtensionErrorDomain @"OnePasswordExtension"
-
-#define AppExtensionErrorCodeCancelledByUser 0
-#define AppExtensionErrorCodeAPINotAvailable 1
-#define AppExtensionErrorCodeFailedToContactExtension 2
-#define AppExtensionErrorCodeFailedToLoadItemProviderData 3
-#define AppExtensionErrorCodeCollectFieldsScriptFailed 4
-#define AppExtensionErrorCodeFillFieldsScriptFailed 5
-#define AppExtensionErrorCodeUnexpectedData 6
-#define AppExtensionErrorCodeFailedToObtainURLStringFromWebView 7
+FOUNDATION_EXPORT NSString *const AppExtensionErrorDomain;
+
+FOUNDATION_EXPORT NS_ENUM(NSUInteger, AppExtensionErrorCode) {
+ AppExtensionErrorCodeCancelledByUser = 0,
+ AppExtensionErrorCodeAPINotAvailable = 1,
+ AppExtensionErrorCodeFailedToContactExtension = 2,
+ AppExtensionErrorCodeFailedToLoadItemProviderData = 3,
+ AppExtensionErrorCodeCollectFieldsScriptFailed = 4,
+ AppExtensionErrorCodeFillFieldsScriptFailed = 5,
+ AppExtensionErrorCodeUnexpectedData = 6,
+ AppExtensionErrorCodeFailedToObtainURLStringFromWebView = 7
+};
// Note to creators of libraries or frameworks:
// If you include this code within your library, then to prevent potential duplicate symbol
@@ -152,13 +168,13 @@ typedef void (^OnePasswordExtensionItemCompletionBlock)(NSExtensionItem * __null
/*!
Called from your web view controller, this method will show all the saved logins for the active page in the provided web
- view, and automatically fill the HTML form fields. Supports both WKWebView and UIWebView.
+ view, and automatically fill the HTML form fields. Supports WKWebView.
@discussion 1Password will show all matching Login for the naked domain of the current website. For example if the user has an item in your 1Password vault with "subdomain1.domain.com” as the website and another one with "subdomain2.domain.com”, and the current website is "https://domain.com", 1Password will show both items.
However, if no matching login is found for "https://domain.com", the 1Password Extension will display the "New Login" button so that the user can create a new Login for the current website.
- @param webView The web view which displays the form to be filled. The active UIWebView Or WKWebView. Must not be nil.
+ @param webView The web view which displays the form to be filled. The active WKWebView. Must not be nil.
@param viewController The view controller from which the 1Password Extension is invoked. Usually `self`
@@ -168,7 +184,7 @@ typedef void (^OnePasswordExtensionItemCompletionBlock)(NSExtensionItem * __null
@param completion Completion block called on completion with parameters success, and error. The success reply parameter that is YES if the 1Password Extension has been successfully completed or NO otherwise. The error reply parameter that is nil if the 1Password Extension has been successfully completed, or it contains error information about the completion failure.
*/
-- (void)fillItemIntoWebView:(nonnull id)webView forViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender showOnlyLogins:(BOOL)yesOrNo completion:(nonnull OnePasswordSuccessCompletionBlock)completion;
+- (void)fillItemIntoWebView:(nonnull WKWebView *)webView forViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender showOnlyLogins:(BOOL)yesOrNo completion:(nonnull OnePasswordSuccessCompletionBlock)completion;
/*!
Called in the UIActivityViewController completion block to find out whether or not the user selected the 1Password Extension activity.
@@ -182,27 +198,21 @@ typedef void (^OnePasswordExtensionItemCompletionBlock)(NSExtensionItem * __null
/*!
The returned NSExtensionItem can be used to create your own UIActivityViewController. Use `isOnePasswordExtensionActivityType:` and `fillReturnedItems:intoWebView:completion:` in the activity view controller completion block to process the result. The completion block is guaranteed to be called on the main thread.
- @param webView The web view which displays the form to be filled. The active UIWebView Or WKWebView. Must not be nil.
+ @param webView The web view which displays the form to be filled. The active WKWebView. Must not be nil.
@param completion Completion block called on completion with extensionItem and error. The extensionItem reply parameter that is contains all the info required by the 1Password extension if has been successfully completed or nil otherwise. The error reply parameter that is nil if the 1Password extension item has been successfully created, or it contains error information about the completion failure.
*/
-- (void)createExtensionItemForWebView:(nonnull id)webView completion:(nonnull OnePasswordExtensionItemCompletionBlock)completion;
+- (void)createExtensionItemForWebView:(nonnull WKWebView *)webView completion:(nonnull OnePasswordExtensionItemCompletionBlock)completion;
/*!
Method used in the UIActivityViewController completion block to fill information into a web view.
@param returnedItems Array which contains the selected activity in the share sheet. Empty array if the share sheet is cancelled by the user.
- @param webView The web view which displays the form to be filled. The active UIWebView Or WKWebView. Must not be nil.
+ @param webView The web view which displays the form to be filled. The active WKWebView. Must not be nil.
@param completion Completion block called on completion with parameters success, and error. The success reply parameter that is YES if the 1Password Extension has been successfully completed or NO otherwise. The error reply parameter that is nil if the 1Password Extension has been successfully completed, or it contains error information about the completion failure.
*/
-- (void)fillReturnedItems:(nullable NSArray *)returnedItems intoWebView:(nonnull id)webView completion:(nonnull OnePasswordSuccessCompletionBlock)completion;
-
-/*!
- Deprecated in version 1.5
- @see Use fillItemIntoWebView:forViewController:sender:showOnlyLogins:completion: instead
- */
-- (void)fillLoginIntoWebView:(nonnull id)webView forViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender completion:(nonnull OnePasswordSuccessCompletionBlock)completion __attribute__((deprecated("Use fillItemIntoWebView:forViewController:sender:showOnlyLogins:completion: instead. Deprecated in version 1.5")));
+- (void)fillReturnedItems:(nullable NSArray *)returnedItems intoWebView:(nonnull WKWebView *)webView completion:(nonnull OnePasswordSuccessCompletionBlock)completion;
@end
#if __has_feature(nullability)
diff --git a/Pods/1PasswordExtension/OnePasswordExtension.m b/Pods/1PasswordExtension/OnePasswordExtension.m
index 133f548428..b19667bc52 100644
--- a/Pods/1PasswordExtension/OnePasswordExtension.m
+++ b/Pods/1PasswordExtension/OnePasswordExtension.m
@@ -1,12 +1,45 @@
+//Copyright (c) 2014-2020 AgileBits Inc.
//
-// 1Password Extension
+//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:
//
-// Lovingly handcrafted by Dave Teare, Michael Fey, Rad Azzouz, and Roustem Karimov.
-// Copyright (c) 2014 AgileBits. All rights reserved.
+//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 "OnePasswordExtension.h"
+NSString *const AppExtensionURLStringKey = @"url_string";
+NSString *const AppExtensionUsernameKey = @"username";
+NSString *const AppExtensionPasswordKey = @"password";
+NSString *const AppExtensionTOTPKey = @"totp";
+NSString *const AppExtensionTitleKey = @"login_title";
+NSString *const AppExtensionNotesKey = @"notes";
+NSString *const AppExtensionSectionTitleKey = @"section_title";
+NSString *const AppExtensionFieldsKey = @"fields";
+NSString *const AppExtensionReturnedFieldsKey = @"returned_fields";
+NSString *const AppExtensionOldPasswordKey = @"old_password";
+NSString *const AppExtensionPasswordGeneratorOptionsKey = @"password_generator_options";
+
+NSString *const AppExtensionGeneratedPasswordMinLengthKey = @"password_min_length";
+NSString *const AppExtensionGeneratedPasswordMaxLengthKey = @"password_max_length";
+NSString *const AppExtensionGeneratedPasswordRequireDigitsKey = @"password_require_digits";
+NSString *const AppExtensionGeneratedPasswordRequireSymbolsKey = @"password_require_symbols";
+NSString *const AppExtensionGeneratedPasswordForbiddenCharactersKey = @"password_forbidden_characters";
+
+NSString *const AppExtensionErrorDomain = @"OnePasswordExtension";
+
// Version
#define VERSION_NUMBER @(185)
static NSString *const AppExtensionVersionNumberKey = @"version_number";
@@ -60,7 +93,6 @@ - (void)findLoginForURLString:(nonnull NSString *)URLString forViewController:(n
return;
}
-#ifdef __IPHONE_8_0
NSDictionary *item = @{ AppExtensionVersionNumberKey: VERSION_NUMBER, AppExtensionURLStringKey: URLString };
UIActivityViewController *activityViewController = [self activityViewControllerForItem:item viewController:viewController sender:sender typeIdentifier:kUTTypeAppExtensionFindLoginAction];
@@ -90,7 +122,6 @@ - (void)findLoginForURLString:(nonnull NSString *)URLString forViewController:(n
};
[viewController presentViewController:activityViewController animated:YES completion:nil];
-#endif
}
#pragma mark - New User Registration
@@ -108,8 +139,6 @@ - (void)storeLoginForURLString:(nonnull NSString *)URLString loginDetails:(nulla
return;
}
-
-#ifdef __IPHONE_8_0
NSMutableDictionary *newLoginAttributesDict = [NSMutableDictionary new];
newLoginAttributesDict[AppExtensionVersionNumberKey] = VERSION_NUMBER;
newLoginAttributesDict[AppExtensionURLStringKey] = URLString;
@@ -145,7 +174,6 @@ - (void)storeLoginForURLString:(nonnull NSString *)URLString loginDetails:(nulla
};
[viewController presentViewController:activityViewController animated:YES completion:nil];
-#endif
}
#pragma mark - Change Password
@@ -163,7 +191,6 @@ - (void)changePasswordForLoginForURLString:(nonnull NSString *)URLString loginDe
return;
}
-#ifdef __IPHONE_8_0
NSMutableDictionary *item = [NSMutableDictionary new];
item[AppExtensionVersionNumberKey] = VERSION_NUMBER;
item[AppExtensionURLStringKey] = URLString;
@@ -200,34 +227,20 @@ - (void)changePasswordForLoginForURLString:(nonnull NSString *)URLString loginDe
};
[viewController presentViewController:activityViewController animated:YES completion:nil];
-#endif
}
#pragma mark - Web View filling Support
-- (void)fillItemIntoWebView:(nonnull id)webView forViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender showOnlyLogins:(BOOL)yesOrNo completion:(nonnull OnePasswordSuccessCompletionBlock)completion {
+- (void)fillItemIntoWebView:(nonnull WKWebView *)webView forViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender showOnlyLogins:(BOOL)yesOrNo completion:(nonnull OnePasswordSuccessCompletionBlock)completion {
NSAssert(webView != nil, @"webView must not be nil");
NSAssert(viewController != nil, @"viewController must not be nil");
- NSAssert([webView isKindOfClass:[UIWebView class]] || [webView isKindOfClass:[WKWebView class]], @"webView must be an instance of WKWebView or UIWebView.");
+ NSAssert([webView isKindOfClass:[WKWebView class]], @"webView must be an instance of WKWebView.");
-#ifdef __IPHONE_8_0
- if ([webView isKindOfClass:[UIWebView class]]) {
- [self fillItemIntoUIWebView:webView webViewController:viewController sender:(id)sender showOnlyLogins:yesOrNo completion:^(BOOL success, NSError *error) {
- if (completion) {
- completion(success, error);
- }
- }];
- }
- #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW
- else if ([webView isKindOfClass:[WKWebView class]]) {
- [self fillItemIntoWKWebView:webView forViewController:viewController sender:(id)sender showOnlyLogins:yesOrNo completion:^(BOOL success, NSError *error) {
- if (completion) {
- completion(success, error);
- }
- }];
- }
- #endif
-#endif
+ [self fillItemIntoWKWebView:webView forViewController:viewController sender:(id)sender showOnlyLogins:yesOrNo completion:^(BOOL success, NSError *error) {
+ if (completion) {
+ completion(success, error);
+ }
+ }];
}
#pragma mark - Support for custom UIActivityViewControllers
@@ -236,46 +249,33 @@ - (BOOL)isOnePasswordExtensionActivityType:(nullable NSString *)activityType {
return [@"com.agilebits.onepassword-ios.extension" isEqualToString:activityType] || [@"com.agilebits.beta.onepassword-ios.extension" isEqualToString:activityType];
}
-- (void)createExtensionItemForWebView:(nonnull id)webView completion:(nonnull OnePasswordExtensionItemCompletionBlock)completion {
+- (void)createExtensionItemForWebView:(nonnull WKWebView *)webView completion:(nonnull OnePasswordExtensionItemCompletionBlock)completion {
NSAssert(webView != nil, @"webView must not be nil");
- NSAssert([webView isKindOfClass:[UIWebView class]] || [webView isKindOfClass:[WKWebView class]], @"webView must be an instance of WKWebView or UIWebView.");
+ NSAssert([webView isKindOfClass:[WKWebView class]], @"webView must be an instance of WKWebView.");
-#ifdef __IPHONE_8_0
- if ([webView isKindOfClass:[UIWebView class]]) {
- UIWebView *uiWebView = (UIWebView *)webView;
- NSString *collectedPageDetails = [uiWebView stringByEvaluatingJavaScriptFromString:OPWebViewCollectFieldsScript];
-
- [self createExtensionItemForURLString:uiWebView.request.URL.absoluteString webPageDetails:collectedPageDetails completion:completion];
- }
- #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW
- else if ([webView isKindOfClass:[WKWebView class]]) {
- WKWebView *wkWebView = (WKWebView *)webView;
- [wkWebView evaluateJavaScript:OPWebViewCollectFieldsScript completionHandler:^(NSString *result, NSError *evaluateError) {
- if (result == nil) {
- NSLog(@"1Password Extension failed to collect web page fields: %@", evaluateError);
- NSError *failedToCollectFieldsError = [OnePasswordExtension failedToCollectFieldsErrorWithUnderlyingError:evaluateError];
- if (completion) {
- if ([NSThread isMainThread]) {
+ [webView evaluateJavaScript:OPWebViewCollectFieldsScript completionHandler:^(NSString *result, NSError *evaluateError) {
+ if (result == nil) {
+ NSLog(@"1Password Extension failed to collect web page fields: %@", evaluateError);
+ NSError *failedToCollectFieldsError = [OnePasswordExtension failedToCollectFieldsErrorWithUnderlyingError:evaluateError];
+ if (completion) {
+ if ([NSThread isMainThread]) {
+ completion(nil, failedToCollectFieldsError);
+ }
+ else {
+ dispatch_async(dispatch_get_main_queue(), ^{
completion(nil, failedToCollectFieldsError);
- }
- else {
- dispatch_async(dispatch_get_main_queue(), ^{
- completion(nil, failedToCollectFieldsError);
- });
- }
+ });
}
-
- return;
}
- [self createExtensionItemForURLString:wkWebView.URL.absoluteString webPageDetails:result completion:completion];
- }];
- }
- #endif
-#endif
+ return;
+ }
+
+ [self createExtensionItemForURLString:webView.URL.absoluteString webPageDetails:result completion:completion];
+ }];
}
-- (void)fillReturnedItems:(nullable NSArray *)returnedItems intoWebView:(nonnull id)webView completion:(nonnull OnePasswordSuccessCompletionBlock)completion {
+- (void)fillReturnedItems:(nullable NSArray *)returnedItems intoWebView:(nonnull WKWebView *)webView completion:(nonnull OnePasswordSuccessCompletionBlock)completion {
NSAssert(webView != nil, @"webView must not be nil");
if (returnedItems.count == 0) {
@@ -308,14 +308,10 @@ - (void)fillReturnedItems:(nullable NSArray *)returnedItems intoWebView:(nonnull
#pragma mark - Private methods
- (BOOL)isSystemAppExtensionAPIAvailable {
-#ifdef __IPHONE_8_0
return [NSExtensionItem class] != nil;
-#else
- return NO;
-#endif
}
-- (void)findLoginIn1PasswordWithURLString:(nonnull NSString *)URLString collectedPageDetails:(nullable NSString *)collectedPageDetails forWebViewController:(nonnull UIViewController *)forViewController sender:(nullable id)sender withWebView:(nonnull id)webView showOnlyLogins:(BOOL)yesOrNo completion:(nonnull OnePasswordSuccessCompletionBlock)completion {
+- (void)findLoginIn1PasswordWithURLString:(nonnull NSString *)URLString collectedPageDetails:(nullable NSString *)collectedPageDetails forWebViewController:(nonnull UIViewController *)forViewController sender:(nullable id)sender withWebView:(nonnull WKWebView *)webView showOnlyLogins:(BOOL)yesOrNo completion:(nonnull OnePasswordSuccessCompletionBlock)completion {
if ([URLString length] == 0) {
NSError *URLStringError = [OnePasswordExtension failedToObtainURLStringFromWebViewError];
NSLog(@"Failed to findLoginIn1PasswordWithURLString: %@", URLStringError);
@@ -380,7 +376,6 @@ - (void)findLoginIn1PasswordWithURLString:(nonnull NSString *)URLString collecte
[forViewController presentViewController:activityViewController animated:YES completion:nil];
}
-#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW
- (void)fillItemIntoWKWebView:(nonnull WKWebView *)webView forViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender showOnlyLogins:(BOOL)yesOrNo completion:(nonnull OnePasswordSuccessCompletionBlock)completion {
[webView evaluateJavaScript:OPWebViewCollectFieldsScript completionHandler:^(NSString *result, NSError *error) {
if (result == nil) {
@@ -399,18 +394,8 @@ - (void)fillItemIntoWKWebView:(nonnull WKWebView *)webView forViewController:(no
}];
}];
}
-#endif
-- (void)fillItemIntoUIWebView:(nonnull UIWebView *)webView webViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender showOnlyLogins:(BOOL)yesOrNo completion:(nonnull OnePasswordSuccessCompletionBlock)completion {
- NSString *collectedPageDetails = [webView stringByEvaluatingJavaScriptFromString:OPWebViewCollectFieldsScript];
- [self findLoginIn1PasswordWithURLString:webView.request.URL.absoluteString collectedPageDetails:collectedPageDetails forWebViewController:viewController sender:sender withWebView:webView showOnlyLogins:yesOrNo completion:^(BOOL success, NSError *error) {
- if (completion) {
- completion(success, error);
- }
- }];
-}
-
-- (void)executeFillScript:(NSString * __nullable)fillScript inWebView:(nonnull id)webView completion:(nonnull OnePasswordSuccessCompletionBlock)completion {
+- (void)executeFillScript:(NSString * __nullable)fillScript inWebView:(nonnull WKWebView *)webView completion:(nonnull OnePasswordSuccessCompletionBlock)completion {
if (fillScript == nil) {
NSLog(@"Failed to executeFillScript, fillScript is missing");
@@ -424,43 +409,21 @@ - (void)executeFillScript:(NSString * __nullable)fillScript inWebView:(nonnull i
NSMutableString *scriptSource = [OPWebViewFillScript mutableCopy];
[scriptSource appendFormat:@"(document, %@, undefined);", fillScript];
-#ifdef __IPHONE_8_0
- if ([webView isKindOfClass:[UIWebView class]]) {
- NSString *result = [((UIWebView *)webView) stringByEvaluatingJavaScriptFromString:scriptSource];
+ [webView evaluateJavaScript:scriptSource completionHandler:^(NSString *result, NSError *evaluationError) {
BOOL success = (result != nil);
NSError *error = nil;
if (!success) {
- NSLog(@"Cannot executeFillScript, stringByEvaluatingJavaScriptFromString failed");
- error = [OnePasswordExtension failedToFillFieldsErrorWithLocalizedErrorMessage:NSLocalizedStringFromTable(@"Failed to fill web page because script could not be evaluated", @"OnePasswordExtension", @"1Password Extension Error Message") underlyingError:nil];
+ NSLog(@"Cannot executeFillScript, evaluateJavaScript failed: %@", evaluationError);
+ error = [OnePasswordExtension failedToFillFieldsErrorWithLocalizedErrorMessage:NSLocalizedStringFromTable(@"Failed to fill web page because script could not be evaluated", @"OnePasswordExtension", @"1Password Extension Error Message") underlyingError:error];
}
if (completion) {
completion(success, error);
}
- }
-
- #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW
- else if ([webView isKindOfClass:[WKWebView class]]) {
- [((WKWebView *)webView) evaluateJavaScript:scriptSource completionHandler:^(NSString *result, NSError *evaluationError) {
- BOOL success = (result != nil);
- NSError *error = nil;
-
- if (!success) {
- NSLog(@"Cannot executeFillScript, evaluateJavaScript failed: %@", evaluationError);
- error = [OnePasswordExtension failedToFillFieldsErrorWithLocalizedErrorMessage:NSLocalizedStringFromTable(@"Failed to fill web page because script could not be evaluated", @"OnePasswordExtension", @"1Password Extension Error Message") underlyingError:error];
- }
-
- if (completion) {
- completion(success, error);
- }
- }];
- }
- #endif
-#endif
+ }];
}
-#ifdef __IPHONE_8_0
- (void)processExtensionItem:(nullable NSExtensionItem *)extensionItem completion:(nonnull OnePasswordLoginDictionaryCompletionBlock)completion {
if (extensionItem.attachments.count == 0) {
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Unexpected data returned by App Extension: extension item had no attachments." };
@@ -503,7 +466,6 @@ - (void)processExtensionItem:(nullable NSExtensionItem *)extensionItem completio
}
- (UIActivityViewController *)activityViewControllerForItem:(nonnull NSDictionary *)item viewController:(nonnull UIViewController*)viewController sender:(nullable id)sender typeIdentifier:(nonnull NSString *)typeIdentifier {
-#ifdef __IPHONE_8_0
NSAssert(NO == (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && sender == nil), @"sender must not be nil on iPad.");
NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithItem:item typeIdentifier:typeIdentifier];
@@ -525,13 +487,8 @@ - (UIActivityViewController *)activityViewControllerForItem:(nonnull NSDictionar
}
return controller;
-#else
- return nil;
-#endif
}
-#endif
-
- (void)createExtensionItemForURLString:(nonnull NSString *)URLString webPageDetails:(nullable NSString *)webPageDetails completion:(nonnull OnePasswordExtensionItemCompletionBlock)completion {
NSError *jsonError = nil;
NSData *data = [webPageDetails dataUsingEncoding:NSUTF8StringEncoding];
@@ -678,15 +635,4 @@ + (NSError *)failedToObtainURLStringFromWebViewError {
\
";
-
-#pragma mark - Deprecated methods
-
-/*
- Deprecated in version 1.5
- Use fillItemIntoWebView:forViewController:sender:showOnlyLogins:completion: instead
- */
-- (void)fillLoginIntoWebView:(nonnull id)webView forViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender completion:(nonnull OnePasswordSuccessCompletionBlock)completion {
- [self fillItemIntoWebView:webView forViewController:viewController sender:sender showOnlyLogins:YES completion:completion];
-}
-
@end
diff --git a/Pods/1PasswordExtension/README.md b/Pods/1PasswordExtension/README.md
index 3797dd7426..78ffeada1a 100644
--- a/Pods/1PasswordExtension/README.md
+++ b/Pods/1PasswordExtension/README.md
@@ -23,8 +23,8 @@ You might be looking at this 23 KB README and think integrating with 1Password i
If you're the type that just wants the code, here it is:
-* [OnePasswordExtension.h](https://raw.githubusercontent.com/AgileBits/onepassword-app-extension/master/OnePasswordExtension.h?token=110676__eyJzY29wZSI6IlJhd0Jsb2I6QWdpbGVCaXRzL29uZXBhc3N3b3JkLWFwcC1leHRlbnNpb24vbWFzdGVyL09uZVBhc3N3b3JkRXh0ZW5zaW9uLmgiLCJleHBpcmVzIjoxNDA3Mjg0MTMwfQ%3D%3D--3867c64b22a5923bead5948001ce2ff048892799)
-* [OnePasswordExtension.m](https://raw.githubusercontent.com/AgileBits/onepassword-app-extension/master/OnePasswordExtension.m?token=110676__eyJzY29wZSI6IlJhd0Jsb2I6QWdpbGVCaXRzL29uZXBhc3N3b3JkLWFwcC1leHRlbnNpb24vbWFzdGVyL09uZVBhc3N3b3JkRXh0ZW5zaW9uLm0iLCJleHBpcmVzIjoxNDA3Mjg0MTA5fQ%3D%3D--05c6ea9c73d0afb9f30e53a31d81df00b7c02077)
+* [OnePasswordExtension.h](https://raw.githubusercontent.com/AgileBits/onepassword-app-extension/master/OnePasswordExtension.h)
+* [OnePasswordExtension.m](https://raw.githubusercontent.com/AgileBits/onepassword-app-extension/master/OnePasswordExtension.m)
Simply include these two files in your project, add a button with a [1Password login image](https://github.com/AgileBits/onepassword-app-extension/tree/master/1Password.xcassets) on it to your view, set the button's action to call the appropriate `OnePasswordExtension` method, and you're all set!
@@ -52,7 +52,7 @@ The sample project depends upon having the latest version of Xcode, as well as t
If you are developing for OS X, you can enable betas within the 1Password > Preferences > Updates window (as shown [here](i.agilebits.com/Preferences_197C0C6B.png)) and enabling the _Include beta builds_ checkbox. Mac App Store users should [download the web store version](https://agilebits.com/downloads) in order to enable betas.
-->
-To install 1Password, you will need to download it from the [App Store](http://j.mp/1PasSITE).
+To install 1Password, you will need to download it from the [App Store](https://1pw.ca/download/ios).
Let us know that you're an app developer and planning to add 1Password support by emailing us to [support+appex@agilebits.com](mailto:support+appex@agilebits.com).
@@ -103,7 +103,7 @@ Note that `isAppExtensionAvailable` looks to see if any app is installed that su
-For more information about URL schemes in iOS 9, please refer to the [Privacy and Your Apps session](https://developer.apple.com/videos/wwdc/2015/?id=703) from WWDC 2015 at around the the 9th minute mark.
+For more information about URL schemes in iOS 9, please refer to the [Privacy and Your Apps session](https://developer.apple.com/videos/play/wwdc2015/703/) from WWDC 2015 at around the the 9th minute mark.
Next we need to wire up the action for this button to this method in your UIViewController:
@@ -263,7 +263,7 @@ Adding 1Password to your change password screen is very similar to adding 1Passw
### Use Case #4: Web View Filling
-The 1Password App Extension is not limited to filling native UIs. With just a little bit of extra effort, users can fill `UIWebView`s and `WKWebView`s within your application as well.
+The 1Password App Extension is not limited to filling native UIs. With just a little bit of extra effort, users can fill `WKWebView`s within your application as well.
Simply add a button to your UI with its action assigned to this method in your web view's UIViewController:
@@ -285,18 +285,6 @@ If you use a web view to login (i.e. OAuth) and you do not want other activities
If your app uses `SFSafariViewController`, the 1Password App Extension will show up in the share sheet on devices running iOS 9.2 or later just like it does in Safari. No implementation is required.
-## Projects supporting iOS 7.1 and earlier
-
-If your project's Deployment Target is earlier than iOS 8.0, please make sure that you link the `MobileCoreServices` and the `WebKit` frameworks as follows:
-
-
-
-#### WKWebView support for projects with iOS 7.1 or earlier as the Deployment Target
-
-If the **Deployment Target** is `7.1` or earlier in your project or target and you are using `WKWebViews` (runtime checks for iOS 8 devices), you simply need to add `ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW=1` to your `Preprocessor Macros`.
-
-
-
## Best Practices
* Use the same `URLString` during Registration and Login.
@@ -313,8 +301,8 @@ If the **Deployment Target** is `7.1` or earlier in your project or target and y
If you open up OnePasswordExtension.m and start poking around, you'll be interested in these references.
-* [Apple Extension Guide](https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/index.html#//apple_ref/doc/uid/TP40014214)
-* [NSItemProvider](https://developer.apple.com/library/prerelease/ios/documentation/Foundation/Reference/NSItemProvider_Class/index.html#//apple_ref/doc/uid/TP40014351), [NSExtensionItem](https://developer.apple.com/library/prerelease/ios/documentation/Foundation/Reference/NSExtensionItem_Class/index.html#//apple_ref/doc/uid/TP40014375), and [UIActivityViewController](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIActivityViewController_Class/index.html#//apple_ref/doc/uid/TP40011976) class references.
+* [Apple Extension Guide](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/index.html#//apple_ref/doc/uid/TP40014214)
+* [NSItemProvider](https://developer.apple.com/documentation/foundation/nsitemprovider#//apple_ref/doc/uid/TP40014351), [NSExtensionItem](https://developer.apple.com/documentation/foundation/nsextensionitem#//apple_ref/doc/uid/TP40014375), and [UIActivityViewController](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller#//apple_ref/doc/uid/TP40011976) class references.
## Contact Us
@@ -322,5 +310,3 @@ If you open up OnePasswordExtension.m and start poking around, you'll be interes
Contact us, please! We'd love to hear from you about how you integrated 1Password within your app, how we can further improve things, and add your app to [apps that integrate with 1Password](https://blog.agilebits.com/1password-apps/).
You can reach us at support+appex@agilebits.com, or if you prefer, [@1Password](https://twitter.com/1Password) on Twitter.
-
-You can also [subscribe to our 1Password App Extension Developers newsletter](https://blog.agilebits.com/1password-extension-developers-newsletter/). We’ll send you an occasional newsletter containing 1Password App Extension news, updates, and tricks, to help you realize the full potential of the 1Password Extension API in your iOS apps.
diff --git a/Pods/Crashlytics/README.md b/Pods/Crashlytics/README.md
index 2715a06b7c..996af5078b 100644
--- a/Pods/Crashlytics/README.md
+++ b/Pods/Crashlytics/README.md
@@ -1,39 +1,23 @@
-
-Part of [Google Fabric](https://get.fabric.io), [Crashlytics](http://try.crashlytics.com/) offers the most powerful, yet lightest weight crash reporting solution for iOS. Crashlytics also provides real-time analytics through [Answers](https://answers.io/) and app distributions to testers using [Beta](http://try.crashlytics.com/beta/).
+# Crashlytics
-## Setup
-
-1. Visit [https://fabric.io/sign_up](https://fabric.io/sign_up) to create your Fabric account and to download Fabric.app.
-
-1. Open Fabric.app, login and select the Crashlytics SDK.
-
- 
+## Overview
-1. The Fabric app automatically detects when a project uses CocoaPods and gives you the option to install via the Podfile or Xcode.
+[Crashlytics](https://firebase.google.com/docs/crashlytics/get-started?platform=ios) offers the most powerful, yet lightest weight crash reporting solution for iOS.
- 
-1. Select the Podfile option and follow the installation instructions to update your Podfile. **Note:** the Crashlytics Pod includes Answers. If you have Answers included as a separate Pod it should be removed from your Podfile to avoid duplicate symbol errors.
-
- ```
- pod 'Fabric'
- pod 'Crashlytics'
- ```
-
-1. Run `pod install`
+## Setup
-1. Add a Run Script Build Phase and build your app.
+To start using Crashlytics, there are two options:
- 
+1) The recommended way is to go to the [Firebase Crashlytics Docs](https://firebase.google.com/docs/crashlytics/get-started?platform=ios) and follow the directions there.
-1. Initialize the SDK by inserting code outlined in the Fabric.app.
+2) If you aren't using Firebase yet, go to [Fabric Kits](https://fabric.io/kits), and follow the directions for Crashlytics.
-1. Run your app to finish the installation.
## Resources
-* [Documentation](https://docs.fabric.io/apple/crashlytics/overview.html)
+* [API Reference](https://firebase.google.com/docs/reference/ios/crashlytics/api/reference/Classes)
* [Forums](https://stackoverflow.com/questions/tagged/google-fabric)
-* [Website](http://try.crashlytics.com/)
-* Follow us on Twitter: [@fabric](https://twitter.com/fabric) and [@crashlytics](https://twitter.com/crashlytics)
+* [Website](https://firebase.google.com/docs/crashlytics)
+* Follow us on Twitter: [@crashlytics](https://twitter.com/crashlytics)
diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics b/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics
index 79eb5165e0..214fb90513 100755
Binary files a/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics and b/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics differ
diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/Info.plist b/Pods/Crashlytics/iOS/Crashlytics.framework/Info.plist
index bfa283150d..d86059be5c 100644
Binary files a/Pods/Crashlytics/iOS/Crashlytics.framework/Info.plist and b/Pods/Crashlytics/iOS/Crashlytics.framework/Info.plist differ
diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/run b/Pods/Crashlytics/iOS/Crashlytics.framework/run
index 9058ea62c0..736cd2ff57 100755
--- a/Pods/Crashlytics/iOS/Crashlytics.framework/run
+++ b/Pods/Crashlytics/iOS/Crashlytics.framework/run
@@ -3,26 +3,71 @@
# run
#
# Copyright (c) 2015 Crashlytics. All rights reserved.
+#
+#
+# This script is meant to be run as a Run Script in the "Build Phases" section
+# of your Xcode project. It sends debug symbols to symbolicate stacktraces,
+# sends build events to track versions, and onboard apps for Crashlytics.
+#
+# This script calls upload-symbols twice:
+#
+# 1) First it calls upload-symbols synchronously in "validation" mode. If the
+# script finds issues with the build environment, it will report errors to Xcode.
+# In validation mode it exits before doing any time consuming work.
+#
+# 2) Then it calls upload-symbols in the background to actually send the build
+# event and upload symbols. It does this in the background so that it doesn't
+# slow down your builds. If an error happens here, you won't see it in Xcode.
+#
+# You can find the output for the background execution in Console.app, by
+# searching for "upload-symbols".
+#
+# If you want verbose output, you can pass the --debug flag to this script
+#
# Figure out where we're being called from
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
-# Quote path in case of spaces or special chars
-DIR="\"${DIR}"
+# If the first argument is specified without a dash, treat it as the Fabric API
+# Key and add it as an argument
+if [ -z "$1" ] || [[ $1 == -* ]]; then
+ API_KEY_ARG=""
+else
+ API_KEY_ARG="-a $1"; shift
+fi
+
+# If a second argument is specified without a dash, treat it as the Build Secret
+# and add it as an argument
+if [ -z "$1" ] || [[ $1 == -* ]]; then
+ BUILD_SECRET_ARG=""
+else
+ BUILD_SECRET_ARG="-bs $1"; shift
+fi
+
+# Build up the arguments list, passing through any flags added after the
+# API Key and Build Secret
+ARGUMENTS="$API_KEY_ARG $BUILD_SECRET_ARG $@"
+VALIDATE_ARGUMENTS="$ARGUMENTS --build-phase --validate"
+UPLOAD_ARGUMENTS="$ARGUMENTS --build-phase"
-PATH_SEP="/"
-VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script"
-UPLOAD_COMMAND="uploadDSYM\" $@ run-script"
+# Quote the path to handle folders with special characters
+COMMAND_PATH="\"$DIR/upload-symbols\" "
-# Ensure params are as expected, run in sync mode to validate
-eval $DIR$PATH_SEP$VALIDATE_COMMAND
+# Ensure params are as expected, run in sync mode to validate,
+# and cause a build error if validation fails
+eval $COMMAND_PATH$VALIDATE_ARGUMENTS
return_code=$?
if [[ $return_code != 0 ]]; then
exit $return_code
fi
-# Verification passed, upload dSYM in background to prevent Xcode from waiting
-# Note: Validation is performed again before upload.
-# Output can still be found in Console.app
-eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 &
+# Verification passed, convert and upload cSYMs in the background to prevent
+# build delays
+#
+# Note: Validation is performed again at this step before upload
+#
+# Note: Output can still be found in Console.app, by searching for
+# "upload-symbols"
+#
+eval $COMMAND_PATH$UPLOAD_ARGUMENTS > /dev/null 2>&1 &
diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/upload-symbols b/Pods/Crashlytics/iOS/Crashlytics.framework/upload-symbols
new file mode 100755
index 0000000000..5af65deccc
Binary files /dev/null and b/Pods/Crashlytics/iOS/Crashlytics.framework/upload-symbols differ
diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/uploadDSYM b/Pods/Crashlytics/iOS/Crashlytics.framework/uploadDSYM
deleted file mode 100755
index 8deb7c9c38..0000000000
Binary files a/Pods/Crashlytics/iOS/Crashlytics.framework/uploadDSYM and /dev/null differ
diff --git a/Pods/DifferenceKit/README.md b/Pods/DifferenceKit/README.md
index 6ddb51e7b7..c0107a3e2f 100644
--- a/Pods/DifferenceKit/README.md
+++ b/Pods/DifferenceKit/README.md
@@ -16,8 +16,7 @@ The algorithm is optimized based on the Paul Heckel's algorithm.
-
+
@@ -182,80 +181,102 @@ The frameworks and its version that compared is below.
- [RxDataSources](https://github.com/RxSwiftCommunity/RxDataSources) ([Differentiator](https://github.com/RxSwiftCommunity/RxDataSources/tree/master/Sources/Differentiator)) - 4.0.1
- [FlexibleDiff](https://github.com/RACCommunity/FlexibleDiff) - 0.0.8
- [IGListKit](https://github.com/Instagram/IGListKit) - 3.4.0
-- [DeepDiff](https://github.com/onmyway133/DeepDiff) - 2.0.1
-- [Differ](https://github.com/tonyarnold/Differ) ([Diff.swift](https://github.com/wokalski/Diff.swift)) - 1.4.1
+- [DeepDiff](https://github.com/onmyway133/DeepDiff) - 2.2.0
+- [Differ](https://github.com/tonyarnold/Differ) ([Diff.swift](https://github.com/wokalski/Diff.swift)) - 1.4.3
- [Dwifft](https://github.com/jflinter/Dwifft) - 0.9
+- [Swift.CollectionDifference](https://developer.apple.com/documentation/swift/collectiondifference) - Swift 5.1
### Performance Comparison
Benchmark project is [here](https://github.com/ra1028/DifferenceKit/blob/master/Benchmark).
-Performance was mesured by code compiled using `Xcode10.2` and `Swift 5.0` with `-O -whole-module-optimization` and run on `iPhoneXs simulator`.
+Performance was mesured by code compiled using `Xcode11.1` and `Swift 5.1` with `-O` optimization and run on `iPhone11 Pro simulator`.
Use `Foundation.UUID` as an element of collections.
#### - From 5,000 elements to 1,000 deleted, 1,000 inserted and 200 shuffled
-| |Time(sec) |
-|:------------|------------:|
-|DifferenceKit|`0.0021` |
-|RxDataSources|`0.0067` |
-|IGListKit |`0.0490` |
-|FlexibleDiff |`0.0117` |
-|DeepDiff |`0.0263` |
-|Differ |`1.2661` |
-|Dwifft |`0.4552` |
+| |Time(sec) |
+|:-------------------------|-------------------------:|
+|DifferenceKit |`0.0019` |
+|RxDataSources |`0.0074` |
+|IGListKit |`0.0346` |
+|FlexibleDiff |`0.0161` |
+|DeepDiff |`0.0373` |
+|Differ |`1.0581` |
+|Dwifft |`0.4732` |
+|Swift.CollectionDifference|`0.0620` |
#### - From 100,000 elements to 10,000 deleted, 10,000 inserted and 2,000 shuffled
-| |Time(sec) |
-|:------------|------------:|
-|DifferenceKit|`0.0364` |
-|RxDataSources|`0.1167` |
-|IGListKit |`1.0130` |
-|FlexibleDiff |`0.2104` |
-|DeepDiff |`0.4180` |
-|Differ |`136.8958` |
-|Dwifft |`211.4457` |
+| |Time(sec) |
+|:-------------------------|-------------------------:|
+|DifferenceKit |`0.0348` |
+|RxDataSources |`0.1024` |
+|IGListKit |`0.7002` |
+|FlexibleDiff |`0.2189` |
+|DeepDiff |`0.5537` |
+|Differ |`153.8007` |
+|Dwifft |`187.1341` |
+|Swift.CollectionDifference|`5.0281` |
### Features Comparison
+#### - Algorithm
+
+| |Base algorithm|Order|
+|:-------------------------|-------------:|----:|
+|DifferenceKit |Heckel |O(N) |
+|RxDataSources |Heckel |O(N) |
+|FlexibleDiff |Heckel |O(N) |
+|IGListKit |Heckel |O(N) |
+|DeepDiff |Heckel |O(N) |
+|Differ |Myers |O(ND)|
+|Dwifft |Myers |O(ND)|
+|Swift.CollectionDifference|Myers |O(ND)|
+
+\* [**Heckel algorithm**](https://dl.acm.org/citation.cfm?id=359467)
+\* [**Myers algorithm**](http://www.xmailserver.org/diff2.pdf)
+
#### - Supported Collection
-| |Linear|Sectioned|Duplicate element/section|
-|:------------|:----:|:-------:|:-----------------------:|
-|DifferenceKit|✅ |✅ |✅ |
-|RxDataSources|❌ |✅ |❌ |
-|FlexibleDiff |✅ |✅ |✅ |
-|IGListKit |✅ |❌ |✅ |
-|DeepDiff |✅ |❌ |✅ |
-|Differ |✅ |✅ |✅ |
-|Dwifft |✅ |✅ |✅ |
+| |Linear|Sectioned|Duplicate element/section|
+|:-------------------------|:----:|:-------:|:-----------------------:|
+|DifferenceKit |✅ |✅ |✅ |
+|RxDataSources |❌ |✅ |❌ |
+|FlexibleDiff |✅ |✅ |✅ |
+|IGListKit |✅ |❌ |✅ |
+|DeepDiff |✅ |❌ |✅ |
+|Differ |✅ |✅ |✅ |
+|Dwifft |✅ |✅ |✅ |
+|Swift.CollectionDifference|✅ |❌ |✅ |
\* **Linear** means 1-dimensional collection
\* **Sectioned** means 2-dimensional collection
#### - Supported Element Diff
-| |Delete|Insert|Move|Reload|Move across sections|
-|:------------|:----:|:----:|:--:|:----:|:------------------:|
-|DifferenceKit|✅ |✅ |✅ |✅ |✅ |
-|RxDataSources|✅ |✅ |✅ |✅ |✅ |
-|FlexibleDiff |✅ |✅ |✅ |✅ |❌ |
-|IGListKit |✅ |✅ |✅ |✅ |❌ |
-|DeepDiff |✅ |✅ |✅ |✅ |❌ |
-|Differ |✅ |✅ |✅ |❌ |❌ |
-|Dwifft |✅ |✅ |❌ |❌ |❌ |
+| |Delete|Insert|Move|Reload|Move across sections|
+|:-------------------------|:----:|:----:|:--:|:----:|:------------------:|
+|DifferenceKit |✅ |✅ |✅ |✅ |✅ |
+|RxDataSources |✅ |✅ |✅ |✅ |✅ |
+|FlexibleDiff |✅ |✅ |✅ |✅ |❌ |
+|IGListKit |✅ |✅ |✅ |✅ |❌ |
+|DeepDiff |✅ |✅ |✅ |✅ |❌ |
+|Differ |✅ |✅ |✅ |❌ |❌ |
+|Dwifft |✅ |✅ |❌ |❌ |❌ |
+|Swift.CollectionDifference|✅ |✅ |✅ |❌ |❌ |
#### - Supported Section Diff
-| |Delete|Insert|Move|Reload|
-|:------------|:----:|:----:|:--:|:----:|
-|DifferenceKit|✅ |✅ |✅ |✅ |
-|RxDataSources|✅ |✅ |✅ |❌ |
-|FlexibleDiff |✅ |✅ |✅ |✅ |
-|IGListKit |❌ |❌ |❌ |❌ |
-|DeepDiff |❌ |❌ |❌ |❌ |
-|Differ |✅ |✅ |✅ |❌ |
-|Dwifft |✅ |✅ |❌ |❌ |
+| |Delete|Insert|Move|Reload|
+|:-------------------------|:----:|:----:|:--:|:----:|
+|DifferenceKit |✅ |✅ |✅ |✅ |
+|RxDataSources |✅ |✅ |✅ |❌ |
+|FlexibleDiff |✅ |✅ |✅ |✅ |
+|IGListKit |❌ |❌ |❌ |❌ |
+|DeepDiff |❌ |❌ |❌ |❌ |
+|Differ |✅ |✅ |✅ |❌ |
+|Dwifft |✅ |✅ |❌ |❌ |
+|Swift.CollectionDifference|❌ |❌ |❌ |❌ |
---
@@ -311,9 +332,15 @@ Add the following to your `Cartfile`:
github "ra1028/DifferenceKit"
```
+### [Swift Package Manager for Apple platforms](https://developer.apple.com/documentation/xcode/adding_package_dependencies_to_your_app)
+
+Select Xcode menu `File > Swift Packages > Add Package Dependency` and enter repository URL with GUI.
+```
+Repository: https://github.com/ra1028/DifferenceKit
+```
+
### [Swift Package Manager](https://swift.org/package-manager/)
-The SwiftPM version does not include the extensions for UI.
Add the following to the dependencies of your `Package.swift`:
```swift
.package(url: "https://github.com/ra1028/DifferenceKit.git", from: "version")
@@ -335,12 +362,12 @@ DifferenceKit was developed with reference to the following excellent materials
- [A technique for isolating differences between files](https://dl.acm.org/citation.cfm?id=359467) (by [Paul Heckel](https://dl.acm.org/author_page.cfm?id=81100051772))
- [DifferenceAlgorithmComparison](https://github.com/horita-yuya/DifferenceAlgorithmComparison) (by [@horita-yuya](https://github.com/horita-yuya))
-- [RxDataSources](https://github.com/RxSwiftCommunity/RxDataSources) (by [@kzaher](https://github.com/kzaher), [RxSwift Community](https://github.com/RxSwiftCommunity))
#### OSS using DifferenceKit
The list of the awesome OSS which uses this library. They also help to understanding how to use DifferenceKit.
- [Carbon](https://github.com/ra1028/Carbon) (by [@ra1028](https://github.com/ra1028))
+- [DiffableDataSources](https://github.com/ra1028/DiffableDataSources) (by [@ra1028](https://github.com/ra1028))
- [Rocket.Chat.iOS](https://github.com/RocketChat/Rocket.Chat.iOS) (by [RocketChat](https://github.com/RocketChat))
- [wire-ios](https://github.com/wireapp/wire-ios) (by [Wire Swiss GmbH](https://github.com/wireapp))
- [ReactiveLists](https://github.com/plangrid/ReactiveLists) (by [PlanGrid](https://github.com/plangrid))
@@ -350,6 +377,7 @@ The list of the awesome OSS which uses this library. They also help to understan
#### Other diffing libraries
I respect and ️❤️ all libraries involved in diffing.
+- [RxDataSources](https://github.com/RxSwiftCommunity/RxDataSources) (by [@kzaher](https://github.com/kzaher), [RxSwift Community](https://github.com/RxSwiftCommunity))
- [IGListKit](https://github.com/Instagram/IGListKit) (by [Instagram](https://github.com/Instagram))
- [FlexibleDiff](https://github.com/RACCommunity/FlexibleDiff) (by [@andersio](https://github.com/andersio), [RACCommunity](https://github.com/RACCommunity))
- [DeepDiff](https://github.com/onmyway133/DeepDiff) (by [@onmyway133](https://github.com/onmyway133))
diff --git a/Pods/DifferenceKit/Sources/Algorithm.swift b/Pods/DifferenceKit/Sources/Algorithm.swift
index d57f67b8a0..213add3582 100644
--- a/Pods/DifferenceKit/Sources/Algorithm.swift
+++ b/Pods/DifferenceKit/Sources/Algorithm.swift
@@ -586,7 +586,7 @@ internal struct DiffResult {
@usableFromInline
internal let targetReferences: ContiguousArray
- @inlinable
+ @usableFromInline
internal init(
deleted: [Index] = [],
inserted: [Index] = [],
@@ -614,8 +614,8 @@ internal struct Trace {
@usableFromInline
internal var isTracked = false
- @inlinable
- init() {}
+ @usableFromInline
+ internal init() {}
}
/// The occurrences of element.
@@ -633,7 +633,7 @@ internal final class IndicesReference {
@usableFromInline
internal var position = 0
- @inlinable
+ @usableFromInline
internal init(_ indices: ContiguousArray) {
self.indices = indices
}
@@ -661,7 +661,7 @@ internal struct TableKey: Hashable {
@usableFromInline
internal let pointer: UnsafePointer
- @inlinable
+ @usableFromInline
internal init(pointer: UnsafePointer) {
self.pointeeHashValue = pointer.pointee.hashValue
self.pointer = pointer
diff --git a/Pods/DifferenceKit/Sources/AnyDifferentiable.swift b/Pods/DifferenceKit/Sources/AnyDifferentiable.swift
index 2ccc8869c2..e9c7bf3491 100644
--- a/Pods/DifferenceKit/Sources/AnyDifferentiable.swift
+++ b/Pods/DifferenceKit/Sources/AnyDifferentiable.swift
@@ -42,7 +42,6 @@ public struct AnyDifferentiable: Differentiable {
///
/// - Parameters:
/// - base: A differentiable value to wrap.
- @inlinable
public init(_ base: D) {
if let anyDifferentiable = base as? AnyDifferentiable {
self = anyDifferentiable
@@ -94,7 +93,7 @@ internal struct DifferentiableBox: AnyDifferentiableBox {
return baseComponent.differenceIdentifier
}
- @inlinable
+ @usableFromInline
internal init(_ base: Base) {
baseComponent = base
}
diff --git a/Pods/DifferenceKit/Sources/ArraySection.swift b/Pods/DifferenceKit/Sources/ArraySection.swift
index 60426661fd..0a7e2ab3b1 100644
--- a/Pods/DifferenceKit/Sources/ArraySection.swift
+++ b/Pods/DifferenceKit/Sources/ArraySection.swift
@@ -19,7 +19,6 @@ public struct ArraySection: Diff
/// - Parameters:
/// - model: A differentiable model of section.
/// - elements: The collection of element in the section.
- @inlinable
public init(model: Model, elements: C) where C.Element == Element {
self.model = model
self.elements = Array(elements)
diff --git a/Pods/DifferenceKit/Sources/Changeset.swift b/Pods/DifferenceKit/Sources/Changeset.swift
index 16e6561f9f..55b8e9effe 100644
--- a/Pods/DifferenceKit/Sources/Changeset.swift
+++ b/Pods/DifferenceKit/Sources/Changeset.swift
@@ -38,7 +38,6 @@ public struct Changeset {
/// - elementInserted: The paths of inserted elements.
/// - elementUpdated: The paths of updated elements.
/// - elementMoved: The pairs of source and target path of moved elements.
- @inlinable
public init(
data: Collection,
sectionDeleted: [Int] = [],
diff --git a/Pods/DifferenceKit/Sources/ContentIdentifiable.swift b/Pods/DifferenceKit/Sources/ContentIdentifiable.swift
new file mode 100644
index 0000000000..60daabe043
--- /dev/null
+++ b/Pods/DifferenceKit/Sources/ContentIdentifiable.swift
@@ -0,0 +1,16 @@
+/// Represents the value that identified for differentiate.
+public protocol ContentIdentifiable {
+ /// A type representing the identifier.
+ associatedtype DifferenceIdentifier: Hashable
+
+ /// An identifier value for difference calculation.
+ var differenceIdentifier: DifferenceIdentifier { get }
+}
+
+public extension ContentIdentifiable where Self: Hashable {
+ /// The `self` value as an identifier for difference calculation.
+ @inlinable
+ var differenceIdentifier: Self {
+ return self
+ }
+}
diff --git a/Pods/DifferenceKit/Sources/Differentiable.swift b/Pods/DifferenceKit/Sources/Differentiable.swift
index 0610b24021..889561dd76 100644
--- a/Pods/DifferenceKit/Sources/Differentiable.swift
+++ b/Pods/DifferenceKit/Sources/Differentiable.swift
@@ -1,16 +1,2 @@
-/// Represents the value that identified for differentiate.
-public protocol Differentiable: ContentEquatable {
- /// A type representing the identifier.
- associatedtype DifferenceIdentifier: Hashable
-
- /// An identifier value for difference calculation.
- var differenceIdentifier: DifferenceIdentifier { get }
-}
-
-public extension Differentiable where Self: Hashable {
- /// The `self` value as an identifier for difference calculation.
- @inlinable
- var differenceIdentifier: Self {
- return self
- }
-}
+/// Represents a type that can be used for identifying and comparing for equality.
+public typealias Differentiable = ContentIdentifiable & ContentEquatable
diff --git a/Pods/DifferenceKit/Sources/ElementPath.swift b/Pods/DifferenceKit/Sources/ElementPath.swift
index bbcaffa38f..ddf3363357 100644
--- a/Pods/DifferenceKit/Sources/ElementPath.swift
+++ b/Pods/DifferenceKit/Sources/ElementPath.swift
@@ -12,7 +12,6 @@ public struct ElementPath: Hashable {
/// - Parameters:
/// - element: The element index (or offset).
/// - section: The section index (or offset).
- @inlinable
public init(element: Int, section: Int) {
self.element = element
self.section = section
diff --git a/Pods/DifferenceKit/Sources/StagedChangeset.swift b/Pods/DifferenceKit/Sources/StagedChangeset.swift
index 60db5d4ec9..7c6319c498 100644
--- a/Pods/DifferenceKit/Sources/StagedChangeset.swift
+++ b/Pods/DifferenceKit/Sources/StagedChangeset.swift
@@ -37,7 +37,6 @@ public struct StagedChangeset {
///
/// - Parameters:
/// - changesets: The collection of `Changeset`.
- @inlinable
public init(_ changesets: C) where C.Element == Changeset {
self.changesets = ContiguousArray(changesets)
}
diff --git a/Pods/Fabric/README.md b/Pods/Fabric/README.md
index 9eca6105ad..e99ce8344f 100644
--- a/Pods/Fabric/README.md
+++ b/Pods/Fabric/README.md
@@ -1,38 +1,23 @@
-
# Fabric
## Overview
-[Fabric](https://get.fabric.io) provides developers with the tools they need to build the best apps. Developed and maintained by Google and the team that built Crashlytics, Fabric provides an easy way to manage all your SDKs so that you’ll never have to worry about tedious configurations or juggling different accounts. We let you get right into coding and building the next big app.
+[Fabric](https://get.fabric.io) provides developers with the tools they need to build the best apps. Developed and maintained by Google and the team that built Crashlytics.
-For a full list of SDK provided through Fabric visit [https://fabric.io/kits](https://fabric.io/kits).
+For a full list of SDKs provided through Fabric visit [https://fabric.io/kits](https://fabric.io/kits).
-## Setup
-
-The Fabric Pod is a dependency for all Fabric SDKs and is included when installing any Fabric related Pods. General setup instructions are shown below; however, these vary depending on the selected SDK.
-
-1. Visit [https://fabric.io/sign_up](https://fabric.io/sign_up) to create your Fabric account and to download Fabric.app.
-
-1. Open Fabric.app, login and select an SDK to install.
+To follow the migration to Firebase, check out the [Fabric Roadmap](https://get.fabric.io/roadmap).
- 
-1. The Fabric app automatically detects when a project uses CocoaPods and gives you the option to install via the Podfile or Xcode.
-
- 
-
-1. Select the Podfile option and follow the installation instructions to update your Podfile. Note: the example below is for the Crashlytics SDK. The instructions will vary based on the selected SDK.
-
- 
+## Setup
-1. Add a Run Script Build Phase and build your app.
+Fabric is a dependency for the Crashlytics SDK. To start using Crashlytics, there are two options:
- 
+1) The recommended way is to go to the [Firebase Crashlytics Docs](https://firebase.google.com/docs/crashlytics/get-started?platform=ios) and follow the directions there.
-1. Initialize the SDK by inserting code outlined in Fabric.app.
+2) If you aren't using Firebase yet, go to [Fabric Kits](https://fabric.io/kits), and follow the directions for Crashlytics.
-1. Run your app to finish the installation.
## Resources
diff --git a/Pods/Fabric/iOS/Fabric.framework/Fabric b/Pods/Fabric/iOS/Fabric.framework/Fabric
index 3057fdf419..aa394a3de9 100755
Binary files a/Pods/Fabric/iOS/Fabric.framework/Fabric and b/Pods/Fabric/iOS/Fabric.framework/Fabric differ
diff --git a/Pods/Fabric/iOS/Fabric.framework/Info.plist b/Pods/Fabric/iOS/Fabric.framework/Info.plist
index 46b5064836..a617b035fa 100644
Binary files a/Pods/Fabric/iOS/Fabric.framework/Info.plist and b/Pods/Fabric/iOS/Fabric.framework/Info.plist differ
diff --git a/Pods/Fabric/iOS/Fabric.framework/run b/Pods/Fabric/iOS/Fabric.framework/run
index 9058ea62c0..736cd2ff57 100755
--- a/Pods/Fabric/iOS/Fabric.framework/run
+++ b/Pods/Fabric/iOS/Fabric.framework/run
@@ -3,26 +3,71 @@
# run
#
# Copyright (c) 2015 Crashlytics. All rights reserved.
+#
+#
+# This script is meant to be run as a Run Script in the "Build Phases" section
+# of your Xcode project. It sends debug symbols to symbolicate stacktraces,
+# sends build events to track versions, and onboard apps for Crashlytics.
+#
+# This script calls upload-symbols twice:
+#
+# 1) First it calls upload-symbols synchronously in "validation" mode. If the
+# script finds issues with the build environment, it will report errors to Xcode.
+# In validation mode it exits before doing any time consuming work.
+#
+# 2) Then it calls upload-symbols in the background to actually send the build
+# event and upload symbols. It does this in the background so that it doesn't
+# slow down your builds. If an error happens here, you won't see it in Xcode.
+#
+# You can find the output for the background execution in Console.app, by
+# searching for "upload-symbols".
+#
+# If you want verbose output, you can pass the --debug flag to this script
+#
# Figure out where we're being called from
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
-# Quote path in case of spaces or special chars
-DIR="\"${DIR}"
+# If the first argument is specified without a dash, treat it as the Fabric API
+# Key and add it as an argument
+if [ -z "$1" ] || [[ $1 == -* ]]; then
+ API_KEY_ARG=""
+else
+ API_KEY_ARG="-a $1"; shift
+fi
+
+# If a second argument is specified without a dash, treat it as the Build Secret
+# and add it as an argument
+if [ -z "$1" ] || [[ $1 == -* ]]; then
+ BUILD_SECRET_ARG=""
+else
+ BUILD_SECRET_ARG="-bs $1"; shift
+fi
+
+# Build up the arguments list, passing through any flags added after the
+# API Key and Build Secret
+ARGUMENTS="$API_KEY_ARG $BUILD_SECRET_ARG $@"
+VALIDATE_ARGUMENTS="$ARGUMENTS --build-phase --validate"
+UPLOAD_ARGUMENTS="$ARGUMENTS --build-phase"
-PATH_SEP="/"
-VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script"
-UPLOAD_COMMAND="uploadDSYM\" $@ run-script"
+# Quote the path to handle folders with special characters
+COMMAND_PATH="\"$DIR/upload-symbols\" "
-# Ensure params are as expected, run in sync mode to validate
-eval $DIR$PATH_SEP$VALIDATE_COMMAND
+# Ensure params are as expected, run in sync mode to validate,
+# and cause a build error if validation fails
+eval $COMMAND_PATH$VALIDATE_ARGUMENTS
return_code=$?
if [[ $return_code != 0 ]]; then
exit $return_code
fi
-# Verification passed, upload dSYM in background to prevent Xcode from waiting
-# Note: Validation is performed again before upload.
-# Output can still be found in Console.app
-eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 &
+# Verification passed, convert and upload cSYMs in the background to prevent
+# build delays
+#
+# Note: Validation is performed again at this step before upload
+#
+# Note: Output can still be found in Console.app, by searching for
+# "upload-symbols"
+#
+eval $COMMAND_PATH$UPLOAD_ARGUMENTS > /dev/null 2>&1 &
diff --git a/Pods/Fabric/iOS/Fabric.framework/upload-symbols b/Pods/Fabric/iOS/Fabric.framework/upload-symbols
new file mode 100755
index 0000000000..a18d0b68f2
Binary files /dev/null and b/Pods/Fabric/iOS/Fabric.framework/upload-symbols differ
diff --git a/Pods/Fabric/iOS/Fabric.framework/uploadDSYM b/Pods/Fabric/iOS/Fabric.framework/uploadDSYM
deleted file mode 100755
index 2e823acfc2..0000000000
Binary files a/Pods/Fabric/iOS/Fabric.framework/uploadDSYM and /dev/null differ
diff --git a/Pods/Fabric/run b/Pods/Fabric/run
index 9058ea62c0..736cd2ff57 100755
--- a/Pods/Fabric/run
+++ b/Pods/Fabric/run
@@ -3,26 +3,71 @@
# run
#
# Copyright (c) 2015 Crashlytics. All rights reserved.
+#
+#
+# This script is meant to be run as a Run Script in the "Build Phases" section
+# of your Xcode project. It sends debug symbols to symbolicate stacktraces,
+# sends build events to track versions, and onboard apps for Crashlytics.
+#
+# This script calls upload-symbols twice:
+#
+# 1) First it calls upload-symbols synchronously in "validation" mode. If the
+# script finds issues with the build environment, it will report errors to Xcode.
+# In validation mode it exits before doing any time consuming work.
+#
+# 2) Then it calls upload-symbols in the background to actually send the build
+# event and upload symbols. It does this in the background so that it doesn't
+# slow down your builds. If an error happens here, you won't see it in Xcode.
+#
+# You can find the output for the background execution in Console.app, by
+# searching for "upload-symbols".
+#
+# If you want verbose output, you can pass the --debug flag to this script
+#
# Figure out where we're being called from
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
-# Quote path in case of spaces or special chars
-DIR="\"${DIR}"
+# If the first argument is specified without a dash, treat it as the Fabric API
+# Key and add it as an argument
+if [ -z "$1" ] || [[ $1 == -* ]]; then
+ API_KEY_ARG=""
+else
+ API_KEY_ARG="-a $1"; shift
+fi
+
+# If a second argument is specified without a dash, treat it as the Build Secret
+# and add it as an argument
+if [ -z "$1" ] || [[ $1 == -* ]]; then
+ BUILD_SECRET_ARG=""
+else
+ BUILD_SECRET_ARG="-bs $1"; shift
+fi
+
+# Build up the arguments list, passing through any flags added after the
+# API Key and Build Secret
+ARGUMENTS="$API_KEY_ARG $BUILD_SECRET_ARG $@"
+VALIDATE_ARGUMENTS="$ARGUMENTS --build-phase --validate"
+UPLOAD_ARGUMENTS="$ARGUMENTS --build-phase"
-PATH_SEP="/"
-VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script"
-UPLOAD_COMMAND="uploadDSYM\" $@ run-script"
+# Quote the path to handle folders with special characters
+COMMAND_PATH="\"$DIR/upload-symbols\" "
-# Ensure params are as expected, run in sync mode to validate
-eval $DIR$PATH_SEP$VALIDATE_COMMAND
+# Ensure params are as expected, run in sync mode to validate,
+# and cause a build error if validation fails
+eval $COMMAND_PATH$VALIDATE_ARGUMENTS
return_code=$?
if [[ $return_code != 0 ]]; then
exit $return_code
fi
-# Verification passed, upload dSYM in background to prevent Xcode from waiting
-# Note: Validation is performed again before upload.
-# Output can still be found in Console.app
-eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 &
+# Verification passed, convert and upload cSYMs in the background to prevent
+# build delays
+#
+# Note: Validation is performed again at this step before upload
+#
+# Note: Output can still be found in Console.app, by searching for
+# "upload-symbols"
+#
+eval $COMMAND_PATH$UPLOAD_ARGUMENTS > /dev/null 2>&1 &
diff --git a/Pods/Fabric/upload-symbols b/Pods/Fabric/upload-symbols
index b41105957c..a18d0b68f2 100755
Binary files a/Pods/Fabric/upload-symbols and b/Pods/Fabric/upload-symbols differ
diff --git a/Pods/Fabric/uploadDSYM b/Pods/Fabric/uploadDSYM
deleted file mode 100755
index 2e823acfc2..0000000000
Binary files a/Pods/Fabric/uploadDSYM and /dev/null differ
diff --git a/Pods/Firebase/CoreOnly/Sources/Firebase.h b/Pods/Firebase/CoreOnly/Sources/Firebase.h
index 6461547d8e..e5049ca432 100755
--- a/Pods/Firebase/CoreOnly/Sources/Firebase.h
+++ b/Pods/Firebase/CoreOnly/Sources/Firebase.h
@@ -1,3 +1,17 @@
+// Copyright 2019 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
#import
#if !defined(__has_include)
@@ -6,20 +20,14 @@
#else
#if __has_include()
#import
- #else
- #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
- #warning "FirebaseAnalytics.framework is not included in your target. Please add \
-`Firebase/Core` to your Podfile or add FirebaseAnalytics.framework to your project to ensure \
-Firebase services work as intended."
- #endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
#endif
#if __has_include()
#import
#endif
- #if __has_include()
- #import
+ #if __has_include()
+ #import
#endif
#if __has_include()
@@ -28,6 +36,13 @@ Firebase services work as intended."
#if __has_include()
#import
+ #if !__has_include()
+ #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
+ #warning "FirebaseAnalytics.framework is not included in your target. Please add \
+`Firebase/Analytics` to your Podfile or add FirebaseAnalytics.framework to your project to ensure \
+Firebase Dynamic Links works as intended."
+ #endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
+ #endif
#endif
#if __has_include()
@@ -40,28 +55,62 @@ Firebase services work as intended."
#if __has_include()
#import
+ #if !__has_include()
+ #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
+ #warning "FirebaseAnalytics.framework is not included in your target. Please add \
+`Firebase/Analytics` to your Podfile or add FirebaseAnalytics.framework to your project to ensure \
+Firebase In App Messaging works as intended."
+ #endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
+ #endif
#endif
#if __has_include()
#import
#endif
- #if __has_include()
- #import
- #endif
-
#if __has_include()
#import
+ #if !__has_include()
+ #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
+ #warning "FirebaseAnalytics.framework is not included in your target. Please add \
+`Firebase/Analytics` to your Podfile or add FirebaseAnalytics.framework to your project to ensure \
+Firebase Messaging works as intended."
+ #endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
+ #endif
+#endif
+
+ #if __has_include()
+ #import
#endif
#if __has_include()
#import
#endif
+ #if __has_include()
+ #import
+ #endif
+
+ #if __has_include()
+ #import
+ #endif
+
+ #if __has_include()
+ #import
+ #endif
+
+ #if __has_include()
+ #import
+ #endif
+
#if __has_include()
#import
#endif
+ #if __has_include()
+ #import
+ #endif
+
#if __has_include()
#import
#endif
@@ -74,16 +123,34 @@ Firebase services work as intended."
#import
#endif
+ #if __has_include()
+ #import
+ #endif
+
#if __has_include()
#import
#endif
#if __has_include()
#import
+ #if !__has_include()
+ #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
+ #warning "FirebaseAnalytics.framework is not included in your target. Please add \
+`Firebase/Analytics` to your Podfile or add FirebaseAnalytics.framework to your project to ensure \
+Firebase Performance works as intended."
+ #endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
+ #endif
#endif
#if __has_include()
#import
+ #if !__has_include()
+ #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
+ #warning "FirebaseAnalytics.framework is not included in your target. Please add \
+`Firebase/Analytics` to your Podfile or add FirebaseAnalytics.framework to your project to ensure \
+Firebase Remote Config works as intended."
+ #endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
+ #endif
#endif
#if __has_include()
diff --git a/Pods/GoogleUtilities/LICENSE b/Pods/Firebase/LICENSE
similarity index 100%
rename from Pods/GoogleUtilities/LICENSE
rename to Pods/Firebase/LICENSE
diff --git a/Pods/Firebase/README.md b/Pods/Firebase/README.md
old mode 100755
new mode 100644
index 49aa2ee0c8..23d66e8586
--- a/Pods/Firebase/README.md
+++ b/Pods/Firebase/README.md
@@ -1,87 +1,270 @@
-# Firebase APIs for iOS
+# Firebase iOS Open Source Development
+ [![Actions Status][gh-core-badge]][gh-actions]
+ [![Actions Status][gh-dynamiclinks-badge]][gh-actions]
+ [![Actions Status][gh-datatransport-badge]][gh-actions]
+ [![Actions Status][gh-storage-badge]][gh-actions]
+ [![Actions Status][gh-zip-badge]][gh-actions]
+ [](https://travis-ci.org/firebase/firebase-ios-sdk)
-Simplify your iOS development, grow your user base, and monetize more
-effectively with Firebase services.
+This repository contains all Firebase iOS SDK source except FirebaseAnalytics,
+FirebasePerformance, and FirebaseML.
-Much more information can be found at [https://firebase.google.com](https://firebase.google.com).
+The repository also includes GoogleUtilities source. The
+[GoogleUtilities](GoogleUtilities/README.md) pod is
+a set of utilities used by Firebase and other Google products.
-## Install a Firebase SDK using CocoaPods
+Firebase is an app development platform with tools to help you build, grow and
+monetize your app. More information about Firebase can be found at
+[https://firebase.google.com](https://firebase.google.com).
-Firebase distributes several iOS specific APIs and SDKs via CocoaPods.
-You can install the CocoaPods tool on OS X by running the following command from
-the terminal. Detailed information is available in the [Getting Started
-guide](https://guides.cocoapods.org/using/getting-started.html#getting-started).
+## Installation
+See the three subsections for details about three different installation methods.
+1. [Standard pod install](README.md#standard-pod-install)
+1. [Installing from the GitHub repo](README.md#installing-from-github)
+1. [Experimental Carthage](README.md#carthage-ios-only)
+
+### Standard pod install
+
+Go to
+[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup).
+
+### Installing from GitHub
+
+For releases starting with 5.0.0, the source for each release is also deployed
+to CocoaPods master and available via standard
+[CocoaPods Podfile syntax](https://guides.cocoapods.org/syntax/podfile.html#pod).
+
+These instructions can be used to access the Firebase repo at other branches,
+tags, or commits.
+
+#### Background
+
+See
+[the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod)
+for instructions and options about overriding pod source locations.
+
+#### Accessing Firebase Source Snapshots
+
+All of the official releases are tagged in this repo and available via CocoaPods. To access a local
+source snapshot or unreleased branch, use Podfile directives like the following:
+
+To access FirebaseFirestore via a branch:
```
-$ sudo gem install cocoapods
+pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master'
+pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master'
```
-## Try out an SDK
+To access FirebaseMessaging via a checked out version of the firebase-ios-sdk repo do:
+
+```
+pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk'
+pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk'
+```
+
+### Carthage (iOS only)
+
+Instructions for the experimental Carthage distribution are at
+[Carthage](Carthage.md).
+
+### Rome
+
+Instructions for installing binary frameworks via
+[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md).
+
+### Using Firebase from a Framework or a library
+
+[Using Firebase from a Framework or a library](docs/firebase_in_libraries.md)
-You can try any of the SDKs with `pod try`. Run the following command and select
-the SDK you are interested in when prompted:
+## Development
+
+To develop Firebase software in this repository, ensure that you have at least
+the following software:
+
+ * Xcode 10.1 (or later)
+ * CocoaPods 1.7.2 (or later)
+ * [CocoaPods generate](https://github.com/square/cocoapods-generate)
+
+For the pod that you want to develop:
+
+`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios`
+
+Note: If the CocoaPods cache is out of date, you may need to run
+`pod repo update` before the `pod gen` command.
+
+Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for
+those platforms. Since 10.2, Xcode does not properly handle multi-platform
+CocoaPods workspaces.
+
+Firestore has a self contained Xcode project. See
+[Firestore/README.md](Firestore/README.md).
+
+### Development for Catalyst
+* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios`
+* Check the Mac box in the App-iOS Build Settings
+* Sign the App in the Settings Signing & Capabilities tab
+* Click Pods in the Project Manager
+* Add Signing to the iOS host app and unit test targets
+* Select the Unit-unit scheme
+* Run it to build and test
+
+### Adding a New Firebase Pod
+
+See [AddNewPod.md](AddNewPod.md).
+
+### Code Formatting
+
+To ensure that the code is formatted consistently, run the script
+[./scripts/style.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/style.sh)
+before creating a PR.
+
+Travis will verify that any code changes are done in a style compliant way. Install
+`clang-format` and `swiftformat`.
+These commands will get the right versions:
```
-$ pod try Firebase
+brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/e3496d9/Formula/clang-format.rb
+brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/7963c3d/Formula/swiftformat.rb
```
-Note that some SDKs may require credentials. More information is available in
-the SDK-specific documentation at [https://firebase.google.com/docs/](https://firebase.google.com/docs/).
-
-## Add a Firebase SDK to your iOS app
-
-CocoaPods is used to install and manage dependencies in existing Xcode projects.
-
-1. Create an Xcode project, and save it to your local machine.
-2. Create a file named `Podfile` in your project directory. This file defines
- your project's dependencies, and is commonly referred to as a Podspec.
-3. Open `Podfile`, and add your dependencies. A simple Podspec is shown here:
-
- ```
- platform :ios, '8.0'
- pod 'Firebase'
- ```
-
-4. Save the file.
-
-5. Open a terminal and `cd` to the directory containing the Podfile.
-
- ```
- $ cd /project/
- ```
-
-6. Run the `pod install` command. This will install the SDKs specified in the
- Podspec, along with any dependencies they may have.
-
- ```
- $ pod install
- ```
-
-7. Open your app's `.xcworkspace` file to launch Xcode. Use this file for all
- development on your app.
-
-8. You can also install other Firebase SDKs by adding the subspecs in the
- Podfile.
-
- ```
- pod 'Firebase/AdMob'
- pod 'Firebase/Analytics'
- pod 'Firebase/Auth'
- pod 'Firebase/Crash'
- pod 'Firebase/Database'
- pod 'Firebase/DynamicLinks'
- pod 'Firebase/Firestore'
- pod 'Firebase/Functions'
- pod 'Firebase/Invites'
- pod 'Firebase/Messaging'
- pod 'Firebase/MLCommon'
- pod 'Firebase/MLModelInterpreter'
- pod 'Firebase/MLVision'
- pod 'Firebase/MLVisionBarcodeModel'
- pod 'Firebase/MLVisionFaceModel'
- pod 'Firebase/MLVisionLabelModel'
- pod 'Firebase/MLVisionTextModel'
- pod 'Firebase/Performance'
- pod 'Firebase/RemoteConfig'
- pod 'Firebase/Storage'
- ```
+Note: if you already have a newer version of these installed you may need to
+`brew switch` to this version.
+
+To update this section, find the versions of clang-format and swiftformat.rb to
+match the versions in the CI failure logs
+[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula).
+
+### Running Unit Tests
+
+Select a scheme and press Command-u to build a component and run its unit tests.
+
+#### Viewing Code Coverage
+
+First, make sure that [xcov](https://github.com/nakiostudio/xcov) is installed with `gem install xcov`.
+
+After running the `AllUnitTests_iOS` scheme in Xcode, execute
+`xcov --workspace Firebase.xcworkspace --scheme AllUnitTests_iOS --output_directory xcov_output`
+at Example/ in the terminal. This will aggregate the coverage, and you can run `open xcov_output/index.html` to see the results.
+
+### Running Sample Apps
+In order to run the sample apps and integration tests, you'll need valid
+`GoogleService-Info.plist` files for those samples. The Firebase Xcode project contains dummy plist
+files without real values, but can be replaced with real plist files. To get your own
+`GoogleService-Info.plist` files:
+
+1. Go to the [Firebase Console](https://console.firebase.google.com/)
+2. Create a new Firebase project, if you don't already have one
+3. For each sample app you want to test, create a new Firebase app with the sample app's bundle
+identifier (e.g. `com.google.Database-Example`)
+4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file
+(e.g. in [Example/Database/App/](Example/Database/App/));
+
+Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require
+special Apple capabilities, and you will have to change the sample app to use a unique bundle
+identifier that you can control in your own Apple Developer account.
+
+## Specific Component Instructions
+See the sections below for any special instructions for those components.
+
+### Firebase Auth
+
+If you're doing specific Firebase Auth development, see
+[the Auth Sample README](Example/Auth/README.md) for instructions about
+building and running the FirebaseAuth pod along with various samples and tests.
+
+### Firebase Database
+
+To run the Database Integration tests, make your database authentication rules
+[public](https://firebase.google.com/docs/database/security/quickstart).
+
+### Firebase Storage
+
+To run the Storage Integration tests, follow the instructions in
+[FIRStorageIntegrationTests.m](Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m).
+
+#### Push Notifications
+
+Push notifications can only be delivered to specially provisioned App IDs in the developer portal.
+In order to actually test receiving push notifications, you will need to:
+
+1. Change the bundle identifier of the sample app to something you own in your Apple Developer
+account, and enable that App ID for push notifications.
+2. You'll also need to
+[upload your APNs Provider Authentication Key or certificate to the Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs)
+at **Project Settings > Cloud Messaging > [Your Firebase App]**.
+3. Ensure your iOS device is added to your Apple Developer portal as a test device.
+
+#### iOS Simulator
+
+The iOS Simulator cannot register for remote notifications, and will not receive push notifications.
+In order to receive push notifications, you'll have to follow the steps above and run the app on a
+physical device.
+
+## Community Supported Efforts
+
+We've seen an amazing amount of interest and contributions to improve the Firebase SDKs, and we are
+very grateful! We'd like to empower as many developers as we can to be able to use Firebase and
+participate in the Firebase community.
+
+### tvOS, macOS, watchOS and Catalyst
+Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and work on
+tvOS, macOS, watchOS and Catalyst.
+
+For tvOS, checkout the [Sample](Example/tvOSSample).
+For watchOS, currently only Messaging and Storage (and their dependencies) have limited support. Checkout the
+[Independent Watch App Sample](Example/watchOSSample).
+
+Keep in mind that macOS, tvOS, watchOS and Catalyst are not officially supported by Firebase, and this
+repository is actively developed primarily for iOS. While we can catch basic unit test issues with
+Travis, there may be some changes where the SDK no longer works as expected on macOS, tvOS or watchOS. If you
+encounter this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues).
+
+During app setup in the console, you may get to a step that mentions something like "Checking if the app
+has communicated with our servers". This relies on Analytics and will not work on macOS/tvOS/watchOS/Catalyst.
+**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected.
+
+To install, add a subset of the following to the Podfile:
+
+```
+pod 'Firebase/ABTesting' # No watchOS support yet
+pod 'Firebase/Auth' # No watchOS support yet
+pod 'Firebase/Crashlytics' # No watchOS support yet
+pod 'Firebase/Database' # No watchOS support yet
+pod 'Firebase/Firestore' # No watchOS support yet
+pod 'Firebase/Functions' # No watchOS support yet
+pod 'Firebase/Messaging'
+pod 'Firebase/RemoteConfig' # No watchOS support yet
+pod 'Firebase/Storage'
+```
+
+#### Additional Catalyst Notes
+
+* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability`
+to Build Settings.
+* FirebaseFirestore requires signing the
+[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681).
+
+## Roadmap
+
+See [Roadmap](ROADMAP.md) for more about the Firebase iOS SDK Open Source
+plans and directions.
+
+## Contributing
+
+See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase
+iOS SDK.
+
+## License
+
+The contents of this repository is licensed under the
+[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0).
+
+Your use of Firebase is governed by the
+[Terms of Service for Firebase Services](https://firebase.google.com/terms/).
+
+[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions
+[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg
+[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg
+[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg
+[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg
+[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg
diff --git a/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector b/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector
index 897b5da29e..00739c911e 100755
Binary files a/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector and b/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector differ
diff --git a/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/Modules/module.modulemap b/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/Modules/module.modulemap
index 73fb1d7a0f..99a4b1dc23 100755
--- a/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/Modules/module.modulemap
+++ b/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/Modules/module.modulemap
@@ -1,5 +1,11 @@
framework module FIRAnalyticsConnector {
export *
- module * { export *}
+ module * { export * }
+ link "sqlite3"
+ link "z"
+ link framework "CoreData"
link framework "Security"
- link framework "SystemConfiguration"}
+ link framework "StoreKit"
+ link framework "SystemConfiguration"
+ link framework "UIKit"
+}
diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics
index b20d5d25c2..980dd8d547 100755
Binary files a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics and b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics differ
diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h
index 39d23f18f2..be0b1faee5 100755
--- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h
+++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h
@@ -9,6 +9,10 @@ NS_ASSUME_NONNULL_BEGIN
/// The top level Firebase Analytics singleton that provides methods for logging events and setting
/// user properties. See the developer guides for general
/// information on using Firebase Analytics in your apps.
+///
+/// @note The Analytics SDK uses SQLite to persist events and other app-specific data. Calling
+/// certain thread-unsafe global SQLite methods like `sqlite3_shutdown()` can result in
+/// unexpected crashes at runtime.
NS_SWIFT_NAME(Analytics)
@interface FIRAnalytics : NSObject
@@ -107,6 +111,19 @@ NS_SWIFT_NAME(Analytics)
+ (void)setScreenName:(nullable NSString *)screenName
screenClass:(nullable NSString *)screenClassOverride;
+/// Sets whether analytics collection is enabled for this app on this device. This setting is
+/// persisted across app sessions. By default it is enabled.
+///
+/// @param analyticsCollectionEnabled A flag that enables or disables Analytics collection.
++ (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled;
+
+/// Sets the interval of inactivity in seconds that terminates the current session. The default
+/// value is 1800 seconds (30 minutes).
+///
+/// @param sessionTimeoutInterval The custom time of inactivity in seconds before the current
+/// session terminates.
++ (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval;
+
/// The unique ID for this instance of the application.
+ (NSString *)appInstanceID;
diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h
index c70c53e25f..d7719d9a0b 100755
--- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h
+++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h
@@ -12,46 +12,41 @@
#import
-/// Add Payment Info event. This event signifies that a user has submitted their payment information
-/// to your app.
+/// Add Payment Info event. This event signifies that a user has submitted their payment
+/// information. Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
+/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params:
+///
+///
+/// - @c kFIRParameterCoupon (NSString) (optional)
+/// - @c kFIRParameterCurrency (NSString) (optional)
+/// - @c kFIRParameterItems (NSArray) (optional)
+/// - @c kFIRParameterPaymentType (NSString) (optional)
+/// - @c kFIRParameterValue (double as NSNumber) (optional)
+///
static NSString *const kFIREventAddPaymentInfo NS_SWIFT_NAME(AnalyticsEventAddPaymentInfo) =
@"add_payment_info";
-/// E-Commerce Add To Cart event. This event signifies that an item was added to a cart for
-/// purchase. Add this event to a funnel with kFIREventEcommercePurchase to gauge the effectiveness
-/// of your checkout process. Note: If you supply the @c kFIRParameterValue parameter, you must
-/// also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
+/// E-Commerce Add To Cart event. This event signifies that an item(s) was added to a cart for
+/// purchase. Add this event to a funnel with @c kFIREventPurchase to gauge the effectiveness of
+/// your checkout process. Note: If you supply the @c kFIRParameterValue parameter, you must also
+/// supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
/// accurately. Params:
///
///
-/// - @c kFIRParameterQuantity (signed 64-bit integer as NSNumber)
-/// - @c kFIRParameterItemID (NSString)
-/// - @c kFIRParameterItemName (NSString)
-/// - @c kFIRParameterItemCategory (NSString)
-/// - @c kFIRParameterItemLocationID (NSString) (optional)
-/// - @c kFIRParameterPrice (double as NSNumber) (optional)
/// - @c kFIRParameterCurrency (NSString) (optional)
+/// - @c kFIRParameterItems (NSArray) (optional)
/// - @c kFIRParameterValue (double as NSNumber) (optional)
-/// - @c kFIRParameterOrigin (NSString) (optional)
-/// - @c kFIRParameterDestination (NSString) (optional)
-/// - @c kFIRParameterStartDate (NSString) (optional)
-/// - @c kFIRParameterEndDate (NSString) (optional)
///
static NSString *const kFIREventAddToCart NS_SWIFT_NAME(AnalyticsEventAddToCart) = @"add_to_cart";
-/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist.
-/// Use this event to identify popular gift items in your app. Note: If you supply the
-/// @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency
-/// parameter so that revenue metrics can be computed accurately. Params:
+/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist. Use
+/// this event to identify popular gift items. Note: If you supply the @c kFIRParameterValue
+/// parameter, you must also supply the @c kFIRParameterCurrency parameter so that revenue metrics
+/// can be computed accurately. Params:
///
///
-/// - @c kFIRParameterQuantity (signed 64-bit integer as NSNumber)
-/// - @c kFIRParameterItemID (NSString)
-/// - @c kFIRParameterItemName (NSString)
-/// - @c kFIRParameterItemCategory (NSString)
-/// - @c kFIRParameterItemLocationID (NSString) (optional)
-/// - @c kFIRParameterPrice (double as NSNumber) (optional)
/// - @c kFIRParameterCurrency (NSString) (optional)
+/// - @c kFIRParameterItems (NSArray) (optional)
/// - @c kFIRParameterValue (double as NSNumber) (optional)
///
static NSString *const kFIREventAddToWishlist NS_SWIFT_NAME(AnalyticsEventAddToWishlist) =
@@ -64,26 +59,16 @@ static NSString *const kFIREventAddToWishlist NS_SWIFT_NAME(AnalyticsEventAddToW
static NSString *const kFIREventAppOpen NS_SWIFT_NAME(AnalyticsEventAppOpen) = @"app_open";
/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of
-/// checking out. Add this event to a funnel with your kFIREventEcommercePurchase event to gauge the
-/// effectiveness of your checkout process. Note: If you supply the @c kFIRParameterValue
-/// parameter, you must also supply the @c kFIRParameterCurrency parameter so that revenue
-/// metrics can be computed accurately. Params:
+/// checking out. Add this event to a funnel with your @c kFIREventPurchase event to gauge the
+/// effectiveness of your checkout process. Note: If you supply the @c kFIRParameterValue parameter,
+/// you must also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be
+/// computed accurately. Params:
///
///
-/// - @c kFIRParameterValue (double as NSNumber) (optional)
+/// - @c kFIRParameterCoupon (NSString) (optional)
/// - @c kFIRParameterCurrency (NSString) (optional)
-/// - @c kFIRParameterTransactionID (NSString) (optional)
-/// - @c kFIRParameterStartDate (NSString) (optional)
-/// - @c kFIRParameterEndDate (NSString) (optional)
-/// - @c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for
-/// hotel bookings
-/// - @c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for
-/// hotel bookings
-/// - @c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional)
-/// for travel bookings
-/// - @c kFIRParameterOrigin (NSString) (optional)
-/// - @c kFIRParameterDestination (NSString) (optional)
-/// - @c kFIRParameterTravelClass (NSString) (optional) for travel bookings
+/// - @c kFIRParameterItems (NSArray) (optional)
+/// - @c kFIRParameterValue (double as NSNumber) (optional)
///
static NSString *const kFIREventBeginCheckout NS_SWIFT_NAME(AnalyticsEventBeginCheckout) =
@"begin_checkout";
@@ -110,6 +95,7 @@ static NSString *const kFIREventCampaignDetails NS_SWIFT_NAME(AnalyticsEventCamp
/// @c kFIRParameterCheckoutStep (unsigned 64-bit integer as NSNumber)
/// @c kFIRParameterCheckoutOption (NSString) (optional)
///
+/// This constant has been deprecated.
static NSString *const kFIREventCheckoutProgress NS_SWIFT_NAME(AnalyticsEventCheckoutProgress) =
@"checkout_progress";
@@ -150,6 +136,7 @@ static NSString *const kFIREventEarnVirtualCurrency
/// @c kFIRParameterDestination (NSString) (optional)
/// @c kFIRParameterTravelClass (NSString) (optional) for travel bookings
///
+/// This constant has been deprecated. Use @c kFIREventPurchase constant instead.
static NSString *const kFIREventEcommercePurchase NS_SWIFT_NAME(AnalyticsEventEcommercePurchase) =
@"ecommerce_purchase";
@@ -173,6 +160,21 @@ static NSString *const kFIREventGenerateLead NS_SWIFT_NAME(AnalyticsEventGenerat
///
static NSString *const kFIREventJoinGroup NS_SWIFT_NAME(AnalyticsEventJoinGroup) = @"join_group";
+/// Level End event. Log this event when the user finishes a level. Params:
+///
+///
+/// - @c kFIRParameterLevelName (NSString)
+/// - @c kFIRParameterSuccess (NSString)
+///
+static NSString *const kFIREventLevelEnd NS_SWIFT_NAME(AnalyticsEventLevelEnd) = @"level_end";
+
+/// Level Start event. Log this event when the user starts a new level. Params:
+///
+///
+/// - @c kFIRParameterLevelName (NSString)
+///
+static NSString *const kFIREventLevelStart NS_SWIFT_NAME(AnalyticsEventLevelStart) = @"level_start";
+
/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can
/// help you gauge the level distribution of your userbase and help you identify certain levels that
/// are difficult to pass. Params:
@@ -214,6 +216,7 @@ static NSString *const kFIREventPostScore NS_SWIFT_NAME(AnalyticsEventPostScore)
/// @c kFIRParameterCurrency (NSString) (optional)
/// @c kFIRParameterValue (double as NSNumber) (optional)
///
+/// This constant has been deprecated. Use @c kFIREventViewPromotion constant instead.
static NSString *const kFIREventPresentOffer NS_SWIFT_NAME(AnalyticsEventPresentOffer) =
@"present_offer";
@@ -227,24 +230,18 @@ static NSString *const kFIREventPresentOffer NS_SWIFT_NAME(AnalyticsEventPresent
/// @c kFIRParameterValue (double as NSNumber) (optional)
/// @c kFIRParameterTransactionID (NSString) (optional)
///
+/// This constant has been deprecated. Use @c kFIREventRefund constant instead.
static NSString *const kFIREventPurchaseRefund NS_SWIFT_NAME(AnalyticsEventPurchaseRefund) =
@"purchase_refund";
-/// Remove from cart event. Params:
+/// E-Commerce Remove from Cart event. This event signifies that an item(s) was removed from a cart.
+/// Note: If you supply the @c kFIRParameterValue parameter, you must also supply the @c
+/// kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params:
///
///
-/// - @c kFIRParameterQuantity (signed 64-bit integer as NSNumber)
-/// - @c kFIRParameterItemID (NSString)
-/// - @c kFIRParameterItemName (NSString)
-/// - @c kFIRParameterItemCategory (NSString)
-/// - @c kFIRParameterItemLocationID (NSString) (optional)
-/// - @c kFIRParameterPrice (double as NSNumber) (optional)
/// - @c kFIRParameterCurrency (NSString) (optional)
+/// - @c kFIRParameterItems (NSArray) (optional)
/// - @c kFIRParameterValue (double as NSNumber) (optional)
-/// - @c kFIRParameterOrigin (NSString) (optional)
-/// - @c kFIRParameterDestination (NSString) (optional)
-/// - @c kFIRParameterStartDate (NSString) (optional)
-/// - @c kFIRParameterEndDate (NSString) (optional)
///
static NSString *const kFIREventRemoveFromCart NS_SWIFT_NAME(AnalyticsEventRemoveFromCart) =
@"remove_from_cart";
@@ -277,6 +274,7 @@ static NSString *const kFIREventSearch NS_SWIFT_NAME(AnalyticsEventSearch) = @"s
/// @c kFIRParameterContentType (NSString)
/// @c kFIRParameterItemID (NSString)
///
+/// This constant has been deprecated. Use @c kFIREventSelectItem constant instead.
static NSString *const kFIREventSelectContent NS_SWIFT_NAME(AnalyticsEventSelectContent) =
@"select_content";
@@ -286,6 +284,7 @@ static NSString *const kFIREventSelectContent NS_SWIFT_NAME(AnalyticsEventSelect
/// @c kFIRParameterCheckoutStep (unsigned 64-bit integer as NSNumber)
/// @c kFIRParameterCheckoutOption (NSString)
///
+/// This constant has been deprecated.
static NSString *const kFIREventSetCheckoutOption NS_SWIFT_NAME(AnalyticsEventSetCheckoutOption) =
@"set_checkout_option";
@@ -340,43 +339,24 @@ static NSString *const kFIREventTutorialComplete NS_SWIFT_NAME(AnalyticsEventTut
static NSString *const kFIREventUnlockAchievement NS_SWIFT_NAME(AnalyticsEventUnlockAchievement) =
@"unlock_achievement";
-/// View Item event. This event signifies that some content was shown to the user. This content may
-/// be a product, a webpage or just a simple image or text. Use the appropriate parameters to
-/// contextualize the event. Use this event to discover the most popular items viewed in your app.
-/// Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
-/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately.
-/// Params:
+/// View Item event. This event signifies that a user has viewed an item. Use the appropriate
+/// parameters to contextualize the event. Use this event to discover the most popular items viewed
+/// in your app. Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
+/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params:
///
///
-/// - @c kFIRParameterItemID (NSString)
-/// - @c kFIRParameterItemName (NSString)
-/// - @c kFIRParameterItemCategory (NSString)
-/// - @c kFIRParameterItemLocationID (NSString) (optional)
-/// - @c kFIRParameterPrice (double as NSNumber) (optional)
-/// - @c kFIRParameterQuantity (signed 64-bit integer as NSNumber) (optional)
/// - @c kFIRParameterCurrency (NSString) (optional)
+/// - @c kFIRParameterItems (NSArray) (optional)
/// - @c kFIRParameterValue (double as NSNumber) (optional)
-/// - @c kFIRParameterStartDate (NSString) (optional)
-/// - @c kFIRParameterEndDate (NSString) (optional)
-/// - @c kFIRParameterFlightNumber (NSString) (optional) for travel bookings
-/// - @c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional)
-/// for travel bookings
-/// - @c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for
-/// travel bookings
-/// - @c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for
-/// travel bookings
-/// - @c kFIRParameterOrigin (NSString) (optional)
-/// - @c kFIRParameterDestination (NSString) (optional)
-/// - @c kFIRParameterSearchTerm (NSString) (optional) for travel bookings
-/// - @c kFIRParameterTravelClass (NSString) (optional) for travel bookings
///
static NSString *const kFIREventViewItem NS_SWIFT_NAME(AnalyticsEventViewItem) = @"view_item";
-/// View Item List event. Log this event when the user has been presented with a list of items of a
-/// certain category. Params:
+/// View Item List event. Log this event when a user sees a list of items or offerings. Params:
///
///
-/// - @c kFIRParameterItemCategory (NSString)
+/// - @c kFIRParameterItems (NSArray) (optional)
+/// - @c kFIRParameterItemListID (NSString) (optional)
+/// - @c kFIRParameterItemListName (NSString) (optional)
///
static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewItemList) =
@"view_item_list";
@@ -387,21 +367,107 @@ static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewIte
///
/// - @c kFIRParameterSearchTerm (NSString)
///
+/// This constant has been deprecated.
static NSString *const kFIREventViewSearchResults NS_SWIFT_NAME(AnalyticsEventViewSearchResults) =
@"view_search_results";
-/// Level Start event. Log this event when the user starts a new level. Params:
+/// Add Shipping Info event. This event signifies that a user has submitted their shipping
+/// information. Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
+/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params:
///
///
-/// - @c kFIRParameterLevelName (NSString)
+/// - @c kFIRParameterCoupon (NSString) (optional)
+/// - @c kFIRParameterCurrency (NSString) (optional)
+/// - @c kFIRParameterItems (NSArray) (optional)
+/// - @c kFIRParameterShippingTier (NSString) (optional)
+/// - @c kFIRParameterValue (double as NSNumber) (optional)
///
-static NSString *const kFIREventLevelStart NS_SWIFT_NAME(AnalyticsEventLevelStart) =
- @"level_start";
+static NSString *const kFIREventAddShippingInfo NS_SWIFT_NAME(AnalyticsEventAddShippingInfo) =
+ @"add_shipping_info";
-/// Level End event. Log this event when the user finishes a level. Params:
+/// E-Commerce Purchase event. This event signifies that an item(s) was purchased by a user. Note:
+/// This is different from the in-app purchase event, which is reported automatically for App
+/// Store-based apps. Note: If you supply the @c kFIRParameterValue parameter, you must also supply
+/// the @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately.
+/// Params:
///
///
-/// - @c kFIRParameterLevelName (NSString)
-/// - @c kFIRParameterSuccess (NSString)
+/// - @c kFIRParameterAffiliation (NSString) (optional)
+/// - @c kFIRParameterCoupon (NSString) (optional)
+/// - @c kFIRParameterCurrency (NSString) (optional)
+/// - @c kFIRParameterItems (NSArray) (optional)
+/// - @c kFIRParameterShipping (double as NSNumber) (optional)
+/// - @c kFIRParameterTax (double as NSNumber) (optional)
+/// - @c kFIRParameterTransactionID (NSString) (optional)
+/// - @c kFIRParameterValue (double as NSNumber) (optional)
///
-static NSString *const kFIREventLevelEnd NS_SWIFT_NAME(AnalyticsEventLevelEnd) = @"level_end";
+static NSString *const kFIREventPurchase NS_SWIFT_NAME(AnalyticsEventPurchase) = @"purchase";
+
+/// E-Commerce Refund event. This event signifies that a refund was issued. Note: If you supply the
+/// @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency parameter so
+/// that revenue metrics can be computed accurately. Params:
+///
+///
+/// - @c kFIRParameterAffiliation (NSString) (optional)
+/// - @c kFIRParameterCoupon (NSString) (optional)
+/// - @c kFIRParameterCurrency (NSString) (optional)
+/// - @c kFIRParameterItems (NSArray) (optional)
+/// - @c kFIRParameterShipping (double as NSNumber) (optional)
+/// - @c kFIRParameterTax (double as NSNumber) (optional)
+/// - @c kFIRParameterTransactionID (NSString) (optional)
+/// - @c kFIRParameterValue (double as NSNumber) (optional)
+///
+static NSString *const kFIREventRefund NS_SWIFT_NAME(AnalyticsEventRefund) = @"refund";
+
+/// Select Item event. This event signifies that an item was selected by a user from a list. Use the
+/// appropriate parameters to contextualize the event. Use this event to discover the most popular
+/// items selected. Params:
+///
+///
+/// - @c kFIRParameterItems (NSArray) (optional)
+/// - @c kFIRParameterItemListID (NSString) (optional)
+/// - @c kFIRParameterItemListName (NSString) (optional)
+///
+static NSString *const kFIREventSelectItem NS_SWIFT_NAME(AnalyticsEventSelectItem) = @"select_item";
+
+/// Select promotion event. This event signifies that a user has selected a promotion offer. Use the
+/// appropriate parameters to contextualize the event, such as the item(s) for which the promotion
+/// applies. Params:
+///
+///
+/// - @c kFIRParameterCreativeName (NSString) (optional)
+/// - @c kFIRParameterCreativeSlot (NSString) (optional)
+/// - @c kFIRParameterItems (NSArray) (optional)
+/// - @c kFIRParameterLocationID (NSString) (optional)
+/// - @c kFIRParameterPromotionID (NSString) (optional)
+/// - @c kFIRParameterPromotionName (NSString) (optional)
+///
+static NSString *const kFIREventSelectPromotion NS_SWIFT_NAME(AnalyticsEventSelectPromotion) =
+ @"select_promotion";
+
+/// E-commerce View Cart event. This event signifies that a user has viewed their cart. Use this to
+/// analyze your purchase funnel. Note: If you supply the @c kFIRParameterValue parameter, you must
+/// also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
+/// accurately. Params:
+///
+///
+/// - @c kFIRParameterCurrency (NSString) (optional)
+/// - @c kFIRParameterItems (NSArray) (optional)
+/// - @c kFIRParameterValue (double as NSNumber) (optional)
+///
+static NSString *const kFIREventViewCart NS_SWIFT_NAME(AnalyticsEventViewCart) = @"view_cart";
+
+/// View Promotion event. This event signifies that a promotion was shown to a user. Add this event
+/// to a funnel with the @c kFIREventAddToCart and @c kFIREventPurchase to gauge your conversion
+/// process. Params:
+///
+///
+/// - @c kFIRParameterCreativeName (NSString) (optional)
+/// - @c kFIRParameterCreativeSlot (NSString) (optional)
+/// - @c kFIRParameterItems (NSArray) (optional)
+/// - @c kFIRParameterLocationID (NSString) (optional)
+/// - @c kFIRParameterPromotionID (NSString) (optional)
+/// - @c kFIRParameterPromotionName (NSString) (optional)
+///
+static NSString *const kFIREventViewPromotion NS_SWIFT_NAME(AnalyticsEventViewPromotion) =
+ @"view_promotion";
diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h
index 4e1366ce91..5775d866c4 100755
--- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h
+++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h
@@ -32,8 +32,8 @@ static NSString *const kFIRParameterAchievementID NS_SWIFT_NAME(AnalyticsParamet
static NSString *const kFIRParameterAdNetworkClickID
NS_SWIFT_NAME(AnalyticsParameterAdNetworkClickID) = @"aclid";
-/// The store or affiliation from which this transaction occurred (NSString).
-///
+/// A product affiliation to designate a supplying company or brick and mortar store location
+/// (NSString).
/// NSDictionary *params = @{
/// kFIRParameterAffiliation : @"Google Store",
/// // ...
@@ -71,6 +71,7 @@ static NSString *const kFIRParameterCharacter NS_SWIFT_NAME(AnalyticsParameterCh
/// // ...
/// };
///
+/// This constant has been deprecated.
static NSString *const kFIRParameterCheckoutStep NS_SWIFT_NAME(AnalyticsParameterCheckoutStep) =
@"checkout_step";
@@ -81,6 +82,7 @@ static NSString *const kFIRParameterCheckoutStep NS_SWIFT_NAME(AnalyticsParamete
/// // ...
/// };
///
+/// This constant has been deprecated.
static NSString *const kFIRParameterCheckoutOption
NS_SWIFT_NAME(AnalyticsParameterCheckoutOption) = @"checkout_option";
@@ -97,10 +99,10 @@ static NSString *const kFIRParameterContent NS_SWIFT_NAME(AnalyticsParameterCont
static NSString *const kFIRParameterContentType NS_SWIFT_NAME(AnalyticsParameterContentType) =
@"content_type";
-/// Coupon code for a purchasable item (NSString).
+/// Coupon code used for a purchase (NSString).
///
/// NSDictionary *params = @{
-/// kFIRParameterCoupon : @"zz123",
+/// kFIRParameterCoupon : @"SUMMER_FUN",
/// // ...
/// };
///
@@ -136,8 +138,8 @@ static NSString *const kFIRParameterCreativeName NS_SWIFT_NAME(AnalyticsParamete
static NSString *const kFIRParameterCreativeSlot NS_SWIFT_NAME(AnalyticsParameterCreativeSlot) =
@"creative_slot";
-/// Purchase currency in 3-letter
-/// ISO_4217 format (NSString).
+/// Currency of the purchase or items associated with the event, in 3-letter
+/// ISO_4217 format (NSString).
///
/// NSDictionary *params = @{
/// kFIRParameterCurrency : @"USD",
@@ -186,10 +188,10 @@ static NSString *const kFIRParameterFlightNumber NS_SWIFT_NAME(AnalyticsParamete
///
static NSString *const kFIRParameterGroupID NS_SWIFT_NAME(AnalyticsParameterGroupID) = @"group_id";
-/// Index of an item in a list (signed 64-bit integer as NSNumber).
+/// The index of the item in a list (signed 64-bit integer as NSNumber).
///
/// NSDictionary *params = @{
-/// kFIRParameterIndex : @(1),
+/// kFIRParameterIndex : @(5),
/// // ...
/// };
///
@@ -205,20 +207,20 @@ static NSString *const kFIRParameterIndex NS_SWIFT_NAME(AnalyticsParameterIndex)
static NSString *const kFIRParameterItemBrand NS_SWIFT_NAME(AnalyticsParameterItemBrand) =
@"item_brand";
-/// Item category (NSString).
+/// Item category (context-specific) (NSString).
///
/// NSDictionary *params = @{
-/// kFIRParameterItemCategory : @"t-shirts",
+/// kFIRParameterItemCategory : @"pants",
/// // ...
/// };
///
static NSString *const kFIRParameterItemCategory NS_SWIFT_NAME(AnalyticsParameterItemCategory) =
@"item_category";
-/// Item ID (NSString).
+/// Item ID (context-specific) (NSString).
///
/// NSDictionary *params = @{
-/// kFIRParameterItemID : @"p7654",
+/// kFIRParameterItemID : @"SKU_12345",
/// // ...
/// };
///
@@ -232,13 +234,14 @@ static NSString *const kFIRParameterItemID NS_SWIFT_NAME(AnalyticsParameterItemI
/// // ...
/// };
///
+/// This constant has been deprecated. Use @c kFIRParameterLocationID constant instead.
static NSString *const kFIRParameterItemLocationID
NS_SWIFT_NAME(AnalyticsParameterItemLocationID) = @"item_location_id";
-/// Item name (NSString).
+/// Item Name (context-specific) (NSString).
///
/// NSDictionary *params = @{
-/// kFIRParameterItemName : @"abc",
+/// kFIRParameterItemName : @"jeggings",
/// // ...
/// };
///
@@ -252,13 +255,14 @@ static NSString *const kFIRParameterItemName NS_SWIFT_NAME(AnalyticsParameterIte
/// // ...
/// };
///
+/// This constant has been deprecated. Use @c kFIRParameterItemListName constant instead.
static NSString *const kFIRParameterItemList NS_SWIFT_NAME(AnalyticsParameterItemList) =
@"item_list";
/// Item variant (NSString).
///
/// NSDictionary *params = @{
-/// kFIRParameterItemVariant : @"Red",
+/// kFIRParameterItemVariant : @"Black",
/// // ...
/// };
///
@@ -374,11 +378,11 @@ static NSString *const kFIRParameterScore NS_SWIFT_NAME(AnalyticsParameterScore)
static NSString *const kFIRParameterSearchTerm NS_SWIFT_NAME(AnalyticsParameterSearchTerm) =
@"search_term";
-/// Shipping cost (double as NSNumber).
+/// Shipping cost associated with a transaction (double as NSNumber).
///
/// NSDictionary *params = @{
-/// kFIRParameterShipping : @(9.50),
-/// kFIRParameterCurrency : @"USD", // e.g. $9.50 USD
+/// kFIRParameterShipping : @(5.99),
+/// kFIRParameterCurrency : @"USD", // e.g. $5.99 USD
/// // ...
/// };
///
@@ -392,9 +396,21 @@ static NSString *const kFIRParameterShipping NS_SWIFT_NAME(AnalyticsParameterShi
/// // ...
/// };
///
+///
+/// This constant has been deprecated. Use Method constant instead.
static NSString *const kFIRParameterSignUpMethod NS_SWIFT_NAME(AnalyticsParameterSignUpMethod) =
@"sign_up_method";
+/// A particular approach used in an operation; for example, "facebook" or "email" in the context
+/// of a sign_up or login event. (NSString).
+///
+/// NSDictionary *params = @{
+/// kFIRParameterMethod : @"google",
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterMethod NS_SWIFT_NAME(AnalyticsParameterMethod) = @"method";
+
/// The origin of your traffic, such as an Ad network (for example, google) or partner (urban
/// airship). Identify the advertiser, site, publication, etc. that is sending traffic to your
/// property. Highly recommended (NSString).
@@ -417,11 +433,11 @@ static NSString *const kFIRParameterSource NS_SWIFT_NAME(AnalyticsParameterSourc
static NSString *const kFIRParameterStartDate NS_SWIFT_NAME(AnalyticsParameterStartDate) =
@"start_date";
-/// Tax amount (double as NSNumber).
+/// Tax cost associated with a transaction (double as NSNumber).
///
/// NSDictionary *params = @{
-/// kFIRParameterTax : @(1.0),
-/// kFIRParameterCurrency : @"USD", // e.g. $1.00 USD
+/// kFIRParameterTax : @(2.43),
+/// kFIRParameterCurrency : @"USD", // e.g. $2.43 USD
/// // ...
/// };
///
@@ -437,10 +453,10 @@ static NSString *const kFIRParameterTax NS_SWIFT_NAME(AnalyticsParameterTax) = @
///
static NSString *const kFIRParameterTerm NS_SWIFT_NAME(AnalyticsParameterTerm) = @"term";
-/// A single ID for a ecommerce group transaction (NSString).
+/// The unique identifier of a transaction (NSString).
///
/// NSDictionary *params = @{
-/// kFIRParameterTransactionID : @"ab7236dd9823",
+/// kFIRParameterTransactionID : @"T12345",
/// // ...
/// };
///
@@ -505,3 +521,150 @@ static NSString *const kFIRParameterLevelName NS_SWIFT_NAME(AnalyticsParameterLe
/// };
///
static NSString *const kFIRParameterSuccess NS_SWIFT_NAME(AnalyticsParameterSuccess) = @"success";
+
+/// Indicates that the associated event should either extend the current session
+/// or start a new session if no session was active when the event was logged.
+/// Specify YES to extend the current session or to start a new session; any
+/// other value will not extend or start a session.
+///
+/// NSDictionary *params = @{
+/// kFIRParameterExtendSession : @YES,
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterExtendSession NS_SWIFT_NAME(AnalyticsParameterExtendSession) =
+ @"extend_session";
+
+/// Monetary value of discount associated with a purchase (double as NSNumber).
+///
+/// NSDictionary *params = @{
+/// kFIRParameterDiscount : @(2.0),
+/// kFIRParameterCurrency : @"USD", // e.g. $2.00 USD
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterDiscount NS_SWIFT_NAME(AnalyticsParameterDiscount) =
+ @"discount";
+
+/// Item Category (context-specific) (NSString).
+///
+/// NSDictionary *params = @{
+/// kFIRParameterItemCategory2 : @"pants",
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterItemCategory2 NS_SWIFT_NAME(AnalyticsParameterItemCategory2) =
+ @"item_category2";
+
+/// Item Category (context-specific) (NSString).
+///
+/// NSDictionary *params = @{
+/// kFIRParameterItemCategory3 : @"pants",
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterItemCategory3 NS_SWIFT_NAME(AnalyticsParameterItemCategory3) =
+ @"item_category3";
+
+/// Item Category (context-specific) (NSString).
+///
+/// NSDictionary *params = @{
+/// kFIRParameterItemCategory4 : @"pants",
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterItemCategory4 NS_SWIFT_NAME(AnalyticsParameterItemCategory4) =
+ @"item_category4";
+
+/// Item Category (context-specific) (NSString).
+///
+/// NSDictionary *params = @{
+/// kFIRParameterItemCategory5 : @"pants",
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterItemCategory5 NS_SWIFT_NAME(AnalyticsParameterItemCategory5) =
+ @"item_category5";
+
+/// The ID of the list in which the item was presented to the user (NSString).
+///
+/// NSDictionary *params = @{
+/// kFIRParameterItemListID : @"ABC123",
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterItemListID NS_SWIFT_NAME(AnalyticsParameterItemListID) =
+ @"item_list_id";
+
+/// The name of the list in which the item was presented to the user (NSString).
+///
+/// NSDictionary *params = @{
+/// kFIRParameterItemListName : @"Related products",
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterItemListName NS_SWIFT_NAME(AnalyticsParameterItemListName) =
+ @"item_list_name";
+
+/// The list of items involved in the transaction. (NSArray).
+///
+/// NSDictionary *params = @{
+/// kFIRParameterItems : @[
+/// @{kFIRParameterItemName : @"jeggings", kFIRParameterItemCategory : @"pants"},
+/// @{kFIRParameterItemName : @"boots", kFIRParameterItemCategory : @"shoes"},
+/// ],
+/// };
+///
+static NSString *const kFIRParameterItems NS_SWIFT_NAME(AnalyticsParameterItems) = @"items";
+
+/// The location associated with the event. Preferred to be the Google
+/// Place ID that corresponds to the
+/// associated item but could be overridden to a custom location ID string.(NSString).
+/// NSDictionary *params = @{
+/// kFIRParameterLocationID : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterLocationID NS_SWIFT_NAME(AnalyticsParameterLocationID) =
+ @"location_id";
+
+/// The chosen method of payment (NSString).
+///
+/// NSDictionary *params = @{
+/// kFIRParameterPaymentType : @"Visa",
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterPaymentType NS_SWIFT_NAME(AnalyticsParameterPaymentType) =
+ @"payment_type";
+
+/// The ID of a product promotion (NSString).
+///
+/// NSDictionary *params = @{
+/// kFIRParameterPromotionID : @"ABC123",
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterPromotionID NS_SWIFT_NAME(AnalyticsParameterPromotionID) =
+ @"promotion_id";
+
+/// The name of a product promotion (NSString).
+///
+/// NSDictionary *params = @{
+/// kFIRParameterPromotionName : @"Summer Sale",
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterPromotionName NS_SWIFT_NAME(AnalyticsParameterPromotionName) =
+ @"promotion_name";
+
+/// The shipping tier (e.g. Ground, Air, Next-day) selected for delivery of the purchased item
+/// (NSString).
+///
+/// NSDictionary *params = @{
+/// kFIRParameterShippingTier : @"Ground",
+/// // ...
+/// };
+///
+static NSString *const kFIRParameterShippingTier NS_SWIFT_NAME(AnalyticsParameterShippingTier) =
+ @"shipping_tier";
diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h
index f50707fa15..132aef770c 100755
--- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h
+++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h
@@ -15,3 +15,15 @@
/// The method used to sign in. For example, "google", "facebook" or "twitter".
static NSString *const kFIRUserPropertySignUpMethod
NS_SWIFT_NAME(AnalyticsUserPropertySignUpMethod) = @"sign_up_method";
+
+/// Indicates whether events logged by Google Analytics can be used to personalize ads for the user.
+/// Set to "YES" to enable, or "NO" to disable. Default is enabled. See the
+/// documentation for
+/// more details and information about related settings.
+///
+///
+/// [FIRAnalytics setUserPropertyString:@"NO"
+/// forName:kFIRUserPropertyAllowAdPersonalizationSignals];
+///
+static NSString *const kFIRUserPropertyAllowAdPersonalizationSignals
+ NS_SWIFT_NAME(AnalyticsUserPropertyAllowAdPersonalizationSignals) = @"allow_personalized_ads";
diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Modules/module.modulemap b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Modules/module.modulemap
index ef80595cd7..d7c59054aa 100755
--- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Modules/module.modulemap
+++ b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Modules/module.modulemap
@@ -1,10 +1,12 @@
framework module FirebaseAnalytics {
umbrella header "FirebaseAnalytics.h"
export *
- module * { export *}
+ module * { export * }
link "sqlite3"
link "z"
+ link framework "CoreData"
link framework "Security"
link framework "StoreKit"
link framework "SystemConfiguration"
- link framework "UIKit"}
+ link framework "UIKit"
+}
diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseCoreDiagnostics.framework/FirebaseCoreDiagnostics b/Pods/FirebaseAnalytics/Frameworks/FirebaseCoreDiagnostics.framework/FirebaseCoreDiagnostics
deleted file mode 100755
index 8384856183..0000000000
Binary files a/Pods/FirebaseAnalytics/Frameworks/FirebaseCoreDiagnostics.framework/FirebaseCoreDiagnostics and /dev/null differ
diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseCoreDiagnostics.framework/Modules/module.modulemap b/Pods/FirebaseAnalytics/Frameworks/FirebaseCoreDiagnostics.framework/Modules/module.modulemap
deleted file mode 100755
index bbcb94e31d..0000000000
--- a/Pods/FirebaseAnalytics/Frameworks/FirebaseCoreDiagnostics.framework/Modules/module.modulemap
+++ /dev/null
@@ -1,6 +0,0 @@
-framework module FirebaseCoreDiagnostics {
- export *
- module * { export *}
- link "z"
- link framework "Security"
- link framework "SystemConfiguration"}
diff --git a/Pods/FirebaseCore/Firebase/Core/Public/FIRAnalyticsConfiguration.h b/Pods/FirebaseCore/Firebase/Core/Public/FIRAnalyticsConfiguration.h
deleted file mode 100644
index ca1d32c6e2..0000000000
--- a/Pods/FirebaseCore/Firebase/Core/Public/FIRAnalyticsConfiguration.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2017 Google
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#import
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * This class provides configuration fields for Firebase Analytics.
- */
-NS_SWIFT_NAME(AnalyticsConfiguration)
-@interface FIRAnalyticsConfiguration : NSObject
-
-/**
- * Returns the shared instance of FIRAnalyticsConfiguration.
- */
-+ (FIRAnalyticsConfiguration *)sharedInstance NS_SWIFT_NAME(shared());
-
-/**
- * Sets the minimum engagement time in seconds required to start a new session. The default value
- * is 10 seconds.
- */
-- (void)setMinimumSessionInterval:(NSTimeInterval)minimumSessionInterval;
-
-/**
- * Sets the interval of inactivity in seconds that terminates the current session. The default
- * value is 1800 seconds (30 minutes).
- */
-- (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval;
-
-/**
- * Sets whether analytics collection is enabled for this app on this device. This setting is
- * persisted across app sessions. By default it is enabled.
- */
-- (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseCore/Firebase/Core/FIRAnalyticsConfiguration.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.m
similarity index 79%
rename from Pods/FirebaseCore/Firebase/Core/FIRAnalyticsConfiguration.m
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.m
index 33aa1687f5..3a7d6de0e7 100644
--- a/Pods/FirebaseCore/Firebase/Core/FIRAnalyticsConfiguration.m
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRAnalyticsConfiguration.m
@@ -12,11 +12,14 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#import "FIRAnalyticsConfiguration.h"
+#import
-#import "Private/FIRAnalyticsConfiguration+Internal.h"
+#import "FirebaseCore/Sources/Private/FIRAnalyticsConfiguration.h"
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-implementations"
@implementation FIRAnalyticsConfiguration
+#pragma clang diagnostic pop
+ (FIRAnalyticsConfiguration *)sharedInstance {
static FIRAnalyticsConfiguration *sharedInstance = nil;
@@ -36,16 +39,6 @@ - (void)postNotificationName:(NSString *)name value:(id)value {
userInfo:@{name : value}];
}
-- (void)setMinimumSessionInterval:(NSTimeInterval)minimumSessionInterval {
- [self postNotificationName:kFIRAnalyticsConfigurationSetMinimumSessionIntervalNotification
- value:@(minimumSessionInterval)];
-}
-
-- (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval {
- [self postNotificationName:kFIRAnalyticsConfigurationSetSessionTimeoutIntervalNotification
- value:@(sessionTimeoutInterval)];
-}
-
- (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled {
[self setAnalyticsCollectionEnabled:analyticsCollectionEnabled persistSetting:YES];
}
diff --git a/Pods/FirebaseCore/Firebase/Core/FIRApp.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRApp.m
similarity index 61%
rename from Pods/FirebaseCore/Firebase/Core/FIRApp.m
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRApp.m
index 3b352fa7d1..002f93c516 100644
--- a/Pods/FirebaseCore/Firebase/Core/FIRApp.m
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRApp.m
@@ -14,33 +14,50 @@
#include
-#import "FIRApp.h"
-#import "FIRConfiguration.h"
-#import "Private/FIRAnalyticsConfiguration+Internal.h"
-#import "Private/FIRAppInternal.h"
-#import "Private/FIRBundleUtil.h"
-#import "Private/FIRComponentContainerInternal.h"
-#import "Private/FIRCoreConfigurable.h"
-#import "Private/FIRLogger.h"
-#import "Private/FIROptionsInternal.h"
-
-NSString *const kFIRServiceAdMob = @"AdMob";
-NSString *const kFIRServiceAuth = @"Auth";
-NSString *const kFIRServiceAuthUI = @"AuthUI";
-NSString *const kFIRServiceCrash = @"Crash";
-NSString *const kFIRServiceDatabase = @"Database";
-NSString *const kFIRServiceDynamicLinks = @"DynamicLinks";
-NSString *const kFIRServiceFirestore = @"Firestore";
-NSString *const kFIRServiceFunctions = @"Functions";
-NSString *const kFIRServiceInstanceID = @"InstanceID";
-NSString *const kFIRServiceInvites = @"Invites";
-NSString *const kFIRServiceMessaging = @"Messaging";
-NSString *const kFIRServiceMeasurement = @"Measurement";
-NSString *const kFIRServicePerformance = @"Performance";
-NSString *const kFIRServiceRemoteConfig = @"RemoteConfig";
-NSString *const kFIRServiceStorage = @"Storage";
-NSString *const kGGLServiceAnalytics = @"Analytics";
-NSString *const kGGLServiceSignIn = @"SignIn";
+#if __has_include()
+#import
+#endif
+
+#if __has_include()
+#import
+#endif
+
+#import
+
+#import "FirebaseCore/Sources/FIRBundleUtil.h"
+#import "FirebaseCore/Sources/FIRVersion.h"
+#import "FirebaseCore/Sources/Private/FIRAnalyticsConfiguration.h"
+#import "FirebaseCore/Sources/Private/FIRAppInternal.h"
+#import "FirebaseCore/Sources/Private/FIRComponentContainerInternal.h"
+#import "FirebaseCore/Sources/Private/FIRConfigurationInternal.h"
+#import "FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h"
+#import "FirebaseCore/Sources/Private/FIRLibrary.h"
+#import "FirebaseCore/Sources/Private/FIRLogger.h"
+#import "FirebaseCore/Sources/Private/FIROptionsInternal.h"
+
+#import
+
+#import
+
+// The kFIRService strings are only here while transitioning CoreDiagnostics from the Analytics
+// pod to a Core dependency. These symbols are not used and should be deleted after the transition.
+NSString *const kFIRServiceAdMob;
+NSString *const kFIRServiceAuth;
+NSString *const kFIRServiceAuthUI;
+NSString *const kFIRServiceCrash;
+NSString *const kFIRServiceDatabase;
+NSString *const kFIRServiceDynamicLinks;
+NSString *const kFIRServiceFirestore;
+NSString *const kFIRServiceFunctions;
+NSString *const kFIRServiceInstanceID;
+NSString *const kFIRServiceInvites;
+NSString *const kFIRServiceMessaging;
+NSString *const kFIRServiceMeasurement;
+NSString *const kFIRServicePerformance;
+NSString *const kFIRServiceRemoteConfig;
+NSString *const kFIRServiceStorage;
+NSString *const kGGLServiceAnalytics;
+NSString *const kGGLServiceSignIn;
NSString *const kFIRDefaultAppName = @"__FIRAPP_DEFAULT";
NSString *const kFIRAppReadyToConfigureSDKNotification = @"FIRAppReadyToConfigureSDKNotification";
@@ -61,6 +78,7 @@
NSString *const kFIRAppDiagnosticsFIRAppKey = @"FIRApp";
NSString *const kFIRAppDiagnosticsSDKNameKey = @"SDKName";
NSString *const kFIRAppDiagnosticsSDKVersionKey = @"SDKVersion";
+NSString *const kFIRAppDiagnosticsApplePlatformPrefix = @"apple-platform";
// Auth internal notification notification and key.
NSString *const FIRAuthStateDidChangeInternalNotification =
@@ -81,7 +99,7 @@
* An array of all classes that registered as `FIRCoreConfigurable` in order to receive lifecycle
* events from Core.
*/
-static NSMutableArray> *gRegisteredAsConfigurable;
+static NSMutableArray> *sRegisteredAsConfigurable;
@interface FIRApp ()
@@ -99,29 +117,16 @@ @implementation FIRApp
static NSMutableDictionary *sAllApps;
static FIRApp *sDefaultApp;
static NSMutableDictionary *sLibraryVersions;
+static dispatch_once_t sFirebaseUserAgentOnceToken;
+ (void)configure {
FIROptions *options = [FIROptions defaultOptions];
if (!options) {
- // Read the Info.plist to see if the flag is set. At this point we can't check any user defaults
- // since the app isn't configured at all, so only rely on the Info.plist value.
- NSNumber *collectionEnabledPlistValue = [[self class] readDataCollectionSwitchFromPlist];
- if (collectionEnabledPlistValue == nil || [collectionEnabledPlistValue boolValue]) {
- [[NSNotificationCenter defaultCenter]
- postNotificationName:kFIRAppDiagnosticsNotification
- object:nil
- userInfo:@{
- kFIRAppDiagnosticsConfigurationTypeKey : @(FIRConfigTypeCore),
- kFIRAppDiagnosticsErrorKey : [FIRApp errorForMissingOptions]
- }];
- }
-
[NSException raise:kFirebaseCoreErrorDomain
- format:
- @"`[FIRApp configure];` (`FirebaseApp.configure()` in Swift) could not find "
- @"a valid GoogleService-Info.plist in your project. Please download one "
- @"from %@.",
- kPlistURL];
+ format:@"`[FIRApp configure];` (`FirebaseApp.configure()` in Swift) could not find "
+ @"a valid GoogleService-Info.plist in your project. Please download one "
+ @"from %@.",
+ kPlistURL];
}
[FIRApp configureWithOptions:options];
#if TARGET_OS_OSX || TARGET_OS_TV
@@ -140,6 +145,17 @@ + (void)configureWithOptions:(FIROptions *)options {
[FIRApp configureWithName:kFIRDefaultAppName options:options];
}
++ (NSCharacterSet *)applicationNameAllowedCharacters {
+ static NSCharacterSet *applicationNameAllowedCharacters;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ NSMutableCharacterSet *allowedNameCharacters = [NSMutableCharacterSet alphanumericCharacterSet];
+ [allowedNameCharacters addCharactersInString:@"-_"];
+ applicationNameAllowedCharacters = [allowedNameCharacters copy];
+ });
+ return applicationNameAllowedCharacters;
+}
+
+ (void)configureWithName:(NSString *)name options:(FIROptions *)options {
if (!name || !options) {
[NSException raise:kFirebaseCoreErrorDomain format:@"Neither name nor options can be nil."];
@@ -150,27 +166,28 @@ + (void)configureWithName:(NSString *)name options:(FIROptions *)options {
if ([name isEqualToString:kFIRDefaultAppName]) {
if (sDefaultApp) {
- [NSException raise:kFirebaseCoreErrorDomain
- format:@"Default app has already been configured."];
+ // The default app already exixts. Handle duplicate `configure` calls and return.
+ [self appWasConfiguredTwice:sDefaultApp usingOptions:options];
+ return;
}
FIRLogDebug(kFIRLoggerCore, @"I-COR000001", @"Configuring the default app.");
} else {
// Validate the app name and ensure it hasn't been configured already.
- for (NSUInteger charIndex = 0; charIndex < name.length; charIndex++) {
- char character = [name characterAtIndex:charIndex];
- if (!((character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z') ||
- (character >= '0' && character <= '9') || character == '_' || character == '-')) {
- [NSException raise:kFirebaseCoreErrorDomain
- format:
- @"App name should only contain Letters, "
- @"Numbers, Underscores, and Dashes."];
- }
- }
+ NSCharacterSet *nameCharacters = [NSCharacterSet characterSetWithCharactersInString:name];
- if (sAllApps && sAllApps[name]) {
+ if (![[self applicationNameAllowedCharacters] isSupersetOfSet:nameCharacters]) {
[NSException raise:kFirebaseCoreErrorDomain
- format:@"App named %@ has already been configured.", name];
+ format:@"App name can only contain alphanumeric, "
+ @"hyphen (-), and underscore (_) characters"];
+ }
+
+ @synchronized(self) {
+ if (sAllApps && sAllApps[name]) {
+ // The app already exists. Handle a duplicate `configure` call and return.
+ [self appWasConfiguredTwice:sAllApps[name] usingOptions:options];
+ return;
+ }
}
FIRLogDebug(kFIRLoggerCore, @"I-COR000002", @"Configuring app named %@", name);
@@ -183,10 +200,44 @@ + (void)configureWithName:(NSString *)name options:(FIROptions *)options {
}
[FIRApp addAppToAppDictionary:app];
+
+ // The FIRApp instance is ready to go, `sDefaultApp` is assigned, other SDKs are now ready to be
+ // instantiated.
+ [app.container instantiateEagerComponents];
[FIRApp sendNotificationsToSDKs:app];
}
}
+/// Called when `configure` has been called multiple times for the same app. This can either throw
+/// an exception (most cases) or ignore the duplicate configuration in situations where it's allowed
+/// like an extension.
++ (void)appWasConfiguredTwice:(FIRApp *)app usingOptions:(FIROptions *)options {
+ // Only extensions should potentially be able to call `configure` more than once.
+ if (![GULAppEnvironmentUtil isAppExtension]) {
+ // Throw an exception since this is now an invalid state.
+ if (app.isDefaultApp) {
+ [NSException raise:kFirebaseCoreErrorDomain
+ format:@"Default app has already been configured."];
+ } else {
+ [NSException raise:kFirebaseCoreErrorDomain
+ format:@"App named %@ has already been configured.", app.name];
+ }
+ }
+
+ // In an extension, the entry point could be called multiple times. As long as the options are
+ // identical we should allow multiple `configure` calls.
+ if ([options isEqual:app.options]) {
+ // Everything is identical but the extension's lifecycle triggered `configure` twice.
+ // Ignore duplicate calls and return since everything should still be in a valid state.
+ FIRLogDebug(kFIRLoggerCore, @"I-COR000035",
+ @"Ignoring second `configure` call in an extension.");
+ return;
+ } else {
+ [NSException raise:kFirebaseCoreErrorDomain
+ format:@"App named %@ has already been configured.", app.name];
+ }
+}
+
+ (FIRApp *)defaultApp {
if (sDefaultApp) {
return sDefaultApp;
@@ -216,18 +267,20 @@ + (NSDictionary *)allApps {
if (!sAllApps) {
FIRLogError(kFIRLoggerCore, @"I-COR000005", @"No app has been configured yet.");
}
- NSDictionary *dict = [NSDictionary dictionaryWithDictionary:sAllApps];
- return dict;
+ return [sAllApps copy];
}
}
// Public only for tests
+ (void)resetApps {
- sDefaultApp = nil;
- [sAllApps removeAllObjects];
- sAllApps = nil;
- [sLibraryVersions removeAllObjects];
- sLibraryVersions = nil;
+ @synchronized(self) {
+ sDefaultApp = nil;
+ [sAllApps removeAllObjects];
+ sAllApps = nil;
+ [sLibraryVersions removeAllObjects];
+ sLibraryVersions = nil;
+ sFirebaseUserAgentOnceToken = 0;
+ }
}
- (void)deleteApp:(FIRAppVoidBoolCallback)completion {
@@ -235,6 +288,8 @@ - (void)deleteApp:(FIRAppVoidBoolCallback)completion {
if (sAllApps && sAllApps[self.name]) {
FIRLogDebug(kFIRLoggerCore, @"I-COR000006", @"Deleting app named %@", self.name);
+ // Remove all registered libraries from the container to avoid creating new instances.
+ [self.container removeAllComponents];
// Remove all cached instances from the container before deleting the app.
[self.container removeAllCachedInstances];
@@ -263,9 +318,8 @@ + (void)addAppToAppDictionary:(FIRApp *)app {
sAllApps[app.name] = app;
} else {
[NSException raise:kFirebaseCoreErrorDomain
- format:
- @"Configuration fails. It may be caused by an invalid GOOGLE_APP_ID in "
- @"GoogleService-Info.plist or set in the customized options."];
+ format:@"Configuration fails. It may be caused by an invalid GOOGLE_APP_ID in "
+ @"GoogleService-Info.plist or set in the customized options."];
}
}
@@ -281,50 +335,24 @@ - (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)opti
return self;
}
-- (void)getTokenForcingRefresh:(BOOL)forceRefresh withCallback:(FIRTokenCallback)callback {
- if (!_getTokenImplementation) {
- callback(nil, nil);
- return;
- }
-
- _getTokenImplementation(forceRefresh, callback);
+- (void)dealloc {
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (BOOL)configureCore {
[self checkExpectedBundleID];
if (![self isAppIDValid]) {
- if (_options.usingOptionsFromDefaultPlist && [self isDataCollectionDefaultEnabled]) {
- [[NSNotificationCenter defaultCenter]
- postNotificationName:kFIRAppDiagnosticsNotification
- object:nil
- userInfo:@{
- kFIRAppDiagnosticsConfigurationTypeKey : @(FIRConfigTypeCore),
- kFIRAppDiagnosticsErrorKey : [FIRApp errorForInvalidAppID],
- }];
- }
return NO;
}
- if ([self isDataCollectionDefaultEnabled]) {
- [[NSNotificationCenter defaultCenter]
- postNotificationName:kFIRAppDiagnosticsNotification
- object:nil
- userInfo:@{
- kFIRAppDiagnosticsConfigurationTypeKey : @(FIRConfigTypeCore),
- kFIRAppDiagnosticsFIRAppKey : self
- }];
- }
+ [self logCoreTelemetryIfEnabled];
#if TARGET_OS_IOS
// Initialize the Analytics once there is a valid options under default app. Analytics should
// always initialize first by itself before the other SDKs.
if ([self.name isEqualToString:kFIRDefaultAppName]) {
Class firAnalyticsClass = NSClassFromString(@"FIRAnalytics");
- if (!firAnalyticsClass) {
- FIRLogWarning(kFIRLoggerCore, @"I-COR000022",
- @"Firebase Analytics is not available. To add it, include Firebase/Core in the "
- @"Podfile or add FirebaseAnalytics.framework to the Link Build Phase");
- } else {
+ if (firAnalyticsClass) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
SEL startWithConfigurationSelector = @selector(startWithConfiguration:options:);
@@ -332,6 +360,7 @@ - (BOOL)configureCore {
if ([firAnalyticsClass respondsToSelector:startWithConfigurationSelector]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[firAnalyticsClass performSelector:startWithConfigurationSelector
withObject:[FIRConfiguration sharedInstance].analyticsConfiguration
withObject:_options];
@@ -341,6 +370,8 @@ - (BOOL)configureCore {
}
#endif
+ [self subscribeForAppDidBecomeActiveNotifications];
+
return YES;
}
@@ -367,14 +398,17 @@ - (void)setDataCollectionDefaultEnabled:(BOOL)dataCollectionDefaultEnabled {
}
// Check if the Analytics flag is explicitly set. If so, no further actions are necessary.
- if ([self.options isAnalyticsCollectionExpicitlySet]) {
+ if ([self.options isAnalyticsCollectionExplicitlySet]) {
return;
}
// The Analytics flag has not been explicitly set, so update with the value being set.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[[FIRAnalyticsConfiguration sharedInstance]
setAnalyticsCollectionEnabled:dataCollectionDefaultEnabled
persistSetting:NO];
+#pragma clang diagnostic pop
}
- (BOOL)isDataCollectionDefaultEnabled {
@@ -431,8 +465,10 @@ + (void)sendNotificationsToSDKs:(FIRApp *)app {
// This is the new way of sending information to SDKs.
// TODO: Do we want this on a background thread, maybe?
- for (Class library in gRegisteredAsConfigurable) {
- [library configureWithApp:app];
+ @synchronized(self) {
+ for (Class library in sRegisteredAsConfigurable) {
+ [library configureWithApp:app];
+ }
}
}
@@ -471,52 +507,127 @@ + (NSError *)errorForInvalidAppID {
userInfo:errorDict];
}
-+ (void)registerAsConfigurable:(Class)klass {
- // This is called at +load time, keep the work to a minimum.
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- gRegisteredAsConfigurable = [[NSMutableArray alloc] initWithCapacity:1];
- });
-
- NSAssert([(Class)klass conformsToProtocol:@protocol(FIRCoreConfigurable)],
- @"The class being registered (%@) must conform to `FIRCoreConfigurable`.", klass);
- [gRegisteredAsConfigurable addObject:klass];
-}
-
+ (BOOL)isDefaultAppConfigured {
return (sDefaultApp != nil);
}
-+ (void)registerLibrary:(nonnull NSString *)library withVersion:(nonnull NSString *)version {
++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version {
// Create the set of characters which aren't allowed, only if this feature is used.
NSMutableCharacterSet *allowedSet = [NSMutableCharacterSet alphanumericCharacterSet];
[allowedSet addCharactersInString:@"-_."];
NSCharacterSet *disallowedSet = [allowedSet invertedSet];
// Make sure the library name and version strings do not contain unexpected characters, and
// add the name/version pair to the dictionary.
- if ([library rangeOfCharacterFromSet:disallowedSet].location == NSNotFound &&
+ if ([name rangeOfCharacterFromSet:disallowedSet].location == NSNotFound &&
[version rangeOfCharacterFromSet:disallowedSet].location == NSNotFound) {
- if (!sLibraryVersions) {
- sLibraryVersions = [[NSMutableDictionary alloc] init];
+ @synchronized(self) {
+ if (!sLibraryVersions) {
+ sLibraryVersions = [[NSMutableDictionary alloc] init];
+ }
+ sLibraryVersions[name] = version;
}
- sLibraryVersions[library] = version;
} else {
FIRLogError(kFIRLoggerCore, @"I-COR000027",
- @"The library name (%@) or version number (%@) contain illegal characters. "
+ @"The library name (%@) or version number (%@) contain invalid characters. "
@"Only alphanumeric, dash, underscore and period characters are allowed.",
- library, version);
+ name, version);
}
}
++ (void)registerInternalLibrary:(nonnull Class)library
+ withName:(nonnull NSString *)name
+ withVersion:(nonnull NSString *)version {
+ // This is called at +load time, keep the work to a minimum.
+
+ // Ensure the class given conforms to the proper protocol.
+ if (![(Class)library conformsToProtocol:@protocol(FIRLibrary)] ||
+ ![(Class)library respondsToSelector:@selector(componentsToRegister)]) {
+ [NSException raise:NSInvalidArgumentException
+ format:@"Class %@ attempted to register components, but it does not conform to "
+ @"`FIRLibrary or provide a `componentsToRegister:` method.",
+ library];
+ }
+
+ [FIRComponentContainer registerAsComponentRegistrant:library];
+ if ([(Class)library respondsToSelector:@selector(configureWithApp:)]) {
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ sRegisteredAsConfigurable = [[NSMutableArray alloc] init];
+ });
+ @synchronized(self) {
+ [sRegisteredAsConfigurable addObject:library];
+ }
+ }
+ [self registerLibrary:name withVersion:version];
+}
+
+ (NSString *)firebaseUserAgent {
- NSMutableArray *libraries =
- [[NSMutableArray alloc] initWithCapacity:sLibraryVersions.count];
- for (NSString *libraryName in sLibraryVersions) {
- [libraries
- addObject:[NSString stringWithFormat:@"%@/%@", libraryName, sLibraryVersions[libraryName]]];
+ @synchronized(self) {
+ dispatch_once(&sFirebaseUserAgentOnceToken, ^{
+ // Report FirebaseCore version for useragent string
+ [FIRApp registerLibrary:@"fire-ios"
+ withVersion:[NSString stringWithUTF8String:FIRCoreVersionString]];
+
+ NSDictionary *info = [[NSBundle mainBundle] infoDictionary];
+ NSString *xcodeVersion = info[@"DTXcodeBuild"];
+ NSString *sdkVersion = info[@"DTSDKBuild"];
+ if (xcodeVersion) {
+ [FIRApp registerLibrary:@"xcode" withVersion:xcodeVersion];
+ }
+ if (sdkVersion) {
+ [FIRApp registerLibrary:@"apple-sdk" withVersion:sdkVersion];
+ }
+
+ NSString *swiftFlagValue = [self hasSwiftRuntime] ? @"true" : @"false";
+ [FIRApp registerLibrary:@"swift" withVersion:swiftFlagValue];
+
+ [FIRApp registerLibrary:kFIRAppDiagnosticsApplePlatformPrefix
+ withVersion:[self applePlatform]];
+ });
+
+ NSMutableArray *libraries =
+ [[NSMutableArray alloc] initWithCapacity:sLibraryVersions.count];
+ for (NSString *libraryName in sLibraryVersions) {
+ [libraries addObject:[NSString stringWithFormat:@"%@/%@", libraryName,
+ sLibraryVersions[libraryName]]];
+ }
+ [libraries sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
+ return [libraries componentsJoinedByString:@" "];
}
- [libraries sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
- return [libraries componentsJoinedByString:@" "];
+}
+
++ (BOOL)hasSwiftRuntime {
+ // The class
+ // [Swift._SwiftObject](https://github.com/apple/swift/blob/5eac3e2818eb340b11232aff83edfbd1c307fa03/stdlib/public/runtime/SwiftObject.h#L35)
+ // is a part of Swift runtime, so it should be present if Swift runtime is available.
+
+ BOOL hasSwiftRuntime =
+ objc_lookUpClass("Swift._SwiftObject") != nil ||
+ // Swift object class name before
+ // https://github.com/apple/swift/commit/9637b4a6e11ddca72f5f6dbe528efc7c92f14d01
+ objc_getClass("_TtCs12_SwiftObject") != nil;
+
+ return hasSwiftRuntime;
+}
+
++ (NSString *)applePlatform {
+ NSString *applePlatform = @"unknown";
+
+ // When a Catalyst app is run on macOS then both `TARGET_OS_MACCATALYST` and `TARGET_OS_IOS` are
+ // `true`, which means the condition list is order-sensitive.
+#if TARGET_OS_MACCATALYST
+ applePlatform = @"maccatalyst";
+#elif TARGET_OS_IOS
+ applePlatform = @"ios";
+#elif TARGET_OS_TV
+ applePlatform = @"tvos";
+#elif TARGET_OS_OSX
+ applePlatform = @"macos";
+#elif TARGET_OS_WATCH
+ applePlatform = @"watchos";
+#endif
+
+ return applePlatform;
}
- (void)checkExpectedBundleID {
@@ -524,8 +635,8 @@ - (void)checkExpectedBundleID {
NSString *expectedBundleID = [self expectedBundleID];
// The checking is only done when the bundle ID is provided in the serviceInfo dictionary for
// backward compatibility.
- if (expectedBundleID != nil &&
- ![FIRBundleUtil hasBundleIdentifier:expectedBundleID inBundles:bundles]) {
+ if (expectedBundleID != nil && ![FIRBundleUtil hasBundleIdentifierPrefix:expectedBundleID
+ inBundles:bundles]) {
FIRLogError(kFIRLoggerCore, @"I-COR000008",
@"The project's Bundle ID is inconsistent with "
@"either the Bundle ID in '%@.%@', or the Bundle ID in the options if you are "
@@ -538,15 +649,6 @@ - (void)checkExpectedBundleID {
}
}
-// TODO: Remove once SDKs transition to Auth interop library.
-- (nullable NSString *)getUID {
- if (!_getUIDImplementation) {
- FIRLogWarning(kFIRLoggerCore, @"I-COR000025", @"FIRAuth getUID implementation wasn't set.");
- return nil;
- }
- return _getUIDImplementation();
-}
-
#pragma mark - private - App ID Validation
/**
@@ -579,33 +681,32 @@ + (BOOL)validateAppID:(NSString *)appID {
return NO;
}
- // All app IDs must start with at least ":".
- NSString *const versionPattern = @"^\\d+:";
- NSRegularExpression *versionRegex =
- [NSRegularExpression regularExpressionWithPattern:versionPattern options:0 error:NULL];
- if (!versionRegex) {
+ NSScanner *stringScanner = [NSScanner scannerWithString:appID];
+ stringScanner.charactersToBeSkipped = nil;
+
+ NSString *appIDVersion;
+ if (![stringScanner scanCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet]
+ intoString:&appIDVersion]) {
return NO;
}
- NSRange appIDRange = NSMakeRange(0, appID.length);
- NSArray *versionMatches = [versionRegex matchesInString:appID options:0 range:appIDRange];
- if (versionMatches.count != 1) {
+ if (![stringScanner scanString:@":" intoString:NULL]) {
+ // appIDVersion must be separated by ":"
return NO;
}
- NSRange versionRange = [(NSTextCheckingResult *)versionMatches.firstObject range];
- NSString *appIDVersion = [appID substringWithRange:versionRange];
- NSArray *knownVersions = @[ @"1:" ];
+ NSArray *knownVersions = @[ @"1" ];
if (![knownVersions containsObject:appIDVersion]) {
// Permit unknown yet properly formatted app ID versions.
+ FIRLogInfo(kFIRLoggerCore, @"I-COR000010", @"Unknown GOOGLE_APP_ID version: %@", appIDVersion);
return YES;
}
- if (![FIRApp validateAppIDFormat:appID withVersion:appIDVersion]) {
+ if (![self validateAppIDFormat:appID withVersion:appIDVersion]) {
return NO;
}
- if (![FIRApp validateAppIDFingerprint:appID withVersion:appIDVersion]) {
+ if (![self validateAppIDFingerprint:appID withVersion:appIDVersion]) {
return NO;
}
@@ -635,32 +736,76 @@ + (BOOL)validateAppIDFormat:(NSString *)appID withVersion:(NSString *)version {
return NO;
}
- if (![version hasSuffix:@":"]) {
+ NSScanner *stringScanner = [NSScanner scannerWithString:appID];
+ stringScanner.charactersToBeSkipped = nil;
+
+ // Skip version part
+ // '**::ios:'
+ if (![stringScanner scanString:version intoString:NULL]) {
+ // The version part is missing or mismatched
+ return NO;
+ }
+
+ // Validate version part (see part between '*' symbols below)
+ // '*:*:ios:'
+ if (![stringScanner scanString:@":" intoString:NULL]) {
+ // appIDVersion must be separated by ":"
return NO;
}
- if (![appID hasPrefix:version]) {
+ // Validate version part (see part between '*' symbols below)
+ // ':**:ios:'.
+ NSInteger projectNumber = NSNotFound;
+ if (![stringScanner scanInteger:&projectNumber]) {
+ // NO project number found.
return NO;
}
- NSString *const pattern = @"^\\d+:ios:[a-f0-9]+$";
- NSRegularExpression *regex =
- [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL];
- if (!regex) {
+ // Validate version part (see part between '*' symbols below)
+ // ':*:*ios:'.
+ if (![stringScanner scanString:@":" intoString:NULL]) {
+ // The project number must be separated by ":"
return NO;
}
- NSRange localRange = NSMakeRange(version.length, appID.length - version.length);
- NSUInteger numberOfMatches = [regex numberOfMatchesInString:appID options:0 range:localRange];
- if (numberOfMatches != 1) {
+ // Validate version part (see part between '*' symbols below)
+ // '::*ios*:'.
+ NSString *platform;
+ if (![stringScanner scanUpToString:@":" intoString:&platform]) {
return NO;
}
+
+ if (![platform isEqualToString:@"ios"]) {
+ // The platform must be @"ios"
+ return NO;
+ }
+
+ // Validate version part (see part between '*' symbols below)
+ // '::ios*:*'.
+ if (![stringScanner scanString:@":" intoString:NULL]) {
+ // The platform must be separated by ":"
+ return NO;
+ }
+
+ // Validate version part (see part between '*' symbols below)
+ // '::ios:**'.
+ unsigned long long fingerprint = NSNotFound;
+ if (![stringScanner scanHexLongLong:&fingerprint]) {
+ // Fingerprint part is missing
+ return NO;
+ }
+
+ if (!stringScanner.isAtEnd) {
+ // There are not allowed characters in the fingerprint part
+ return NO;
+ }
+
return YES;
}
/**
* Validates that the fingerprint of the app ID string is what is expected based on the supplied
- * version. The version must end in ":".
+ * version.
*
* Note that the v1 hash algorithm is not permitted on the client and cannot be fully validated.
*
@@ -670,18 +815,6 @@ + (BOOL)validateAppIDFormat:(NSString *)appID withVersion:(NSString *)version {
* otherwise.
*/
+ (BOOL)validateAppIDFingerprint:(NSString *)appID withVersion:(NSString *)version {
- if (!appID.length || !version.length) {
- return NO;
- }
-
- if (![version hasSuffix:@":"]) {
- return NO;
- }
-
- if (![appID hasPrefix:version]) {
- return NO;
- }
-
// Extract the supplied fingerprint from the supplied app ID.
// This assumes the app ID format is the same for all known versions below. If the app ID format
// changes in future versions, the tokenizing of the app ID format will need to take into account
@@ -702,7 +835,7 @@ + (BOOL)validateAppIDFingerprint:(NSString *)appID withVersion:(NSString *)versi
return NO;
}
- if ([version isEqual:@"1:"]) {
+ if ([version isEqual:@"1"]) {
// The v1 hash algorithm is not permitted on the client so the actual hash cannot be validated.
return YES;
}
@@ -766,26 +899,40 @@ + (nullable NSNumber *)readDataCollectionSwitchFromPlist {
#pragma mark - Sending Logs
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-parameter"
- (void)sendLogsWithServiceName:(NSString *)serviceName
version:(NSString *)version
error:(NSError *)error {
- // If the user has manually turned off data collection, return and don't send logs.
- if (![self isDataCollectionDefaultEnabled]) {
- return;
- }
+ // Do nothing. Please remove calls to this method.
+}
+#pragma clang diagnostic pop
- NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] initWithDictionary:@{
- kFIRAppDiagnosticsConfigurationTypeKey : @(FIRConfigTypeSDK),
- kFIRAppDiagnosticsSDKNameKey : serviceName,
- kFIRAppDiagnosticsSDKVersionKey : version,
- kFIRAppDiagnosticsFIRAppKey : self
- }];
- if (error) {
- userInfo[kFIRAppDiagnosticsErrorKey] = error;
+#pragma mark - App Life Cycle
+
+- (void)subscribeForAppDidBecomeActiveNotifications {
+#if TARGET_OS_IOS || TARGET_OS_TV
+ NSNotificationName notificationName = UIApplicationDidBecomeActiveNotification;
+#elif TARGET_OS_OSX
+ NSNotificationName notificationName = NSApplicationDidBecomeActiveNotification;
+#endif
+
+#if !TARGET_OS_WATCH
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(appDidBecomeActive:)
+ name:notificationName
+ object:nil];
+#endif
+}
+
+- (void)appDidBecomeActive:(NSNotification *)notification {
+ [self logCoreTelemetryIfEnabled];
+}
+
+- (void)logCoreTelemetryIfEnabled {
+ if ([self isDataCollectionDefaultEnabled]) {
+ [FIRCoreDiagnosticsConnector logCoreTelemetryWithOptions:_options];
}
- [[NSNotificationCenter defaultCenter] postNotificationName:kFIRAppDiagnosticsNotification
- object:nil
- userInfo:userInfo];
}
@end
diff --git a/Pods/FirebaseCore/Firebase/Core/FIRAppAssociationRegistration.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRAppAssociationRegistration.m
similarity index 96%
rename from Pods/FirebaseCore/Firebase/Core/FIRAppAssociationRegistration.m
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRAppAssociationRegistration.m
index 2aecdabe1a..e4125cd255 100644
--- a/Pods/FirebaseCore/Firebase/Core/FIRAppAssociationRegistration.m
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRAppAssociationRegistration.m
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#import "Private/FIRAppAssociationRegistration.h"
+#import "FirebaseCore/Sources/Private/FIRAppAssociationRegistration.h"
#import
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRBundleUtil.h b/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.h
similarity index 88%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRBundleUtil.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.h
index c458a2c4c6..d9475dd29e 100644
--- a/Pods/FirebaseCore/Firebase/Core/Private/FIRBundleUtil.h
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.h
@@ -45,8 +45,9 @@
+ (NSArray *)relevantURLSchemes;
/**
- * Checks if the bundle identifier exists in the given bundles.
+ * Checks if any of the given bundles have a matching bundle identifier prefix (removing extension
+ * suffixes).
*/
-+ (BOOL)hasBundleIdentifier:(NSString *)bundleIdentifier inBundles:(NSArray *)bundles;
++ (BOOL)hasBundleIdentifierPrefix:(NSString *)bundleIdentifier inBundles:(NSArray *)bundles;
@end
diff --git a/Pods/FirebaseCore/Firebase/Core/FIRBundleUtil.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.m
similarity index 63%
rename from Pods/FirebaseCore/Firebase/Core/FIRBundleUtil.m
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.m
index 93ee02e97d..b858f14c41 100644
--- a/Pods/FirebaseCore/Firebase/Core/FIRBundleUtil.m
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRBundleUtil.m
@@ -12,7 +12,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#import "Private/FIRBundleUtil.h"
+#import "FirebaseCore/Sources/FIRBundleUtil.h"
+
+#import
@implementation FIRBundleUtil
@@ -45,13 +47,29 @@ + (NSArray *)relevantURLSchemes {
return result;
}
-+ (BOOL)hasBundleIdentifier:(NSString *)bundleIdentifier inBundles:(NSArray *)bundles {
++ (BOOL)hasBundleIdentifierPrefix:(NSString *)bundleIdentifier inBundles:(NSArray *)bundles {
for (NSBundle *bundle in bundles) {
- if ([bundle.bundleIdentifier isEqualToString:bundleIdentifier]) {
+ // This allows app extensions that have the app's bundle as their prefix to pass this test.
+ NSString *applicationBundleIdentifier =
+ [GULAppEnvironmentUtil isAppExtension]
+ ? [self bundleIdentifierByRemovingLastPartFrom:bundle.bundleIdentifier]
+ : bundle.bundleIdentifier;
+
+ if ([applicationBundleIdentifier isEqualToString:bundleIdentifier]) {
return YES;
}
}
return NO;
}
++ (NSString *)bundleIdentifierByRemovingLastPartFrom:(NSString *)bundleIdentifier {
+ NSString *bundleIDComponentsSeparator = @".";
+
+ NSMutableArray *bundleIDComponents =
+ [[bundleIdentifier componentsSeparatedByString:bundleIDComponentsSeparator] mutableCopy];
+ [bundleIDComponents removeLastObject];
+
+ return [bundleIDComponents componentsJoinedByString:bundleIDComponentsSeparator];
+}
+
@end
diff --git a/Pods/FirebaseCore/Firebase/Core/FIRComponent.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponent.m
similarity index 93%
rename from Pods/FirebaseCore/Firebase/Core/FIRComponent.m
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRComponent.m
index 2474d1aabf..9c1fbed3cb 100644
--- a/Pods/FirebaseCore/Firebase/Core/FIRComponent.m
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponent.m
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-#import "Private/FIRComponent.h"
+#import "FirebaseCore/Sources/Private/FIRComponent.h"
-#import "Private/FIRComponentContainer.h"
-#import "Private/FIRDependency.h"
+#import "FirebaseCore/Sources/Private/FIRComponentContainer.h"
+#import "FirebaseCore/Sources/Private/FIRDependency.h"
@interface FIRComponent ()
diff --git a/Pods/FirebaseCore/Firebase/Core/FIRComponentContainer.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainer.m
similarity index 60%
rename from Pods/FirebaseCore/Firebase/Core/FIRComponentContainer.m
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainer.m
index 381c95c431..bbe887824f 100644
--- a/Pods/FirebaseCore/Firebase/Core/FIRComponentContainer.m
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentContainer.m
@@ -14,67 +14,54 @@
* limitations under the License.
*/
-#import "Private/FIRComponentContainer.h"
+#import "FirebaseCore/Sources/Private/FIRComponentContainer.h"
-#import "Private/FIRAppInternal.h"
-#import "Private/FIRComponent.h"
-#import "Private/FIRComponentRegistrant.h"
-#import "Private/FIRLogger.h"
+#import "FirebaseCore/Sources/Private/FIRAppInternal.h"
+#import "FirebaseCore/Sources/Private/FIRComponent.h"
+#import "FirebaseCore/Sources/Private/FIRLibrary.h"
+#import "FirebaseCore/Sources/Private/FIRLogger.h"
NS_ASSUME_NONNULL_BEGIN
@interface FIRComponentContainer ()
-/// The dictionary of components that are registered for a particular app. The key is an NSString
+/// The dictionary of components that are registered for a particular app. The key is an `NSString`
/// of the protocol.
@property(nonatomic, strong) NSMutableDictionary *components;
/// Cached instances of components that requested to be cached.
@property(nonatomic, strong) NSMutableDictionary *cachedInstances;
+/// Protocols of components that have requested to be eagerly instantiated.
+@property(nonatomic, strong, nullable) NSMutableArray *eagerProtocolsToInstantiate;
+
@end
@implementation FIRComponentContainer
// Collection of all classes that register to provide components.
-static NSMutableSet *gFIRComponentRegistrants;
+static NSMutableSet *sFIRComponentRegistrants;
#pragma mark - Public Registration
-+ (void)registerAsComponentRegistrant:(Class)klass {
++ (void)registerAsComponentRegistrant:(Class)klass {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
- gFIRComponentRegistrants = [[NSMutableSet alloc] init];
+ sFIRComponentRegistrants = [[NSMutableSet alloc] init];
});
- [self registerAsComponentRegistrant:klass inSet:gFIRComponentRegistrants];
+ [self registerAsComponentRegistrant:klass inSet:sFIRComponentRegistrants];
}
-+ (void)registerAsComponentRegistrant:(Class)klass inSet:(NSMutableSet *)allRegistrants {
- // Validate the array to store the components is initialized.
- if (!allRegistrants) {
- FIRLogWarning(kFIRLoggerCore, @"I-COR000025",
- @"Attempted to store registered components in an empty set.");
- return;
- }
-
- // Ensure the class given conforms to the proper protocol.
- if (![klass conformsToProtocol:@protocol(FIRComponentRegistrant)] ||
- ![klass respondsToSelector:@selector(componentsToRegister)]) {
- [NSException raise:NSInvalidArgumentException
- format:
- @"Class %@ attempted to register components, but it does not conform to "
- @"`FIRComponentRegistrant` or provide a `componentsToRegister:` method.",
- klass];
- }
-
++ (void)registerAsComponentRegistrant:(Class)klass
+ inSet:(NSMutableSet *)allRegistrants {
[allRegistrants addObject:klass];
}
#pragma mark - Internal Initialization
- (instancetype)initWithApp:(FIRApp *)app {
- return [self initWithApp:app registrants:gFIRComponentRegistrants];
+ return [self initWithApp:app registrants:sFIRComponentRegistrants];
}
- (instancetype)initWithApp:(FIRApp *)app registrants:(NSMutableSet *)allRegistrants {
@@ -90,8 +77,11 @@ - (instancetype)initWithApp:(FIRApp *)app registrants:(NSMutableSet *)all
}
- (void)populateComponentsFromRegisteredClasses:(NSSet *)classes forApp:(FIRApp *)app {
+ // Keep track of any components that need to eagerly instantiate after all components are added.
+ self.eagerProtocolsToInstantiate = [[NSMutableArray alloc] init];
+
// Loop through the verified component registrants and populate the components array.
- for (Class klass in classes) {
+ for (Class klass in classes) {
// Loop through all the components being registered and store them as appropriate.
// Classes which do not provide functionality should use a dummy FIRComponentRegistrant
// protocol.
@@ -108,14 +98,16 @@ - (void)populateComponentsFromRegisteredClasses:(NSSet *)classes forApp:(
// Store the creation block for later usage.
self.components[protocolName] = component.creationBlock;
- // Instantiate the
+ // Queue any protocols that should be eagerly instantiated. Don't instantiate them yet
+ // because they could depend on other components that haven't been added to the components
+ // array yet.
BOOL shouldInstantiateEager =
(component.instantiationTiming == FIRInstantiationTimingAlwaysEager);
BOOL shouldInstantiateDefaultEager =
(component.instantiationTiming == FIRInstantiationTimingEagerInDefaultApp &&
[app isDefaultApp]);
if (shouldInstantiateEager || shouldInstantiateDefaultEager) {
- [self instantiateInstanceForProtocol:component.protocol withBlock:component.creationBlock];
+ [self.eagerProtocolsToInstantiate addObject:component.protocol];
}
}
}
@@ -123,11 +115,28 @@ - (void)populateComponentsFromRegisteredClasses:(NSSet *)classes forApp:(
#pragma mark - Instance Creation
+- (void)instantiateEagerComponents {
+ // After all components are registered, instantiate the ones that are requesting eager
+ // instantiation.
+ @synchronized(self) {
+ for (Protocol *protocol in self.eagerProtocolsToInstantiate) {
+ // Get an instance for the protocol, which will instantiate it since it couldn't have been
+ // cached yet. Ignore the instance coming back since we don't need it.
+ __unused id unusedInstance = [self instanceForProtocol:protocol];
+ }
+
+ // All eager instantiation is complete, clear the stored property now.
+ self.eagerProtocolsToInstantiate = nil;
+ }
+}
+
/// Instantiate an instance of a class that conforms to the specified protocol.
/// This will:
/// - Call the block to create an instance if possible,
/// - Validate that the instance returned conforms to the protocol it claims to,
/// - Cache the instance if the block requests it
+///
+/// Note that this method assumes the caller already has @sychronized on self.
- (nullable id)instantiateInstanceForProtocol:(Protocol *)protocol
withBlock:(FIRComponentCreationBlock)creationBlock {
if (!creationBlock) {
@@ -163,41 +172,41 @@ - (nullable id)instantiateInstanceForProtocol:(Protocol *)protocol
- (nullable id)instanceForProtocol:(Protocol *)protocol {
// Check if there is a cached instance, and return it if so.
NSString *protocolName = NSStringFromProtocol(protocol);
- id cachedInstance = self.cachedInstances[protocolName];
- if (cachedInstance) {
- return cachedInstance;
- }
- // Use the creation block to instantiate an instance and return it.
- FIRComponentCreationBlock creationBlock = self.components[protocolName];
- return [self instantiateInstanceForProtocol:protocol withBlock:creationBlock];
+ id cachedInstance;
+ @synchronized(self) {
+ cachedInstance = self.cachedInstances[protocolName];
+ if (!cachedInstance) {
+ // Use the creation block to instantiate an instance and return it.
+ FIRComponentCreationBlock creationBlock = self.components[protocolName];
+ cachedInstance = [self instantiateInstanceForProtocol:protocol withBlock:creationBlock];
+ }
+ }
+ return cachedInstance;
}
#pragma mark - Lifecycle
- (void)removeAllCachedInstances {
- // Loop through the cache and notify each instance that is a maintainer to clean up after itself.
- for (id instance in self.cachedInstances.allValues) {
- if ([instance conformsToProtocol:@protocol(FIRComponentLifecycleMaintainer)] &&
- [instance respondsToSelector:@selector(appWillBeDeleted:)]) {
- [instance appWillBeDeleted:self.app];
+ @synchronized(self) {
+ // Loop through the cache and notify each instance that is a maintainer to clean up after
+ // itself.
+ for (id instance in self.cachedInstances.allValues) {
+ if ([instance conformsToProtocol:@protocol(FIRComponentLifecycleMaintainer)] &&
+ [instance respondsToSelector:@selector(appWillBeDeleted:)]) {
+ [instance appWillBeDeleted:self.app];
+ }
}
- }
- [self.cachedInstances removeAllObjects];
+ // Empty the cache.
+ [self.cachedInstances removeAllObjects];
+ }
}
-#pragma mark - Testing Initializers
-
-// TODO(wilsonryan): Set up a testing flag so this only is compiled in with unit tests.
-/// Initialize an instance with an app and existing components.
-- (instancetype)initWithApp:(FIRApp *)app
- components:(NSDictionary *)components {
- self = [self initWithApp:app registrants:[[NSMutableSet alloc] init]];
- if (self) {
- _components = [components mutableCopy];
+- (void)removeAllComponents {
+ @synchronized(self) {
+ [self.components removeAllObjects];
}
- return self;
}
@end
diff --git a/Pods/FirebaseCore/Firebase/Core/FIRComponentType.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentType.m
similarity index 86%
rename from Pods/FirebaseCore/Firebase/Core/FIRComponentType.m
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentType.m
index bdc004fbce..6410f2ea1c 100644
--- a/Pods/FirebaseCore/Firebase/Core/FIRComponentType.m
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRComponentType.m
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-#import "Private/FIRComponentType.h"
+#import "FirebaseCore/Sources/Private/FIRComponentType.h"
-#import "Private/FIRComponentContainerInternal.h"
+#import "FirebaseCore/Sources/Private/FIRComponentContainerInternal.h"
@implementation FIRComponentType
diff --git a/Pods/FirebaseCore/Firebase/Core/FIRConfiguration.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfiguration.m
similarity index 90%
rename from Pods/FirebaseCore/Firebase/Core/FIRConfiguration.m
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRConfiguration.m
index cd6486257e..a1c9f4a2e9 100644
--- a/Pods/FirebaseCore/Firebase/Core/FIRConfiguration.m
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRConfiguration.m
@@ -12,7 +12,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#import "FIRConfiguration.h"
+#import "FirebaseCore/Sources/Private/FIRConfigurationInternal.h"
+
+#import "FirebaseCore/Sources/Private/FIRAnalyticsConfiguration.h"
extern void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel);
diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRCoreDiagnosticsConnector.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRCoreDiagnosticsConnector.m
new file mode 100644
index 0000000000..4981ca1b05
--- /dev/null
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRCoreDiagnosticsConnector.m
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h"
+
+#import
+
+#import
+
+#import "FirebaseCore/Sources/Private/FIRAppInternal.h"
+#import "FirebaseCore/Sources/Private/FIRDiagnosticsData.h"
+#import "FirebaseCore/Sources/Private/FIROptionsInternal.h"
+
+// Define the interop class symbol declared as an extern in FIRCoreDiagnosticsInterop.
+Class FIRCoreDiagnosticsImplementation;
+
+@implementation FIRCoreDiagnosticsConnector
+
++ (void)initialize {
+ if (!FIRCoreDiagnosticsImplementation) {
+ FIRCoreDiagnosticsImplementation = NSClassFromString(@"FIRCoreDiagnostics");
+ if (FIRCoreDiagnosticsImplementation) {
+ NSAssert([FIRCoreDiagnosticsImplementation
+ conformsToProtocol:@protocol(FIRCoreDiagnosticsInterop)],
+ @"If FIRCoreDiagnostics is implemented, it must conform to the interop protocol.");
+ NSAssert(
+ [FIRCoreDiagnosticsImplementation respondsToSelector:@selector(sendDiagnosticsData:)],
+ @"If FIRCoreDiagnostics is implemented, it must implement +sendDiagnosticsData.");
+ }
+ }
+}
+
++ (void)logCoreTelemetryWithOptions:(FIROptions *)options {
+ if (FIRCoreDiagnosticsImplementation) {
+ FIRDiagnosticsData *diagnosticsData = [[FIRDiagnosticsData alloc] init];
+ [diagnosticsData insertValue:@(YES) forKey:kFIRCDIsDataCollectionDefaultEnabledKey];
+ [diagnosticsData insertValue:[FIRApp firebaseUserAgent] forKey:kFIRCDFirebaseUserAgentKey];
+ [diagnosticsData insertValue:@(FIRConfigTypeCore) forKey:kFIRCDConfigurationTypeKey];
+ [diagnosticsData insertValue:options.googleAppID forKey:kFIRCDGoogleAppIDKey];
+ [diagnosticsData insertValue:options.bundleID forKey:kFIRCDBundleIDKey];
+ [diagnosticsData insertValue:@(options.usingOptionsFromDefaultPlist)
+ forKey:kFIRCDUsingOptionsFromDefaultPlistKey];
+ [diagnosticsData insertValue:options.libraryVersionID forKey:kFIRCDLibraryVersionIDKey];
+ [FIRCoreDiagnosticsImplementation sendDiagnosticsData:diagnosticsData];
+ }
+}
+
+@end
diff --git a/Pods/FirebaseCore/Firebase/Core/FIRDependency.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRDependency.m
similarity index 95%
rename from Pods/FirebaseCore/Firebase/Core/FIRDependency.m
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRDependency.m
index f979984147..e1e25783ef 100644
--- a/Pods/FirebaseCore/Firebase/Core/FIRDependency.m
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRDependency.m
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#import "Private/FIRDependency.h"
+#import "FirebaseCore/Sources/Private/FIRDependency.h"
@interface FIRDependency ()
diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRDiagnosticsData.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRDiagnosticsData.m
new file mode 100644
index 0000000000..bbe0561d95
--- /dev/null
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRDiagnosticsData.m
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FirebaseCore/Sources/Private/FIRDiagnosticsData.h"
+
+#import
+
+#import "FirebaseCore/Sources/Private/FIRAppInternal.h"
+#import "FirebaseCore/Sources/Private/FIROptionsInternal.h"
+
+@implementation FIRDiagnosticsData {
+ /** Backing ivar for the diagnosticObjects property. */
+ NSMutableDictionary *_diagnosticObjects;
+}
+
+- (instancetype)init {
+ self = [super init];
+ if (self) {
+ _diagnosticObjects = [[NSMutableDictionary alloc] init];
+ }
+ return self;
+}
+
+- (void)insertValue:(nullable id)value forKey:(NSString *)key {
+ if (key) {
+ _diagnosticObjects[key] = value;
+ }
+}
+
+#pragma mark - FIRCoreDiagnosticsData
+
+- (NSDictionary *)diagnosticObjects {
+ if (!_diagnosticObjects[kFIRCDllAppsCountKey]) {
+ _diagnosticObjects[kFIRCDllAppsCountKey] = @([FIRApp allApps].count);
+ }
+ if (!_diagnosticObjects[kFIRCDIsDataCollectionDefaultEnabledKey]) {
+ _diagnosticObjects[kFIRCDIsDataCollectionDefaultEnabledKey] =
+ @([[FIRApp defaultApp] isDataCollectionDefaultEnabled]);
+ }
+ if (!_diagnosticObjects[kFIRCDFirebaseUserAgentKey]) {
+ _diagnosticObjects[kFIRCDFirebaseUserAgentKey] = [FIRApp firebaseUserAgent];
+ }
+ return _diagnosticObjects;
+}
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-parameter"
+- (void)setDiagnosticObjects:(NSDictionary *)diagnosticObjects {
+ NSAssert(NO, @"Please use -insertValue:forKey:");
+}
+#pragma clang diagnostic pop
+
+@end
diff --git a/Pods/FirebaseCore/Firebase/Core/FIRErrors.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRErrors.m
similarity index 58%
rename from Pods/FirebaseCore/Firebase/Core/FIRErrors.m
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRErrors.m
index 6d6d52d2ce..104eeb8252 100644
--- a/Pods/FirebaseCore/Firebase/Core/FIRErrors.m
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRErrors.m
@@ -12,18 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#import "Private/FIRErrors.h"
+#import "FirebaseCore/Sources/Private/FIRErrors.h"
NSString *const kFirebaseErrorDomain = @"com.firebase";
-NSString *const kFirebaseAdMobErrorDomain = @"com.firebase.admob";
-NSString *const kFirebaseAppInviteErrorDomain = @"com.firebase.appinvite";
-NSString *const kFirebaseAuthErrorDomain = @"com.firebase.auth";
-NSString *const kFirebaseCloudMessagingErrorDomain = @"com.firebase.cloudmessaging";
NSString *const kFirebaseConfigErrorDomain = @"com.firebase.config";
NSString *const kFirebaseCoreErrorDomain = @"com.firebase.core";
-NSString *const kFirebaseCrashReportingErrorDomain = @"com.firebase.crashreporting";
-NSString *const kFirebaseDatabaseErrorDomain = @"com.firebase.database";
-NSString *const kFirebaseDurableDeepLinkErrorDomain = @"com.firebase.durabledeeplink";
-NSString *const kFirebaseInstanceIDErrorDomain = @"com.firebase.instanceid";
NSString *const kFirebasePerfErrorDomain = @"com.firebase.perf";
NSString *const kFirebaseStorageErrorDomain = @"com.firebase.storage";
diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/FIRHeartbeatInfo.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRHeartbeatInfo.m
new file mode 100644
index 0000000000..277b0f712b
--- /dev/null
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRHeartbeatInfo.m
@@ -0,0 +1,61 @@
+// Copyright 2019 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import "FirebaseCore/Sources/Private/FIRHeartbeatInfo.h"
+#import
+#import
+
+const static long secondsInDay = 86400;
+@implementation FIRHeartbeatInfo : NSObject
+
+/** Updates the storage with the heartbeat information corresponding to this tag.
+ * @param heartbeatTag Tag which could either be sdk specific tag or the global tag.
+ * @return Boolean representing whether the heartbeat needs to be sent for this tag or not.
+ */
++ (BOOL)updateIfNeededHeartbeatDateForTag:(NSString *)heartbeatTag {
+ @synchronized(self) {
+ NSString *const kHeartbeatStorageFile = @"HEARTBEAT_INFO_STORAGE";
+ GULHeartbeatDateStorage *dataStorage =
+ [[GULHeartbeatDateStorage alloc] initWithFileName:kHeartbeatStorageFile];
+ NSDate *heartbeatTime = [dataStorage heartbeatDateForTag:heartbeatTag];
+ NSDate *currentDate = [NSDate date];
+ if (heartbeatTime != nil) {
+ NSTimeInterval secondsBetween = [currentDate timeIntervalSinceDate:heartbeatTime];
+ if (secondsBetween < secondsInDay) {
+ return false;
+ }
+ }
+ return [dataStorage setHearbeatDate:currentDate forTag:heartbeatTag];
+ }
+}
+
++ (FIRHeartbeatInfoCode)heartbeatCodeForTag:(NSString *)heartbeatTag {
+ NSString *globalTag = @"GLOBAL";
+ BOOL isSdkHeartbeatNeeded = [FIRHeartbeatInfo updateIfNeededHeartbeatDateForTag:heartbeatTag];
+ BOOL isGlobalHeartbeatNeeded = [FIRHeartbeatInfo updateIfNeededHeartbeatDateForTag:globalTag];
+ if (!isSdkHeartbeatNeeded && !isGlobalHeartbeatNeeded) {
+ // Both sdk and global heartbeat not needed.
+ return FIRHeartbeatInfoCodeNone;
+ } else if (isSdkHeartbeatNeeded && !isGlobalHeartbeatNeeded) {
+ // Only SDK heartbeat needed.
+ return FIRHeartbeatInfoCodeSDK;
+ } else if (!isSdkHeartbeatNeeded && isGlobalHeartbeatNeeded) {
+ // Only global heartbeat needed.
+ return FIRHeartbeatInfoCodeGlobal;
+ } else {
+ // Both sdk and global heartbeat are needed.
+ return FIRHeartbeatInfoCodeCombined;
+ }
+}
+@end
diff --git a/Pods/FirebaseCore/Firebase/Core/FIRLogger.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRLogger.m
similarity index 92%
rename from Pods/FirebaseCore/Firebase/Core/FIRLogger.m
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRLogger.m
index d1e3b37382..ba2ee1f584 100644
--- a/Pods/FirebaseCore/Firebase/Core/FIRLogger.m
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIRLogger.m
@@ -12,31 +12,25 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#import "Private/FIRLogger.h"
+#import "FirebaseCore/Sources/Private/FIRLogger.h"
#import
#import
#import
-#import "Private/FIRVersion.h"
+#import "FirebaseCore/Sources/FIRVersion.h"
+FIRLoggerService kFIRLoggerCore = @"[Firebase/Core]";
+
+// All the FIRLoggerService definitions should be migrated to clients. Do not add new ones!
FIRLoggerService kFIRLoggerABTesting = @"[Firebase/ABTesting]";
FIRLoggerService kFIRLoggerAdMob = @"[Firebase/AdMob]";
FIRLoggerService kFIRLoggerAnalytics = @"[Firebase/Analytics]";
FIRLoggerService kFIRLoggerAuth = @"[Firebase/Auth]";
-FIRLoggerService kFIRLoggerCore = @"[Firebase/Core]";
FIRLoggerService kFIRLoggerCrash = @"[Firebase/Crash]";
-FIRLoggerService kFIRLoggerDatabase = @"[Firebase/Database]";
-FIRLoggerService kFIRLoggerDynamicLinks = @"[Firebase/DynamicLinks]";
-FIRLoggerService kFIRLoggerFirestore = @"[Firebase/Firestore]";
-FIRLoggerService kFIRLoggerInstanceID = @"[Firebase/InstanceID]";
-FIRLoggerService kFIRLoggerInvites = @"[Firebase/Invites]";
FIRLoggerService kFIRLoggerMLKit = @"[Firebase/MLKit]";
-FIRLoggerService kFIRLoggerMessaging = @"[Firebase/Messaging]";
FIRLoggerService kFIRLoggerPerf = @"[Firebase/Performance]";
FIRLoggerService kFIRLoggerRemoteConfig = @"[Firebase/RemoteConfig]";
-FIRLoggerService kFIRLoggerStorage = @"[Firebase/Storage]";
-FIRLoggerService kFIRLoggerSwizzler = @"[FirebaseSwizzlingUtilities]";
/// Arguments passed on launch.
NSString *const kFIRDisableDebugModeApplicationArgument = @"-FIRDebugDisabled";
diff --git a/Pods/FirebaseCore/Firebase/Core/FIROptions.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIROptions.m
similarity index 80%
rename from Pods/FirebaseCore/Firebase/Core/FIROptions.m
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIROptions.m
index db83d9c654..d185330940 100644
--- a/Pods/FirebaseCore/Firebase/Core/FIROptions.m
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/FIROptions.m
@@ -12,11 +12,11 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#import "Private/FIRAppInternal.h"
-#import "Private/FIRBundleUtil.h"
-#import "Private/FIRErrors.h"
-#import "Private/FIRLogger.h"
-#import "Private/FIROptionsInternal.h"
+#import "FirebaseCore/Sources/FIRBundleUtil.h"
+#import "FirebaseCore/Sources/FIRVersion.h"
+#import "FirebaseCore/Sources/Private/FIRAppInternal.h"
+#import "FirebaseCore/Sources/Private/FIRLogger.h"
+#import "FirebaseCore/Sources/Private/FIROptionsInternal.h"
// Keys for the strings in the plist file.
NSString *const kFIRAPIKey = @"API_KEY";
@@ -39,12 +39,13 @@
NSString *const kFIRIsAnalyticsEnabled = @"IS_ANALYTICS_ENABLED";
NSString *const kFIRIsSignInEnabled = @"IS_SIGNIN_ENABLED";
-// Library version ID.
-NSString *const kFIRLibraryVersionID =
- @"5" // Major version (one or more digits)
- @"01" // Minor version (exactly 2 digits)
- @"07" // Build number (exactly 2 digits)
- @"000"; // Fixed "000"
+// Library version ID formatted like:
+// @"5" // Major version (one or more digits)
+// @"04" // Minor version (exactly 2 digits)
+// @"01" // Build number (exactly 2 digits)
+// @"000"; // Fixed "000"
+NSString *kFIRLibraryVersionID;
+
// Plist file name.
NSString *const kServiceInfoFileName = @"GoogleService-Info";
// Plist file type.
@@ -108,30 +109,6 @@ + (FIROptions *)defaultOptions {
#pragma mark - Private class methods
-+ (void)initialize {
- // Report FirebaseCore version for useragent string
- NSRange major = NSMakeRange(0, 1);
- NSRange minor = NSMakeRange(1, 2);
- NSRange patch = NSMakeRange(3, 2);
- [FIRApp
- registerLibrary:@"fire-ios"
- withVersion:[NSString stringWithFormat:@"%@.%d.%d",
- [kFIRLibraryVersionID substringWithRange:major],
- [[kFIRLibraryVersionID substringWithRange:minor]
- intValue],
- [[kFIRLibraryVersionID substringWithRange:patch]
- intValue]]];
- NSDictionary *info = [[NSBundle mainBundle] infoDictionary];
- NSString *xcodeVersion = info[@"DTXcodeBuild"];
- NSString *sdkVersion = info[@"DTSDKBuild"];
- if (xcodeVersion) {
- [FIRApp registerLibrary:@"xcode" withVersion:xcodeVersion];
- }
- if (sdkVersion) {
- [FIRApp registerLibrary:@"apple-sdk" withVersion:sdkVersion];
- }
-}
-
+ (NSDictionary *)defaultOptionsDictionary {
if (sDefaultOptionsDictionary != nil) {
return sDefaultOptionsDictionary;
@@ -185,6 +162,7 @@ - (id)copyWithZone:(NSZone *)zone {
if (newOptions) {
newOptions.optionsDictionary = self.optionsDictionary;
newOptions.deepLinkURLScheme = self.deepLinkURLScheme;
+ newOptions.appGroupID = self.appGroupID;
newOptions.editingLocked = self.isEditingLocked;
newOptions.usingOptionsFromDefaultPlist = self.usingOptionsFromDefaultPlist;
}
@@ -296,6 +274,16 @@ - (void)setGoogleAppID:(NSString *)googleAppID {
}
- (NSString *)libraryVersionID {
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ // The unit tests are set up to catch anything that does not properly convert.
+ NSString *version = [NSString stringWithUTF8String:FIRCoreVersionString];
+ NSArray *components = [version componentsSeparatedByString:@"."];
+ NSString *major = [components objectAtIndex:0];
+ NSString *minor = [NSString stringWithFormat:@"%02d", [[components objectAtIndex:1] intValue]];
+ NSString *patch = [NSString stringWithFormat:@"%02d", [[components objectAtIndex:2] intValue]];
+ kFIRLibraryVersionID = [NSString stringWithFormat:@"%@%@%@000", major, minor, patch];
+ });
return kFIRLibraryVersionID;
}
@@ -336,6 +324,64 @@ - (void)setBundleID:(NSString *)bundleID {
_optionsDictionary[kFIRBundleID] = [bundleID copy];
}
+- (void)setAppGroupID:(NSString *)appGroupID {
+ [self checkEditingLocked];
+ _appGroupID = [appGroupID copy];
+}
+
+#pragma mark - Equality
+
+- (BOOL)isEqual:(id)object {
+ if (!object || ![object isKindOfClass:[FIROptions class]]) {
+ return NO;
+ }
+
+ return [self isEqualToOptions:(FIROptions *)object];
+}
+
+- (BOOL)isEqualToOptions:(FIROptions *)options {
+ // Skip any non-FIROptions classes.
+ if (![options isKindOfClass:[FIROptions class]]) {
+ return NO;
+ }
+
+ // Check the internal dictionary and custom properties for differences.
+ if (![options.optionsDictionary isEqualToDictionary:self.optionsDictionary]) {
+ return NO;
+ }
+
+ // Validate extra properties not contained in the dictionary. Only validate it if one of the
+ // objects has the property set.
+ if ((options.deepLinkURLScheme != nil || self.deepLinkURLScheme != nil) &&
+ ![options.deepLinkURLScheme isEqualToString:self.deepLinkURLScheme]) {
+ return NO;
+ }
+
+ if ((options.appGroupID != nil || self.appGroupID != nil) &&
+ ![options.appGroupID isEqualToString:self.appGroupID]) {
+ return NO;
+ }
+
+ // Validate the Analytics options haven't changed with the Info.plist.
+ if (![options.analyticsOptionsDictionary isEqualToDictionary:self.analyticsOptionsDictionary]) {
+ return NO;
+ }
+
+ // We don't care about the `editingLocked` or `usingOptionsFromDefaultPlist` properties since
+ // those relate to lifecycle and construction, we only care if the contents of the options
+ // themselves are equal.
+ return YES;
+}
+
+- (NSUInteger)hash {
+ // This is strongly recommended for any object that implements a custom `isEqual:` method to
+ // ensure that dictionary and set behavior matches other `isEqual:` checks.
+ // Note: `self.analyticsOptionsDictionary` was left out here since it solely relies on the
+ // contents of the main bundle's `Info.plist`. We should avoid reading that file and the contents
+ // should be identical.
+ return self.optionsDictionary.hash ^ self.deepLinkURLScheme.hash ^ self.appGroupID.hash;
+}
+
#pragma mark - Internal instance methods
- (NSDictionary *)analyticsOptionsDictionaryWithInfoDictionary:(NSDictionary *)infoDictionary {
@@ -389,7 +435,7 @@ - (BOOL)isMeasurementEnabled {
return [value boolValue];
}
-- (BOOL)isAnalyticsCollectionExpicitlySet {
+- (BOOL)isAnalyticsCollectionExplicitlySet {
// If it's de-activated, it classifies as explicity set. If not, it's not a good enough indication
// that the developer wants FirebaseAnalytics enabled so continue checking.
if (self.isAnalyticsCollectionDeactivated) {
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRVersion.h b/Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.h
similarity index 100%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRVersion.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.h
diff --git a/Pods/FirebaseCore/Firebase/Core/FIRVersion.m b/Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.m
similarity index 100%
rename from Pods/FirebaseCore/Firebase/Core/FIRVersion.m
rename to Pods/FirebaseCore/FirebaseCore/Sources/FIRVersion.m
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRAnalyticsConfiguration+Internal.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRAnalyticsConfiguration.h
similarity index 83%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRAnalyticsConfiguration+Internal.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRAnalyticsConfiguration.h
index be624b4941..6429ac70ea 100644
--- a/Pods/FirebaseCore/Firebase/Core/Private/FIRAnalyticsConfiguration+Internal.h
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRAnalyticsConfiguration.h
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#import "FIRAnalyticsConfiguration.h"
+#import
/// Values stored in analyticsEnabledState. Never alter these constants since they must match with
/// values persisted to disk.
@@ -38,7 +38,14 @@ static NSString *const kFIRAnalyticsConfigurationSetMinimumSessionIntervalNotifi
static NSString *const kFIRAnalyticsConfigurationSetSessionTimeoutIntervalNotification =
@"FIRAnalyticsConfigurationSetSessionTimeoutIntervalNotification";
-@interface FIRAnalyticsConfiguration (Internal)
+@interface FIRAnalyticsConfiguration : NSObject
+
+/// Returns the shared instance of FIRAnalyticsConfiguration.
++ (FIRAnalyticsConfiguration *)sharedInstance;
+
+// Sets whether analytics collection is enabled for this app on this device. This setting is
+// persisted across app sessions. By default it is enabled.
+- (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled;
/// Sets whether analytics collection is enabled for this app on this device, and a flag to persist
/// the value or not. The setting should not be persisted if being set by the global data collection
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRAppAssociationRegistration.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRAppAssociationRegistration.h
similarity index 100%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRAppAssociationRegistration.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRAppAssociationRegistration.h
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRAppInternal.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRAppInternal.h
similarity index 61%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRAppInternal.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRAppInternal.h
index e1aa65d0ba..ad1a186b93 100644
--- a/Pods/FirebaseCore/Firebase/Core/Private/FIRAppInternal.h
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRAppInternal.h
@@ -14,11 +14,11 @@
* limitations under the License.
*/
-#import "FIRApp.h"
-#import "FIRErrors.h"
+#import
+#import
@class FIRComponentContainer;
-@protocol FIRCoreConfigurable;
+@protocol FIRLibrary;
/**
* The internal interface to FIRApp. This is meant for first-party integrators, who need to receive
@@ -34,28 +34,6 @@ typedef NS_ENUM(NSInteger, FIRConfigType) {
FIRConfigTypeSDK = 2,
};
-/**
- * Names of services provided by Firebase.
- */
-extern NSString *const kFIRServiceAdMob;
-extern NSString *const kFIRServiceAuth;
-extern NSString *const kFIRServiceAuthUI;
-extern NSString *const kFIRServiceCrash;
-extern NSString *const kFIRServiceDatabase;
-extern NSString *const kFIRServiceDynamicLinks;
-extern NSString *const kFIRServiceInstanceID;
-extern NSString *const kFIRServiceInvites;
-extern NSString *const kFIRServiceMessaging;
-extern NSString *const kFIRServiceMeasurement;
-extern NSString *const kFIRServiceRemoteConfig;
-extern NSString *const kFIRServiceStorage;
-
-/**
- * Names of services provided by the Google pod, but logged by the Firebase pod.
- */
-extern NSString *const kGGLServiceAnalytics;
-extern NSString *const kGGLServiceSignIn;
-
extern NSString *const kFIRDefaultAppName;
extern NSString *const kFIRAppReadyToConfigureSDKNotification;
extern NSString *const kFIRAppDeleteNotification;
@@ -109,24 +87,6 @@ extern NSString *const FIRAuthStateDidChangeInternalNotificationAppKey;
*/
extern NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey;
-/** @typedef FIRTokenCallback
- @brief The type of block which gets called when a token is ready.
- */
-typedef void (^FIRTokenCallback)(NSString *_Nullable token, NSError *_Nullable error);
-
-/** @typedef FIRAppGetTokenImplementation
- @brief The type of block which can provide an implementation for the @c getTokenWithCallback:
- method.
- @param forceRefresh Forces the token to be refreshed.
- @param callback The block which should be invoked when the async call completes.
- */
-typedef void (^FIRAppGetTokenImplementation)(BOOL forceRefresh, FIRTokenCallback callback);
-
-/** @typedef FIRAppGetUID
- @brief The type of block which can provide an implementation for the @c getUID method.
- */
-typedef NSString *_Nullable (^FIRAppGetUIDImplementation)(void);
-
@interface FIRApp ()
/**
@@ -134,17 +94,6 @@ typedef NSString *_Nullable (^FIRAppGetUIDImplementation)(void);
*/
@property(nonatomic, readonly) BOOL isDefaultApp;
-/** @property getTokenImplementation
- @brief Gets or sets the block to use for the implementation of
- @c getTokenForcingRefresh:withCallback:
- */
-@property(nonatomic, copy) FIRAppGetTokenImplementation getTokenImplementation;
-
-/** @property getUIDImplementation
- @brief Gets or sets the block to use for the implementation of @c getUID.
- */
-@property(nonatomic, copy) FIRAppGetUIDImplementation getUIDImplementation;
-
/*
* The container of interop SDKs for this app.
*/
@@ -164,23 +113,25 @@ typedef NSString *_Nullable (^FIRAppGetUIDImplementation)(void);
+ (BOOL)isDefaultAppConfigured;
/**
- * Register a class that conforms to `FIRCoreConfigurable`. Each SDK should have one class that
- * registers in order to provide critical information for interoperability and lifecycle events.
- * TODO(wilsonryan): Write more documentation.
+ * Registers a given third-party library with the given version number to be reported for
+ * analytics.
+ *
+ * @param name Name of the library.
+ * @param version Version of the library.
*/
-+ (void)registerAsConfigurable:(Class)klass;
++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version;
/**
- * Registers a given third-party library with the given version number to be reported for
- * analyitcs.
+ * Registers a given internal library with the given version number to be reported for
+ * analytics.
*
- * @param library Name of the library
- * @param version Version of the library
+ * @param library Optional parameter for component registration.
+ * @param name Name of the library.
+ * @param version Version of the library.
*/
-// clang-format off
-+ (void)registerLibrary:(NSString *)library
- withVersion:(NSString *)version NS_SWIFT_NAME(registerLibrary(_:version:));
-// clang-format on
++ (void)registerInternalLibrary:(nonnull Class)library
+ withName:(nonnull NSString *)name
+ withVersion:(nonnull NSString *)version;
/**
* A concatenated string representing all the third-party libraries and version numbers.
@@ -189,6 +140,8 @@ typedef NSString *_Nullable (^FIRAppGetUIDImplementation)(void);
/**
* Used by each SDK to send logs about SDK configuration status to Clearcut.
+ *
+ * @note This API is a no-op, please remove calls to it.
*/
- (void)sendLogsWithServiceName:(NSString *)serviceName
version:(NSString *)version
@@ -204,19 +157,6 @@ typedef NSString *_Nullable (^FIRAppGetUIDImplementation)(void);
*/
- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options;
-/** @fn getTokenForcingRefresh:withCallback:
- @brief Retrieves the Firebase authentication token, possibly refreshing it.
- @param forceRefresh Forces a token refresh. Useful if the token becomes invalid for some reason
- other than an expiration.
- @param callback The block to invoke when the token is available.
- */
-- (void)getTokenForcingRefresh:(BOOL)forceRefresh withCallback:(FIRTokenCallback)callback;
-
-/**
- * Expose the UID of the current user for Firestore.
- */
-- (nullable NSString *)getUID;
-
@end
NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRComponent.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponent.h
similarity index 100%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRComponent.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponent.h
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRComponentContainer.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentContainer.h
similarity index 85%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRComponentContainer.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentContainer.h
index 10e2255389..8dfab9c10d 100644
--- a/Pods/FirebaseCore/Firebase/Core/Private/FIRComponentContainer.h
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentContainer.h
@@ -15,7 +15,8 @@
*/
#import
-#import "FIRComponentType.h"
+#import
+#import
NS_ASSUME_NONNULL_BEGIN
@@ -38,10 +39,6 @@ NS_SWIFT_NAME(FirebaseComponentContainer)
/// Unavailable. Use the `container` property on `FIRApp`.
- (instancetype)init NS_UNAVAILABLE;
-/// Register a class to provide components for the interoperability system. The class should conform
-/// to `FIRComponentRegistrant` and provide an array of `FIRComponent` objects.
-+ (void)registerAsComponentRegistrant:(Class)klass;
-
@end
NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRComponentContainerInternal.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentContainerInternal.h
similarity index 58%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRComponentContainerInternal.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentContainerInternal.h
index bb73e7bab5..bf39bc6ce4 100644
--- a/Pods/FirebaseCore/Firebase/Core/Private/FIRComponentContainerInternal.h
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentContainerInternal.h
@@ -15,8 +15,8 @@
*/
#import
-#import "FIRComponent.h"
-#import "FIRComponentContainer.h"
+#import
+#import
@class FIRApp;
@@ -24,16 +24,26 @@ NS_ASSUME_NONNULL_BEGIN
@interface FIRComponentContainer (Private)
-/// Initializes a contain for a given app. This should only be called by the app itself.
+/// Initializes a container for a given app. This should only be called by the app itself.
- (instancetype)initWithApp:(FIRApp *)app;
/// Retrieves an instance that conforms to the specified protocol. This will return `nil` if the
-/// protocol wasn't registered, or if the instance couldn't instantiate for the provided app.
+/// protocol wasn't registered, or if the instance couldn't be instantiated for the provided app.
- (nullable id)instanceForProtocol:(Protocol *)protocol NS_SWIFT_NAME(instance(for:));
+/// Instantiates all the components that have registered as "eager" after initialization.
+- (void)instantiateEagerComponents;
+
/// Remove all of the cached instances stored and allow them to clean up after themselves.
- (void)removeAllCachedInstances;
+/// Removes all the components. After calling this method no new instances will be created.
+- (void)removeAllComponents;
+
+/// Register a class to provide components for the interoperability system. The class should conform
+/// to `FIRComponentRegistrant` and provide an array of `FIRComponent` objects.
++ (void)registerAsComponentRegistrant:(Class)klass;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRComponentType.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentType.h
similarity index 100%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRComponentType.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponentType.h
diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRConfigurationInternal.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRConfigurationInternal.h
new file mode 100644
index 0000000000..0d1a36f666
--- /dev/null
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRConfigurationInternal.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+
+@class FIRAnalyticsConfiguration;
+
+@interface FIRConfiguration ()
+
+/**
+ * The configuration class for Firebase Analytics. This should be removed once the logic for
+ * enabling and disabling Analytics is moved to Analytics.
+ */
+@property(nonatomic, readwrite) FIRAnalyticsConfiguration *analyticsConfiguration;
+
+@end
diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h
new file mode 100644
index 0000000000..76c0c05f0a
--- /dev/null
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+
+@class FIRDiagnosticsData;
+@class FIROptions;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** Connects FIRCore with the CoreDiagnostics library. */
+@interface FIRCoreDiagnosticsConnector : NSObject
+
+/** Logs FirebaseCore related data.
+ *
+ * @param options The options object containing data to log.
+ */
++ (void)logCoreTelemetryWithOptions:(FIROptions *)options;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRDependency.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRDependency.h
similarity index 100%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRDependency.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRDependency.h
diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRDiagnosticsData.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRDiagnosticsData.h
new file mode 100644
index 0000000000..ac5ef2c4f9
--- /dev/null
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRDiagnosticsData.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** Implements the FIRCoreDiagnosticsData protocol to log diagnostics data. */
+@interface FIRDiagnosticsData : NSObject
+
+/** Inserts values into the diagnosticObjects dictionary if the value isn't nil.
+ *
+ * @param value The value to insert if it's not nil.
+ * @param key The key to associate it with.
+ */
+- (void)insertValue:(nullable id)value forKey:(NSString *)key;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRErrorCode.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrorCode.h
similarity index 64%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRErrorCode.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrorCode.h
index 01d3c56e36..f77b3d0024 100644
--- a/Pods/FirebaseCore/Firebase/Core/Private/FIRErrorCode.h
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrorCode.h
@@ -34,22 +34,5 @@ typedef NS_ENUM(NSInteger, FIRErrorCode) {
/**
* Error code for failing to configure a specific service.
*/
- FIRErrorCodeAdMobFailed = -110,
- FIRErrorCodeAppInviteFailed = -112,
- FIRErrorCodeCloudMessagingFailed = -113,
FIRErrorCodeConfigFailed = -114,
- FIRErrorCodeDatabaseFailed = -115,
- FIRErrorCodeCrashReportingFailed = -118,
- FIRErrorCodeDurableDeepLinkFailed = -119,
- FIRErrorCodeAuthFailed = -120,
- FIRErrorCodeInstanceIDFailed = -121,
- FIRErrorCodeStorageFailed = -123,
-
- /**
- * Error codes returned by Dynamic Links
- */
- FIRErrorCodeDynamicLinksStrongMatchNotAvailable = -124,
- FIRErrorCodeDynamicLinksManualRetrievalNotEnabled = -125,
- FIRErrorCodeDynamicLinksPendingLinkOnlyAvailableAtFirstLaunch = -126,
- FIRErrorCodeDynamicLinksPendingLinkRetrievalAlreadyRunning = -127,
};
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRErrors.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrors.h
similarity index 63%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRErrors.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrors.h
index cf69252aa9..19e47328ac 100644
--- a/Pods/FirebaseCore/Firebase/Core/Private/FIRErrors.h
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRErrors.h
@@ -19,15 +19,6 @@
#include "FIRErrorCode.h"
extern NSString *const kFirebaseErrorDomain;
-extern NSString *const kFirebaseAdMobErrorDomain;
-extern NSString *const kFirebaseAppInviteErrorDomain;
-extern NSString *const kFirebaseAuthErrorDomain;
-extern NSString *const kFirebaseCloudMessagingErrorDomain;
extern NSString *const kFirebaseConfigErrorDomain;
extern NSString *const kFirebaseCoreErrorDomain;
-extern NSString *const kFirebaseCrashReportingErrorDomain;
-extern NSString *const kFirebaseDatabaseErrorDomain;
-extern NSString *const kFirebaseDurableDeepLinkErrorDomain;
-extern NSString *const kFirebaseInstanceIDErrorDomain;
extern NSString *const kFirebasePerfErrorDomain;
-extern NSString *const kFirebaseStorageErrorDomain;
diff --git a/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h
new file mode 100644
index 0000000000..bfff73e5d9
--- /dev/null
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h
@@ -0,0 +1,39 @@
+// Copyright 2019 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FIRHeartbeatInfo : NSObject
+
+// Enum representing the different heartbeat codes.
+typedef NS_ENUM(NSInteger, FIRHeartbeatInfoCode) {
+ FIRHeartbeatInfoCodeNone = 0,
+ FIRHeartbeatInfoCodeSDK = 1,
+ FIRHeartbeatInfoCodeGlobal = 2,
+ FIRHeartbeatInfoCodeCombined = 3,
+};
+
+/**
+ * Get heartbeat code requred for the sdk.
+ * @param heartbeatTag String representing the sdk heartbeat tag.
+ * @return Heartbeat code indicating whether or not an sdk/global heartbeat
+ * needs to be sent
+ */
++ (FIRHeartbeatInfoCode)heartbeatCodeForTag:(NSString *)heartbeatTag;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRComponentRegistrant.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLibrary.h
similarity index 64%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRComponentRegistrant.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLibrary.h
index ad2cad2146..af9d9685d5 100644
--- a/Pods/FirebaseCore/Firebase/Core/Private/FIRComponentRegistrant.h
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLibrary.h
@@ -14,25 +14,32 @@
* limitations under the License.
*/
-#ifndef FIRComponentRegistrant_h
-#define FIRComponentRegistrant_h
+#ifndef FIRLibrary_h
+#define FIRLibrary_h
#import
-@class FIRComponent;
+#import
+
+@class FIRApp;
NS_ASSUME_NONNULL_BEGIN
-/// Describes functionality for SDKs registering components in the `FIRComponentContainer`.
-NS_SWIFT_NAME(ComponentRegistrant)
-@protocol FIRComponentRegistrant
+/// Provide an interface to register a library for userAgent logging and availability to others.
+NS_SWIFT_NAME(Library)
+@protocol FIRLibrary
/// Returns one or more FIRComponents that will be registered in
/// FIRApp and participate in dependency resolution and injection.
+ (NSArray *)componentsToRegister;
+@optional
+/// Implement this method if the library needs notifications for lifecycle events. This method is
+/// called when the developer calls `FirebaseApp.configure()`.
++ (void)configureWithApp:(FIRApp *)app;
+
@end
NS_ASSUME_NONNULL_END
-#endif /* FIRComponentRegistrant_h */
+#endif /* FIRLibrary_h */
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIRLogger.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLogger.h
similarity index 93%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIRLogger.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLogger.h
index a538199be1..548e389a4e 100644
--- a/Pods/FirebaseCore/Firebase/Core/Private/FIRLogger.h
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRLogger.h
@@ -16,7 +16,7 @@
#import
-#import "FIRLoggerLevel.h"
+#import
NS_ASSUME_NONNULL_BEGIN
@@ -29,19 +29,11 @@ extern FIRLoggerService kFIRLoggerABTesting;
extern FIRLoggerService kFIRLoggerAdMob;
extern FIRLoggerService kFIRLoggerAnalytics;
extern FIRLoggerService kFIRLoggerAuth;
-extern FIRLoggerService kFIRLoggerCore;
extern FIRLoggerService kFIRLoggerCrash;
-extern FIRLoggerService kFIRLoggerDatabase;
-extern FIRLoggerService kFIRLoggerDynamicLinks;
-extern FIRLoggerService kFIRLoggerFirestore;
-extern FIRLoggerService kFIRLoggerInstanceID;
-extern FIRLoggerService kFIRLoggerInvites;
+extern FIRLoggerService kFIRLoggerCore;
extern FIRLoggerService kFIRLoggerMLKit;
-extern FIRLoggerService kFIRLoggerMessaging;
extern FIRLoggerService kFIRLoggerPerf;
extern FIRLoggerService kFIRLoggerRemoteConfig;
-extern FIRLoggerService kFIRLoggerStorage;
-extern FIRLoggerService kFIRLoggerSwizzler;
/**
* The key used to store the logger's error count.
diff --git a/Pods/FirebaseCore/Firebase/Core/Private/FIROptionsInternal.h b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIROptionsInternal.h
similarity index 96%
rename from Pods/FirebaseCore/Firebase/Core/Private/FIROptionsInternal.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Private/FIROptionsInternal.h
index 7bb40fc10d..0660a3cd8c 100644
--- a/Pods/FirebaseCore/Firebase/Core/Private/FIROptionsInternal.h
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Private/FIROptionsInternal.h
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#import "FIROptions.h"
+#import
/**
* Keys for the strings in the plist file.
@@ -65,7 +65,7 @@ extern NSString *const kServiceInfoFileType;
* Indicates whether or not Analytics collection was explicitly enabled via a plist flag or at
* runtime.
*/
-@property(nonatomic, readonly) BOOL isAnalyticsCollectionExpicitlySet;
+@property(nonatomic, readonly) BOOL isAnalyticsCollectionExplicitlySet;
/**
* Whether or not Analytics Collection was enabled. Analytics Collection is enabled unless
diff --git a/Pods/FirebaseCore/Firebase/Core/Public/FIRApp.h b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRApp.h
similarity index 100%
rename from Pods/FirebaseCore/Firebase/Core/Public/FIRApp.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRApp.h
diff --git a/Pods/FirebaseCore/Firebase/Core/Public/FIRConfiguration.h b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRConfiguration.h
similarity index 83%
rename from Pods/FirebaseCore/Firebase/Core/Public/FIRConfiguration.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRConfiguration.h
index 95bba5e7b3..8de3b076a6 100644
--- a/Pods/FirebaseCore/Firebase/Core/Public/FIRConfiguration.h
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRConfiguration.h
@@ -16,14 +16,12 @@
#import
-#import "FIRAnalyticsConfiguration.h"
-#import "FIRLoggerLevel.h"
+#import
NS_ASSUME_NONNULL_BEGIN
/**
- * This interface provides global level properties that the developer can tweak, and the singleton
- * of the Firebase Analytics configuration class.
+ * This interface provides global level properties that the developer can tweak.
*/
NS_SWIFT_NAME(FirebaseConfiguration)
@interface FIRConfiguration : NSObject
@@ -31,9 +29,6 @@ NS_SWIFT_NAME(FirebaseConfiguration)
/** Returns the shared configuration object. */
@property(class, nonatomic, readonly) FIRConfiguration *sharedInstance NS_SWIFT_NAME(shared);
-/** The configuration class for Firebase Analytics. */
-@property(nonatomic, readwrite) FIRAnalyticsConfiguration *analyticsConfiguration;
-
/**
* Sets the logging level for internal Firebase logging. Firebase will only log messages
* that are logged at or below loggerLevel. The messages are logged both to the Xcode
diff --git a/Pods/FirebaseCore/Firebase/Core/Public/FIRLoggerLevel.h b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRLoggerLevel.h
similarity index 100%
rename from Pods/FirebaseCore/Firebase/Core/Public/FIRLoggerLevel.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Public/FIRLoggerLevel.h
diff --git a/Pods/FirebaseCore/Firebase/Core/Public/FIROptions.h b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIROptions.h
similarity index 93%
rename from Pods/FirebaseCore/Firebase/Core/Public/FIROptions.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Public/FIROptions.h
index 87a01ddc71..67fbe5ba42 100644
--- a/Pods/FirebaseCore/Firebase/Core/Public/FIROptions.h
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FIROptions.h
@@ -90,6 +90,13 @@ NS_SWIFT_NAME(FirebaseOptions)
*/
@property(nonatomic, copy, nullable) NSString *storageBucket;
+/**
+ * The App Group identifier to share data between the application and the application extensions.
+ * The App Group must be configured in the application and on the Apple Developer Portal. Default
+ * value `nil`.
+ */
+@property(nonatomic, copy, nullable) NSString *appGroupID;
+
/**
* Initializes a customized instance of FIROptions from the file at the given plist file path. This
* will read the file synchronously from disk.
diff --git a/Pods/FirebaseCore/Firebase/Core/Public/FirebaseCore.h b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore.h
similarity index 94%
rename from Pods/FirebaseCore/Firebase/Core/Public/FirebaseCore.h
rename to Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore.h
index fa26f694b7..95119aed92 100644
--- a/Pods/FirebaseCore/Firebase/Core/Public/FirebaseCore.h
+++ b/Pods/FirebaseCore/FirebaseCore/Sources/Public/FirebaseCore.h
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-#import "FIRAnalyticsConfiguration.h"
#import "FIRApp.h"
#import "FIRConfiguration.h"
#import "FIRLoggerLevel.h"
diff --git a/Pods/FirebaseCore/README.md b/Pods/FirebaseCore/README.md
index 00e6ade973..23d66e8586 100644
--- a/Pods/FirebaseCore/README.md
+++ b/Pods/FirebaseCore/README.md
@@ -1,9 +1,13 @@
-# Firebase iOS Open Source Development [](https://travis-ci.org/firebase/firebase-ios-sdk)
+# Firebase iOS Open Source Development
+ [![Actions Status][gh-core-badge]][gh-actions]
+ [![Actions Status][gh-dynamiclinks-badge]][gh-actions]
+ [![Actions Status][gh-datatransport-badge]][gh-actions]
+ [![Actions Status][gh-storage-badge]][gh-actions]
+ [![Actions Status][gh-zip-badge]][gh-actions]
+ [](https://travis-ci.org/firebase/firebase-ios-sdk)
-This repository contains a subset of the Firebase iOS SDK source. It currently
-includes FirebaseCore, FirebaseAuth, FirebaseDatabase, FirebaseFirestore,
-FirebaseFunctions, FirebaseInAppMessagingDisplay, FirebaseMessaging and
-FirebaseStorage.
+This repository contains all Firebase iOS SDK source except FirebaseAnalytics,
+FirebasePerformance, and FirebaseML.
The repository also includes GoogleUtilities source. The
[GoogleUtilities](GoogleUtilities/README.md) pod is
@@ -68,26 +72,80 @@ Instructions for the experimental Carthage distribution are at
Instructions for installing binary frameworks via
[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md).
+### Using Firebase from a Framework or a library
+
+[Using Firebase from a Framework or a library](docs/firebase_in_libraries.md)
+
## Development
-Follow the subsequent instructions to develop, debug, unit test, run integration
-tests, and try out reference samples:
+To develop Firebase software in this repository, ensure that you have at least
+the following software:
+
+ * Xcode 10.1 (or later)
+ * CocoaPods 1.7.2 (or later)
+ * [CocoaPods generate](https://github.com/square/cocoapods-generate)
+
+For the pod that you want to develop:
+
+`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios`
+
+Note: If the CocoaPods cache is out of date, you may need to run
+`pod repo update` before the `pod gen` command.
+
+Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for
+those platforms. Since 10.2, Xcode does not properly handle multi-platform
+CocoaPods workspaces.
+
+Firestore has a self contained Xcode project. See
+[Firestore/README.md](Firestore/README.md).
+
+### Development for Catalyst
+* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios`
+* Check the Mac box in the App-iOS Build Settings
+* Sign the App in the Settings Signing & Capabilities tab
+* Click Pods in the Project Manager
+* Add Signing to the iOS host app and unit test targets
+* Select the Unit-unit scheme
+* Run it to build and test
+
+### Adding a New Firebase Pod
+
+See [AddNewPod.md](AddNewPod.md).
+
+### Code Formatting
+
+To ensure that the code is formatted consistently, run the script
+[./scripts/style.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/style.sh)
+before creating a PR.
+
+Travis will verify that any code changes are done in a style compliant way. Install
+`clang-format` and `swiftformat`.
+These commands will get the right versions:
```
-$ git clone git@github.com:firebase/firebase-ios-sdk.git
-$ cd firebase-ios-sdk/Example
-$ pod update
-$ open Firebase.xcworkspace
+brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/e3496d9/Formula/clang-format.rb
+brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/7963c3d/Formula/swiftformat.rb
```
-Firestore and Functions have self contained Xcode projects. See
-[Firestore/README.md](Firestore/README.md) and
-[Functions/README.md](Functions/README.md).
+Note: if you already have a newer version of these installed you may need to
+`brew switch` to this version.
+
+To update this section, find the versions of clang-format and swiftformat.rb to
+match the versions in the CI failure logs
+[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula).
### Running Unit Tests
Select a scheme and press Command-u to build a component and run its unit tests.
+#### Viewing Code Coverage
+
+First, make sure that [xcov](https://github.com/nakiostudio/xcov) is installed with `gem install xcov`.
+
+After running the `AllUnitTests_iOS` scheme in Xcode, execute
+`xcov --workspace Firebase.xcworkspace --scheme AllUnitTests_iOS --output_directory xcov_output`
+at Example/ in the terminal. This will aggregate the coverage, and you can run `open xcov_output/index.html` to see the results.
+
### Running Sample Apps
In order to run the sample apps and integration tests, you'll need valid
`GoogleService-Info.plist` files for those samples. The Firebase Xcode project contains dummy plist
@@ -148,23 +206,43 @@ We've seen an amazing amount of interest and contributions to improve the Fireba
very grateful! We'd like to empower as many developers as we can to be able to use Firebase and
participate in the Firebase community.
-### macOS and tvOS
-FirebaseAuth, FirebaseCore, FirebaseDatabase and FirebaseStorage now compile, run unit tests, and
-work on macOS and tvOS, thanks to contributions from the community. There are a few tweaks needed,
-like ensuring iOS-only, macOS-only, or tvOS-only code is correctly guarded with checks for
-`TARGET_OS_IOS`, `TARGET_OS_OSX` and `TARGET_OS_TV`.
+### tvOS, macOS, watchOS and Catalyst
+Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and work on
+tvOS, macOS, watchOS and Catalyst.
For tvOS, checkout the [Sample](Example/tvOSSample).
+For watchOS, currently only Messaging and Storage (and their dependencies) have limited support. Checkout the
+[Independent Watch App Sample](Example/watchOSSample).
-Keep in mind that macOS and tvOS are not officially supported by Firebase, and this repository is
-actively developed primarily for iOS. While we can catch basic unit test issues with Travis, there
-may be some changes where the SDK no longer works as expected on macOS or tvOS. If you encounter
-this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues).
+Keep in mind that macOS, tvOS, watchOS and Catalyst are not officially supported by Firebase, and this
+repository is actively developed primarily for iOS. While we can catch basic unit test issues with
+Travis, there may be some changes where the SDK no longer works as expected on macOS, tvOS or watchOS. If you
+encounter this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues).
-For installation instructions, see [above](README.md#accessing-firebase-source-snapshots).
+During app setup in the console, you may get to a step that mentions something like "Checking if the app
+has communicated with our servers". This relies on Analytics and will not work on macOS/tvOS/watchOS/Catalyst.
+**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected.
-Note that the Firebase pod is not available for macOS and tvOS. Install a selection of the
-`FirebaseAuth`, `FirebaseCore`, `FirebaseDatabase` and `FirebaseStorage` CocoaPods.
+To install, add a subset of the following to the Podfile:
+
+```
+pod 'Firebase/ABTesting' # No watchOS support yet
+pod 'Firebase/Auth' # No watchOS support yet
+pod 'Firebase/Crashlytics' # No watchOS support yet
+pod 'Firebase/Database' # No watchOS support yet
+pod 'Firebase/Firestore' # No watchOS support yet
+pod 'Firebase/Functions' # No watchOS support yet
+pod 'Firebase/Messaging'
+pod 'Firebase/RemoteConfig' # No watchOS support yet
+pod 'Firebase/Storage'
+```
+
+#### Additional Catalyst Notes
+
+* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability`
+to Build Settings.
+* FirebaseFirestore requires signing the
+[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681).
## Roadmap
@@ -183,3 +261,10 @@ The contents of this repository is licensed under the
Your use of Firebase is governed by the
[Terms of Service for Firebase Services](https://firebase.google.com/terms/).
+
+[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions
+[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg
+[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg
+[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg
+[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg
+[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg
diff --git a/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/FIRCoreDiagnostics.m b/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/FIRCoreDiagnostics.m
new file mode 100644
index 0000000000..87d57c4e8a
--- /dev/null
+++ b/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/FIRCoreDiagnostics.m
@@ -0,0 +1,647 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+#include
+
+#import
+#import
+#import
+#import
+
+#import
+#import
+#import
+
+#import
+#import
+
+#import
+#import
+#import
+
+#import "FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.h"
+
+/** The logger service string to use when printing to the console. */
+static GULLoggerService kFIRCoreDiagnostics = @"[FirebaseCoreDiagnostics/FIRCoreDiagnostics]";
+
+#ifdef FIREBASE_BUILD_ZIP_FILE
+static BOOL kUsingZipFile = YES;
+#else // FIREBASE_BUILD_ZIP_FILE
+static BOOL kUsingZipFile = NO;
+#endif // FIREBASE_BUILD_ZIP_FILE
+
+#ifdef FIREBASE_BUILD_CARTHAGE
+#define kDeploymentType logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_CARTHAGE
+#elif FIREBASE_BUILD_ZIP_FILE
+#define kDeploymentType logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_ZIP_FILE
+#else
+#define kDeploymentType logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_COCOAPODS
+#endif
+
+static NSString *const kFIRServiceMLVisionOnDeviceAutoML = @"MLVisionOnDeviceAutoML";
+static NSString *const kFIRServiceMLVisionOnDeviceFace = @"MLVisionOnDeviceFace";
+static NSString *const kFIRServiceMLVisionOnDeviceBarcode = @"MLVisionOnDeviceBarcode";
+static NSString *const kFIRServiceMLVisionOnDeviceText = @"MLVisionOnDeviceText";
+static NSString *const kFIRServiceMLVisionOnDeviceLabel = @"MLVisionOnDeviceLabel";
+static NSString *const kFIRServiceMLVisionOnDeviceObjectDetection =
+ @"MLVisionOnDeviceObjectDetection";
+static NSString *const kFIRServiceMLModelInterpreter = @"MLModelInterpreter";
+
+static NSString *const kFIRServiceAdMob = @"AdMob";
+static NSString *const kFIRServiceAuth = @"Auth";
+static NSString *const kFIRServiceAuthUI = @"AuthUI";
+static NSString *const kFIRServiceCrash = @"Crash";
+static NSString *const kFIRServiceDatabase = @"Database";
+static NSString *const kFIRServiceDynamicLinks = @"DynamicLinks";
+static NSString *const kFIRServiceFirestore = @"Firestore";
+static NSString *const kFIRServiceFunctions = @"Functions";
+static NSString *const kFIRServiceIAM = @"InAppMessaging";
+static NSString *const kFIRServiceInstanceID = @"InstanceID";
+static NSString *const kFIRServiceInvites = @"Invites";
+static NSString *const kFIRServiceMessaging = @"Messaging";
+static NSString *const kFIRServiceMeasurement = @"Measurement";
+static NSString *const kFIRServicePerformance = @"Performance";
+static NSString *const kFIRServiceRemoteConfig = @"RemoteConfig";
+static NSString *const kFIRServiceStorage = @"Storage";
+static NSString *const kGGLServiceAnalytics = @"Analytics";
+static NSString *const kGGLServiceSignIn = @"SignIn";
+static NSString *const kFIRAppDiagnosticsConfigurationTypeKey =
+ @"FIRAppDiagnosticsConfigurationTypeKey";
+static NSString *const kFIRAppDiagnosticsFIRAppKey = @"FIRAppDiagnosticsFIRAppKey";
+static NSString *const kFIRAppDiagnosticsSDKNameKey = @"FIRAppDiagnosticsSDKNameKey";
+static NSString *const kFIRAppDiagnosticsSDKVersionKey = @"FIRAppDiagnosticsSDKVersionKey";
+static NSString *const kFIRCoreDiagnosticsHeartbeatTag = @"FIRCoreDiagnostics";
+
+/**
+ * The file name to the recent heartbeat date.
+ */
+NSString *const kFIRCoreDiagnosticsHeartbeatDateFileName = @"FIREBASE_DIAGNOSTICS_HEARTBEAT_DATE";
+
+/**
+ * @note This should implement the GDTCOREventDataObject protocol, but can't because of
+ * weak-linking.
+ */
+@interface FIRCoreDiagnosticsLog : NSObject
+
+/** The config that will be converted to proto bytes. */
+@property(nonatomic) logs_proto_mobilesdk_ios_ICoreConfiguration config;
+
+@end
+
+@implementation FIRCoreDiagnosticsLog
+
+- (instancetype)initWithConfig:(logs_proto_mobilesdk_ios_ICoreConfiguration)config {
+ self = [super init];
+ if (self) {
+ _config = config;
+ }
+ return self;
+}
+
+// Provided and required by the GDTCOREventDataObject protocol.
+- (NSData *)transportBytes {
+ pb_ostream_t sizestream = PB_OSTREAM_SIZING;
+
+ // Encode 1 time to determine the size.
+ if (!pb_encode(&sizestream, logs_proto_mobilesdk_ios_ICoreConfiguration_fields, &_config)) {
+ GDTCORLogError(GDTCORMCETransportBytesError, @"Error in nanopb encoding for size: %s",
+ PB_GET_ERROR(&sizestream));
+ }
+
+ // Encode a 2nd time to actually get the bytes from it.
+ size_t bufferSize = sizestream.bytes_written;
+ CFMutableDataRef dataRef = CFDataCreateMutable(CFAllocatorGetDefault(), bufferSize);
+ CFDataSetLength(dataRef, bufferSize);
+ pb_ostream_t ostream = pb_ostream_from_buffer((void *)CFDataGetBytePtr(dataRef), bufferSize);
+ if (!pb_encode(&ostream, logs_proto_mobilesdk_ios_ICoreConfiguration_fields, &_config)) {
+ GDTCORLogError(GDTCORMCETransportBytesError, @"Error in nanopb encoding for bytes: %s",
+ PB_GET_ERROR(&ostream));
+ }
+ CFDataSetLength(dataRef, ostream.bytes_written);
+
+ return CFBridgingRelease(dataRef);
+}
+
+- (void)dealloc {
+ pb_release(logs_proto_mobilesdk_ios_ICoreConfiguration_fields, &_config);
+}
+
+@end
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** This class produces a protobuf containing diagnostics and usage data to be logged. */
+@interface FIRCoreDiagnostics : NSObject
+
+/** The queue on which all diagnostics collection will occur. */
+@property(nonatomic, readonly) dispatch_queue_t diagnosticsQueue;
+
+/** The transport object used to send data. */
+@property(nonatomic, readonly) GDTCORTransport *transport;
+
+/** The storage to store the date of the last sent heartbeat. */
+@property(nonatomic, readonly) GULHeartbeatDateStorage *heartbeatDateStorage;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+@implementation FIRCoreDiagnostics
+
++ (instancetype)sharedInstance {
+ static FIRCoreDiagnostics *sharedInstance;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ sharedInstance = [[FIRCoreDiagnostics alloc] init];
+ });
+ return sharedInstance;
+}
+
+- (instancetype)init {
+ GDTCORTransport *transport = [[GDTCORTransport alloc] initWithMappingID:@"137"
+ transformers:nil
+ target:kGDTCORTargetFLL];
+
+ GULHeartbeatDateStorage *dateStorage =
+ [[GULHeartbeatDateStorage alloc] initWithFileName:kFIRCoreDiagnosticsHeartbeatDateFileName];
+
+ return [self initWithTransport:transport heartbeatDateStorage:dateStorage];
+}
+
+/** Initializer for unit tests.
+ *
+ * @param transport A `GDTCORTransport` instance which that be used to send event.
+ * @param heartbeatDateStorage An instanse of date storage to track heartbeat sending.
+ * @return Returns the initialized `FIRCoreDiagnostics` instance.
+ */
+- (instancetype)initWithTransport:(GDTCORTransport *)transport
+ heartbeatDateStorage:(GULHeartbeatDateStorage *)heartbeatDateStorage {
+ self = [super init];
+ if (self) {
+ _diagnosticsQueue =
+ dispatch_queue_create("com.google.FIRCoreDiagnostics", DISPATCH_QUEUE_SERIAL);
+ _transport = transport;
+ _heartbeatDateStorage = heartbeatDateStorage;
+ }
+ return self;
+}
+
+#pragma mark - Metadata helpers
+
+/** Returns the model of iOS device. Sample platform strings are @"iPhone7,1" for iPhone 6 Plus,
+ * @"iPhone7,2" for iPhone 6, etc. Refer to the Hardware strings at
+ * https://en.wikipedia.org/wiki/List_of_iOS_devices
+ *
+ * @return The device model as an NSString.
+ */
++ (NSString *)deviceModel {
+ static NSString *deviceModel = nil;
+ if (deviceModel == nil) {
+ struct utsname systemInfo;
+ uname(&systemInfo);
+ deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
+ }
+ return deviceModel;
+}
+
+#pragma mark - nanopb helper functions
+
+/** Callocs a pb_bytes_array and copies the given NSString's bytes into the bytes array.
+ *
+ * @note Memory needs to be free manually, through pb_free or pb_release.
+ * @param string The string to encode as pb_bytes.
+ */
+pb_bytes_array_t *FIREncodeString(NSString *string) {
+ NSData *stringBytes = [string dataUsingEncoding:NSUTF8StringEncoding];
+ return FIREncodeData(stringBytes);
+}
+
+/** Callocs a pb_bytes_array and copies the given NSData bytes into the bytes array.
+ *
+ * @note Memory needs to be free manually, through pb_free or pb_release.
+ * @param data The data to copy into the new bytes array.
+ */
+pb_bytes_array_t *FIREncodeData(NSData *data) {
+ pb_bytes_array_t *pbBytesArray = calloc(1, PB_BYTES_ARRAY_T_ALLOCSIZE(data.length));
+ if (pbBytesArray != NULL) {
+ [data getBytes:pbBytesArray->bytes length:data.length];
+ pbBytesArray->size = (pb_size_t)data.length;
+ }
+ return pbBytesArray;
+}
+
+/** Maps a service string to the representative nanopb enum.
+ *
+ * @param serviceString The SDK service string to convert.
+ * @return The representative nanopb enum.
+ */
+logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType FIRMapFromServiceStringToTypeEnum(
+ NSString *serviceString) {
+ static NSDictionary *serviceStringToTypeEnum;
+ if (serviceStringToTypeEnum == nil) {
+ serviceStringToTypeEnum = @{
+ kFIRServiceAdMob : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ADMOB),
+ kFIRServiceMessaging : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MESSAGING),
+ kFIRServiceMeasurement :
+ @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MEASUREMENT),
+ kFIRServiceRemoteConfig :
+ @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_REMOTE_CONFIG),
+ kFIRServiceDatabase : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DATABASE),
+ kFIRServiceDynamicLinks :
+ @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DYNAMIC_LINKS),
+ kFIRServiceAuth : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_AUTH),
+ kFIRServiceAuthUI : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_AUTH_UI),
+ kFIRServiceFirestore : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_FIRESTORE),
+ kFIRServiceFunctions : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_FUNCTIONS),
+ kFIRServicePerformance :
+ @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_PERFORMANCE),
+ kFIRServiceStorage : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_STORAGE),
+ kFIRServiceMLVisionOnDeviceAutoML :
+ @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_AUTOML),
+ kFIRServiceMLVisionOnDeviceFace :
+ @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_FACE),
+ kFIRServiceMLVisionOnDeviceBarcode :
+ @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_BARCODE),
+ kFIRServiceMLVisionOnDeviceText :
+ @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_TEXT),
+ kFIRServiceMLVisionOnDeviceLabel :
+ @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_LABEL),
+ kFIRServiceMLVisionOnDeviceObjectDetection : @(
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_OBJECT_DETECTION),
+ kFIRServiceMLModelInterpreter :
+ @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_MODEL_INTERPRETER),
+ kGGLServiceAnalytics : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ANALYTICS),
+ kGGLServiceSignIn : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_SIGN_IN),
+ kFIRServiceIAM : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_IN_APP_MESSAGING),
+ };
+ }
+ if (serviceStringToTypeEnum[serviceString] != nil) {
+ return (int32_t)serviceStringToTypeEnum[serviceString].longLongValue;
+ }
+ return logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_UNKNOWN_SDK_SERVICE;
+}
+
+#pragma mark - Proto population functions
+
+/** Populates the given proto with data related to an SDK logDiagnostics call from the
+ * diagnosticObjects dictionary.
+ *
+ * @param config The proto to populate
+ * @param diagnosticObjects The dictionary of diagnostics objects.
+ */
+void FIRPopulateProtoWithInfoFromUserInfoParams(logs_proto_mobilesdk_ios_ICoreConfiguration *config,
+ NSDictionary *diagnosticObjects) {
+ NSNumber *configurationType = diagnosticObjects[kFIRCDConfigurationTypeKey];
+ if (configurationType != nil) {
+ switch (configurationType.integerValue) {
+ case logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_CORE:
+ config->configuration_type =
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_CORE;
+ config->has_configuration_type = 1;
+ break;
+ case logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK:
+ config->configuration_type =
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK;
+ config->has_configuration_type = 1;
+ break;
+ default:
+ break;
+ }
+ }
+
+ NSString *sdkName = diagnosticObjects[kFIRCDSdkNameKey];
+ if (sdkName) {
+ config->sdk_name = FIRMapFromServiceStringToTypeEnum(sdkName);
+ config->has_sdk_name = 1;
+ }
+
+ NSString *version = diagnosticObjects[kFIRCDSdkVersionKey];
+ if (version) {
+ config->sdk_version = FIREncodeString(version);
+ }
+}
+
+/** Populates the given proto with data from the calling FIRApp using the given
+ * diagnosticObjects dictionary.
+ *
+ * @param config The proto to populate
+ * @param diagnosticObjects The dictionary of diagnostics objects.
+ */
+void FIRPopulateProtoWithCommonInfoFromApp(logs_proto_mobilesdk_ios_ICoreConfiguration *config,
+ NSDictionary *diagnosticObjects) {
+ config->pod_name = logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_FIREBASE;
+ config->has_pod_name = 1;
+
+ if (!diagnosticObjects[kFIRCDllAppsCountKey]) {
+ GDTCORLogError(GDTCORMCEGeneralError, @"%@",
+ @"App count is a required value in the data dict.");
+ }
+ config->app_count = (int32_t)[diagnosticObjects[kFIRCDllAppsCountKey] integerValue];
+ config->has_app_count = 1;
+
+ NSString *googleAppID = diagnosticObjects[kFIRCDGoogleAppIDKey];
+ if (googleAppID.length) {
+ config->app_id = FIREncodeString(googleAppID);
+ }
+
+ NSString *bundleID = diagnosticObjects[kFIRCDBundleIDKey];
+ if (bundleID.length) {
+ config->bundle_id = FIREncodeString(bundleID);
+ }
+
+ NSString *firebaseUserAgent = diagnosticObjects[kFIRCDFirebaseUserAgentKey];
+ if (firebaseUserAgent.length) {
+ config->platform_info = FIREncodeString(firebaseUserAgent);
+ }
+
+ NSNumber *usingOptionsFromDefaultPlist = diagnosticObjects[kFIRCDUsingOptionsFromDefaultPlistKey];
+ if (usingOptionsFromDefaultPlist != nil) {
+ config->use_default_app = [usingOptionsFromDefaultPlist boolValue];
+ config->has_use_default_app = 1;
+ }
+
+ NSString *libraryVersionID = diagnosticObjects[kFIRCDLibraryVersionIDKey];
+ if (libraryVersionID) {
+ config->icore_version = FIREncodeString(libraryVersionID);
+ }
+
+ NSString *deviceModel = [FIRCoreDiagnostics deviceModel];
+ if (deviceModel.length) {
+ config->device_model = FIREncodeString(deviceModel);
+ }
+
+ NSString *osVersion = [GULAppEnvironmentUtil systemVersion];
+ if (osVersion.length) {
+ config->os_version = FIREncodeString(osVersion);
+ }
+
+ config->using_zip_file = kUsingZipFile;
+ config->has_using_zip_file = 1;
+ config->deployment_type = kDeploymentType;
+ config->has_deployment_type = 1;
+ config->deployed_in_app_store = [GULAppEnvironmentUtil isFromAppStore];
+ config->has_deployed_in_app_store = 1;
+}
+
+/** Populates the given proto with installed services data.
+ *
+ * @param config The proto to populate
+ */
+void FIRPopulateProtoWithInstalledServices(logs_proto_mobilesdk_ios_ICoreConfiguration *config) {
+ NSMutableArray *sdkServiceInstalledArray = [NSMutableArray array];
+
+ // AdMob
+ if (NSClassFromString(@"GADBannerView") != nil) {
+ [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceAdMob))];
+ }
+ // CloudMessaging
+ if (NSClassFromString(@"FIRMessaging") != nil) {
+ [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMessaging))];
+ }
+ // RemoteConfig
+ if (NSClassFromString(@"FIRRemoteConfig") != nil) {
+ [sdkServiceInstalledArray
+ addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceRemoteConfig))];
+ }
+ // Measurement/Analtyics
+ if (NSClassFromString(@"FIRAnalytics") != nil) {
+ [sdkServiceInstalledArray
+ addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMeasurement))];
+ }
+ // ML Vision On Device AutoML.
+ if (NSClassFromString(@"FIRVisionOnDeviceAutoMLImageLabelerOptions") != nil) {
+ [sdkServiceInstalledArray
+ addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceAutoML))];
+ }
+ // ML Vision On Device Face.
+ if (NSClassFromString(@"FIRVisionFaceDetector") != nil &&
+ NSClassFromString(@"GMVFaceDetector") != nil) {
+ [sdkServiceInstalledArray
+ addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceFace))];
+ }
+ // ML Vision On Device Barcode.
+ if (NSClassFromString(@"FIRVisionBarcodeDetector") != nil &&
+ NSClassFromString(@"GMVBarcodeDetector") != nil) {
+ [sdkServiceInstalledArray
+ addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceBarcode))];
+ }
+ // ML Vision On Device Text.
+ if (NSClassFromString(@"FIRVisionTextDetector") != nil &&
+ NSClassFromString(@"GMVTextDetector") != nil) {
+ [sdkServiceInstalledArray
+ addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceText))];
+ }
+ // ML Vision On Device Image Label.
+ if (NSClassFromString(@"FIRVisionLabelDetector") != nil &&
+ NSClassFromString(@"GMVLabelDetector") != nil) {
+ [sdkServiceInstalledArray
+ addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceLabel))];
+ }
+ // ML Vision On Device Object.
+ if (NSClassFromString(@"FIRVisionObjectDetector") != nil) {
+ [sdkServiceInstalledArray
+ addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceObjectDetection))];
+ }
+ // ML Model Interpreter
+ if (NSClassFromString(@"FIRCustomModelInterpreter") != nil) {
+ [sdkServiceInstalledArray
+ addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLModelInterpreter))];
+ }
+ // Database
+ if (NSClassFromString(@"FIRDatabase") != nil) {
+ [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceDatabase))];
+ }
+ // DynamicDeepLink
+ if (NSClassFromString(@"FIRDynamicLinks") != nil) {
+ [sdkServiceInstalledArray
+ addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceDynamicLinks))];
+ }
+ // Auth
+ if (NSClassFromString(@"FIRAuth") != nil) {
+ [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceAuth))];
+ }
+ // AuthUI
+ if (NSClassFromString(@"FUIAuth") != nil) {
+ [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceAuthUI))];
+ }
+ // Firestore
+ if (NSClassFromString(@"FIRFirestore") != nil) {
+ [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceFirestore))];
+ }
+ // Functions
+ if (NSClassFromString(@"FIRFunctions") != nil) {
+ [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceFunctions))];
+ }
+ // Performance
+ if (NSClassFromString(@"FIRPerformance") != nil) {
+ [sdkServiceInstalledArray
+ addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServicePerformance))];
+ }
+ // Storage
+ if (NSClassFromString(@"FIRStorage") != nil) {
+ [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceStorage))];
+ }
+ // SignIn via Google pod
+ if (NSClassFromString(@"GIDSignIn") != nil && NSClassFromString(@"GGLContext") != nil) {
+ [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kGGLServiceSignIn))];
+ }
+ // Analytics via Google pod
+ if (NSClassFromString(@"GAI") != nil && NSClassFromString(@"GGLContext") != nil) {
+ [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kGGLServiceAnalytics))];
+ }
+
+ // In-App Messaging
+ if (NSClassFromString(@"FIRInAppMessaging") != nil) {
+ [sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceIAM))];
+ }
+
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType *servicesInstalled =
+ calloc(sdkServiceInstalledArray.count,
+ sizeof(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType));
+ if (servicesInstalled == NULL) {
+ return;
+ }
+ for (NSUInteger i = 0; i < sdkServiceInstalledArray.count; i++) {
+ NSNumber *typeEnum = sdkServiceInstalledArray[i];
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType serviceType =
+ (int32_t)typeEnum.integerValue;
+ servicesInstalled[i] = serviceType;
+ }
+
+ config->sdk_service_installed = servicesInstalled;
+ config->sdk_service_installed_count = (int32_t)sdkServiceInstalledArray.count;
+}
+
+/** Populates the proto with the number of linked frameworks.
+ *
+ * @param config The proto to populate.
+ */
+void FIRPopulateProtoWithNumberOfLinkedFrameworks(
+ logs_proto_mobilesdk_ios_ICoreConfiguration *config) {
+ int numFrameworks = -1; // Subtract the app binary itself.
+ unsigned int numImages;
+ const char **imageNames = objc_copyImageNames(&numImages);
+ for (unsigned int i = 0; i < numImages; i++) {
+ NSString *imageName = [NSString stringWithUTF8String:imageNames[i]];
+ if ([imageName rangeOfString:@"System/Library"].length != 0 // Apple .frameworks
+ || [imageName rangeOfString:@"Developer/Library"].length != 0 // Xcode debug .frameworks
+ || [imageName rangeOfString:@"usr/lib"].length != 0) { // Public .dylibs
+ continue;
+ }
+ numFrameworks++;
+ }
+ free(imageNames);
+ config->dynamic_framework_count = numFrameworks;
+ config->has_dynamic_framework_count = 1;
+}
+
+/** Populates the proto with Info.plist values.
+ *
+ * @param config The proto to populate.
+ */
+void FIRPopulateProtoWithInfoPlistValues(logs_proto_mobilesdk_ios_ICoreConfiguration *config) {
+ NSDictionary *info = [[NSBundle mainBundle] infoDictionary];
+
+ NSString *xcodeVersion = info[@"DTXcodeBuild"] ?: @"";
+ NSString *sdkVersion = info[@"DTSDKBuild"] ?: @"";
+ NSString *combinedVersions = [NSString stringWithFormat:@"%@-%@", xcodeVersion, sdkVersion];
+ config->apple_framework_version = FIREncodeString(combinedVersions);
+
+ NSString *minVersion = info[@"MinimumOSVersion"];
+ if (minVersion) {
+ config->min_supported_ios_version = FIREncodeString(minVersion);
+ }
+
+ // Apps can turn off swizzling in the Info.plist, check if they've explicitly set the value and
+ // report it. It's enabled by default.
+ NSNumber *appDelegateSwizzledNum = info[@"FirebaseAppDelegateProxyEnabled"];
+ BOOL appDelegateSwizzled = YES;
+ if ([appDelegateSwizzledNum isKindOfClass:[NSNumber class]]) {
+ appDelegateSwizzled = [appDelegateSwizzledNum boolValue];
+ }
+ config->swizzling_enabled = appDelegateSwizzled;
+ config->has_swizzling_enabled = 1;
+}
+
+#pragma mark - FIRCoreDiagnosticsInterop
+
++ (void)sendDiagnosticsData:(nonnull id)diagnosticsData {
+ FIRCoreDiagnostics *diagnostics = [FIRCoreDiagnostics sharedInstance];
+ [diagnostics sendDiagnosticsData:diagnosticsData];
+}
+
+- (void)sendDiagnosticsData:(nonnull id)diagnosticsData {
+ dispatch_async(self.diagnosticsQueue, ^{
+ NSDictionary *diagnosticObjects = diagnosticsData.diagnosticObjects;
+ NSNumber *isDataCollectionDefaultEnabled =
+ diagnosticObjects[kFIRCDIsDataCollectionDefaultEnabledKey];
+ if (isDataCollectionDefaultEnabled && ![isDataCollectionDefaultEnabled boolValue]) {
+ return;
+ }
+
+ // Create the proto.
+ logs_proto_mobilesdk_ios_ICoreConfiguration icore_config =
+ logs_proto_mobilesdk_ios_ICoreConfiguration_init_default;
+
+ icore_config.using_gdt = 1;
+ icore_config.has_using_gdt = 1;
+
+ // Populate the proto with information.
+ FIRPopulateProtoWithInfoFromUserInfoParams(&icore_config, diagnosticObjects);
+ FIRPopulateProtoWithCommonInfoFromApp(&icore_config, diagnosticObjects);
+ FIRPopulateProtoWithInstalledServices(&icore_config);
+ FIRPopulateProtoWithNumberOfLinkedFrameworks(&icore_config);
+ FIRPopulateProtoWithInfoPlistValues(&icore_config);
+ [self setHeartbeatFlagIfNeededToConfig:&icore_config];
+
+ // This log object is capable of converting the proto to bytes.
+ FIRCoreDiagnosticsLog *log = [[FIRCoreDiagnosticsLog alloc] initWithConfig:icore_config];
+
+ // Send the log as a telemetry event.
+ GDTCOREvent *event = [self.transport eventForTransport];
+ event.dataObject = (id)log;
+ [self.transport sendTelemetryEvent:event];
+ });
+}
+
+#pragma mark - Heartbeat
+
+- (void)setHeartbeatFlagIfNeededToConfig:(logs_proto_mobilesdk_ios_ICoreConfiguration *)config {
+ // Check if need to send a heartbeat.
+ NSDate *currentDate = [NSDate date];
+ NSDate *lastCheckin =
+ [self.heartbeatDateStorage heartbeatDateForTag:kFIRCoreDiagnosticsHeartbeatTag];
+ if (lastCheckin) {
+ // Ensure the previous checkin was on a different date in the past.
+ if ([self isDate:currentDate inSameDayOrBeforeThan:lastCheckin]) {
+ return;
+ }
+ }
+
+ // Update heartbeat sent date.
+ [self.heartbeatDateStorage setHearbeatDate:currentDate forTag:kFIRCoreDiagnosticsHeartbeatTag];
+ // Set the flag.
+ config->sdk_name = logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ICORE;
+ config->has_sdk_name = 1;
+}
+
+- (BOOL)isDate:(NSDate *)date1 inSameDayOrBeforeThan:(NSDate *)date2 {
+ return [[NSCalendar currentCalendar] isDate:date1 inSameDayAsDate:date2] ||
+ [date1 compare:date2] == NSOrderedAscending;
+}
+
+@end
diff --git a/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.c b/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.c
new file mode 100644
index 0000000000..4b2ac2f74b
--- /dev/null
+++ b/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.c
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Automatically generated nanopb constant definitions */
+/* Generated by nanopb-0.3.9.3 */
+
+#include "firebasecore.nanopb.h"
+
+/* @@protoc_insertion_point(includes) */
+#if PB_PROTO_HEADER_VERSION != 30
+#error Regenerate this file with the current version of nanopb generator.
+#endif
+
+
+
+const pb_field_t logs_proto_mobilesdk_ios_ICoreConfiguration_fields[22] = {
+ PB_FIELD( 1, UENUM , OPTIONAL, STATIC , FIRST, logs_proto_mobilesdk_ios_ICoreConfiguration, configuration_type, configuration_type, 0),
+ PB_FIELD( 7, UENUM , REPEATED, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, sdk_service_installed, configuration_type, 0),
+ PB_FIELD( 9, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, device_model, sdk_service_installed, 0),
+ PB_FIELD( 10, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, app_id, device_model, 0),
+ PB_FIELD( 12, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, bundle_id, app_id, 0),
+ PB_FIELD( 16, UENUM , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, pod_name, bundle_id, 0),
+ PB_FIELD( 18, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, icore_version, pod_name, 0),
+ PB_FIELD( 19, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, sdk_version, icore_version, 0),
+ PB_FIELD( 20, UENUM , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, sdk_name, sdk_version, 0),
+ PB_FIELD( 21, INT32 , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, app_count, sdk_name, 0),
+ PB_FIELD( 22, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, os_version, app_count, 0),
+ PB_FIELD( 24, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, min_supported_ios_version, os_version, 0),
+ PB_FIELD( 25, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, use_default_app, min_supported_ios_version, 0),
+ PB_FIELD( 26, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, deployed_in_app_store, use_default_app, 0),
+ PB_FIELD( 27, INT32 , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, dynamic_framework_count, deployed_in_app_store, 0),
+ PB_FIELD( 28, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, apple_framework_version, dynamic_framework_count, 0),
+ PB_FIELD( 29, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, using_zip_file, apple_framework_version, 0),
+ PB_FIELD( 30, UENUM , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, deployment_type, using_zip_file, 0),
+ PB_FIELD( 31, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, platform_info, deployment_type, 0),
+ PB_FIELD( 33, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, swizzling_enabled, platform_info, 0),
+ PB_FIELD( 36, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, using_gdt, swizzling_enabled, 0),
+ PB_LAST_FIELD
+};
+
+
+
+
+
+
+
+/* @@protoc_insertion_point(eof) */
diff --git a/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.h b/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.h
new file mode 100644
index 0000000000..3e4c1950dc
--- /dev/null
+++ b/Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.h
@@ -0,0 +1,193 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Automatically generated nanopb header */
+/* Generated by nanopb-0.3.9.3 */
+
+#ifndef PB_LOGS_PROTO_MOBILESDK_IOS_FIREBASECORE_NANOPB_H_INCLUDED
+#define PB_LOGS_PROTO_MOBILESDK_IOS_FIREBASECORE_NANOPB_H_INCLUDED
+#include
+
+/* @@protoc_insertion_point(includes) */
+#if PB_PROTO_HEADER_VERSION != 30
+#error Regenerate this file with the current version of nanopb generator.
+#endif
+
+
+/* Enum definitions */
+typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType {
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_UNKNOWN_CONFIGURATION_TYPE = 0,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_CORE = 1,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK = 2
+} logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType;
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_UNKNOWN_CONFIGURATION_TYPE
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType)(logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK+1))
+
+typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType {
+ logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_UNKNOWN_BUILD_TYPE = 0,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_INTERNAL = 1,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_EAP = 2,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_PROD = 3
+} logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType;
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_UNKNOWN_BUILD_TYPE
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_PROD
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType)(logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_PROD+1))
+
+typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType {
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_UNKNOWN_SDK_SERVICE = 0,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ICORE = 1,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ADMOB = 2,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_APP_INVITE = 3,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_SIGN_IN = 5,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_GCM = 6,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MAPS = 7,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_SCION = 8,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ANALYTICS = 9,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_APP_INDEXING = 10,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_CONFIG = 11,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DURABLE_DEEP_LINKS = 12,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_CRASH = 13,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_AUTH = 14,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DATABASE = 15,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_STORAGE = 16,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MESSAGING = 17,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MEASUREMENT = 18,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_REMOTE_CONFIG = 19,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DYNAMIC_LINKS = 20,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_INVITES = 21,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_AUTH_UI = 22,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_FIRESTORE = 23,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_PERFORMANCE = 24,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_FACE = 26,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_BARCODE = 27,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_TEXT = 28,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_LABEL = 29,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_MODEL_INTERPRETER = 30,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_IN_APP_MESSAGING = 31,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_FUNCTIONS = 32,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_NATURAL_LANGUAGE = 33,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_AUTOML = 34,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_OBJECT_DETECTION = 35
+} logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType;
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_UNKNOWN_SDK_SERVICE
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_OBJECT_DETECTION
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType)(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_OBJECT_DETECTION+1))
+
+typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName {
+ logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_UNKNOWN_POD_NAME = 0,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_GOOGLE = 1,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_FIREBASE = 2
+} logs_proto_mobilesdk_ios_ICoreConfiguration_PodName;
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_UNKNOWN_POD_NAME
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_FIREBASE
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_PodName)(logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_FIREBASE+1))
+
+typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType {
+ logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_UNKNOWN = 0,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_COCOAPODS = 1,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_ZIP_FILE = 2,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_CARTHAGE = 3,
+ logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_SPM = 4
+} logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType;
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_UNKNOWN
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_SPM
+#define _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType)(logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_SPM+1))
+
+/* Struct definitions */
+typedef struct _logs_proto_mobilesdk_ios_ICoreConfiguration {
+ bool has_configuration_type;
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType configuration_type;
+ pb_size_t sdk_service_installed_count;
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType *sdk_service_installed;
+ pb_bytes_array_t *device_model;
+ pb_bytes_array_t *app_id;
+ pb_bytes_array_t *bundle_id;
+ bool has_pod_name;
+ logs_proto_mobilesdk_ios_ICoreConfiguration_PodName pod_name;
+ pb_bytes_array_t *icore_version;
+ pb_bytes_array_t *sdk_version;
+ bool has_sdk_name;
+ logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType sdk_name;
+ bool has_app_count;
+ int32_t app_count;
+ pb_bytes_array_t *os_version;
+ pb_bytes_array_t *min_supported_ios_version;
+ bool has_use_default_app;
+ bool use_default_app;
+ bool has_deployed_in_app_store;
+ bool deployed_in_app_store;
+ bool has_dynamic_framework_count;
+ int32_t dynamic_framework_count;
+ pb_bytes_array_t *apple_framework_version;
+ bool has_using_zip_file;
+ bool using_zip_file;
+ bool has_deployment_type;
+ logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType deployment_type;
+ pb_bytes_array_t *platform_info;
+ bool has_swizzling_enabled;
+ bool swizzling_enabled;
+ bool has_using_gdt;
+ bool using_gdt;
+/* @@protoc_insertion_point(struct:logs_proto_mobilesdk_ios_ICoreConfiguration) */
+} logs_proto_mobilesdk_ios_ICoreConfiguration;
+
+/* Default values for struct fields */
+
+/* Initializer values for message structs */
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_init_default {false, _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_MIN, 0, NULL, NULL, NULL, NULL, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_MIN, NULL, NULL, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MIN, false, 0, NULL, NULL, false, 0, false, 0, false, 0, NULL, false, 0, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_MIN, NULL, false, 0, false, 0}
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_init_zero {false, _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_MIN, 0, NULL, NULL, NULL, NULL, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_MIN, NULL, NULL, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MIN, false, 0, NULL, NULL, false, 0, false, 0, false, 0, NULL, false, 0, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_MIN, NULL, false, 0, false, 0}
+
+/* Field tags (for use in manual encoding/decoding) */
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_pod_name_tag 16
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_configuration_type_tag 1
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_icore_version_tag 18
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_sdk_version_tag 19
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_sdk_service_installed_tag 7
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_sdk_name_tag 20
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_device_model_tag 9
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_os_version_tag 22
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_app_id_tag 10
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_bundle_id_tag 12
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_min_supported_ios_version_tag 24
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_use_default_app_tag 25
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_app_count_tag 21
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_deployed_in_app_store_tag 26
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_dynamic_framework_count_tag 27
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_apple_framework_version_tag 28
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_using_zip_file_tag 29
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_deployment_type_tag 30
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_platform_info_tag 31
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_swizzling_enabled_tag 33
+#define logs_proto_mobilesdk_ios_ICoreConfiguration_using_gdt_tag 36
+
+/* Struct field encoding specification for nanopb */
+extern const pb_field_t logs_proto_mobilesdk_ios_ICoreConfiguration_fields[22];
+
+/* Maximum encoded size of messages (where known) */
+/* logs_proto_mobilesdk_ios_ICoreConfiguration_size depends on runtime parameters */
+
+/* Message IDs (where set with "msgid" option) */
+#ifdef PB_MSGID
+
+#define FIREBASECORE_MESSAGES \
+
+
+#endif
+
+/* @@protoc_insertion_point(eof) */
+
+#endif
diff --git a/Pods/FirebaseCoreDiagnostics/LICENSE b/Pods/FirebaseCoreDiagnostics/LICENSE
new file mode 100644
index 0000000000..d645695673
--- /dev/null
+++ b/Pods/FirebaseCoreDiagnostics/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/Pods/FirebaseCoreDiagnostics/README.md b/Pods/FirebaseCoreDiagnostics/README.md
new file mode 100644
index 0000000000..23d66e8586
--- /dev/null
+++ b/Pods/FirebaseCoreDiagnostics/README.md
@@ -0,0 +1,270 @@
+# Firebase iOS Open Source Development
+ [![Actions Status][gh-core-badge]][gh-actions]
+ [![Actions Status][gh-dynamiclinks-badge]][gh-actions]
+ [![Actions Status][gh-datatransport-badge]][gh-actions]
+ [![Actions Status][gh-storage-badge]][gh-actions]
+ [![Actions Status][gh-zip-badge]][gh-actions]
+ [](https://travis-ci.org/firebase/firebase-ios-sdk)
+
+This repository contains all Firebase iOS SDK source except FirebaseAnalytics,
+FirebasePerformance, and FirebaseML.
+
+The repository also includes GoogleUtilities source. The
+[GoogleUtilities](GoogleUtilities/README.md) pod is
+a set of utilities used by Firebase and other Google products.
+
+Firebase is an app development platform with tools to help you build, grow and
+monetize your app. More information about Firebase can be found at
+[https://firebase.google.com](https://firebase.google.com).
+
+## Installation
+
+See the three subsections for details about three different installation methods.
+1. [Standard pod install](README.md#standard-pod-install)
+1. [Installing from the GitHub repo](README.md#installing-from-github)
+1. [Experimental Carthage](README.md#carthage-ios-only)
+
+### Standard pod install
+
+Go to
+[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup).
+
+### Installing from GitHub
+
+For releases starting with 5.0.0, the source for each release is also deployed
+to CocoaPods master and available via standard
+[CocoaPods Podfile syntax](https://guides.cocoapods.org/syntax/podfile.html#pod).
+
+These instructions can be used to access the Firebase repo at other branches,
+tags, or commits.
+
+#### Background
+
+See
+[the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod)
+for instructions and options about overriding pod source locations.
+
+#### Accessing Firebase Source Snapshots
+
+All of the official releases are tagged in this repo and available via CocoaPods. To access a local
+source snapshot or unreleased branch, use Podfile directives like the following:
+
+To access FirebaseFirestore via a branch:
+```
+pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master'
+pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master'
+```
+
+To access FirebaseMessaging via a checked out version of the firebase-ios-sdk repo do:
+
+```
+pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk'
+pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk'
+```
+
+### Carthage (iOS only)
+
+Instructions for the experimental Carthage distribution are at
+[Carthage](Carthage.md).
+
+### Rome
+
+Instructions for installing binary frameworks via
+[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md).
+
+### Using Firebase from a Framework or a library
+
+[Using Firebase from a Framework or a library](docs/firebase_in_libraries.md)
+
+## Development
+
+To develop Firebase software in this repository, ensure that you have at least
+the following software:
+
+ * Xcode 10.1 (or later)
+ * CocoaPods 1.7.2 (or later)
+ * [CocoaPods generate](https://github.com/square/cocoapods-generate)
+
+For the pod that you want to develop:
+
+`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios`
+
+Note: If the CocoaPods cache is out of date, you may need to run
+`pod repo update` before the `pod gen` command.
+
+Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for
+those platforms. Since 10.2, Xcode does not properly handle multi-platform
+CocoaPods workspaces.
+
+Firestore has a self contained Xcode project. See
+[Firestore/README.md](Firestore/README.md).
+
+### Development for Catalyst
+* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios`
+* Check the Mac box in the App-iOS Build Settings
+* Sign the App in the Settings Signing & Capabilities tab
+* Click Pods in the Project Manager
+* Add Signing to the iOS host app and unit test targets
+* Select the Unit-unit scheme
+* Run it to build and test
+
+### Adding a New Firebase Pod
+
+See [AddNewPod.md](AddNewPod.md).
+
+### Code Formatting
+
+To ensure that the code is formatted consistently, run the script
+[./scripts/style.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/style.sh)
+before creating a PR.
+
+Travis will verify that any code changes are done in a style compliant way. Install
+`clang-format` and `swiftformat`.
+These commands will get the right versions:
+
+```
+brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/e3496d9/Formula/clang-format.rb
+brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/7963c3d/Formula/swiftformat.rb
+```
+
+Note: if you already have a newer version of these installed you may need to
+`brew switch` to this version.
+
+To update this section, find the versions of clang-format and swiftformat.rb to
+match the versions in the CI failure logs
+[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula).
+
+### Running Unit Tests
+
+Select a scheme and press Command-u to build a component and run its unit tests.
+
+#### Viewing Code Coverage
+
+First, make sure that [xcov](https://github.com/nakiostudio/xcov) is installed with `gem install xcov`.
+
+After running the `AllUnitTests_iOS` scheme in Xcode, execute
+`xcov --workspace Firebase.xcworkspace --scheme AllUnitTests_iOS --output_directory xcov_output`
+at Example/ in the terminal. This will aggregate the coverage, and you can run `open xcov_output/index.html` to see the results.
+
+### Running Sample Apps
+In order to run the sample apps and integration tests, you'll need valid
+`GoogleService-Info.plist` files for those samples. The Firebase Xcode project contains dummy plist
+files without real values, but can be replaced with real plist files. To get your own
+`GoogleService-Info.plist` files:
+
+1. Go to the [Firebase Console](https://console.firebase.google.com/)
+2. Create a new Firebase project, if you don't already have one
+3. For each sample app you want to test, create a new Firebase app with the sample app's bundle
+identifier (e.g. `com.google.Database-Example`)
+4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file
+(e.g. in [Example/Database/App/](Example/Database/App/));
+
+Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require
+special Apple capabilities, and you will have to change the sample app to use a unique bundle
+identifier that you can control in your own Apple Developer account.
+
+## Specific Component Instructions
+See the sections below for any special instructions for those components.
+
+### Firebase Auth
+
+If you're doing specific Firebase Auth development, see
+[the Auth Sample README](Example/Auth/README.md) for instructions about
+building and running the FirebaseAuth pod along with various samples and tests.
+
+### Firebase Database
+
+To run the Database Integration tests, make your database authentication rules
+[public](https://firebase.google.com/docs/database/security/quickstart).
+
+### Firebase Storage
+
+To run the Storage Integration tests, follow the instructions in
+[FIRStorageIntegrationTests.m](Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m).
+
+#### Push Notifications
+
+Push notifications can only be delivered to specially provisioned App IDs in the developer portal.
+In order to actually test receiving push notifications, you will need to:
+
+1. Change the bundle identifier of the sample app to something you own in your Apple Developer
+account, and enable that App ID for push notifications.
+2. You'll also need to
+[upload your APNs Provider Authentication Key or certificate to the Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs)
+at **Project Settings > Cloud Messaging > [Your Firebase App]**.
+3. Ensure your iOS device is added to your Apple Developer portal as a test device.
+
+#### iOS Simulator
+
+The iOS Simulator cannot register for remote notifications, and will not receive push notifications.
+In order to receive push notifications, you'll have to follow the steps above and run the app on a
+physical device.
+
+## Community Supported Efforts
+
+We've seen an amazing amount of interest and contributions to improve the Firebase SDKs, and we are
+very grateful! We'd like to empower as many developers as we can to be able to use Firebase and
+participate in the Firebase community.
+
+### tvOS, macOS, watchOS and Catalyst
+Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and work on
+tvOS, macOS, watchOS and Catalyst.
+
+For tvOS, checkout the [Sample](Example/tvOSSample).
+For watchOS, currently only Messaging and Storage (and their dependencies) have limited support. Checkout the
+[Independent Watch App Sample](Example/watchOSSample).
+
+Keep in mind that macOS, tvOS, watchOS and Catalyst are not officially supported by Firebase, and this
+repository is actively developed primarily for iOS. While we can catch basic unit test issues with
+Travis, there may be some changes where the SDK no longer works as expected on macOS, tvOS or watchOS. If you
+encounter this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues).
+
+During app setup in the console, you may get to a step that mentions something like "Checking if the app
+has communicated with our servers". This relies on Analytics and will not work on macOS/tvOS/watchOS/Catalyst.
+**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected.
+
+To install, add a subset of the following to the Podfile:
+
+```
+pod 'Firebase/ABTesting' # No watchOS support yet
+pod 'Firebase/Auth' # No watchOS support yet
+pod 'Firebase/Crashlytics' # No watchOS support yet
+pod 'Firebase/Database' # No watchOS support yet
+pod 'Firebase/Firestore' # No watchOS support yet
+pod 'Firebase/Functions' # No watchOS support yet
+pod 'Firebase/Messaging'
+pod 'Firebase/RemoteConfig' # No watchOS support yet
+pod 'Firebase/Storage'
+```
+
+#### Additional Catalyst Notes
+
+* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability`
+to Build Settings.
+* FirebaseFirestore requires signing the
+[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681).
+
+## Roadmap
+
+See [Roadmap](ROADMAP.md) for more about the Firebase iOS SDK Open Source
+plans and directions.
+
+## Contributing
+
+See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase
+iOS SDK.
+
+## License
+
+The contents of this repository is licensed under the
+[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0).
+
+Your use of Firebase is governed by the
+[Terms of Service for Firebase Services](https://firebase.google.com/terms/).
+
+[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions
+[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg
+[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg
+[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg
+[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg
+[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg
diff --git a/Pods/FirebaseCoreDiagnosticsInterop/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h b/Pods/FirebaseCoreDiagnosticsInterop/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h
new file mode 100644
index 0000000000..69c40721a2
--- /dev/null
+++ b/Pods/FirebaseCoreDiagnosticsInterop/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** If present, is a BOOL wrapped in an NSNumber. */
+#define kFIRCDIsDataCollectionDefaultEnabledKey @"FIRCDIsDataCollectionDefaultEnabledKey"
+
+/** If present, is an int32_t wrapped in an NSNumber. */
+#define kFIRCDConfigurationTypeKey @"FIRCDConfigurationTypeKey"
+
+/** If present, is an NSString. */
+#define kFIRCDSdkNameKey @"FIRCDSdkNameKey"
+
+/** If present, is an NSString. */
+#define kFIRCDSdkVersionKey @"FIRCDSdkVersionKey"
+
+/** If present, is an int32_t wrapped in an NSNumber. */
+#define kFIRCDllAppsCountKey @"FIRCDllAppsCountKey"
+
+/** If present, is an NSString. */
+#define kFIRCDGoogleAppIDKey @"FIRCDGoogleAppIDKey"
+
+/** If present, is an NSString. */
+#define kFIRCDBundleIDKey @"FIRCDBundleID"
+
+/** If present, is a BOOL wrapped in an NSNumber. */
+#define kFIRCDUsingOptionsFromDefaultPlistKey @"FIRCDUsingOptionsFromDefaultPlistKey"
+
+/** If present, is an NSString. */
+#define kFIRCDLibraryVersionIDKey @"FIRCDLibraryVersionIDKey"
+
+/** If present, is an NSString. */
+#define kFIRCDFirebaseUserAgentKey @"FIRCDFirebaseUserAgentKey"
+
+/** Defines the interface of a data object needed to log diagnostics data. */
+@protocol FIRCoreDiagnosticsData
+
+@required
+
+/** A dictionary containing data (non-exhaustive) to be logged in diagnostics. */
+@property(nonatomic) NSDictionary *diagnosticObjects;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseCoreDiagnosticsInterop/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h b/Pods/FirebaseCoreDiagnosticsInterop/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h
new file mode 100644
index 0000000000..2b0eb710cd
--- /dev/null
+++ b/Pods/FirebaseCoreDiagnosticsInterop/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+
+#import "FIRCoreDiagnosticsData.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** Allows the interoperation of FirebaseCore and FirebaseCoreDiagnostics. */
+@protocol FIRCoreDiagnosticsInterop
+
+/** Sends the given diagnostics data.
+ *
+ * @param diagnosticsData The diagnostics data object to send.
+ */
++ (void)sendDiagnosticsData:(id)diagnosticsData;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseCoreDiagnosticsInterop/LICENSE b/Pods/FirebaseCoreDiagnosticsInterop/LICENSE
new file mode 100644
index 0000000000..d645695673
--- /dev/null
+++ b/Pods/FirebaseCoreDiagnosticsInterop/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/Pods/FirebaseCoreDiagnosticsInterop/README.md b/Pods/FirebaseCoreDiagnosticsInterop/README.md
new file mode 100644
index 0000000000..3ddc8fbd29
--- /dev/null
+++ b/Pods/FirebaseCoreDiagnosticsInterop/README.md
@@ -0,0 +1,251 @@
+# Firebase iOS Open Source Development [](https://travis-ci.org/firebase/firebase-ios-sdk)
+
+This repository contains a subset of the Firebase iOS SDK source. It currently
+includes FirebaseCore, FirebaseABTesting, FirebaseAuth, FirebaseDatabase,
+FirebaseFirestore, FirebaseFunctions, FirebaseInstanceID, FirebaseInAppMessaging,
+FirebaseInAppMessagingDisplay, FirebaseMessaging, FirebaseRemoteConfig, and
+FirebaseStorage.
+
+The repository also includes GoogleUtilities source. The
+[GoogleUtilities](GoogleUtilities/README.md) pod is
+a set of utilities used by Firebase and other Google products.
+
+Firebase is an app development platform with tools to help you build, grow and
+monetize your app. More information about Firebase can be found at
+[https://firebase.google.com](https://firebase.google.com).
+
+## Installation
+
+See the three subsections for details about three different installation methods.
+1. [Standard pod install](README.md#standard-pod-install)
+1. [Installing from the GitHub repo](README.md#installing-from-github)
+1. [Experimental Carthage](README.md#carthage-ios-only)
+
+### Standard pod install
+
+Go to
+[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup).
+
+### Installing from GitHub
+
+For releases starting with 5.0.0, the source for each release is also deployed
+to CocoaPods master and available via standard
+[CocoaPods Podfile syntax](https://guides.cocoapods.org/syntax/podfile.html#pod).
+
+These instructions can be used to access the Firebase repo at other branches,
+tags, or commits.
+
+#### Background
+
+See
+[the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod)
+for instructions and options about overriding pod source locations.
+
+#### Accessing Firebase Source Snapshots
+
+All of the official releases are tagged in this repo and available via CocoaPods. To access a local
+source snapshot or unreleased branch, use Podfile directives like the following:
+
+To access FirebaseFirestore via a branch:
+```
+pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master'
+pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master'
+```
+
+To access FirebaseMessaging via a checked out version of the firebase-ios-sdk repo do:
+
+```
+pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk'
+pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk'
+```
+
+### Carthage (iOS only)
+
+Instructions for the experimental Carthage distribution are at
+[Carthage](Carthage.md).
+
+### Rome
+
+Instructions for installing binary frameworks via
+[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md).
+
+## Development
+
+To develop Firebase software in this repository, ensure that you have at least
+the following software:
+
+ * Xcode 10.1 (or later)
+ * CocoaPods 1.7.2 (or later)
+ * [CocoaPods generate](https://github.com/square/cocoapods-generate)
+
+For the pod that you want to develop:
+
+`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios`
+
+Note: If the CocoaPods cache is out of date, you may need to run
+`pod repo update` before the `pod gen` command.
+
+Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for
+those platforms. Since 10.2, Xcode does not properly handle multi-platform
+CocoaPods workspaces.
+
+Firestore has a self contained Xcode project. See
+[Firestore/README.md](Firestore/README.md).
+
+### Development for Catalyst
+* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios`
+* Check the Mac box in the App-iOS Build Settings
+* Sign the App in the Settings Signing & Capabilities tab
+* Click Pods in the Project Manager
+* Add Signing to the iOS host app and unit test targets
+* Select the Unit-unit scheme
+* Run it to build and test
+
+### Adding a New Firebase Pod
+
+See [AddNewPod.md](AddNewPod.md).
+
+### Code Formatting
+
+To ensure that the code is formatted consistently, run the script
+[./scripts/style.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/style.sh)
+before creating a PR.
+
+Travis will verify that any code changes are done in a style compliant way. Install
+`clang-format` and `swiftformat`.
+These commands will get the right versions:
+
+```
+brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/e3496d9/Formula/clang-format.rb
+brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/7963c3d/Formula/swiftformat.rb
+```
+
+Note: if you already have a newer version of these installed you may need to
+`brew switch` to this version.
+
+To update this section, find the versions of clang-format and swiftformat.rb to
+match the versions in the CI failure logs
+[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula).
+
+### Running Unit Tests
+
+Select a scheme and press Command-u to build a component and run its unit tests.
+
+#### Viewing Code Coverage
+
+First, make sure that [xcov](https://github.com/nakiostudio/xcov) is installed with `gem install xcov`.
+
+After running the `AllUnitTests_iOS` scheme in Xcode, execute
+`xcov --workspace Firebase.xcworkspace --scheme AllUnitTests_iOS --output_directory xcov_output`
+at Example/ in the terminal. This will aggregate the coverage, and you can run `open xcov_output/index.html` to see the results.
+
+### Running Sample Apps
+In order to run the sample apps and integration tests, you'll need valid
+`GoogleService-Info.plist` files for those samples. The Firebase Xcode project contains dummy plist
+files without real values, but can be replaced with real plist files. To get your own
+`GoogleService-Info.plist` files:
+
+1. Go to the [Firebase Console](https://console.firebase.google.com/)
+2. Create a new Firebase project, if you don't already have one
+3. For each sample app you want to test, create a new Firebase app with the sample app's bundle
+identifier (e.g. `com.google.Database-Example`)
+4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file
+(e.g. in [Example/Database/App/](Example/Database/App/));
+
+Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require
+special Apple capabilities, and you will have to change the sample app to use a unique bundle
+identifier that you can control in your own Apple Developer account.
+
+## Specific Component Instructions
+See the sections below for any special instructions for those components.
+
+### Firebase Auth
+
+If you're doing specific Firebase Auth development, see
+[the Auth Sample README](Example/Auth/README.md) for instructions about
+building and running the FirebaseAuth pod along with various samples and tests.
+
+### Firebase Database
+
+To run the Database Integration tests, make your database authentication rules
+[public](https://firebase.google.com/docs/database/security/quickstart).
+
+### Firebase Storage
+
+To run the Storage Integration tests, follow the instructions in
+[FIRStorageIntegrationTests.m](Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m).
+
+#### Push Notifications
+
+Push notifications can only be delivered to specially provisioned App IDs in the developer portal.
+In order to actually test receiving push notifications, you will need to:
+
+1. Change the bundle identifier of the sample app to something you own in your Apple Developer
+account, and enable that App ID for push notifications.
+2. You'll also need to
+[upload your APNs Provider Authentication Key or certificate to the Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs)
+at **Project Settings > Cloud Messaging > [Your Firebase App]**.
+3. Ensure your iOS device is added to your Apple Developer portal as a test device.
+
+#### iOS Simulator
+
+The iOS Simulator cannot register for remote notifications, and will not receive push notifications.
+In order to receive push notifications, you'll have to follow the steps above and run the app on a
+physical device.
+
+## Community Supported Efforts
+
+We've seen an amazing amount of interest and contributions to improve the Firebase SDKs, and we are
+very grateful! We'd like to empower as many developers as we can to be able to use Firebase and
+participate in the Firebase community.
+
+### tvOS, macOS, and Catalyst
+Thanks to contributions from the community, FirebaseABTesting, FirebaseAuth, FirebaseCore,
+FirebaseDatabase, FirebaseMessaging, FirebaseFirestore,
+FirebaseFunctions, FirebaseRemoteConfig, and FirebaseStorage now compile, run unit tests, and work on
+tvOS, macOS, and Catalyst.
+
+For tvOS, checkout the [Sample](Example/tvOSSample).
+
+Keep in mind that macOS, Catalyst and tvOS are not officially supported by Firebase, and this
+repository is actively developed primarily for iOS. While we can catch basic unit test issues with
+Travis, there may be some changes where the SDK no longer works as expected on macOS or tvOS. If you
+encounter this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues).
+
+To install, add a subset of the following to the Podfile:
+
+```
+pod 'Firebase/ABTesting'
+pod 'Firebase/Auth'
+pod 'Firebase/Database'
+pod 'Firebase/Firestore'
+pod 'Firebase/Functions'
+pod 'Firebase/Messaging'
+pod 'Firebase/RemoteConfig'
+pod 'Firebase/Storage'
+```
+
+#### Additional Catalyst Notes
+
+* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability`
+to Build Settings.
+* FirebaseFirestore requires signing the
+[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681).
+
+## Roadmap
+
+See [Roadmap](ROADMAP.md) for more about the Firebase iOS SDK Open Source
+plans and directions.
+
+## Contributing
+
+See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase
+iOS SDK.
+
+## License
+
+The contents of this repository is licensed under the
+[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0).
+
+Your use of Firebase is governed by the
+[Terms of Service for Firebase Services](https://firebase.google.com/terms/).
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h
new file mode 100644
index 0000000000..5bc21a11c9
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+
+#import
+
+@class FIRInstallationsHTTPError;
+
+NS_ASSUME_NONNULL_BEGIN
+
+void FIRInstallationsItemSetErrorToPointer(NSError *error, NSError **pointer);
+
+@interface FIRInstallationsErrorUtil : NSObject
+
++ (NSError *)keyedArchiverErrorWithException:(NSException *)exception;
++ (NSError *)keyedArchiverErrorWithError:(NSError *)error;
+
++ (NSError *)keychainErrorWithFunction:(NSString *)keychainFunction status:(OSStatus)status;
+
++ (NSError *)installationItemNotFoundForAppID:(NSString *)appID appName:(NSString *)appName;
+
++ (NSError *)JSONSerializationError:(NSError *)error;
+
++ (NSError *)networkErrorWithError:(NSError *)error;
+
++ (NSError *)FIDRegistrationErrorWithResponseMissingField:(NSString *)missingFieldName;
+
++ (NSError *)corruptedIIDTokenData;
+
++ (FIRInstallationsHTTPError *)APIErrorWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse
+ data:(nullable NSData *)data;
++ (BOOL)isAPIError:(NSError *)error withHTTPCode:(NSInteger)HTTPCode;
+
+/**
+ * Returns the passed error if it is already in the public domain or a new error with the passed
+ * error at `NSUnderlyingErrorKey`.
+ */
++ (NSError *)publicDomainErrorWithError:(NSError *)error;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.m
new file mode 100644
index 0000000000..f85923acef
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.m
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRInstallationsErrorUtil.h"
+
+#import "FIRInstallationsHTTPError.h"
+
+NSString *const kFirebaseInstallationsErrorDomain = @"com.firebase.installations";
+
+void FIRInstallationsItemSetErrorToPointer(NSError *error, NSError **pointer) {
+ if (pointer != NULL) {
+ *pointer = error;
+ }
+}
+
+@implementation FIRInstallationsErrorUtil
+
++ (NSError *)keyedArchiverErrorWithException:(NSException *)exception {
+ NSString *failureReason = [NSString
+ stringWithFormat:@"NSKeyedArchiver exception with name: %@, reason: %@, userInfo: %@",
+ exception.name, exception.reason, exception.userInfo];
+ return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown
+ failureReason:failureReason
+ underlyingError:nil];
+}
+
++ (NSError *)keyedArchiverErrorWithError:(NSError *)error {
+ NSString *failureReason = [NSString stringWithFormat:@"NSKeyedArchiver error."];
+ return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown
+ failureReason:failureReason
+ underlyingError:error];
+}
+
++ (NSError *)keychainErrorWithFunction:(NSString *)keychainFunction status:(OSStatus)status {
+ NSString *failureReason = [NSString stringWithFormat:@"%@ (%li)", keychainFunction, (long)status];
+ return [self installationsErrorWithCode:FIRInstallationsErrorCodeKeychain
+ failureReason:failureReason
+ underlyingError:nil];
+}
+
++ (NSError *)installationItemNotFoundForAppID:(NSString *)appID appName:(NSString *)appName {
+ NSString *failureReason =
+ [NSString stringWithFormat:@"Installation for appID %@ appName %@ not found", appID, appName];
+ return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown
+ failureReason:failureReason
+ underlyingError:nil];
+}
+
++ (NSError *)corruptedIIDTokenData {
+ NSString *failureReason =
+ @"IID token data stored in Keychain is corrupted or in an incompatible format.";
+ return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown
+ failureReason:failureReason
+ underlyingError:nil];
+}
+
++ (FIRInstallationsHTTPError *)APIErrorWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse
+ data:(nullable NSData *)data {
+ return [[FIRInstallationsHTTPError alloc] initWithHTTPResponse:HTTPResponse data:data];
+}
+
++ (BOOL)isAPIError:(NSError *)error withHTTPCode:(NSInteger)HTTPCode {
+ if (![error isKindOfClass:[FIRInstallationsHTTPError class]]) {
+ return NO;
+ }
+
+ return [(FIRInstallationsHTTPError *)error HTTPResponse].statusCode == HTTPCode;
+}
+
++ (NSError *)JSONSerializationError:(NSError *)error {
+ NSString *failureReason = [NSString stringWithFormat:@"Failed to serialize JSON data."];
+ return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown
+ failureReason:failureReason
+ underlyingError:nil];
+}
+
++ (NSError *)FIDRegistrationErrorWithResponseMissingField:(NSString *)missingFieldName {
+ NSString *failureReason = [NSString
+ stringWithFormat:@"A required response field with name %@ is missing", missingFieldName];
+ return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown
+ failureReason:failureReason
+ underlyingError:nil];
+}
+
++ (NSError *)networkErrorWithError:(NSError *)error {
+ return [self installationsErrorWithCode:FIRInstallationsErrorCodeServerUnreachable
+ failureReason:@"Network connection error."
+ underlyingError:error];
+}
+
++ (NSError *)publicDomainErrorWithError:(NSError *)error {
+ if ([error.domain isEqualToString:kFirebaseInstallationsErrorDomain]) {
+ return error;
+ }
+
+ return [self installationsErrorWithCode:FIRInstallationsErrorCodeUnknown
+ failureReason:nil
+ underlyingError:error];
+}
+
++ (NSError *)installationsErrorWithCode:(FIRInstallationsErrorCode)code
+ failureReason:(nullable NSString *)failureReason
+ underlyingError:(nullable NSError *)underlyingError {
+ NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
+ userInfo[NSUnderlyingErrorKey] = underlyingError;
+ userInfo[NSLocalizedFailureReasonErrorKey] = failureReason;
+
+ return [NSError errorWithDomain:kFirebaseInstallationsErrorDomain code:code userInfo:userInfo];
+}
+
+@end
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h
new file mode 100644
index 0000000000..ad0eb8c134
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** Represents an error caused by an unexpected API response. */
+@interface FIRInstallationsHTTPError : NSError
+
+@property(nonatomic, readonly) NSHTTPURLResponse *HTTPResponse;
+@property(nonatomic, readonly, nonnull) NSData *data;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+- (instancetype)initWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse data:(nullable NSData *)data;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+typedef NS_ENUM(NSInteger, FIRInstallationsHTTPCodes) {
+ FIRInstallationsHTTPCodesTooManyRequests = 429,
+ FIRInstallationsHTTPCodesServerInternalError = 500,
+};
+
+/** Possible response HTTP codes for `CreateInstallation` API request. */
+typedef NS_ENUM(NSInteger, FIRInstallationsRegistrationHTTPCode) {
+ FIRInstallationsRegistrationHTTPCodeSuccess = 201,
+ FIRInstallationsRegistrationHTTPCodeInvalidArgument = 400,
+ FIRInstallationsRegistrationHTTPCodeInvalidAPIKey = 401,
+ FIRInstallationsRegistrationHTTPCodeAPIKeyToProjectIDMismatch = 403,
+ FIRInstallationsRegistrationHTTPCodeProjectNotFound = 404,
+ FIRInstallationsRegistrationHTTPCodeTooManyRequests = 429,
+ FIRInstallationsRegistrationHTTPCodeServerInternalError = 500
+};
+
+typedef NS_ENUM(NSInteger, FIRInstallationsAuthTokenHTTPCode) {
+ FIRInstallationsAuthTokenHTTPCodeInvalidAuthentication = 401,
+ FIRInstallationsAuthTokenHTTPCodeFIDNotFound = 404,
+};
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.m
new file mode 100644
index 0000000000..5b3eae22be
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.m
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRInstallationsHTTPError.h"
+#import "FIRInstallationsErrorUtil.h"
+
+@implementation FIRInstallationsHTTPError
+
+- (instancetype)initWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse
+ data:(nullable NSData *)data {
+ NSDictionary *userInfo = [FIRInstallationsHTTPError userInfoWithHTTPResponse:HTTPResponse
+ data:data];
+ self = [super
+ initWithDomain:kFirebaseInstallationsErrorDomain
+ code:[FIRInstallationsHTTPError errorCodeWithHTTPCode:HTTPResponse.statusCode]
+ userInfo:userInfo];
+ if (self) {
+ _HTTPResponse = HTTPResponse;
+ _data = data;
+ }
+ return self;
+}
+
++ (FIRInstallationsErrorCode)errorCodeWithHTTPCode:(NSInteger)HTTPCode {
+ return FIRInstallationsErrorCodeUnknown;
+}
+
++ (NSDictionary *)userInfoWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse
+ data:(nullable NSData *)data {
+ NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ NSString *failureReason = [NSString
+ stringWithFormat:@"The server responded with an error. HTTP response: %@\nResponse body: %@",
+ HTTPResponse, responseString];
+ return @{NSLocalizedFailureReasonErrorKey : failureReason};
+}
+
+#pragma mark - NSCopying
+
+- (id)copyWithZone:(NSZone *)zone {
+ return [[FIRInstallationsHTTPError alloc] initWithHTTPResponse:self.HTTPResponse data:self.data];
+}
+
+#pragma mark - NSSecureCoding
+
+- (nullable instancetype)initWithCoder:(NSCoder *)coder {
+ NSHTTPURLResponse *HTTPResponse = [coder decodeObjectOfClass:[NSHTTPURLResponse class]
+ forKey:@"HTTPResponse"];
+ if (!HTTPResponse) {
+ return nil;
+ }
+ NSData *data = [coder decodeObjectOfClass:[NSData class] forKey:@"data"];
+
+ return [self initWithHTTPResponse:HTTPResponse data:data];
+}
+
+- (void)encodeWithCoder:(NSCoder *)coder {
+ [coder encodeObject:self.HTTPResponse forKey:@"HTTPResponse"];
+ [coder encodeObject:self.data forKey:@"data"];
+}
+
++ (BOOL)supportsSecureCoding {
+ return YES;
+}
+
+@end
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallations.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallations.m
new file mode 100644
index 0000000000..71e7dd4345
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallations.m
@@ -0,0 +1,248 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRInstallations.h"
+
+#if __has_include()
+#import
+#else
+#import "FBLPromises.h"
+#endif
+
+#import
+#import
+#import
+#import
+#import
+#import
+
+#import "FIRInstallationsAuthTokenResultInternal.h"
+
+#import "FIRInstallationsErrorUtil.h"
+#import "FIRInstallationsIDController.h"
+#import "FIRInstallationsItem.h"
+#import "FIRInstallationsLogger.h"
+#import "FIRInstallationsStoredAuthToken.h"
+#import "FIRInstallationsVersion.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol FIRInstallationsInstanceProvider
+@end
+
+@interface FIRInstallations ()
+@property(nonatomic, readonly) FIROptions *appOptions;
+@property(nonatomic, readonly) NSString *appName;
+
+@property(nonatomic, readonly) FIRInstallationsIDController *installationsIDController;
+
+@end
+
+@implementation FIRInstallations
+
+#pragma mark - Firebase component
+
++ (void)load {
+ [FIRApp registerInternalLibrary:(Class)self
+ withName:@"fire-install"
+ withVersion:[NSString stringWithUTF8String:FIRInstallationsVersionStr]];
+}
+
++ (nonnull NSArray *)componentsToRegister {
+ FIRComponentCreationBlock creationBlock =
+ ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) {
+ *isCacheable = YES;
+ FIRInstallations *installations = [[FIRInstallations alloc] initWithApp:container.app];
+ return installations;
+ };
+
+ FIRComponent *installationsProvider =
+ [FIRComponent componentWithProtocol:@protocol(FIRInstallationsInstanceProvider)
+ instantiationTiming:FIRInstantiationTimingAlwaysEager
+ dependencies:@[]
+ creationBlock:creationBlock];
+ return @[ installationsProvider ];
+}
+
+- (instancetype)initWithApp:(FIRApp *)app {
+ return [self initWitAppOptions:app.options appName:app.name];
+}
+
+- (instancetype)initWitAppOptions:(FIROptions *)appOptions appName:(NSString *)appName {
+ FIRInstallationsIDController *IDController =
+ [[FIRInstallationsIDController alloc] initWithGoogleAppID:appOptions.googleAppID
+ appName:appName
+ APIKey:appOptions.APIKey
+ projectID:appOptions.projectID
+ GCMSenderID:appOptions.GCMSenderID
+ accessGroup:appOptions.appGroupID];
+ return [self initWithAppOptions:appOptions
+ appName:appName
+ installationsIDController:IDController
+ prefetchAuthToken:YES];
+}
+
+/// The initializer is supposed to be used by tests to inject `installationsStore`.
+- (instancetype)initWithAppOptions:(FIROptions *)appOptions
+ appName:(NSString *)appName
+ installationsIDController:(FIRInstallationsIDController *)installationsIDController
+ prefetchAuthToken:(BOOL)prefetchAuthToken {
+ self = [super init];
+ if (self) {
+ [[self class] validateAppOptions:appOptions appName:appName];
+ [[self class] assertCompatibleIIDVersion];
+
+ _appOptions = [appOptions copy];
+ _appName = [appName copy];
+ _installationsIDController = installationsIDController;
+
+ // Pre-fetch auth token.
+ if (prefetchAuthToken) {
+ [self authTokenWithCompletion:^(FIRInstallationsAuthTokenResult *_Nullable tokenResult,
+ NSError *_Nullable error){
+ }];
+ }
+ }
+ return self;
+}
+
++ (void)validateAppOptions:(FIROptions *)appOptions appName:(NSString *)appName {
+ NSMutableArray *missingFields = [NSMutableArray array];
+ if (appName.length < 1) {
+ [missingFields addObject:@"`FirebaseApp.name`"];
+ }
+ if (appOptions.APIKey.length < 1) {
+ [missingFields addObject:@"`FirebaseOptions.APIKey`"];
+ }
+ if (appOptions.googleAppID.length < 1) {
+ [missingFields addObject:@"`FirebaseOptions.googleAppID`"];
+ }
+
+ // TODO(#4692): Check for `appOptions.projectID.length < 1` only.
+ // We can use `GCMSenderID` instead of `projectID` temporary.
+ if (appOptions.projectID.length < 1 && appOptions.GCMSenderID.length < 1) {
+ [missingFields addObject:@"`FirebaseOptions.projectID`"];
+ }
+
+ if (missingFields.count > 0) {
+ [NSException
+ raise:kFirebaseInstallationsErrorDomain
+ format:
+ @"%@[%@] Could not configure Firebase Installations due to invalid FirebaseApp "
+ @"options. The following parameters are nil or empty: %@. If you use "
+ @"GoogleServices-Info.plist please download the most recent version from the Firebase "
+ @"Console. If you configure Firebase in code, please make sure you specify all "
+ @"required parameters.",
+ kFIRLoggerInstallations, kFIRInstallationsMessageCodeInvalidFirebaseAppOptions,
+ [missingFields componentsJoinedByString:@", "]];
+ }
+}
+
+#pragma mark - Public
+
++ (FIRInstallations *)installations {
+ FIRApp *defaultApp = [FIRApp defaultApp];
+ if (!defaultApp) {
+ [NSException raise:kFirebaseInstallationsErrorDomain
+ format:@"The default FirebaseApp instance must be configured before the default"
+ @"FirebaseApp instance can be initialized. One way to ensure that is to "
+ @"call `[FIRApp configure];` (`FirebaseApp.configure()` in Swift) in the App"
+ @" Delegate's `application:didFinishLaunchingWithOptions:` "
+ @"(`application(_:didFinishLaunchingWithOptions:)` in Swift)."];
+ }
+
+ return [self installationsWithApp:defaultApp];
+}
+
++ (FIRInstallations *)installationsWithApp:(FIRApp *)app {
+ id installations =
+ FIR_COMPONENT(FIRInstallationsInstanceProvider, app.container);
+ return (FIRInstallations *)installations;
+}
+
+- (void)installationIDWithCompletion:(FIRInstallationsIDHandler)completion {
+ [self.installationsIDController getInstallationItem]
+ .then(^id(FIRInstallationsItem *installation) {
+ completion(installation.firebaseInstallationID, nil);
+ return nil;
+ })
+ .catch(^(NSError *error) {
+ completion(nil, [FIRInstallationsErrorUtil publicDomainErrorWithError:error]);
+ });
+}
+
+- (void)authTokenWithCompletion:(FIRInstallationsTokenHandler)completion {
+ [self authTokenForcingRefresh:NO completion:completion];
+}
+
+- (void)authTokenForcingRefresh:(BOOL)forceRefresh
+ completion:(FIRInstallationsTokenHandler)completion {
+ [self.installationsIDController getAuthTokenForcingRefresh:forceRefresh]
+ .then(^FIRInstallationsAuthTokenResult *(FIRInstallationsItem *installation) {
+ FIRInstallationsAuthTokenResult *result = [[FIRInstallationsAuthTokenResult alloc]
+ initWithToken:installation.authToken.token
+ expirationDate:installation.authToken.expirationDate];
+ return result;
+ })
+ .then(^id(FIRInstallationsAuthTokenResult *token) {
+ completion(token, nil);
+ return nil;
+ })
+ .catch(^void(NSError *error) {
+ completion(nil, [FIRInstallationsErrorUtil publicDomainErrorWithError:error]);
+ });
+}
+
+- (void)deleteWithCompletion:(void (^)(NSError *__nullable error))completion {
+ [self.installationsIDController deleteInstallation]
+ .then(^id(id result) {
+ completion(nil);
+ return nil;
+ })
+ .catch(^void(NSError *error) {
+ completion([FIRInstallationsErrorUtil publicDomainErrorWithError:error]);
+ });
+}
+
+#pragma mark - IID version compatibility
+
++ (void)assertCompatibleIIDVersion {
+ // We use this flag to disable IID compatibility exception for unit tests.
+#ifdef FIR_INSTALLATIONS_ALLOWS_INCOMPATIBLE_IID_VERSION
+ return;
+#else
+ if (![self isIIDVersionCompatible]) {
+ [NSException raise:kFirebaseInstallationsErrorDomain
+ format:@"FirebaseInstallations will not work correctly with current version of "
+ @"Firebase Instance ID. Please update your Firebase Instance ID version."];
+ }
+#endif
+}
+
++ (BOOL)isIIDVersionCompatible {
+ Class IIDClass = NSClassFromString(@"FIRInstanceID");
+ if (IIDClass == nil) {
+ // It is OK if there is no IID at all.
+ return YES;
+ }
+ // We expect a compatible version having the method `+[FIRInstanceID usesFIS]` defined.
+ BOOL isCompatibleVersion = [IIDClass respondsToSelector:NSSelectorFromString(@"usesFIS")];
+ return isCompatibleVersion;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResult.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResult.m
new file mode 100644
index 0000000000..92e5fab197
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResult.m
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRInstallationsAuthTokenResultInternal.h"
+
+@implementation FIRInstallationsAuthTokenResult
+
+- (instancetype)initWithToken:(NSString *)token expirationDate:(NSDate *)expirationDate {
+ self = [super init];
+ if (self) {
+ _authToken = [token copy];
+ _expirationDate = expirationDate;
+ }
+ return self;
+}
+
+@end
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h
new file mode 100644
index 0000000000..0c959dba55
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FIRInstallationsAuthTokenResult (Internal)
+
+- (instancetype)initWithToken:(NSString *)token expirationDate:(NSDate *)expirationTime;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.h
new file mode 100644
index 0000000000..95fdf835fe
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+
+#import "FIRInstallationsStatus.h"
+
+@class FIRInstallationsStoredItem;
+@class FIRInstallationsStoredAuthToken;
+@class FIRInstallationsStoredIIDCheckin;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * The class represents the required installation ID and auth token data including possible states.
+ * The data is stored to Keychain via `FIRInstallationsStoredItem` which has only the storage
+ * relevant data and does not contain any logic. `FIRInstallationsItem` must be used on the logic
+ * level (not `FIRInstallationsStoredItem`).
+ */
+@interface FIRInstallationsItem : NSObject
+
+/// A `FirebaseApp` identifier.
+@property(nonatomic, readonly) NSString *appID;
+/// A `FirebaseApp` name.
+@property(nonatomic, readonly) NSString *firebaseAppName;
+/// A stable identifier that uniquely identifies the app instance.
+@property(nonatomic, copy, nullable) NSString *firebaseInstallationID;
+/// The `refreshToken` is used to authorize the auth token requests.
+@property(nonatomic, copy, nullable) NSString *refreshToken;
+
+@property(nonatomic, nullable) FIRInstallationsStoredAuthToken *authToken;
+@property(nonatomic, assign) FIRInstallationsStatus registrationStatus;
+
+/// Instance ID default token imported from IID store as a part of IID migration.
+@property(nonatomic, nullable) NSString *IIDDefaultToken;
+
+- (instancetype)initWithAppID:(NSString *)appID firebaseAppName:(NSString *)firebaseAppName;
+
+/**
+ * Populates `FIRInstallationsItem` properties with data from `FIRInstallationsStoredItem`.
+ * @param item An instance of `FIRInstallationsStoredItem` to get data from.
+ */
+- (void)updateWithStoredItem:(FIRInstallationsStoredItem *)item;
+
+/**
+ * Creates a stored item with data from the object.
+ * @return Returns a `FIRInstallationsStoredItem` instance with the data from the object.
+ */
+- (FIRInstallationsStoredItem *)storedItem;
+
+/**
+ * The installation identifier.
+ * @return Returns a string uniquely identifying the installation.
+ */
+- (NSString *)identifier;
+
+/**
+ * The installation identifier.
+ * @param appID A `FirebaseApp` identifier.
+ * @param appName A `FirebaseApp` name.
+ * @return Returns a string uniquely identifying the installation.
+ */
++ (NSString *)identifierWithAppID:(NSString *)appID appName:(NSString *)appName;
+
+/**
+ * Generate a new Firebase Installation Identifier.
+ * @return Returns a 22 characters long globally unique string created based on UUID.
+ */
++ (NSString *)generateFID;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.m
new file mode 100644
index 0000000000..bc819bf8a0
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsItem.m
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRInstallationsItem.h"
+
+#import "FIRInstallationsStoredAuthToken.h"
+#import "FIRInstallationsStoredItem.h"
+
+@implementation FIRInstallationsItem
+
+- (instancetype)initWithAppID:(NSString *)appID firebaseAppName:(NSString *)firebaseAppName {
+ self = [super init];
+ if (self) {
+ _appID = [appID copy];
+ _firebaseAppName = [firebaseAppName copy];
+ }
+ return self;
+}
+
+- (nonnull id)copyWithZone:(nullable NSZone *)zone {
+ FIRInstallationsItem *clone = [[FIRInstallationsItem alloc] initWithAppID:self.appID
+ firebaseAppName:self.firebaseAppName];
+ clone.firebaseInstallationID = [self.firebaseInstallationID copy];
+ clone.refreshToken = [self.refreshToken copy];
+ clone.authToken = [self.authToken copy];
+ clone.registrationStatus = self.registrationStatus;
+
+ return clone;
+}
+
+- (void)updateWithStoredItem:(FIRInstallationsStoredItem *)item {
+ self.firebaseInstallationID = item.firebaseInstallationID;
+ self.refreshToken = item.refreshToken;
+ self.authToken = item.authToken;
+ self.registrationStatus = item.registrationStatus;
+ self.IIDDefaultToken = item.IIDDefaultToken;
+}
+
+- (FIRInstallationsStoredItem *)storedItem {
+ FIRInstallationsStoredItem *storedItem = [[FIRInstallationsStoredItem alloc] init];
+ storedItem.firebaseInstallationID = self.firebaseInstallationID;
+ storedItem.refreshToken = self.refreshToken;
+ storedItem.authToken = self.authToken;
+ storedItem.registrationStatus = self.registrationStatus;
+ storedItem.IIDDefaultToken = self.IIDDefaultToken;
+ return storedItem;
+}
+
+- (nonnull NSString *)identifier {
+ return [[self class] identifierWithAppID:self.appID appName:self.firebaseAppName];
+}
+
++ (NSString *)identifierWithAppID:(NSString *)appID appName:(NSString *)appName {
+ return [appID stringByAppendingString:appName];
+}
+
++ (NSString *)generateFID {
+ NSUUID *UUID = [NSUUID UUID];
+ uuid_t UUIDBytes;
+ [UUID getUUIDBytes:UUIDBytes];
+
+ NSUInteger UUIDLength = sizeof(uuid_t);
+ NSData *UUIDData = [NSData dataWithBytes:UUIDBytes length:UUIDLength];
+
+ uint8_t UUIDLast4Bits = UUIDBytes[UUIDLength - 1] & 0b00001111;
+
+ // FID first 4 bits must be `0111`. The last 4 UUID bits will be cut later to form a proper FID.
+ // To keep 16 random bytes we copy these last 4 UUID to the FID 1st byte after `0111` prefix.
+ uint8_t FIDPrefix = 0b01110000 | UUIDLast4Bits;
+ NSMutableData *FIDData = [NSMutableData dataWithBytes:&FIDPrefix length:1];
+
+ [FIDData appendData:UUIDData];
+ NSString *FIDString = [self base64URLEncodedStringWithData:FIDData];
+
+ // A valid FID has exactly 22 base64 characters, which is 132 bits, or 16.5 bytes.
+ // Our generated ID has 16 bytes UUID + 1 byte prefix which after encoding with base64 will become
+ // 23 characters plus 1 character for "=" padding.
+
+ // Remove the 23rd character that was added because of the extra 4 bits at the
+ // end of our 17 byte data and the '=' padding.
+ return [FIDString substringWithRange:NSMakeRange(0, 22)];
+}
+
++ (NSString *)base64URLEncodedStringWithData:(NSData *)data {
+ NSString *string = [data base64EncodedStringWithOptions:0];
+ string = [string stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
+ string = [string stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
+ return string;
+}
+
+@end
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.h
new file mode 100644
index 0000000000..baeadb2e3a
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+
+#import
+
+extern FIRLoggerService kFIRLoggerInstallations;
+
+// FIRInstallationsAPIService.m
+extern NSString *const kFIRInstallationsMessageCodeSendAPIRequest;
+extern NSString *const kFIRInstallationsMessageCodeAPIRequestNetworkError;
+extern NSString *const kFIRInstallationsMessageCodeAPIRequestResponse;
+extern NSString *const kFIRInstallationsMessageCodeUnexpectedAPIRequestResponse;
+extern NSString *const kFIRInstallationsMessageCodeParsingAPIResponse;
+extern NSString *const kFIRInstallationsMessageCodeAPIResponseParsingInstallationFailed;
+extern NSString *const kFIRInstallationsMessageCodeAPIResponseParsingInstallationSucceed;
+extern NSString *const kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenFailed;
+extern NSString *const kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenSucceed;
+
+// FIRInstallationsIDController.m
+extern NSString *const kFIRInstallationsMessageCodeNewGetInstallationOperationCreated;
+extern NSString *const kFIRInstallationsMessageCodeNewGetAuthTokenOperationCreated;
+extern NSString *const kFIRInstallationsMessageCodeNewDeleteInstallationOperationCreated;
+extern NSString *const kFIRInstallationsMessageCodeInvalidFirebaseConfiguration;
+
+// FIRInstallationsStoredItem.m
+extern NSString *const kFIRInstallationsMessageCodeInstallationCoderVersionMismatch;
+
+// FIRInstallationsStoredAuthToken.m
+extern NSString *const kFIRInstallationsMessageCodeAuthTokenCoderVersionMismatch;
+
+// FIRInstallationsStoredIIDCheckin.m
+extern NSString *const kFIRInstallationsMessageCodeIIDCheckinCoderVersionMismatch;
+extern NSString *const kFIRInstallationsMessageCodeIIDCheckinFailedToDecode;
+
+// FIRInstallations.m
+extern NSString *const kFIRInstallationsMessageCodeInvalidFirebaseAppOptions;
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.m
new file mode 100644
index 0000000000..c2bdf37f1e
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsLogger.m
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRInstallationsLogger.h"
+
+FIRLoggerService kFIRLoggerInstallations = @"[Firebase/Installations]";
+
+// FIRInstallationsAPIService.m
+NSString *const kFIRInstallationsMessageCodeSendAPIRequest = @"I-FIS001001";
+NSString *const kFIRInstallationsMessageCodeAPIRequestNetworkError = @"I-FIS001002";
+NSString *const kFIRInstallationsMessageCodeAPIRequestResponse = @"I-FIS001003";
+NSString *const kFIRInstallationsMessageCodeUnexpectedAPIRequestResponse = @"I-FIS001004";
+NSString *const kFIRInstallationsMessageCodeParsingAPIResponse = @"I-FIS001005";
+NSString *const kFIRInstallationsMessageCodeAPIResponseParsingInstallationFailed = @"I-FIS001006";
+NSString *const kFIRInstallationsMessageCodeAPIResponseParsingInstallationSucceed = @"I-FIS001007";
+NSString *const kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenFailed = @"I-FIS001008";
+NSString *const kFIRInstallationsMessageCodeAPIResponseParsingAuthTokenSucceed = @"I-FIS001009";
+
+// FIRInstallationsIDController.m
+NSString *const kFIRInstallationsMessageCodeNewGetInstallationOperationCreated = @"I-FIS002000";
+NSString *const kFIRInstallationsMessageCodeNewGetAuthTokenOperationCreated = @"I-FIS002001";
+NSString *const kFIRInstallationsMessageCodeNewDeleteInstallationOperationCreated = @"I-FIS002002";
+NSString *const kFIRInstallationsMessageCodeInvalidFirebaseConfiguration = @"I-FIS002003";
+
+// FIRInstallationsStoredItem.m
+NSString *const kFIRInstallationsMessageCodeInstallationCoderVersionMismatch = @"I-FIS003000";
+
+// FIRInstallationsStoredAuthToken.m
+NSString *const kFIRInstallationsMessageCodeAuthTokenCoderVersionMismatch = @"I-FIS004000";
+
+// FIRInstallationsStoredIIDCheckin.m
+NSString *const kFIRInstallationsMessageCodeIIDCheckinCoderVersionMismatch = @"I-FIS007000";
+NSString *const kFIRInstallationsMessageCodeIIDCheckinFailedToDecode = @"I-FIS007001";
+
+// FIRInstallations.m
+NSString *const kFIRInstallationsMessageCodeInvalidFirebaseAppOptions = @"I-FIS008000";
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsVersion.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsVersion.m
new file mode 100644
index 0000000000..a75e3f5bea
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/FIRInstallationsVersion.m
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRInstallationsVersion.h"
+
+// Convert the macro to a string
+#define STR(x) STR_EXPAND(x)
+#define STR_EXPAND(x) #x
+
+const char *const FIRInstallationsVersionStr = (const char *const)STR(FIRInstallations_LIB_VERSION);
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h
new file mode 100644
index 0000000000..e2408caa7e
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+
+@class FBLPromise;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** The class encapsulates a port of a piece FirebaseInstanceID logic required to migrate IID. */
+@interface FIRInstallationsIIDStore : NSObject
+
+/**
+ * Retrieves existing IID if present.
+ * @return Returns a promise that is resolved with IID string if IID has been found or rejected with
+ * an error otherwise.
+ */
+- (FBLPromise *)existingIID;
+
+/**
+ * Deletes existing IID if present.
+ * @return Returns a promise that is resolved with `[NSNull null]` if the IID was successfully.
+ * deleted or was not found. The promise is rejected otherwise.
+ */
+- (FBLPromise *)deleteExistingIID;
+
+#if TARGET_OS_OSX
+/// If not `nil`, then only this keychain will be used to save and read data (see
+/// `kSecMatchSearchList` and `kSecUseKeychain`. It is mostly intended to be used by unit tests.
+@property(nonatomic, nullable) SecKeychainRef keychainRef;
+#endif // TARGET_OSX
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.m
new file mode 100644
index 0000000000..1f3a82afa8
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.m
@@ -0,0 +1,236 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRInstallationsIIDStore.h"
+
+#if __has_include()
+#import
+#else
+#import "FBLPromises.h"
+#endif
+
+#import
+#import "FIRInstallationsErrorUtil.h"
+
+static NSString *const kFIRInstallationsIIDKeyPairPublicTagPrefix =
+ @"com.google.iid.keypair.public-";
+static NSString *const kFIRInstallationsIIDKeyPairPrivateTagPrefix =
+ @"com.google.iid.keypair.private-";
+static NSString *const kFIRInstallationsIIDCreationTimePlistKey = @"|S|cre";
+
+@implementation FIRInstallationsIIDStore
+
+- (FBLPromise *)existingIID {
+ return [FBLPromise onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)
+ do:^id _Nullable {
+ if (![self hasPlistIIDFlag]) {
+ return nil;
+ }
+
+ NSData *IIDPublicKeyData = [self IIDPublicKeyData];
+ return [self IIDWithPublicKeyData:IIDPublicKeyData];
+ }]
+ .validate(^BOOL(NSString *_Nullable IID) {
+ return IID.length > 0;
+ });
+}
+
+- (FBLPromise *)deleteExistingIID {
+ return [FBLPromise onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)
+ do:^id _Nullable {
+ NSError *error;
+ if (![self deleteIIDFlagFromPlist:&error]) {
+ return error;
+ }
+
+ if (![self deleteIID:&error]) {
+ return error;
+ }
+
+ return [NSNull null];
+ }];
+}
+
+#pragma mark - IID decoding
+
+- (NSString *)IIDWithPublicKeyData:(NSData *)publicKeyData {
+ NSData *publicKeySHA1 = [self sha1WithData:publicKeyData];
+
+ const uint8_t *bytes = publicKeySHA1.bytes;
+ NSMutableData *identityData = [NSMutableData dataWithData:publicKeySHA1];
+
+ uint8_t b0 = bytes[0];
+ // Take the first byte and make the initial four 7 by initially making the initial 4 bits 0
+ // and then adding 0x70 to it.
+ b0 = 0x70 + (0xF & b0);
+ // failsafe should give you back b0 itself
+ b0 = (b0 & 0xFF);
+ [identityData replaceBytesInRange:NSMakeRange(0, 1) withBytes:&b0];
+ NSData *data = [identityData subdataWithRange:NSMakeRange(0, 8 * sizeof(Byte))];
+ return [self base64URLEncodedStringWithData:data];
+}
+
+- (NSData *)sha1WithData:(NSData *)data {
+ unsigned char output[CC_SHA1_DIGEST_LENGTH];
+ unsigned int length = (unsigned int)[data length];
+
+ CC_SHA1(data.bytes, length, output);
+ return [NSData dataWithBytes:output length:CC_SHA1_DIGEST_LENGTH];
+}
+
+- (NSString *)base64URLEncodedStringWithData:(NSData *)data {
+ NSString *string = [data base64EncodedStringWithOptions:0];
+ string = [string stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
+ string = [string stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
+ string = [string stringByReplacingOccurrencesOfString:@"=" withString:@""];
+ return string;
+}
+
+#pragma mark - Keychain
+
+- (NSData *)IIDPublicKeyData {
+ NSString *tag = [self keychainKeyTagWithPrefix:kFIRInstallationsIIDKeyPairPublicTagPrefix];
+ NSDictionary *query = [self keyPairQueryWithTag:tag returnData:YES];
+
+ CFTypeRef keyRef = NULL;
+ OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&keyRef);
+
+ if (status != noErr) {
+ if (keyRef) {
+ CFRelease(keyRef);
+ }
+ return nil;
+ }
+
+ return (__bridge NSData *)keyRef;
+}
+
+- (BOOL)deleteIID:(NSError **)outError {
+ if (![self deleteKeychainKeyWithTagPrefix:kFIRInstallationsIIDKeyPairPublicTagPrefix
+ error:outError]) {
+ return NO;
+ }
+
+ if (![self deleteKeychainKeyWithTagPrefix:kFIRInstallationsIIDKeyPairPrivateTagPrefix
+ error:outError]) {
+ return NO;
+ }
+
+ return YES;
+}
+
+- (BOOL)deleteKeychainKeyWithTagPrefix:(NSString *)tagPrefix error:(NSError **)outError {
+ NSString *keyTag = [self keychainKeyTagWithPrefix:kFIRInstallationsIIDKeyPairPublicTagPrefix];
+ NSDictionary *keyQuery = [self keyPairQueryWithTag:keyTag returnData:NO];
+
+ OSStatus status = SecItemDelete((__bridge CFDictionaryRef)keyQuery);
+
+ // When item is not found, it should NOT be considered as an error. The operation should
+ // continue.
+ if (status != noErr && status != errSecItemNotFound) {
+ FIRInstallationsItemSetErrorToPointer(
+ [FIRInstallationsErrorUtil keychainErrorWithFunction:@"SecItemDelete" status:status],
+ outError);
+ return NO;
+ }
+
+ return YES;
+}
+
+- (NSDictionary *)keyPairQueryWithTag:(NSString *)tag returnData:(BOOL)shouldReturnData {
+ NSMutableDictionary *query = [NSMutableDictionary dictionary];
+ NSData *tagData = [tag dataUsingEncoding:NSUTF8StringEncoding];
+
+ query[(__bridge id)kSecClass] = (__bridge id)kSecClassKey;
+ query[(__bridge id)kSecAttrApplicationTag] = tagData;
+ query[(__bridge id)kSecAttrKeyType] = (__bridge id)kSecAttrKeyTypeRSA;
+ if (shouldReturnData) {
+ query[(__bridge id)kSecReturnData] = @(YES);
+ }
+
+#if TARGET_OS_OSX
+ if (self.keychainRef) {
+ query[(__bridge NSString *)kSecMatchSearchList] = @[ (__bridge id)(self.keychainRef) ];
+ }
+#endif // TARGET_OSX
+
+ return query;
+}
+
+- (NSString *)keychainKeyTagWithPrefix:(NSString *)prefix {
+ NSString *mainAppBundleID = [[NSBundle mainBundle] bundleIdentifier];
+ if (mainAppBundleID.length == 0) {
+ return nil;
+ }
+ return [NSString stringWithFormat:@"%@%@", prefix, mainAppBundleID];
+}
+
+- (NSString *)mainbundleIdentifier {
+ NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
+ if (!bundleIdentifier.length) {
+ return nil;
+ }
+ return bundleIdentifier;
+}
+
+#pragma mark - Plist
+
+- (BOOL)deleteIIDFlagFromPlist:(NSError **)outError {
+ NSString *path = [self plistPath];
+ if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
+ return YES;
+ }
+
+ NSMutableDictionary *plistContent = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
+ plistContent[kFIRInstallationsIIDCreationTimePlistKey] = nil;
+
+ if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) {
+ return [plistContent writeToURL:[NSURL fileURLWithPath:path] error:outError];
+ }
+
+ return [plistContent writeToFile:path atomically:YES];
+}
+
+- (BOOL)hasPlistIIDFlag {
+ NSString *path = [self plistPath];
+ if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
+ return NO;
+ }
+
+ NSDictionary *plistContent = [[NSDictionary alloc] initWithContentsOfFile:path];
+ return plistContent[kFIRInstallationsIIDCreationTimePlistKey] != nil;
+}
+
+- (NSString *)plistPath {
+ NSString *plistNameWithExtension = @"com.google.iid-keypair.plist";
+ NSString *_subDirectoryName = @"Google/FirebaseInstanceID";
+
+ NSArray *directoryPaths =
+ NSSearchPathForDirectoriesInDomains([self supportedDirectory], NSUserDomainMask, YES);
+ NSArray *components = @[ directoryPaths.lastObject, _subDirectoryName, plistNameWithExtension ];
+
+ return [NSString pathWithComponents:components];
+}
+
+- (NSSearchPathDirectory)supportedDirectory {
+#if TARGET_OS_TV
+ return NSCachesDirectory;
+#else
+ return NSApplicationSupportDirectory;
+#endif
+}
+
+@end
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h
new file mode 100644
index 0000000000..ed98e3d70e
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+
+@class FBLPromise;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * The class reads a default IID token from IID store if available.
+ */
+@interface FIRInstallationsIIDTokenStore : NSObject
+
+- (instancetype)init NS_UNAVAILABLE;
+
+- (instancetype)initWithGCMSenderID:(NSString *)GCMSenderID;
+
+- (FBLPromise *)existingIIDDefaultToken;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.m
new file mode 100644
index 0000000000..1c9dbabeb6
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.m
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRInstallationsIIDTokenStore.h"
+
+#if __has_include()
+#import
+#else
+#import "FBLPromises.h"
+#endif
+
+#import "FIRInstallationsErrorUtil.h"
+#import "FIRInstallationsKeychainUtils.h"
+
+static NSString *const kFIRInstallationsIIDTokenKeychainId = @"com.google.iid-tokens";
+
+@interface FIRInstallationsIIDTokenInfo : NSObject
+@property(nonatomic, nullable, copy) NSString *token;
+@end
+
+@implementation FIRInstallationsIIDTokenInfo
+
++ (BOOL)supportsSecureCoding {
+ return YES;
+}
+
+- (void)encodeWithCoder:(nonnull NSCoder *)coder {
+}
+
+- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder {
+ self = [super init];
+ if (self) {
+ _token = [coder decodeObjectOfClass:[NSString class] forKey:@"token"];
+ }
+ return self;
+}
+
+@end
+
+@interface FIRInstallationsIIDTokenStore ()
+@property(nonatomic, readonly) NSString *GCMSenderID;
+@end
+
+@implementation FIRInstallationsIIDTokenStore
+
+- (instancetype)initWithGCMSenderID:(NSString *)GCMSenderID {
+ self = [super init];
+ if (self) {
+ _GCMSenderID = GCMSenderID;
+ }
+ return self;
+}
+
+- (FBLPromise *)existingIIDDefaultToken {
+ return [[FBLPromise onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)
+ do:^id _Nullable {
+ return [self IIDDefaultTokenData];
+ }] onQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)
+ then:^id _Nullable(NSData *_Nullable keychainData) {
+ return [self IIDCheckinWithData:keychainData];
+ }];
+}
+
+- (FBLPromise *)IIDCheckinWithData:(NSData *)data {
+ FBLPromise *resultPromise = [FBLPromise pendingPromise];
+
+ NSError *archiverError;
+ NSKeyedUnarchiver *unarchiver;
+ if (@available(iOS 11.0, tvOS 11.0, macOS 10.13, *)) {
+ unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:&archiverError];
+ } else {
+ @try {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
+#pragma clang diagnostic pop
+ } @catch (NSException *exception) {
+ archiverError = [FIRInstallationsErrorUtil keyedArchiverErrorWithException:exception];
+ }
+ }
+
+ if (!unarchiver) {
+ NSError *error = archiverError ?: [FIRInstallationsErrorUtil corruptedIIDTokenData];
+ [resultPromise reject:error];
+ return resultPromise;
+ }
+
+ [unarchiver setClass:[FIRInstallationsIIDTokenInfo class] forClassName:@"FIRInstanceIDTokenInfo"];
+ FIRInstallationsIIDTokenInfo *IIDTokenInfo =
+ [unarchiver decodeObjectOfClass:[FIRInstallationsIIDTokenInfo class]
+ forKey:NSKeyedArchiveRootObjectKey];
+
+ if (IIDTokenInfo.token.length < 1) {
+ [resultPromise reject:[FIRInstallationsErrorUtil corruptedIIDTokenData]];
+ return resultPromise;
+ }
+
+ [resultPromise fulfill:IIDTokenInfo.token];
+
+ return resultPromise;
+}
+
+- (FBLPromise *)IIDDefaultTokenData {
+ FBLPromise *resultPromise = [FBLPromise pendingPromise];
+
+ NSMutableDictionary *keychainQuery = [self IIDDefaultTokenDataKeychainQuery];
+ NSError *error;
+ NSData *data = [FIRInstallationsKeychainUtils getItemWithQuery:keychainQuery error:&error];
+
+ if (data) {
+ [resultPromise fulfill:data];
+ return resultPromise;
+ } else {
+ NSError *outError = error ?: [FIRInstallationsErrorUtil corruptedIIDTokenData];
+ [resultPromise reject:outError];
+ return resultPromise;
+ }
+}
+
+- (NSMutableDictionary *)IIDDefaultTokenDataKeychainQuery {
+ NSDictionary *query = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword};
+
+ NSMutableDictionary *finalQuery = [NSMutableDictionary dictionaryWithDictionary:query];
+ finalQuery[(__bridge NSString *)kSecAttrGeneric] = kFIRInstallationsIIDTokenKeychainId;
+
+ NSString *account = [self IIDAppIdentifier];
+ if ([account length]) {
+ finalQuery[(__bridge NSString *)kSecAttrAccount] = account;
+ }
+
+ finalQuery[(__bridge NSString *)kSecAttrService] =
+ [self serviceKeyForAuthorizedEntity:self.GCMSenderID scope:@"*"];
+ return finalQuery;
+}
+
+- (NSString *)IIDAppIdentifier {
+ return [[NSBundle mainBundle] bundleIdentifier] ?: @"";
+}
+
+- (NSString *)serviceKeyForAuthorizedEntity:(NSString *)authorizedEntity scope:(NSString *)scope {
+ return [NSString stringWithFormat:@"%@:%@", authorizedEntity, scope];
+}
+
+@end
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h
new file mode 100644
index 0000000000..b45475d1a1
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import
+
+@class FBLPromise;
+@class FIRInstallationsItem;
+
+NS_ASSUME_NONNULL_BEGIN
+
+FOUNDATION_EXPORT NSString *const kFIRInstallationsUserAgentKey;
+
+FOUNDATION_EXPORT NSString *const kFIRInstallationsHeartbeatKey;
+
+/**
+ * The class is responsible for interacting with HTTP REST API for Installations.
+ */
+@interface FIRInstallationsAPIService : NSObject
+
+/**
+ * The default initializer.
+ * @param APIKey The Firebase project API key (see `FIROptions.APIKey`).
+ * @param projectID The Firebase project ID (see `FIROptions.projectID`).
+ */
+- (instancetype)initWithAPIKey:(NSString *)APIKey projectID:(NSString *)projectID;
+
+/**
+ * Sends a request to register a new FID to get auth and refresh tokens.
+ * @param installation The `FIRInstallationsItem` instance with the FID to register.
+ * @return A promise that is resolved with a new `FIRInstallationsItem` instance with valid tokens.
+ * It is rejected with an error in case of a failure.
+ */
+- (FBLPromise *)registerInstallation:(FIRInstallationsItem *)installation;
+
+- (FBLPromise *)refreshAuthTokenForInstallation:
+ (FIRInstallationsItem *)installation;
+
+/**
+ * Sends a request to delete the installation, related auth tokens and all related data from the
+ * server.
+ * @param installation The installation to delete.
+ * @return Returns a promise that is resolved with the passed installation on successful deletion or
+ * is rejected with an error otherwise.
+ */
+- (FBLPromise *)deleteInstallation:(FIRInstallationsItem *)installation;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.m b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.m
new file mode 100644
index 0000000000..6e74622031
--- /dev/null
+++ b/Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.m
@@ -0,0 +1,362 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRInstallationsAPIService.h"
+
+#import
+
+#if __has_include(