瀏覽代碼

Sign up, PDF, Withdrawal updates

Hector Carrion 5 年之前
父節點
當前提交
633864320e
共有 51 個檔案被更改,包括 3356 行新增2618 行删除
  1. 105
    8
      EncuestaMarle/OnboardingViewController.swift
  2. 4
    0
      EncuestaMarle/ResearchContainerViewController.swift
  3. 7
    6
      EncuestaMarle/WithdrawViewController.swift
  4. 77
    55
      Podfile.lock
  5. 14
    0
      Pods/Firebase/CoreOnly/Sources/Firebase.h
  6. 二進制
      Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector
  7. 二進制
      Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics
  8. 3
    0
      Pods/FirebaseAuth/Firebase/Auth/CHANGELOG.md
  9. 8
    0
      Pods/FirebaseAuth/Firebase/Auth/Source/Public/FIRAuthErrors.h
  10. 33
    0
      Pods/FirebaseAuth/Firebase/Auth/Source/Public/FIRUser.h
  11. 14
    5
      Pods/FirebaseAuth/README.md
  12. 4
    0
      Pods/FirebaseCore/Firebase/Core/FIRApp.m
  13. 49
    42
      Pods/FirebaseCore/Firebase/Core/FIRComponentContainer.m
  14. 5
    2
      Pods/FirebaseCore/Firebase/Core/Private/FIRComponentContainerInternal.h
  15. 3
    2
      Pods/FirebaseCore/README.md
  16. 1
    1
      Pods/FirebaseInstanceID/Firebase/InstanceID/FIRIMessageCode.h
  17. 29
    57
      Pods/FirebaseInstanceID/Firebase/InstanceID/FIRInstanceID.m
  18. 10
    95
      Pods/FirebaseInstanceID/Firebase/InstanceID/FIRInstanceIDBackupExcludedPlist.m
  19. 2
    1
      Pods/FirebaseInstanceID/Firebase/InstanceID/FIRInstanceIDTokenManager.h
  20. 3
    3
      Pods/FirebaseInstanceID/Firebase/InstanceID/FIRInstanceIDTokenManager.m
  21. 14
    5
      Pods/FirebaseInstanceID/README.md
  22. 26
    0
      Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h
  23. 110
    28
      Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m
  24. 9
    0
      Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h
  25. 42
    8
      Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m
  26. 二進制
      Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.framework/GoogleAppMeasurement
  27. 6
    1
      Pods/GoogleUtilities/GoogleUtilities/Logger/GULLogger.m
  28. 10
    6
      Pods/GoogleUtilities/GoogleUtilities/Network/GULMutableDictionary.m
  29. 21
    2
      Pods/GoogleUtilities/GoogleUtilities/Network/GULNetworkURLSession.m
  30. 77
    55
      Pods/Manifest.lock
  31. 2254
    2224
      Pods/Pods.xcodeproj/project.pbxproj
  32. 1
    1
      Pods/Target Support Files/FirebaseAuth/FirebaseAuth-Info.plist
  33. 1
    1
      Pods/Target Support Files/FirebaseAuth/FirebaseAuth.xcconfig
  34. 1
    1
      Pods/Target Support Files/FirebaseCore/FirebaseCore-Info.plist
  35. 1
    1
      Pods/Target Support Files/FirebaseCore/FirebaseCore.xcconfig
  36. 1
    1
      Pods/Target Support Files/FirebaseInstanceID/FirebaseInstanceID-Info.plist
  37. 1
    1
      Pods/Target Support Files/FirebaseInstanceID/FirebaseInstanceID.xcconfig
  38. 1
    1
      Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-Info.plist
  39. 1
    1
      Pods/Target Support Files/GoogleUtilities/GoogleUtilities-Info.plist
  40. 203
    1
      Pods/Target Support Files/Pods-EncuestaMarle/Pods-EncuestaMarle-acknowledgements.markdown
  41. 204
    2
      Pods/Target Support Files/Pods-EncuestaMarle/Pods-EncuestaMarle-acknowledgements.plist
  42. 1
    1
      Pods/Target Support Files/nanopb/nanopb-Info.plist
  43. 0
    0
      Pods/nanopb/LICENSE.txt
  44. 0
    0
      Pods/nanopb/README.md
  45. 0
    0
      Pods/nanopb/pb.h
  46. 0
    0
      Pods/nanopb/pb_common.c
  47. 0
    0
      Pods/nanopb/pb_common.h
  48. 0
    0
      Pods/nanopb/pb_decode.c
  49. 0
    0
      Pods/nanopb/pb_decode.h
  50. 0
    0
      Pods/nanopb/pb_encode.c
  51. 0
    0
      Pods/nanopb/pb_encode.h

+ 105
- 8
EncuestaMarle/OnboardingViewController.swift 查看文件

@@ -38,6 +38,10 @@ var response_PDF = String()
38 38
 var tokenPDF = String()
39 39
 
40 40
 var resetPassword: Bool = false
41
+var jsonString_reset = String()
42
+var jsonDict_reset = [String: Any]()
43
+var n_jsonDict_reset = [String: Any]()
44
+var response_reset = String()
41 45
 
42 46
 func getConsent_task(task: ORKTaskViewController) -> ORKTaskViewController{
43 47
     return task
@@ -71,6 +75,56 @@ func limpiarJson_recovery(){
71 75
     }
72 76
 }
73 77
 
78
+//func limpiarJson_reset(){
79
+//    let resultados_encuestas = jsonDict_reset["results"] as! [[String:Any]]
80
+//    if let resultado_pregunta = resultados_encuestas[0]["results"] as? [[String:Any]]{
81
+//        n_jsonDict_reset["email"]=resultado_pregunta[0]["textAnswer"]
82
+//    }
83
+//}
84
+
85
+func sendEmail(email: String) {
86
+    
87
+    //impiarJson_reset()
88
+    
89
+    let jsonObject: NSMutableDictionary = NSMutableDictionary()
90
+    
91
+    jsonObject.setValue(email, forKey: "email")
92
+    
93
+    let request = NSMutableURLRequest(url: NSURL(string: "http://tania.uprrp.edu/askForEmail.php")! as URL)
94
+    request.httpMethod = "POST"
95
+    
96
+    let jsonData: NSData
97
+            
98
+    do {
99
+        jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: JSONSerialization.WritingOptions()) as NSData
100
+        let jsonEmail = NSString(data: jsonData as Data, encoding: String.Encoding.utf8.rawValue) as! String
101
+        print("✅ Email recieved, sending request...")
102
+        
103
+        let postString = "data=\(jsonEmail)"
104
+        request.httpBody = postString.data(using: String.Encoding.utf8)
105
+        
106
+        let task = URLSession.shared.dataTask(with: request as URLRequest) {
107
+            data, response, error in
108
+            if error != nil {
109
+                print("error=\(String(describing: error))")
110
+                return
111
+            }
112
+            
113
+            print("response solito Email = \(String(describing: response))") //Error: 1062
114
+            
115
+            let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
116
+            print("responseString Email = \(String(describing: responseString))")
117
+            
118
+            response_reset = responseString as! String
119
+        }
120
+        
121
+        task.resume()
122
+        
123
+    } catch {
124
+        print ("❌ JSON Failure")
125
+    }
126
+}
127
+
74 128
 func sendJson_reg() {
75 129
     
76 130
     let request = NSMutableURLRequest(url: NSURL(string: "http://tania.uprrp.edu/registration.php")! as URL)
@@ -110,8 +164,6 @@ func sendJson_r() {
110 164
     
111 165
     let request = NSMutableURLRequest(url: NSURL(string: "http://tania.uprrp.edu/recoverAccount.php")! as URL)
112 166
     request.httpMethod = "POST"
113
-    print("Json Log-In ✅ 👀")
114
-    print(jsonString_r)
115 167
     let postString = "data=\(jsonString_r)"
116 168
     request.httpBody = postString.data(using: String.Encoding.utf8)
117 169
     
@@ -153,6 +205,9 @@ func sendPDF(_ base64EncodedPDF: String, _ date: Date) {
153 205
         jsonObject.setValue(date.description, forKey: "signatureDate")
154 206
         jsonObject.setValue(tokenPDF, forKey: "token")
155 207
         
208
+        print("Date is formatted as: 📆")
209
+        print(date.description)
210
+        
156 211
         let jsonData: NSData
157 212
         
158 213
         do {
@@ -261,12 +316,27 @@ class OnboardingViewController: UIViewController {
261 316
     @IBAction func recover_account(_ sender: UIButton) {
262 317
         class LoginViewController : ORKLoginStepViewController {
263 318
             override func forgotPasswordButtonTapped() {
264
-                let alertTitle = NSLocalizedString("Enter your email and click submit", comment: "")
265
-                let alertMessage = NSLocalizedString("You will recieve an email to reset your password.", comment: "")
319
+                var email: String = ""
320
+                let alertTitle = NSLocalizedString("Enter your email", comment: "")
321
+                let alertMessage = NSLocalizedString("You will recieve instructions to reset your password.", comment: "")
266 322
                 let alert = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: UIAlertController.Style.alert)
267
-                alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
323
+                alert.addTextField { (textField) in
324
+                    textField.placeholder = "Email"
325
+                }
326
+                alert.addAction(UIAlertAction(title: "Submit", style: UIAlertAction.Style.default, handler: { [weak alert] (_) in
327
+                    let textField = alert!.textFields![0] // Force unwrapping because we know it exists.
328
+                    print("Text field email: \(String(describing: textField.text))")
329
+                    email = textField.text!
330
+                    sendEmail(email: email)
331
+                    let alertTitle2 = NSLocalizedString("If the email is registered we will send you an email", comment: "")
332
+                    let alertMessage2 = NSLocalizedString("Check \(email) for instructions to reset your password", comment: "")
333
+                    let alert2 = UIAlertController(title: alertTitle2, message: alertMessage2, preferredStyle: UIAlertController.Style.alert)
334
+                    alert2.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
335
+                    self.present(alert2, animated: true, completion: nil)
336
+                }))
337
+                alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel , handler: nil))
338
+                
268 339
                 self.present(alert, animated: true, completion: nil)
269
-                resetPassword = true
270 340
             }
271 341
         }
272 342
         
@@ -277,7 +347,18 @@ class OnboardingViewController: UIViewController {
277 347
         let taskViewController = ORKTaskViewController(task: orderedTask, taskRun: nil)
278 348
         taskViewController.delegate = self
279 349
         
280
-        task_def = "recover"
350
+        if (resetPassword) {
351
+            task_def = "reset"
352
+            resetPassword = false
353
+            let alertTitle2 = NSLocalizedString("Email will arrive soon", comment: "")
354
+            let alertMessage2 = NSLocalizedString("Check your inbox for instructions to reset your password", comment: "")
355
+            let alert2 = UIAlertController(title: alertTitle2, message: alertMessage2, preferredStyle: UIAlertController.Style.alert)
356
+            alert2.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
357
+            self.present(alert2, animated: true, completion: nil)
358
+        }
359
+        else {
360
+            task_def = "recover"
361
+        }
281 362
         present(taskViewController, animated: true, completion: nil)
282 363
 
283 364
     }
@@ -289,7 +370,23 @@ extension OnboardingViewController : ORKTaskViewControllerDelegate {
289 370
     public func taskViewController(_ taskViewController: ORKTaskViewController, didFinishWith reason: ORKTaskViewControllerFinishReason, error: Error?) {
290 371
         switch reason {
291 372
         case .completed:
292
-            if task_def == "recover"{
373
+            if task_def == "reset" {
374
+                let taskResult_reset = taskViewController.result
375
+                let jsonData_reset = try! ORKESerializer.jsonData(for: taskResult_reset)
376
+                jsonString_reset = NSString(data: jsonData_reset, encoding: String.Encoding.utf8.rawValue)! as String
377
+                jsonDict_reset = convertToDictionary(text: jsonString_r as String) as! [String: Any]
378
+                do {
379
+                    let jsonData_reset = try JSONSerialization.data(withJSONObject: jsonDict_reset, options: .prettyPrinted)
380
+                    jsonString_reset = NSString(data: jsonData_reset, encoding: String.Encoding.utf8.rawValue)! as String
381
+                }
382
+                catch {
383
+                    print(error.localizedDescription)
384
+                }
385
+                //sendEmail()
386
+                
387
+                
388
+            }
389
+            else if task_def == "recover"{
293 390
                 let taskResult_r = taskViewController.result
294 391
                 let jsonData_r = try! ORKESerializer.jsonData(for: taskResult_r)
295 392
                 jsonString_r = NSString(data: jsonData_r, encoding: String.Encoding.utf8.rawValue)! as String

+ 4
- 0
EncuestaMarle/ResearchContainerViewController.swift 查看文件

@@ -115,6 +115,10 @@ extension ResearchContainerViewController: ORKTaskViewControllerDelegate {
115 115
         if taskViewController is WithdrawViewController {
116 116
             if reason == .completed {
117 117
                 performSegue(withIdentifier: "toOnboarding", sender: self)
118
+                // on completion of withdrawl
119
+                print("❌ User is withdrawing with string: ")
120
+                print(jsonString_withdraw)
121
+                sendJson_withdraw()
118 122
             }
119 123
             dismiss(animated: true, completion: nil)
120 124
         }

+ 7
- 6
EncuestaMarle/WithdrawViewController.swift 查看文件

@@ -14,7 +14,7 @@ var jsonString_withdraw = String()
14 14
 
15 15
 func sendJson_withdraw(){
16 16
     
17
-    let request = NSMutableURLRequest(url: NSURL(string: "http://tania.uprrp.edu/withdraw.php")! as URL)
17
+    let request = NSMutableURLRequest(url: NSURL(string: "http://tania.uprrp.edu/withdrawl.php")! as URL)
18 18
     request.httpMethod = "POST"
19 19
     let postString = "data=\(jsonString_withdraw)"
20 20
     request.httpBody = postString.data(using: String.Encoding.utf8)
@@ -28,7 +28,7 @@ func sendJson_withdraw(){
28 28
         }
29 29
         
30 30
         let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
31
-        print("responseString = \(String(describing: responseString))")
31
+        print("responseString Withdrawl ❌ = \(String(describing: responseString))")
32 32
     } 
33 33
     task.resume()
34 34
 }
@@ -38,7 +38,7 @@ class WithdrawViewController: ORKTaskViewController {
38 38
     init() {
39 39
         let instructionStep = ORKInstructionStep(identifier: "WithdrawlInstruction")
40 40
         instructionStep.title = NSLocalizedString("Are you sure you want to withdraw?", comment: "")
41
-        instructionStep.text = NSLocalizedString("Withdrawing from the study will reset the app to the state it was in prior to you originally joining the study.", comment: "")
41
+        instructionStep.text = NSLocalizedString("Withdrawing from the study will delete all your information and reset the app.", comment: "")
42 42
         
43 43
         let completionStep = ORKCompletionStep(identifier: "Withdraw")
44 44
         completionStep.title = NSLocalizedString("We appreciate your time.", comment: "")
@@ -47,7 +47,6 @@ class WithdrawViewController: ORKTaskViewController {
47 47
         let withdrawTask = ORKOrderedTask(identifier: "Withdraw", steps: [instructionStep, completionStep])
48 48
         
49 49
         withdrawDict["token"]=token
50
-        withdrawDict["withdraw"]="yes"
51 50
         do {
52 51
             let jsonData_w = try JSONSerialization.data(withJSONObject: withdrawDict, options: .prettyPrinted)
53 52
             jsonString_withdraw = NSString(data: jsonData_w, encoding: String.Encoding.utf8.rawValue)! as String
@@ -55,8 +54,10 @@ class WithdrawViewController: ORKTaskViewController {
55 54
         catch {
56 55
             print(error.localizedDescription)
57 56
         }
58
-        print(jsonString_withdraw)
59
-        sendJson_withdraw()
57
+        // TODO: Move this to confirmation step
58
+//        print("❌ User is withdrawing with string: ")
59
+//        print(jsonString_withdraw)
60
+//        sendJson_withdraw()
60 61
         
61 62
         super.init(task: withdrawTask, taskRun: nil)
62 63
     }

+ 77
- 55
Podfile.lock 查看文件

@@ -6,66 +6,80 @@ PODS:
6 6
   - AWSCore (2.8.4)
7 7
   - AWSSNS (2.8.4):
8 8
     - AWSCore (= 2.8.4)
9
-  - Firebase/Auth (5.19.0):
9
+  - Firebase/Auth (6.11.0):
10 10
     - Firebase/CoreOnly
11
-    - FirebaseAuth (= 5.4.1)
12
-  - Firebase/Core (5.19.0):
11
+    - FirebaseAuth (~> 6.3.1)
12
+  - Firebase/Core (6.11.0):
13 13
     - Firebase/CoreOnly
14
-    - FirebaseAnalytics (= 5.8.0)
15
-  - Firebase/CoreOnly (5.19.0):
16
-    - FirebaseCore (= 5.4.0)
17
-  - FirebaseAnalytics (5.8.0):
18
-    - FirebaseCore (~> 5.4)
19
-    - FirebaseInstanceID (~> 3.8)
20
-    - GoogleAppMeasurement (= 5.8.0)
21
-    - GoogleUtilities/AppDelegateSwizzler (~> 5.2)
22
-    - GoogleUtilities/MethodSwizzler (~> 5.2)
23
-    - GoogleUtilities/Network (~> 5.2)
24
-    - "GoogleUtilities/NSData+zlib (~> 5.2)"
25
-    - nanopb (~> 0.3)
26
-  - FirebaseAuth (5.4.1):
14
+    - FirebaseAnalytics (= 6.1.3)
15
+  - Firebase/CoreOnly (6.11.0):
16
+    - FirebaseCore (= 6.3.2)
17
+  - FirebaseAnalytics (6.1.3):
18
+    - FirebaseCore (~> 6.3)
19
+    - FirebaseInstanceID (~> 4.2)
20
+    - GoogleAppMeasurement (= 6.1.3)
21
+    - GoogleUtilities/AppDelegateSwizzler (~> 6.0)
22
+    - GoogleUtilities/MethodSwizzler (~> 6.0)
23
+    - GoogleUtilities/Network (~> 6.0)
24
+    - "GoogleUtilities/NSData+zlib (~> 6.0)"
25
+    - nanopb (~> 0.3.901)
26
+  - FirebaseAuth (6.3.1):
27 27
     - FirebaseAuthInterop (~> 1.0)
28
-    - FirebaseCore (~> 5.2)
29
-    - GoogleUtilities/Environment (~> 5.2)
28
+    - FirebaseCore (~> 6.2)
29
+    - GoogleUtilities/AppDelegateSwizzler (~> 6.2)
30
+    - GoogleUtilities/Environment (~> 6.2)
30 31
     - GTMSessionFetcher/Core (~> 1.1)
31 32
   - FirebaseAuthInterop (1.0.0)
32
-  - FirebaseCore (5.4.0):
33
-    - GoogleUtilities/Environment (~> 5.2)
34
-    - GoogleUtilities/Logger (~> 5.2)
35
-  - FirebaseInstanceID (3.8.0):
36
-    - FirebaseCore (~> 5.2)
37
-    - GoogleUtilities/Environment (~> 5.2)
38
-    - GoogleUtilities/UserDefaults (~> 5.2)
39
-  - GoogleAppMeasurement (5.8.0):
40
-    - GoogleUtilities/AppDelegateSwizzler (~> 5.2)
41
-    - GoogleUtilities/MethodSwizzler (~> 5.2)
42
-    - GoogleUtilities/Network (~> 5.2)
43
-    - "GoogleUtilities/NSData+zlib (~> 5.2)"
44
-    - nanopb (~> 0.3)
45
-  - GoogleUtilities/AppDelegateSwizzler (5.5.0):
33
+  - FirebaseCore (6.3.2):
34
+    - FirebaseCoreDiagnostics (~> 1.0)
35
+    - FirebaseCoreDiagnosticsInterop (~> 1.0)
36
+    - GoogleUtilities/Environment (~> 6.2)
37
+    - GoogleUtilities/Logger (~> 6.2)
38
+  - FirebaseCoreDiagnostics (1.1.1):
39
+    - FirebaseCoreDiagnosticsInterop (~> 1.0)
40
+    - GoogleDataTransportCCTSupport (~> 1.0)
41
+    - GoogleUtilities/Environment (~> 6.2)
42
+    - GoogleUtilities/Logger (~> 6.2)
43
+    - nanopb (~> 0.3.901)
44
+  - FirebaseCoreDiagnosticsInterop (1.0.0)
45
+  - FirebaseInstanceID (4.2.6):
46
+    - FirebaseCore (~> 6.0)
47
+    - GoogleUtilities/Environment (~> 6.0)
48
+    - GoogleUtilities/UserDefaults (~> 6.0)
49
+  - GoogleAppMeasurement (6.1.3):
50
+    - GoogleUtilities/AppDelegateSwizzler (~> 6.0)
51
+    - GoogleUtilities/MethodSwizzler (~> 6.0)
52
+    - GoogleUtilities/Network (~> 6.0)
53
+    - "GoogleUtilities/NSData+zlib (~> 6.0)"
54
+    - nanopb (~> 0.3.901)
55
+  - GoogleDataTransport (3.0.1)
56
+  - GoogleDataTransportCCTSupport (1.2.1):
57
+    - GoogleDataTransport (~> 3.0)
58
+    - nanopb (~> 0.3.901)
59
+  - GoogleUtilities/AppDelegateSwizzler (6.3.1):
46 60
     - GoogleUtilities/Environment
47 61
     - GoogleUtilities/Logger
48 62
     - GoogleUtilities/Network
49
-  - GoogleUtilities/Environment (5.5.0)
50
-  - GoogleUtilities/Logger (5.5.0):
63
+  - GoogleUtilities/Environment (6.3.1)
64
+  - GoogleUtilities/Logger (6.3.1):
51 65
     - GoogleUtilities/Environment
52
-  - GoogleUtilities/MethodSwizzler (5.5.0):
66
+  - GoogleUtilities/MethodSwizzler (6.3.1):
53 67
     - GoogleUtilities/Logger
54
-  - GoogleUtilities/Network (5.5.0):
68
+  - GoogleUtilities/Network (6.3.1):
55 69
     - GoogleUtilities/Logger
56 70
     - "GoogleUtilities/NSData+zlib"
57 71
     - GoogleUtilities/Reachability
58
-  - "GoogleUtilities/NSData+zlib (5.5.0)"
59
-  - GoogleUtilities/Reachability (5.5.0):
72
+  - "GoogleUtilities/NSData+zlib (6.3.1)"
73
+  - GoogleUtilities/Reachability (6.3.1):
60 74
     - GoogleUtilities/Logger
61
-  - GoogleUtilities/UserDefaults (5.5.0):
75
+  - GoogleUtilities/UserDefaults (6.3.1):
62 76
     - GoogleUtilities/Logger
63
-  - GTMSessionFetcher/Core (1.2.1)
64
-  - nanopb (0.3.901):
65
-    - nanopb/decode (= 0.3.901)
66
-    - nanopb/encode (= 0.3.901)
67
-  - nanopb/decode (0.3.901)
68
-  - nanopb/encode (0.3.901)
77
+  - GTMSessionFetcher/Core (1.3.0)
78
+  - nanopb (0.3.9011):
79
+    - nanopb/decode (= 0.3.9011)
80
+    - nanopb/encode (= 0.3.9011)
81
+  - nanopb/decode (0.3.9011)
82
+  - nanopb/encode (0.3.9011)
69 83
 
70 84
 DEPENDENCIES:
71 85
   - AWSCognitoIdentityProvider (~> 2.8.0)
@@ -85,8 +99,12 @@ SPEC REPOS:
85 99
     - FirebaseAuth
86 100
     - FirebaseAuthInterop
87 101
     - FirebaseCore
102
+    - FirebaseCoreDiagnostics
103
+    - FirebaseCoreDiagnosticsInterop
88 104
     - FirebaseInstanceID
89 105
     - GoogleAppMeasurement
106
+    - GoogleDataTransport
107
+    - GoogleDataTransportCCTSupport
90 108
     - GoogleUtilities
91 109
     - GTMSessionFetcher
92 110
     - nanopb
@@ -96,17 +114,21 @@ SPEC CHECKSUMS:
96 114
   AWSCognitoIdentityProviderASF: f94f1a502e72ef3d0a1de93e10bf7a79c8698118
97 115
   AWSCore: 734b0d67c2c77f6edae9e5520431a37310ea4193
98 116
   AWSSNS: 42b39d6628bfb40bf5f9e3c6e4738ce68a323235
99
-  Firebase: c60d49e9c2630875a96207d15e2affb8364996d1
100
-  FirebaseAnalytics: fd72a26bf8dac84cefba2f0864366f718555a5b0
101
-  FirebaseAuth: cbb892a66baed025efc179372598941252acf853
117
+  Firebase: bc9cfc7a96c73268656d5aaab453ff1b4b530e0e
118
+  FirebaseAnalytics: 0e3ecff2c5d86070f7d4325e21f1edabfbd558dc
119
+  FirebaseAuth: b401a012cc33b04df3b52bb308b04e8766f2693e
102 120
   FirebaseAuthInterop: 0ffa57668be100582bb7643d4fcb7615496c41fc
103
-  FirebaseCore: 22a79a961c3951ef2f77b67bfbc99e454247b319
104
-  FirebaseInstanceID: cf488df2f4b79782f0e430b04a0e17c0aa7979b2
105
-  GoogleAppMeasurement: 1624046ab1bcc5e170061a56ef5679000b079c8e
106
-  GoogleUtilities: 6481e6318c5fcabaaa8513ef8120f329055d7c10
107
-  GTMSessionFetcher: 32aeca0aa144acea523e1c8e053089dec2cb98ca
108
-  nanopb: 2901f78ea1b7b4015c860c2fdd1ea2fee1a18d48
121
+  FirebaseCore: beeff42c07c30ea94702471d99db2089b594fbbd
122
+  FirebaseCoreDiagnostics: af29e43048607588c050889d19204f4d7b758c9f
123
+  FirebaseCoreDiagnosticsInterop: 6829da2b8d1fc795ff1bd99df751d3788035d2cb
124
+  FirebaseInstanceID: d0eafcd8bdbd3447cd694594734078c3e3e77d8b
125
+  GoogleAppMeasurement: 434cc7be25e71dc04b8d0e3079125127b330e84a
126
+  GoogleDataTransport: 166f9b9f82cbf60a204e8fe2daa9db3e3ec1fb15
127
+  GoogleDataTransportCCTSupport: f6ab1962e9dc05ab1fb938b795e5b310209edeec
128
+  GoogleUtilities: f895fde57977df4e0233edda0dbeac490e3703b6
129
+  GTMSessionFetcher: 43b8b64263023d4f32caa0b40f4c8bfa3c5f36d8
130
+  nanopb: 18003b5e52dab79db540fe93fe9579f399bd1ccd
109 131
 
110 132
 PODFILE CHECKSUM: b32d1d4808cf6b66bc130db9af762de0d62a6d2f
111 133
 
112
-COCOAPODS: 1.6.1
134
+COCOAPODS: 1.7.4

+ 14
- 0
Pods/Firebase/CoreOnly/Sources/Firebase.h 查看文件

@@ -1,3 +1,17 @@
1
+// Copyright 2019 Google
2
+//
3
+// Licensed under the Apache License, Version 2.0 (the "License");
4
+// you may not use this file except in compliance with the License.
5
+// You may obtain a copy of the License at
6
+//
7
+//      http://www.apache.org/licenses/LICENSE-2.0
8
+//
9
+// Unless required by applicable law or agreed to in writing, software
10
+// distributed under the License is distributed on an "AS IS" BASIS,
11
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+// See the License for the specific language governing permissions and
13
+// limitations under the License.
14
+
1 15
 #import <FirebaseCore/FirebaseCore.h>
2 16
 
3 17
 #if !defined(__has_include)

二進制
Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector 查看文件


二進制
Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics 查看文件


+ 3
- 0
Pods/FirebaseAuth/Firebase/Auth/CHANGELOG.md 查看文件

@@ -1,3 +1,6 @@
1
+# v6.3.0
2
+- [added] Added methods allowing developers to link and reauthenticate with federated providers. (#3971)
3
+
1 4
 # v6.2.3
2 5
 - [fixed] Make sure the first valid auth domain is retrieved. (#3493)
3 6
 - [fixed] Add assertion for Facebook generic IDP flow. (#3208)

+ 8
- 0
Pods/FirebaseAuth/Firebase/Auth/Source/Public/FIRAuthErrors.h 查看文件

@@ -321,6 +321,10 @@ typedef NS_ENUM(NSInteger, FIRAuthErrorCode) {
321 321
      */
322 322
     FIRAuthErrorCodeNullUser = 17067,
323 323
 
324
+    /** Indicates that a Firebase Dynamic Link is not activated.
325
+     */
326
+    FIRAuthErrorCodeDynamicLinkNotActivated = 17068,
327
+
324 328
     /**
325 329
      * Represents the error code for when the given provider id for a web operation is invalid.
326 330
      */
@@ -331,6 +335,10 @@ typedef NS_ENUM(NSInteger, FIRAuthErrorCode) {
331 335
      */
332 336
     FIRAuthErrorCodeInvalidDynamicLinkDomain = 17074,
333 337
 
338
+    /** Indicates that the credential is rejected because it's misformed or mismatching.
339
+     */
340
+    FIRAuthErrorCodeRejectedCredential = 17075,
341
+
334 342
     /** Indicates that the GameKit framework is not linked prior to attempting Game Center signin.
335 343
      */
336 344
     FIRAuthErrorCodeGameKitNotLinked = 17076,

+ 33
- 0
Pods/FirebaseAuth/Firebase/Auth/Source/Public/FIRUser.h 查看文件

@@ -24,6 +24,7 @@
24 24
 @class FIRPhoneAuthCredential;
25 25
 @class FIRUserProfileChangeRequest;
26 26
 @class FIRUserMetadata;
27
+@protocol FIRAuthUIDelegate;
27 28
 
28 29
 NS_ASSUME_NONNULL_BEGIN
29 30
 
@@ -269,6 +270,22 @@ DEPRECATED_MSG_ATTRIBUTE( "Please use reauthenticateWithCredential:completion: f
269 270
                          " Objective-C or reauthenticate(withCredential:completion:)"
270 271
                          " for Swift instead.");
271 272
 
273
+/** @fn reauthenticateWithProvider:UIDelegate:completion:
274
+    @brief Renews the user's authentication using the provided auth provider instance.
275
+
276
+    @param provider An instance of an auth provider used to initiate the reauthenticate flow.
277
+    @param UIDelegate Optionally an instance of a class conforming to the FIRAuthUIDelegate
278
+        protocol, this is used for presenting the web context. If nil, a default FIRAuthUIDelegate
279
+        will be used.
280
+    @param completion Optionally; a block which is invoked when the reauthenticate flow finishes, or
281
+        is canceled. Invoked asynchronously on the main thread in the future.
282
+ */
283
+- (void)reauthenticateWithProvider:(id<FIRFederatedAuthProvider>)provider
284
+                        UIDelegate:(nullable id<FIRAuthUIDelegate>)UIDelegate
285
+                        completion:(nullable FIRAuthDataResultCallback)completion
286
+                        NS_SWIFT_NAME(reauthenticate(with:uiDelegate:completion:))
287
+                        API_AVAILABLE(ios(8.0));
288
+
272 289
 /** @fn getIDTokenResultWithCompletion:
273 290
     @brief Retrieves the Firebase authentication token, possibly refreshing it if it has expired.
274 291
 
@@ -359,6 +376,22 @@ DEPRECATED_MSG_ATTRIBUTE("Please use linkWithCredential:completion: for Objectiv
359 376
 - (void)linkWithCredential:(FIRAuthCredential *)credential
360 377
                 completion:(nullable FIRAuthDataResultCallback)completion;
361 378
 
379
+/** @fn linkWithProvider:UIDelegate:completion:
380
+    @brief link the user with the provided auth provider instance.
381
+
382
+    @param provider An instance of an auth provider used to initiate the link flow.
383
+    @param UIDelegate Optionally an instance of a class conforming to the FIRAuthUIDelegate
384
+        protocol, this is used for presenting the web context. If nil, a default FIRAuthUIDelegate
385
+        will be used.
386
+    @param completion Optionally; a block which is invoked when the link flow finishes, or
387
+        is canceled. Invoked asynchronously on the main thread in the future.
388
+ */
389
+- (void)linkWithProvider:(id<FIRFederatedAuthProvider>)provider
390
+              UIDelegate:(nullable id<FIRAuthUIDelegate>)UIDelegate
391
+              completion:(nullable FIRAuthDataResultCallback)completion
392
+              NS_SWIFT_NAME(link(with:uiDelegate:completion:))
393
+              API_AVAILABLE(ios(8.0));
394
+
362 395
 /** @fn unlinkFromProvider:completion:
363 396
     @brief Disassociates a user account from a third-party identity provider with this user.
364 397
 

+ 14
- 5
Pods/FirebaseAuth/README.md 查看文件

@@ -3,7 +3,8 @@
3 3
 This repository contains a subset of the Firebase iOS SDK source. It currently
4 4
 includes FirebaseCore, FirebaseABTesting, FirebaseAuth, FirebaseDatabase,
5 5
 FirebaseFirestore, FirebaseFunctions, FirebaseInstanceID, FirebaseInAppMessaging,
6
-FirebaseInAppMessagingDisplay, FirebaseMessaging and FirebaseStorage.
6
+FirebaseInAppMessagingDisplay, FirebaseMessaging, FirebaseRemoteConfig, and
7
+FirebaseStorage.
7 8
 
8 9
 The repository also includes GoogleUtilities source. The
9 10
 [GoogleUtilities](GoogleUtilities/README.md) pod is
@@ -80,6 +81,9 @@ For the pod that you want to develop:
80 81
 
81 82
 `pod gen Firebase{name here}.podspec --local-sources=./ --auto-open`
82 83
 
84
+Note: If the CocoaPods cache is out of date, you may need to run
85
+`pod repo update` before the `pod gen` command.
86
+
83 87
 Firestore has a self contained Xcode project. See
84 88
 [Firestore/README.md](Firestore/README.md).
85 89
 
@@ -98,13 +102,17 @@ Travis will verify that any code changes are done in a style compliant way. Inst
98 102
 These commands will get the right versions:
99 103
 
100 104
 ```
101
-brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/773cb75d360b58f32048f5964038d09825a507c8/Formula/clang-format.rb
102
-brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/3dfea1004e0736754bbf49673cca8aaed8a94089/Formula/swiftformat.rb
105
+brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/e3496d9/Formula/clang-format.rb
106
+brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/7963c3d/Formula/swiftformat.rb
103 107
 ```
104 108
 
105 109
 Note: if you already have a newer version of these installed you may need to
106 110
 `brew switch` to this version.
107 111
 
112
+To update this section, find the versions of clang-format and swiftformat.rb to
113
+match the versions in the CI failure logs
114
+[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula).
115
+
108 116
 ### Running Unit Tests
109 117
 
110 118
 Select a scheme and press Command-u to build a component and run its unit tests.
@@ -179,8 +187,8 @@ participate in the Firebase community.
179 187
 
180 188
 ### macOS and tvOS
181 189
 Thanks to contributions from the community, FirebaseABTesting, FirebaseAuth, FirebaseCore,
182
-FirebaseDatabase, FirebaseMessaging,
183
-FirebaseFirestore, FirebaseFunctions and FirebaseStorage now compile, run unit tests, and work on
190
+FirebaseDatabase, FirebaseMessaging, FirebaseFirestore,
191
+FirebaseFunctions, FirebaseRemoteConfig, and FirebaseStorage now compile, run unit tests, and work on
184 192
 macOS and tvOS.
185 193
 
186 194
 For tvOS, checkout the [Sample](Example/tvOSSample).
@@ -202,6 +210,7 @@ pod 'FirebaseDatabase'
202 210
 pod 'FirebaseFirestore'
203 211
 pod 'FirebaseFunctions'
204 212
 pod 'FirebaseMessaging'
213
+pod 'FirebaseRemoteConfig'
205 214
 pod 'FirebaseStorage'
206 215
 ```
207 216
 

+ 4
- 0
Pods/FirebaseCore/Firebase/Core/FIRApp.m 查看文件

@@ -191,6 +191,10 @@ static NSMutableDictionary *sLibraryVersions;
191 191
     }
192 192
 
193 193
     [FIRApp addAppToAppDictionary:app];
194
+
195
+    // The FIRApp instance is ready to go, `sDefaultApp` is assigned, other SDKs are now ready to be
196
+    // instantiated.
197
+    [app.container instantiateEagerComponents];
194 198
     [FIRApp sendNotificationsToSDKs:app];
195 199
   }
196 200
 }

+ 49
- 42
Pods/FirebaseCore/Firebase/Core/FIRComponentContainer.m 查看文件

@@ -23,17 +23,18 @@
23 23
 
24 24
 NS_ASSUME_NONNULL_BEGIN
25 25
 
26
-@interface FIRComponentContainer () {
27
-  dispatch_queue_t _containerQueue;
28
-}
26
+@interface FIRComponentContainer ()
29 27
 
30
-/// The dictionary of components that are registered for a particular app. The key is an NSString
28
+/// The dictionary of components that are registered for a particular app. The key is an `NSString`
31 29
 /// of the protocol.
32 30
 @property(nonatomic, strong) NSMutableDictionary<NSString *, FIRComponentCreationBlock> *components;
33 31
 
34 32
 /// Cached instances of components that requested to be cached.
35 33
 @property(nonatomic, strong) NSMutableDictionary<NSString *, id> *cachedInstances;
36 34
 
35
+/// Protocols of components that have requested to be eagerly instantiated.
36
+@property(nonatomic, strong, nullable) NSMutableArray<Protocol *> *eagerProtocolsToInstantiate;
37
+
37 38
 @end
38 39
 
39 40
 @implementation FIRComponentContainer
@@ -69,8 +70,6 @@ static NSMutableSet<Class> *sFIRComponentRegistrants;
69 70
     _app = app;
70 71
     _cachedInstances = [NSMutableDictionary<NSString *, id> dictionary];
71 72
     _components = [NSMutableDictionary<NSString *, FIRComponentCreationBlock> dictionary];
72
-    _containerQueue =
73
-        dispatch_queue_create("com.google.FirebaseComponentContainer", DISPATCH_QUEUE_SERIAL);
74 73
 
75 74
     [self populateComponentsFromRegisteredClasses:allRegistrants forApp:app];
76 75
   }
@@ -78,6 +77,9 @@ static NSMutableSet<Class> *sFIRComponentRegistrants;
78 77
 }
79 78
 
80 79
 - (void)populateComponentsFromRegisteredClasses:(NSSet<Class> *)classes forApp:(FIRApp *)app {
80
+  // Keep track of any components that need to eagerly instantiate after all components are added.
81
+  self.eagerProtocolsToInstantiate = [[NSMutableArray alloc] init];
82
+
81 83
   // Loop through the verified component registrants and populate the components array.
82 84
   for (Class<FIRLibrary> klass in classes) {
83 85
     // Loop through all the components being registered and store them as appropriate.
@@ -96,14 +98,16 @@ static NSMutableSet<Class> *sFIRComponentRegistrants;
96 98
       // Store the creation block for later usage.
97 99
       self.components[protocolName] = component.creationBlock;
98 100
 
99
-      // Instantiate the instance if it has requested to be instantiated.
101
+      // Queue any protocols that should be eagerly instantiated. Don't instantiate them yet
102
+      // because they could depend on other components that haven't been added to the components
103
+      // array yet.
100 104
       BOOL shouldInstantiateEager =
101 105
           (component.instantiationTiming == FIRInstantiationTimingAlwaysEager);
102 106
       BOOL shouldInstantiateDefaultEager =
103 107
           (component.instantiationTiming == FIRInstantiationTimingEagerInDefaultApp &&
104 108
            [app isDefaultApp]);
105 109
       if (shouldInstantiateEager || shouldInstantiateDefaultEager) {
106
-        [self instantiateInstanceForProtocol:component.protocol withBlock:component.creationBlock];
110
+        [self.eagerProtocolsToInstantiate addObject:component.protocol];
107 111
       }
108 112
     }
109 113
   }
@@ -111,11 +115,28 @@ static NSMutableSet<Class> *sFIRComponentRegistrants;
111 115
 
112 116
 #pragma mark - Instance Creation
113 117
 
118
+- (void)instantiateEagerComponents {
119
+  // After all components are registered, instantiate the ones that are requesting eager
120
+  // instantiation.
121
+  @synchronized(self) {
122
+    for (Protocol *protocol in self.eagerProtocolsToInstantiate) {
123
+      // Get an instance for the protocol, which will instantiate it since it couldn't have been
124
+      // cached yet. Ignore the instance coming back since we don't need it.
125
+      __unused id unusedInstance = [self instanceForProtocol:protocol];
126
+    }
127
+
128
+    // All eager instantiation is complete, clear the stored property now.
129
+    self.eagerProtocolsToInstantiate = nil;
130
+  }
131
+}
132
+
114 133
 /// Instantiate an instance of a class that conforms to the specified protocol.
115 134
 /// This will:
116 135
 ///   - Call the block to create an instance if possible,
117 136
 ///   - Validate that the instance returned conforms to the protocol it claims to,
118 137
 ///   - Cache the instance if the block requests it
138
+///
139
+/// Note that this method assumes the caller already has @sychronized on self.
119 140
 - (nullable id)instantiateInstanceForProtocol:(Protocol *)protocol
120 141
                                     withBlock:(FIRComponentCreationBlock)creationBlock {
121 142
   if (!creationBlock) {
@@ -140,9 +161,7 @@ static NSMutableSet<Class> *sFIRComponentRegistrants;
140 161
 
141 162
   // The instance is ready to be returned, but check if it should be cached first before returning.
142 163
   if (shouldCache) {
143
-    dispatch_sync(_containerQueue, ^{
144
-      self.cachedInstances[protocolName] = instance;
145
-    });
164
+    self.cachedInstances[protocolName] = instance;
146 165
   }
147 166
 
148 167
   return instance;
@@ -153,47 +172,35 @@ static NSMutableSet<Class> *sFIRComponentRegistrants;
153 172
 - (nullable id)instanceForProtocol:(Protocol *)protocol {
154 173
   // Check if there is a cached instance, and return it if so.
155 174
   NSString *protocolName = NSStringFromProtocol(protocol);
156
-  __block id cachedInstance;
157
-  dispatch_sync(_containerQueue, ^{
158
-    cachedInstance = self.cachedInstances[protocolName];
159
-  });
160 175
 
161
-  if (cachedInstance) {
162
-    return cachedInstance;
176
+  id cachedInstance;
177
+  @synchronized(self) {
178
+    cachedInstance = self.cachedInstances[protocolName];
179
+    if (!cachedInstance) {
180
+      // Use the creation block to instantiate an instance and return it.
181
+      FIRComponentCreationBlock creationBlock = self.components[protocolName];
182
+      cachedInstance = [self instantiateInstanceForProtocol:protocol withBlock:creationBlock];
183
+    }
163 184
   }
164
-
165
-  // Use the creation block to instantiate an instance and return it.
166
-  FIRComponentCreationBlock creationBlock = self.components[protocolName];
167
-  return [self instantiateInstanceForProtocol:protocol withBlock:creationBlock];
185
+  return cachedInstance;
168 186
 }
169 187
 
170 188
 #pragma mark - Lifecycle
171 189
 
172 190
 - (void)removeAllCachedInstances {
173
-  // Loop through the cache and notify each instance that is a maintainer to clean up after itself.
174
-  // Design note: we're getting a copy here, unlocking the cached instances, iterating over the
175
-  // copy, then locking and removing all cached instances. A race condition *could* exist where a
176
-  // new cached instance is created between the copy and the removal, but the chances are slim and
177
-  // side-effects are significantly smaller than including the entire loop in the `dispatch_sync`
178
-  // block (access to the cache from inside the block would deadlock and crash).
179
-  __block NSDictionary<NSString *, id> *instancesCopy;
180
-  dispatch_sync(_containerQueue, ^{
181
-    instancesCopy = [self.cachedInstances copy];
182
-  });
183
-
184
-  for (id instance in instancesCopy.allValues) {
185
-    if ([instance conformsToProtocol:@protocol(FIRComponentLifecycleMaintainer)] &&
186
-        [instance respondsToSelector:@selector(appWillBeDeleted:)]) {
187
-      [instance appWillBeDeleted:self.app];
191
+  @synchronized(self) {
192
+    // Loop through the cache and notify each instance that is a maintainer to clean up after
193
+    // itself.
194
+    for (id instance in self.cachedInstances.allValues) {
195
+      if ([instance conformsToProtocol:@protocol(FIRComponentLifecycleMaintainer)] &&
196
+          [instance respondsToSelector:@selector(appWillBeDeleted:)]) {
197
+        [instance appWillBeDeleted:self.app];
198
+      }
188 199
     }
189
-  }
190
-
191
-  instancesCopy = nil;
192 200
 
193
-  // Empty the cache.
194
-  dispatch_sync(_containerQueue, ^{
201
+    // Empty the cache.
195 202
     [self.cachedInstances removeAllObjects];
196
-  });
203
+  }
197 204
 }
198 205
 
199 206
 @end

+ 5
- 2
Pods/FirebaseCore/Firebase/Core/Private/FIRComponentContainerInternal.h 查看文件

@@ -24,13 +24,16 @@ NS_ASSUME_NONNULL_BEGIN
24 24
 
25 25
 @interface FIRComponentContainer (Private)
26 26
 
27
-/// Initializes a contain for a given app. This should only be called by the app itself.
27
+/// Initializes a container for a given app. This should only be called by the app itself.
28 28
 - (instancetype)initWithApp:(FIRApp *)app;
29 29
 
30 30
 /// Retrieves an instance that conforms to the specified protocol. This will return `nil` if the
31
-/// protocol wasn't registered, or if the instance couldn't instantiate for the provided app.
31
+/// protocol wasn't registered, or if the instance couldn't be instantiated for the provided app.
32 32
 - (nullable id)instanceForProtocol:(Protocol *)protocol NS_SWIFT_NAME(instance(for:));
33 33
 
34
+/// Instantiates all the components that have registered as "eager" after initialization.
35
+- (void)instantiateEagerComponents;
36
+
34 37
 /// Remove all of the cached instances stored and allow them to clean up after themselves.
35 38
 - (void)removeAllCachedInstances;
36 39
 

+ 3
- 2
Pods/FirebaseCore/README.md 查看文件

@@ -81,6 +81,9 @@ For the pod that you want to develop:
81 81
 
82 82
 `pod gen Firebase{name here}.podspec --local-sources=./ --auto-open`
83 83
 
84
+Note: If the CocoaPods cache is out of date, you may need to run
85
+`pod repo update` before the `pod gen` command.
86
+
84 87
 Firestore has a self contained Xcode project. See
85 88
 [Firestore/README.md](Firestore/README.md).
86 89
 
@@ -195,8 +198,6 @@ actively developed primarily for iOS. While we can catch basic unit test issues
195 198
 may be some changes where the SDK no longer works as expected on macOS or tvOS. If you encounter
196 199
 this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues).
197 200
 
198
-Note that the Firebase pod is not available for macOS and tvOS.
199
-
200 201
 To install, add a subset of the following to the Podfile:
201 202
 
202 203
 ```

+ 1
- 1
Pods/FirebaseInstanceID/Firebase/InstanceID/FIRIMessageCode.h 查看文件

@@ -55,10 +55,10 @@ typedef NS_ENUM(NSInteger, FIRInstanceIDMessageCode) {
55 55
   kFIRInstanceIDMessageCodeAuthServiceCheckinInProgress = 5004,
56 56
 
57 57
   // FIRInstanceIDBackupExcludedPlist.m
58
+  // Do NOT USE 6003
58 59
   kFIRInstanceIDMessageCodeBackupExcludedPlist000 = 6000,
59 60
   kFIRInstanceIDMessageCodeBackupExcludedPlist001 = 6001,
60 61
   kFIRInstanceIDMessageCodeBackupExcludedPlist002 = 6002,
61
-  kFIRInstanceIDMessageCodeBackupExcludedPlistInvalidPlistEnum = 6003,
62 62
   // FIRInstanceIDCheckinService.m
63 63
   kFIRInstanceIDMessageCodeService000 = 7000,
64 64
   kFIRInstanceIDMessageCodeService001 = 7001,

+ 29
- 57
Pods/FirebaseInstanceID/Firebase/InstanceID/FIRInstanceID.m 查看文件

@@ -22,6 +22,7 @@
22 22
 #import <FirebaseCore/FIRLibrary.h>
23 23
 #import <FirebaseCore/FIROptions.h>
24 24
 #import <GoogleUtilities/GULAppEnvironmentUtil.h>
25
+#import <GoogleUtilities/GULUserDefaults.h>
25 26
 #import "FIRInstanceID+Private.h"
26 27
 #import "FIRInstanceIDAuthService.h"
27 28
 #import "FIRInstanceIDCheckinPreferences.h"
@@ -67,8 +68,8 @@ static NSString *const kEntitlementsKeyForMac = @"Entitlements";
67 68
 static NSString *const kAPSEnvironmentDevelopmentValue = @"development";
68 69
 /// FIRMessaging selector that returns the current FIRMessaging auto init
69 70
 /// enabled flag.
70
-static NSString *const kFIRInstanceIDFCMSelectorAutoInitEnabled = @"isAutoInitEnabled";
71
-static NSString *const kFIRInstanceIDFCMSelectorInstance = @"messaging";
71
+static NSString *const kFIRInstanceIDFCMSelectorAutoInitEnabled =
72
+    @"isAutoInitEnabledWithUserDefaults:";
72 73
 
73 74
 static NSString *const kFIRInstanceIDAPNSTokenType = @"APNSTokenType";
74 75
 static NSString *const kFIRIIDAppReadyToConfigureSDKNotification =
@@ -77,8 +78,6 @@ static NSString *const kFIRIIDAppNameKey = @"FIRAppNameKey";
77 78
 static NSString *const kFIRIIDErrorDomain = @"com.firebase.instanceid";
78 79
 static NSString *const kFIRIIDServiceInstanceID = @"InstanceID";
79 80
 
80
-static NSInteger const kFIRIIDErrorCodeInstanceIDFailed = -121;
81
-
82 81
 typedef void (^FIRInstanceIDKeyPairHandler)(FIRInstanceIDKeyPair *keyPair, NSError *error);
83 82
 
84 83
 /**
@@ -639,41 +638,41 @@ static FIRInstanceID *gInstanceID;
639 638
 + (nonnull NSArray<FIRComponent *> *)componentsToRegister {
640 639
   FIRComponentCreationBlock creationBlock =
641 640
       ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) {
641
+    // InstanceID only works with the default app.
642
+    if (!container.app.isDefaultApp) {
643
+      // Only configure for the default FIRApp.
644
+      FIRInstanceIDLoggerDebug(kFIRInstanceIDMessageCodeFIRApp002,
645
+                               @"Firebase Instance ID only works with the default app.");
646
+      return nil;
647
+    }
648
+
642 649
     // Ensure it's cached so it returns the same instance every time instanceID is called.
643 650
     *isCacheable = YES;
644 651
     FIRInstanceID *instanceID = [[FIRInstanceID alloc] initPrivately];
645 652
     [instanceID start];
653
+    [instanceID configureInstanceIDWithOptions:container.app.options];
646 654
     return instanceID;
647 655
   };
648 656
   FIRComponent *instanceIDProvider =
649 657
       [FIRComponent componentWithProtocol:@protocol(FIRInstanceIDInstanceProvider)
650
-                      instantiationTiming:FIRInstantiationTimingLazy
658
+                      instantiationTiming:FIRInstantiationTimingEagerInDefaultApp
651 659
                              dependencies:@[]
652 660
                             creationBlock:creationBlock];
653 661
   return @[ instanceIDProvider ];
654 662
 }
655 663
 
656
-+ (void)configureWithApp:(FIRApp *)app {
657
-  if (!app.isDefaultApp) {
658
-    // Only configure for the default FIRApp.
659
-    FIRInstanceIDLoggerDebug(kFIRInstanceIDMessageCodeFIRApp002,
660
-                             @"Firebase Instance ID only works with the default app.");
661
-    return;
662
-  }
663
-  [[FIRInstanceID instanceID] configureInstanceIDWithOptions:app.options app:app];
664
-}
665
-
666
-- (void)configureInstanceIDWithOptions:(FIROptions *)options app:(FIRApp *)firApp {
664
+- (void)configureInstanceIDWithOptions:(FIROptions *)options {
667 665
   NSString *GCMSenderID = options.GCMSenderID;
668 666
   if (!GCMSenderID.length) {
669 667
     FIRInstanceIDLoggerError(kFIRInstanceIDMessageCodeFIRApp000,
670 668
                              @"Firebase not set up correctly, nil or empty senderID.");
671
-    [FIRInstanceID exitWithReason:@"GCM_SENDER_ID must not be nil or empty." forFirebaseApp:firApp];
672
-    return;
669
+    [NSException raise:kFIRIIDErrorDomain
670
+                format:@"Could not configure Firebase InstanceID. GCMSenderID must not be nil or "
671
+                       @"empty."];
673 672
   }
674 673
 
675 674
   self.fcmSenderID = GCMSenderID;
676
-  self.firebaseAppID = firApp.options.googleAppID;
675
+  self.firebaseAppID = options.googleAppID;
677 676
 
678 677
   // FCM generates a FCM token during app start for sending push notification to device.
679 678
   // This is not needed for app extension.
@@ -682,26 +681,6 @@ static FIRInstanceID *gInstanceID;
682 681
   }
683 682
 }
684 683
 
685
-+ (NSError *)configureErrorWithReason:(nonnull NSString *)reason {
686
-  NSString *description =
687
-      [NSString stringWithFormat:@"Configuration failed for service %@.", kFIRIIDServiceInstanceID];
688
-  if (!reason.length) {
689
-    reason = @"Unknown reason";
690
-  }
691
-
692
-  NSDictionary *userInfo =
693
-      @{NSLocalizedDescriptionKey : description, NSLocalizedFailureReasonErrorKey : reason};
694
-
695
-  return [NSError errorWithDomain:kFIRIIDErrorDomain
696
-                             code:kFIRIIDErrorCodeInstanceIDFailed
697
-                         userInfo:userInfo];
698
-}
699
-
700
-+ (void)exitWithReason:(nonnull NSString *)reason forFirebaseApp:(FIRApp *)firebaseApp {
701
-  [NSException raise:kFIRIIDErrorDomain
702
-              format:@"Could not configure Firebase InstanceID. %@", reason];
703
-}
704
-
705 684
 // This is used to start any operations when we receive FirebaseSDK setup notification
706 685
 // from FIRCore.
707 686
 - (void)didCompleteConfigure {
@@ -709,7 +688,9 @@ static FIRInstanceID *gInstanceID;
709 688
   // When there is a cached token, do the token refresh.
710 689
   if (cachedToken) {
711 690
     // Clean up expired tokens by checking the token refresh policy.
712
-    if ([self.tokenManager checkForTokenRefreshPolicy]) {
691
+    NSError *error;
692
+    NSString *cachedIID = [self.keyPairStore appIdentityWithError:&error];
693
+    if ([self.tokenManager checkTokenRefreshPolicyWithIID:cachedIID]) {
713 694
       // Default token is expired, fetch default token from server.
714 695
       [self defaultTokenWithHandler:nil];
715 696
     }
@@ -736,29 +717,20 @@ static FIRInstanceID *gInstanceID;
736 717
     return NO;
737 718
   }
738 719
 
739
-  // Messaging doesn't have the singleton method, auto init should be enabled since FCM exists.
740
-  SEL instanceSelector = NSSelectorFromString(kFIRInstanceIDFCMSelectorInstance);
741
-  if (![messagingClass respondsToSelector:instanceSelector]) {
742
-    return YES;
743
-  }
744
-
745
-  // Get FIRMessaging shared instance.
746
-  IMP messagingInstanceIMP = [messagingClass methodForSelector:instanceSelector];
747
-  id (*getMessagingInstance)(id, SEL) = (void *)messagingInstanceIMP;
748
-  id messagingInstance = getMessagingInstance(messagingClass, instanceSelector);
749
-
750
-  // Messaging doesn't have the property, auto init should be enabled since FCM exists.
720
+  // Messaging doesn't have the class method, auto init should be enabled since FCM exists.
751 721
   SEL autoInitSelector = NSSelectorFromString(kFIRInstanceIDFCMSelectorAutoInitEnabled);
752
-  if (![messagingInstance respondsToSelector:autoInitSelector]) {
722
+  if (![messagingClass respondsToSelector:autoInitSelector]) {
753 723
     return YES;
754 724
   }
755 725
 
756
-  // Get autoInitEnabled method.
757
-  IMP isAutoInitEnabledIMP = [messagingInstance methodForSelector:autoInitSelector];
758
-  BOOL (*isAutoInitEnabled)(id, SEL) = (BOOL(*)(id, SEL))isAutoInitEnabledIMP;
726
+  // Get the autoInitEnabled class method.
727
+  IMP isAutoInitEnabledIMP = [messagingClass methodForSelector:autoInitSelector];
728
+  BOOL(*isAutoInitEnabled)
729
+  (Class, SEL, GULUserDefaults *) = (BOOL(*)(id, SEL, GULUserDefaults *))isAutoInitEnabledIMP;
759 730
 
760 731
   // Check FCM's isAutoInitEnabled property.
761
-  return isAutoInitEnabled(messagingInstance, autoInitSelector);
732
+  return isAutoInitEnabled(messagingClass, autoInitSelector,
733
+                           [GULUserDefaults standardUserDefaults]);
762 734
 }
763 735
 
764 736
 // Actually makes InstanceID instantiate both the IID and Token-related subsystems.

+ 10
- 95
Pods/FirebaseInstanceID/Firebase/InstanceID/FIRInstanceIDBackupExcludedPlist.m 查看文件

@@ -18,18 +18,10 @@
18 18
 
19 19
 #import "FIRInstanceIDLogger.h"
20 20
 
21
-typedef enum : NSUInteger {
22
-  FIRInstanceIDPlistDirectoryUnknown,
23
-  FIRInstanceIDPlistDirectoryDocuments,
24
-  FIRInstanceIDPlistDirectoryApplicationSupport,
25
-} FIRInstanceIDPlistDirectory;
26
-
27 21
 @interface FIRInstanceIDBackupExcludedPlist ()
28 22
 
29 23
 @property(nonatomic, readwrite, copy) NSString *fileName;
30 24
 @property(nonatomic, readwrite, copy) NSString *subDirectoryName;
31
-@property(nonatomic, readwrite, assign) BOOL fileInStandardDirectory;
32
-
33 25
 @property(nonatomic, readwrite, strong) NSDictionary *cachedPlistContents;
34 26
 
35 27
 @end
@@ -41,19 +33,12 @@ typedef enum : NSUInteger {
41 33
   if (self) {
42 34
     _fileName = [fileName copy];
43 35
     _subDirectoryName = [subDirectory copy];
44
-#if TARGET_OS_IOS
45
-    _fileInStandardDirectory = [self moveToApplicationSupportSubDirectory:subDirectory];
46
-#else
47
-    // For tvOS and macOS, we never store the content in document folder, so
48
-    // the migration is unnecessary.
49
-    _fileInStandardDirectory = YES;
50
-#endif
51 36
   }
52 37
   return self;
53 38
 }
54 39
 
55 40
 - (BOOL)writeDictionary:(NSDictionary *)dict error:(NSError **)error {
56
-  NSString *path = [self plistPathInDirectory:[self plistDirectory]];
41
+  NSString *path = [self plistPathInDirectory];
57 42
   if (![dict writeToFile:path atomically:YES]) {
58 43
     FIRInstanceIDLoggerError(kFIRInstanceIDMessageCodeBackupExcludedPlist000,
59 44
                              @"Failed to write to %@.plist", self.fileName);
@@ -85,7 +70,7 @@ typedef enum : NSUInteger {
85 70
 
86 71
 - (BOOL)deleteFile:(NSError **)error {
87 72
   BOOL success = YES;
88
-  NSString *path = [self plistPathInDirectory:[self plistDirectory]];
73
+  NSString *path = [self plistPathInDirectory];
89 74
   if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
90 75
     success = [[NSFileManager defaultManager] removeItemAtPath:path error:error];
91 76
   }
@@ -96,7 +81,7 @@ typedef enum : NSUInteger {
96 81
 
97 82
 - (NSDictionary *)contentAsDictionary {
98 83
   if (!self.cachedPlistContents) {
99
-    NSString *path = [self plistPathInDirectory:[self plistDirectory]];
84
+    NSString *path = [self plistPathInDirectory];
100 85
     if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
101 86
       self.cachedPlistContents = [[NSDictionary alloc] initWithContentsOfFile:path];
102 87
     }
@@ -104,93 +89,23 @@ typedef enum : NSUInteger {
104 89
   return self.cachedPlistContents;
105 90
 }
106 91
 
107
-- (BOOL)moveToApplicationSupportSubDirectory:(NSString *)subDirectoryName {
108
-  NSArray *directoryPaths =
109
-      NSSearchPathForDirectoriesInDomains([self supportedDirectory], NSUserDomainMask, YES);
110
-  // This only going to happen inside iOS so it is an applicationSupportDirectory.
111
-  NSString *applicationSupportDirPath = directoryPaths.lastObject;
112
-  NSArray *components = @[ applicationSupportDirPath, subDirectoryName ];
113
-  NSString *subDirectoryPath = [NSString pathWithComponents:components];
114
-  BOOL hasSubDirectory;
115
-  if (![[NSFileManager defaultManager] fileExistsAtPath:subDirectoryPath
116
-                                            isDirectory:&hasSubDirectory]) {
117
-    // Cannot move to non-existent directory
118
-    return NO;
119
-  }
120
-
121
-  if ([self doesFileExistInDirectory:FIRInstanceIDPlistDirectoryDocuments]) {
122
-    NSString *oldPlistPath = [self plistPathInDirectory:FIRInstanceIDPlistDirectoryDocuments];
123
-    NSString *newPlistPath =
124
-        [self plistPathInDirectory:FIRInstanceIDPlistDirectoryApplicationSupport];
125
-    if ([self doesFileExistInDirectory:FIRInstanceIDPlistDirectoryApplicationSupport]) {
126
-      // File exists in both Documents and ApplicationSupport
127
-      return NO;
128
-    }
129
-    NSError *moveError;
130
-    if (![[NSFileManager defaultManager] moveItemAtPath:oldPlistPath
131
-                                                 toPath:newPlistPath
132
-                                                  error:&moveError]) {
133
-      FIRInstanceIDLoggerError(kFIRInstanceIDMessageCodeBackupExcludedPlist002,
134
-                               @"Failed to move file %@ from %@ to %@. Error: %@", self.fileName,
135
-                               oldPlistPath, newPlistPath, moveError);
136
-      return NO;
137
-    }
138
-  }
139
-  // We moved the file if it existed, otherwise we didn't need to do anything
140
-  return YES;
141
-}
142
-
143 92
 - (BOOL)doesFileExist {
144
-  return [self doesFileExistInDirectory:[self plistDirectory]];
93
+  NSString *path = [self plistPathInDirectory];
94
+  return [[NSFileManager defaultManager] fileExistsAtPath:path];
145 95
 }
146 96
 
147 97
 #pragma mark - Private
148 98
 
149
-- (FIRInstanceIDPlistDirectory)plistDirectory {
150
-  if (_fileInStandardDirectory) {
151
-    return FIRInstanceIDPlistDirectoryApplicationSupport;
152
-  } else {
153
-    return FIRInstanceIDPlistDirectoryDocuments;
154
-  };
155
-}
156
-
157
-- (NSString *)plistPathInDirectory:(FIRInstanceIDPlistDirectory)directory {
158
-  return [self pathWithName:self.fileName inDirectory:directory];
159
-}
160
-
161
-- (NSString *)pathWithName:(NSString *)plistName
162
-               inDirectory:(FIRInstanceIDPlistDirectory)directory {
99
+- (NSString *)plistPathInDirectory {
163 100
   NSArray *directoryPaths;
164
-  NSArray *components = @[];
165
-  NSString *plistNameWithExtension = [NSString stringWithFormat:@"%@.plist", plistName];
166
-  switch (directory) {
167
-    case FIRInstanceIDPlistDirectoryDocuments:
168
-      directoryPaths =
169
-          NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
170
-      components = @[ directoryPaths.lastObject, plistNameWithExtension ];
171
-      break;
172
-
173
-    case FIRInstanceIDPlistDirectoryApplicationSupport:
174
-      directoryPaths =
175
-          NSSearchPathForDirectoriesInDomains([self supportedDirectory], NSUserDomainMask, YES);
176
-      components = @[ directoryPaths.lastObject, _subDirectoryName, plistNameWithExtension ];
177
-      break;
178
-
179
-    default:
180
-      FIRInstanceIDLoggerError(kFIRInstanceIDMessageCodeBackupExcludedPlistInvalidPlistEnum,
181
-                               @"Invalid plist directory type: %lu", (unsigned long)directory);
182
-      NSAssert(NO, @"Invalid plist directory type: %lu", (unsigned long)directory);
183
-      break;
184
-  }
101
+  NSString *plistNameWithExtension = [NSString stringWithFormat:@"%@.plist", self.fileName];
102
+  directoryPaths =
103
+      NSSearchPathForDirectoriesInDomains([self supportedDirectory], NSUserDomainMask, YES);
104
+  NSArray *components = @[ directoryPaths.lastObject, _subDirectoryName, plistNameWithExtension ];
185 105
 
186 106
   return [NSString pathWithComponents:components];
187 107
 }
188 108
 
189
-- (BOOL)doesFileExistInDirectory:(FIRInstanceIDPlistDirectory)directory {
190
-  NSString *path = [self plistPathInDirectory:directory];
191
-  return [[NSFileManager defaultManager] fileExistsAtPath:path];
192
-}
193
-
194 109
 - (NSSearchPathDirectory)supportedDirectory {
195 110
 #if TARGET_OS_TV
196 111
   return NSCachesDirectory;

+ 2
- 1
Pods/FirebaseInstanceID/Firebase/InstanceID/FIRInstanceIDTokenManager.h 查看文件

@@ -121,13 +121,14 @@ typedef NS_OPTIONS(NSUInteger, FIRInstanceIDInvalidTokenReason) {
121 121
 /**
122 122
  *  Invalidate any cached tokens, if the app version has changed since last launch or if the token
123 123
  *  is cached for more than 7 days.
124
+ *  @param IID The cached instanceID, check if token is prefixed by such IID.
124 125
  *
125 126
  *  @return Whether we should fetch default token from server.
126 127
  *
127 128
  *  @discussion This should safely be called prior to any tokens being retrieved from
128 129
  *  the cache or being fetched from the network.
129 130
  */
130
-- (BOOL)checkForTokenRefreshPolicy;
131
+- (BOOL)checkTokenRefreshPolicyWithIID:(NSString *)IID;
131 132
 
132 133
 /**
133 134
  *  Upon being provided with different APNs or sandbox, any locally cached tokens

+ 3
- 3
Pods/FirebaseInstanceID/Firebase/InstanceID/FIRInstanceIDTokenManager.m 查看文件

@@ -273,7 +273,7 @@
273 273
 }
274 274
 
275 275
 #pragma mark - Invalidating Cached Tokens
276
-- (BOOL)checkForTokenRefreshPolicy {
276
+- (BOOL)checkTokenRefreshPolicyWithIID:(NSString *)IID {
277 277
   // We know at least one cached token exists.
278 278
   BOOL shouldFetchDefaultToken = NO;
279 279
   NSArray<FIRInstanceIDTokenInfo *> *tokenInfos = [self.instanceIDStore cachedTokenInfos];
@@ -282,8 +282,8 @@
282 282
       [NSMutableArray arrayWithCapacity:tokenInfos.count];
283 283
   for (FIRInstanceIDTokenInfo *tokenInfo in tokenInfos) {
284 284
     BOOL isTokenFresh = [tokenInfo isFresh];
285
-    if (isTokenFresh) {
286
-      // Token is fresh, do nothing.
285
+    if (isTokenFresh && [tokenInfo.token hasPrefix:IID]) {
286
+      // Token is fresh and in right format, do nothing
287 287
       continue;
288 288
     }
289 289
     if ([tokenInfo.scope isEqualToString:kFIRInstanceIDDefaultTokenScope]) {

+ 14
- 5
Pods/FirebaseInstanceID/README.md 查看文件

@@ -3,7 +3,8 @@
3 3
 This repository contains a subset of the Firebase iOS SDK source. It currently
4 4
 includes FirebaseCore, FirebaseABTesting, FirebaseAuth, FirebaseDatabase,
5 5
 FirebaseFirestore, FirebaseFunctions, FirebaseInstanceID, FirebaseInAppMessaging,
6
-FirebaseInAppMessagingDisplay, FirebaseMessaging and FirebaseStorage.
6
+FirebaseInAppMessagingDisplay, FirebaseMessaging, FirebaseRemoteConfig, and
7
+FirebaseStorage.
7 8
 
8 9
 The repository also includes GoogleUtilities source. The
9 10
 [GoogleUtilities](GoogleUtilities/README.md) pod is
@@ -80,6 +81,9 @@ For the pod that you want to develop:
80 81
 
81 82
 `pod gen Firebase{name here}.podspec --local-sources=./ --auto-open`
82 83
 
84
+Note: If the CocoaPods cache is out of date, you may need to run
85
+`pod repo update` before the `pod gen` command.
86
+
83 87
 Firestore has a self contained Xcode project. See
84 88
 [Firestore/README.md](Firestore/README.md).
85 89
 
@@ -98,13 +102,17 @@ Travis will verify that any code changes are done in a style compliant way. Inst
98 102
 These commands will get the right versions:
99 103
 
100 104
 ```
101
-brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/773cb75d360b58f32048f5964038d09825a507c8/Formula/clang-format.rb
102
-brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/3dfea1004e0736754bbf49673cca8aaed8a94089/Formula/swiftformat.rb
105
+brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/e3496d9/Formula/clang-format.rb
106
+brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/7963c3d/Formula/swiftformat.rb
103 107
 ```
104 108
 
105 109
 Note: if you already have a newer version of these installed you may need to
106 110
 `brew switch` to this version.
107 111
 
112
+To update this section, find the versions of clang-format and swiftformat.rb to
113
+match the versions in the CI failure logs
114
+[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula).
115
+
108 116
 ### Running Unit Tests
109 117
 
110 118
 Select a scheme and press Command-u to build a component and run its unit tests.
@@ -179,8 +187,8 @@ participate in the Firebase community.
179 187
 
180 188
 ### macOS and tvOS
181 189
 Thanks to contributions from the community, FirebaseABTesting, FirebaseAuth, FirebaseCore,
182
-FirebaseDatabase, FirebaseMessaging,
183
-FirebaseFirestore, FirebaseFunctions and FirebaseStorage now compile, run unit tests, and work on
190
+FirebaseDatabase, FirebaseMessaging, FirebaseFirestore,
191
+FirebaseFunctions, FirebaseRemoteConfig, and FirebaseStorage now compile, run unit tests, and work on
184 192
 macOS and tvOS.
185 193
 
186 194
 For tvOS, checkout the [Sample](Example/tvOSSample).
@@ -202,6 +210,7 @@ pod 'FirebaseDatabase'
202 210
 pod 'FirebaseFirestore'
203 211
 pod 'FirebaseFunctions'
204 212
 pod 'FirebaseMessaging'
213
+pod 'FirebaseRemoteConfig'
205 214
 pod 'FirebaseStorage'
206 215
 ```
207 216
 

+ 26
- 0
Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h 查看文件

@@ -424,6 +424,32 @@ extern "C" {
424 424
   #endif  // GTM_USE_SESSION_FETCHER
425 425
 #endif
426 426
 
427
+// When creating background sessions to perform out-of-process uploads and
428
+// downloads, on app launch any background sessions must be reconnected in
429
+// order to receive events that occurred while the app was not running.
430
+//
431
+// The fetcher will automatically attempt to recreate the sessions on app
432
+// start, but doing so reads from NSUserDefaults. This may have launch-time
433
+// performance impacts.
434
+//
435
+// To avoid launch performance impacts, on iPhone/iPad with iOS 13+ the
436
+// GTMSessionFetcher class will register for the app launch notification and
437
+// perform the reconnect then.
438
+//
439
+// Apps targeting Mac or older iOS SDKs can opt into the new behavior by defining
440
+// GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH=1.
441
+//
442
+// Apps targeting new SDKs can force the old behavior by defining
443
+// GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH = 0.
444
+#ifndef GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH
445
+  // Default to the on-launch behavior for iOS 13+.
446
+  #if TARGET_OS_IOS && defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
447
+    #define GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH 1
448
+  #else
449
+    #define GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH 0
450
+  #endif
451
+#endif
452
+
427 453
 GTM_ASSUME_NONNULL_BEGIN
428 454
 
429 455
 // Notifications

+ 110
- 28
Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m 查看文件

@@ -18,6 +18,11 @@
18 18
 #endif
19 19
 
20 20
 #import "GTMSessionFetcher.h"
21
+#if TARGET_OS_OSX && GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH
22
+// To reconnect background sessions on Mac outside +load requires importing and linking
23
+// AppKit to access the NSApplicationDidFinishLaunching symbol.
24
+#import <AppKit/AppKit.h>
25
+#endif
21 26
 
22 27
 #import <sys/utsname.h>
23 28
 
@@ -87,6 +92,34 @@ GTM_ASSUME_NONNULL_END
87 92
   #endif
88 93
 #endif
89 94
 
95
+#if ((defined(TARGET_OS_MACCATALYST) && TARGET_OS_MACCATALYST) || \
96
+     (TARGET_OS_OSX && defined(__MAC_10_15) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15) || \
97
+     (TARGET_OS_IOS && defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_13_0) || \
98
+     (TARGET_OS_WATCH && defined(__WATCHOS_6_0) && __WATCHOS_VERSION_MIN_REQUIRED >= __WATCHOS_6_0) || \
99
+     (TARGET_OS_TV && defined(__TVOS_13_0) && __TVOS_VERSION_MIN_REQUIRED >= __TVOS_13_0))
100
+#define GTM_SDK_REQUIRES_TLSMINIMUMSUPPORTEDPROTOCOLVERSION 1
101
+#define GTM_SDK_SUPPORTS_TLSMINIMUMSUPPORTEDPROTOCOLVERSION 1
102
+#elif ((TARGET_OS_OSX && defined(__MAC_10_15) && __MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_10_15) || \
103
+       (TARGET_OS_IOS && defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0) || \
104
+       (TARGET_OS_WATCH && defined(__WATCHOS_6_0) && __WATCHOS_VERSION_MAX_ALLOWED >= __WATCHOS_6_0) || \
105
+       (TARGET_OS_TV && defined(__TVOS_13_0) && __TVOS_VERSION_MAX_ALLOWED >= __TVOS_13_0))
106
+#define GTM_SDK_REQUIRES_TLSMINIMUMSUPPORTEDPROTOCOLVERSION 0
107
+#define GTM_SDK_SUPPORTS_TLSMINIMUMSUPPORTEDPROTOCOLVERSION 1
108
+#else
109
+#define GTM_SDK_REQUIRES_TLSMINIMUMSUPPORTEDPROTOCOLVERSION 0
110
+#define GTM_SDK_SUPPORTS_TLSMINIMUMSUPPORTEDPROTOCOLVERSION 0
111
+#endif
112
+
113
+#if ((defined(TARGET_OS_MACCATALYST) && TARGET_OS_MACCATALYST) || \
114
+     (TARGET_OS_OSX && defined(__MAC_10_15) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15) || \
115
+     (TARGET_OS_IOS && defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_13_0) || \
116
+     (TARGET_OS_WATCH && defined(__WATCHOS_6_0) && __WATCHOS_VERSION_MIN_REQUIRED >= __WATCHOS_6_0) || \
117
+     (TARGET_OS_TV && defined(__TVOS_13_0) && __TVOS_VERSION_MIN_REQUIRED >= __TVOS_13_0))
118
+#define GTM_SDK_REQUIRES_SECTRUSTEVALUATEWITHERROR 1
119
+#else
120
+#define GTM_SDK_REQUIRES_SECTRUSTEVALUATEWITHERROR 0
121
+#endif
122
+
90 123
 @interface GTMSessionFetcher ()
91 124
 
92 125
 @property(atomic, strong, readwrite, GTM_NULLABLE) NSData *downloadedData;
@@ -212,9 +245,32 @@ static GTMSessionFetcherTestBlock GTM_NULLABLE_TYPE gGlobalTestBlock;
212 245
 
213 246
 #if !GTMSESSION_UNIT_TESTING
214 247
 + (void)load {
248
+#if GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH && TARGET_OS_IPHONE
249
+  NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
250
+  [nc addObserver:self
251
+         selector:@selector(reconnectFetchersForBackgroundSessionsOnAppLaunch:)
252
+             name:UIApplicationDidFinishLaunchingNotification
253
+           object:nil];
254
+#elif GTMSESSION_RECONNECT_BACKGROUND_SESSIONS_ON_LAUNCH && TARGET_OS_OSX
255
+  NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
256
+  [nc addObserver:self
257
+         selector:@selector(reconnectFetchersForBackgroundSessionsOnAppLaunch:)
258
+             name:NSApplicationDidFinishLaunchingNotification
259
+           object:nil];
260
+#else
215 261
   [self fetchersForBackgroundSessions];
216
-}
217 262
 #endif
263
+}
264
+
265
++ (void)reconnectFetchersForBackgroundSessionsOnAppLaunch:(NSNotification *)notification {
266
+  // Give all other app-did-launch handlers a chance to complete before
267
+  // reconnecting the fetchers. Not doing this may lead to reconnecting
268
+  // before the app delegate has a chance to run.
269
+  dispatch_async(dispatch_get_main_queue(), ^{
270
+    [self fetchersForBackgroundSessions];
271
+  });
272
+}
273
+#endif  // !GTMSESSION_UNIT_TESTING
218 274
 
219 275
 + (instancetype)fetcherWithRequest:(GTM_NULLABLE NSURLRequest *)request {
220 276
   return [[self alloc] initWithRequest:request configuration:nil];
@@ -619,7 +675,17 @@ static GTMSessionFetcherTestBlock GTM_NULLABLE_TYPE gGlobalTestBlock;
619 675
         _configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
620 676
       }
621 677
 #if !GTM_ALLOW_INSECURE_REQUESTS
678
+#if GTM_SDK_REQUIRES_TLSMINIMUMSUPPORTEDPROTOCOLVERSION
679
+      _configuration.TLSMinimumSupportedProtocolVersion = tls_protocol_version_TLSv12;
680
+#elif GTM_SDK_SUPPORTS_TLSMINIMUMSUPPORTEDPROTOCOLVERSION
681
+      if (@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)) {
682
+        _configuration.TLSMinimumSupportedProtocolVersion = tls_protocol_version_TLSv12;
683
+      } else {
684
+        _configuration.TLSMinimumSupportedProtocol = kTLSProtocol12;
685
+      }
686
+#else
622 687
       _configuration.TLSMinimumSupportedProtocol = kTLSProtocol12;
688
+#endif  // GTM_SDK_REQUIRES_TLSMINIMUMSUPPORTEDPROTOCOLVERSION
623 689
 #endif
624 690
     }  // !_configuration
625 691
     _configuration.HTTPCookieStorage = self.cookieStorage;
@@ -1046,6 +1112,7 @@ NSData * GTM_NULLABLE_TYPE GTMDataFromInputStream(NSInputStream *inputStream, NS
1046 1112
     GTMSessionFetcherReceivedProgressBlock receivedProgressBlock = _receivedProgressBlock;
1047 1113
     GTMSessionFetcherWillCacheURLResponseBlock willCacheURLResponseBlock =
1048 1114
         _willCacheURLResponseBlock;
1115
+    GTMSessionFetcherChallengeBlock challengeBlock = _challengeBlock;
1049 1116
 
1050 1117
     // Simulate receipt of redirection.
1051 1118
     if (willRedirectBlock) {
@@ -1063,34 +1130,32 @@ NSData * GTM_NULLABLE_TYPE GTMDataFromInputStream(NSInputStream *inputStream, NS
1063 1130
     // It might be nice to eventually let the user determine which testBlock
1064 1131
     // fetches get challenged rather than always executing the supplied
1065 1132
     // challenge block.
1066
-    if (_challengeBlock) {
1133
+    if (challengeBlock) {
1067 1134
       [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:YES
1068 1135
                                                           block:^{
1069
-        if (self->_challengeBlock) {
1070
-          NSURL *requestURL = self->_request.URL;
1071
-          NSString *host = requestURL.host;
1072
-          NSURLProtectionSpace *pspace =
1073
-              [[NSURLProtectionSpace alloc] initWithHost:host
1074
-                                                    port:requestURL.port.integerValue
1075
-                                                protocol:requestURL.scheme
1076
-                                                   realm:nil
1077
-                                    authenticationMethod:NSURLAuthenticationMethodHTTPBasic];
1078
-          id<NSURLAuthenticationChallengeSender> unusedSender =
1079
-              (id<NSURLAuthenticationChallengeSender>)[NSNull null];
1080
-          NSURLAuthenticationChallenge *challenge =
1081
-              [[NSURLAuthenticationChallenge alloc] initWithProtectionSpace:pspace
1082
-                                                         proposedCredential:nil
1083
-                                                       previousFailureCount:0
1084
-                                                            failureResponse:nil
1085
-                                                                      error:nil
1086
-                                                                     sender:unusedSender];
1087
-          self->_challengeBlock(self, challenge, ^(NSURLSessionAuthChallengeDisposition disposition,
1088
-                                             NSURLCredential * GTM_NULLABLE_TYPE credential){
1089
-            // We could change the responseData and responseError based on the disposition,
1090
-            // but it's easier for apps to just supply the expected data and error
1091
-            // directly to the test block. So this simulation ignores the disposition.
1092
-          });
1093
-        }
1136
+        NSURL *requestURL = self->_request.URL;
1137
+        NSString *host = requestURL.host;
1138
+        NSURLProtectionSpace *pspace =
1139
+            [[NSURLProtectionSpace alloc] initWithHost:host
1140
+                                                  port:requestURL.port.integerValue
1141
+                                              protocol:requestURL.scheme
1142
+                                                 realm:nil
1143
+                                  authenticationMethod:NSURLAuthenticationMethodHTTPBasic];
1144
+        id<NSURLAuthenticationChallengeSender> unusedSender =
1145
+            (id<NSURLAuthenticationChallengeSender>)[NSNull null];
1146
+        NSURLAuthenticationChallenge *challenge =
1147
+            [[NSURLAuthenticationChallenge alloc] initWithProtectionSpace:pspace
1148
+                                                       proposedCredential:nil
1149
+                                                     previousFailureCount:0
1150
+                                                          failureResponse:nil
1151
+                                                                    error:nil
1152
+                                                                   sender:unusedSender];
1153
+        challengeBlock(self, challenge, ^(NSURLSessionAuthChallengeDisposition disposition,
1154
+                                          NSURLCredential * GTM_NULLABLE_TYPE credential){
1155
+          // We could change the responseData and responseError based on the disposition,
1156
+          // but it's easier for apps to just supply the expected data and error
1157
+          // directly to the test block. So this simulation ignores the disposition.
1158
+        });
1094 1159
       }];
1095 1160
     }
1096 1161
 
@@ -2325,8 +2390,24 @@ didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
2325 2390
     // It looks like the implementation of SecTrustEvaluate() on Mac grabs a global lock,
2326 2391
     // so it may be redundant for us to also lock, but it's easy to synchronize here
2327 2392
     // anyway.
2328
-    SecTrustResultType trustEval = kSecTrustResultInvalid;
2329 2393
     BOOL shouldAllow;
2394
+#if GTM_SDK_REQUIRES_SECTRUSTEVALUATEWITHERROR
2395
+    CFErrorRef errorRef = NULL;
2396
+    @synchronized ([GTMSessionFetcher class]) {
2397
+      GTMSessionMonitorSynchronized([GTMSessionFetcher class]);
2398
+
2399
+      // SecTrustEvaluateWithError handles both the "proceed" and "unspecified" cases,
2400
+      // so it is not necessary to check the trust result the evaluation returns true.
2401
+      shouldAllow = SecTrustEvaluateWithError(serverTrust, &errorRef);
2402
+    }
2403
+
2404
+    if (errorRef) {
2405
+      GTMSESSION_LOG_DEBUG(@"Error %d evaluating trust for %@",
2406
+                           (int)CFErrorGetCode(errorRef), request);
2407
+      CFRelease(errorRef);
2408
+    }
2409
+#else
2410
+    SecTrustResultType trustEval = kSecTrustResultInvalid;
2330 2411
     OSStatus trustError;
2331 2412
     @synchronized([GTMSessionFetcher class]) {
2332 2413
       GTMSessionMonitorSynchronized([GTMSessionFetcher class]);
@@ -2350,6 +2431,7 @@ didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
2350 2431
                              CFBridgingRelease(SecTrustCopyProperties(serverTrust)));
2351 2432
       }
2352 2433
     }
2434
+#endif  // GTM_SDK_REQUIRES_SECTRUSTEVALUATEWITHERROR
2353 2435
     handler(serverTrust, shouldAllow);
2354 2436
 
2355 2437
     CFRelease(serverTrust);

+ 9
- 0
Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h 查看文件

@@ -102,11 +102,18 @@ typedef void (^GTMSessionUploadFetcherCancellationHandler)(
102 102
                                chunkSize:(int64_t)chunkSize
103 103
                           fetcherService:(GTM_NULLABLE GTMSessionFetcherService *)fetcherServiceOrNil;
104 104
 
105
+// Allows cellular access.
105 106
 + (instancetype)uploadFetcherWithLocation:(NSURL * GTM_NULLABLE_TYPE)uploadLocationURL
106 107
                            uploadMIMEType:(NSString *)uploadMIMEType
107 108
                                 chunkSize:(int64_t)chunkSize
108 109
                            fetcherService:(GTM_NULLABLE GTMSessionFetcherService *)fetcherServiceOrNil;
109 110
 
111
++ (instancetype)uploadFetcherWithLocation:(NSURL *GTM_NULLABLE_TYPE)uploadLocationURL
112
+                           uploadMIMEType:(NSString *)uploadMIMEType
113
+                                chunkSize:(int64_t)chunkSize
114
+                     allowsCellularAccess:(BOOL)allowsCellularAccess
115
+                           fetcherService:(GTM_NULLABLE GTMSessionFetcherService *)fetcherServiceOrNil;
116
+
110 117
 // Allows dataProviders for files of unknown length. Pass kGTMSessionUploadFetcherUnknownFileSize as
111 118
 // |fullLength| if the length is unknown.
112 119
 - (void)setUploadDataLength:(int64_t)fullLength
@@ -127,6 +134,8 @@ typedef void (^GTMSessionUploadFetcherCancellationHandler)(
127 134
 @property(atomic, copy) NSString *uploadMIMEType;
128 135
 @property(atomic, assign) int64_t chunkSize;
129 136
 @property(atomic, readonly, assign) int64_t currentOffset;
137
+// Reflects the original NSURLRequest's @c allowCellularAccess property.
138
+@property(atomic, readonly, assign) BOOL allowsCellularAccess;
130 139
 
131 140
 // The fetcher for the current data chunk, if any
132 141
 @property(atomic, strong, GTM_NULLABLE) GTMSessionFetcher *chunkFetcher;

+ 42
- 8
Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m 查看文件

@@ -26,6 +26,7 @@ static NSString *const kGTMSessionIdentifierUploadLocationURLMetadataKey    = @"
26 26
 static NSString *const kGTMSessionIdentifierUploadMIMETypeMetadataKey       = @"_uploadMIME";
27 27
 static NSString *const kGTMSessionIdentifierUploadChunkSizeMetadataKey      = @"_upChSize";
28 28
 static NSString *const kGTMSessionIdentifierUploadCurrentOffsetMetadataKey  = @"_upOffset";
29
+static NSString *const kGTMSessionIdentifierUploadAllowsCellularAccess      = @"_upAllowsCellularAccess";
29 30
 
30 31
 static NSString *const kGTMSessionHeaderXGoogUploadChunkGranularity = @"X-Goog-Upload-Chunk-Granularity";
31 32
 static NSString *const kGTMSessionHeaderXGoogUploadCommand          = @"X-Goog-Upload-Command";
@@ -97,6 +98,7 @@ NSString *const kGTMSessionFetcherUploadLocationObtainedNotification =
97 98
 @property(assign, atomic, getter=isSubdataGenerating) BOOL subdataGenerating;
98 99
 @property(assign, atomic) BOOL shouldInitiateOffsetQuery;
99 100
 @property(assign, atomic) int64_t uploadGranularity;
101
+@property(assign, atomic) BOOL allowsCellularAccess;
100 102
 
101 103
 @end
102 104
 
@@ -157,20 +159,34 @@ NSString *const kGTMSessionFetcherUploadLocationObtainedNotification =
157 159
   GTMSessionUploadFetcher *fetcher = [self uploadFetcherWithRequest:request
158 160
                                                      fetcherService:fetcherService];
159 161
   [fetcher setLocationURL:nil
160
-           uploadMIMEType:uploadMIMEType
161
-                chunkSize:chunkSize];
162
+            uploadMIMEType:uploadMIMEType
163
+                 chunkSize:chunkSize
164
+      allowsCellularAccess:request.allowsCellularAccess];
162 165
   return fetcher;
163 166
 }
164 167
 
165
-+ (instancetype)uploadFetcherWithLocation:(NSURL * GTM_NULLABLE_TYPE)uploadLocationURL
168
++ (instancetype)uploadFetcherWithLocation:(NSURL *GTM_NULLABLE_TYPE)uploadLocationURL
166 169
                            uploadMIMEType:(NSString *)uploadMIMEType
167 170
                                 chunkSize:(int64_t)chunkSize
171
+                           fetcherService:(GTM_NULLABLE GTMSessionFetcherService *)fetcherServiceOrNil {
172
+  return [self uploadFetcherWithLocation:uploadLocationURL
173
+                          uploadMIMEType:uploadMIMEType
174
+                               chunkSize:chunkSize
175
+                    allowsCellularAccess:YES
176
+                          fetcherService:fetcherServiceOrNil];
177
+}
178
+
179
++ (instancetype)uploadFetcherWithLocation:(NSURL *GTM_NULLABLE_TYPE)uploadLocationURL
180
+                           uploadMIMEType:(NSString *)uploadMIMEType
181
+                                chunkSize:(int64_t)chunkSize
182
+                     allowsCellularAccess:(BOOL)allowsCellularAccess
168 183
                            fetcherService:(GTMSessionFetcherService *)fetcherService {
169 184
   GTMSessionUploadFetcher *fetcher = [self uploadFetcherWithRequest:nil
170 185
                                                      fetcherService:fetcherService];
171 186
   [fetcher setLocationURL:uploadLocationURL
172
-           uploadMIMEType:uploadMIMEType
173
-                chunkSize:chunkSize];
187
+            uploadMIMEType:uploadMIMEType
188
+                 chunkSize:chunkSize
189
+      allowsCellularAccess:allowsCellularAccess];
174 190
   return fetcher;
175 191
 }
176 192
 
@@ -211,6 +227,12 @@ NSString *const kGTMSessionFetcherUploadLocationObtainedNotification =
211 227
   }
212 228
   int64_t currentOffset =
213 229
       [metadata[kGTMSessionIdentifierUploadCurrentOffsetMetadataKey] longLongValue];
230
+
231
+  BOOL allowsCellularAccess = YES;
232
+  if (metadata[kGTMSessionIdentifierUploadAllowsCellularAccess]) {
233
+    allowsCellularAccess = [metadata[kGTMSessionIdentifierUploadAllowsCellularAccess] boolValue];
234
+  }
235
+
214 236
   GTMSESSION_ASSERT_DEBUG(currentOffset <= uploadFileLength,
215 237
                           @"CurrentOffset (%lld) exceeds UploadFileSize (%lld)",
216 238
                           currentOffset, uploadFileLength);
@@ -219,6 +241,7 @@ NSString *const kGTMSessionFetcherUploadLocationObtainedNotification =
219 241
   GTMSessionUploadFetcher *uploadFetcher = [self uploadFetcherWithLocation:uploadLocationURL
220 242
                                                             uploadMIMEType:uploadMIMEType
221 243
                                                                  chunkSize:uploadChunkSize
244
+                                                      allowsCellularAccess:allowsCellularAccess
222 245
                                                             fetcherService:nil];
223 246
   // Set the upload file length before setting the upload file URL tries to determine the length.
224 247
   [uploadFetcher setUploadFileLength:uploadFileLength];
@@ -513,14 +536,17 @@ NSString *const kGTMSessionFetcherUploadLocationObtainedNotification =
513 536
   [self setRequest:mutableRequest];
514 537
 }
515 538
 
516
-- (void)setLocationURL:(NSURL * GTM_NULLABLE_TYPE)location
517
-        uploadMIMEType:(NSString *)uploadMIMEType
518
-             chunkSize:(int64_t)chunkSize {
539
+- (void)setLocationURL:(NSURL *GTM_NULLABLE_TYPE)location
540
+          uploadMIMEType:(NSString *)uploadMIMEType
541
+               chunkSize:(int64_t)chunkSize
542
+    allowsCellularAccess:(BOOL)allowsCellularAccess {
519 543
   @synchronized(self) {
520 544
     GTMSessionMonitorSynchronized(self);
521 545
 
522 546
     GTMSESSION_ASSERT_DEBUG(chunkSize > 0, @"chunk size is zero");
523 547
 
548
+    _allowsCellularAccess = allowsCellularAccess;
549
+
524 550
     // When resuming an upload, set the known upload target URL.
525 551
     _uploadLocationURL = location;
526 552
 
@@ -1323,6 +1349,8 @@ NSString *const kGTMSessionFetcherUploadLocationObtainedNotification =
1323 1349
   }
1324 1350
   metadata[kGTMSessionIdentifierUploadChunkSizeMetadataKey] = @(self.chunkSize);
1325 1351
   metadata[kGTMSessionIdentifierUploadCurrentOffsetMetadataKey] = @(self.currentOffset);
1352
+  metadata[kGTMSessionIdentifierUploadAllowsCellularAccess] = @(self.request.allowsCellularAccess);
1353
+
1326 1354
   return metadata;
1327 1355
 }
1328 1356
 
@@ -1339,6 +1367,11 @@ NSString *const kGTMSessionFetcherUploadLocationObtainedNotification =
1339 1367
   // n.b. that self.request is nil for upload fetchers created with an existing upload location
1340 1368
   // URL.
1341 1369
   NSURLRequest *origRequest = self.request;
1370
+
1371
+  chunkRequest.allowsCellularAccess = origRequest.allowsCellularAccess;
1372
+  if (!origRequest) {
1373
+    chunkRequest.allowsCellularAccess = _allowsCellularAccess;
1374
+  }
1342 1375
   NSString *userAgent = [origRequest valueForHTTPHeaderField:@"User-Agent"];
1343 1376
   if (userAgent.length > 0) {
1344 1377
     [chunkRequest setValue:userAgent forHTTPHeaderField:@"User-Agent"];
@@ -1749,6 +1782,7 @@ NSString *const kGTMSessionFetcherUploadLocationObtainedNotification =
1749 1782
 
1750 1783
 // Public properties.
1751 1784
 @synthesize currentOffset = _currentOffset,
1785
+            allowsCellularAccess = _allowsCellularAccess,
1752 1786
             delegateCompletionHandler = _delegateCompletionHandler,
1753 1787
             chunkFetcher = _chunkFetcher,
1754 1788
             lastChunkRequest = _lastChunkRequest,

二進制
Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.framework/GoogleAppMeasurement 查看文件


+ 6
- 1
Pods/GoogleUtilities/GoogleUtilities/Logger/GULLogger.m 查看文件

@@ -161,7 +161,12 @@ void GULLogBasic(GULLoggerLevel level,
161 161
                                                                     range:messageCodeRange];
162 162
   NSCAssert(numberOfMatches == 1, @"Incorrect message code format.");
163 163
 #endif
164
-  NSString *logMsg = [[NSString alloc] initWithFormat:message arguments:args_ptr];
164
+  NSString *logMsg;
165
+  if (args_ptr == NULL) {
166
+    logMsg = message;
167
+  } else {
168
+    logMsg = [[NSString alloc] initWithFormat:message arguments:args_ptr];
169
+  }
165 170
   logMsg = [NSString stringWithFormat:@"%s - %@[%@] %@", sVersion, service, messageCode, logMsg];
166 171
   dispatch_async(sGULClientQueue, ^{
167 172
     asl_log(sGULLoggerClient, NULL, (int)level, "%s", logMsg.UTF8String);

+ 10
- 6
Pods/GoogleUtilities/GoogleUtilities/Network/GULMutableDictionary.m 查看文件

@@ -45,14 +45,14 @@
45 45
 - (id)objectForKey:(id)key {
46 46
   __block id object;
47 47
   dispatch_sync(_queue, ^{
48
-    object = self->_objects[key];
48
+    object = [self->_objects objectForKey:key];
49 49
   });
50 50
   return object;
51 51
 }
52 52
 
53 53
 - (void)setObject:(id)object forKey:(id<NSCopying>)key {
54 54
   dispatch_async(_queue, ^{
55
-    self->_objects[key] = object;
55
+    [self->_objects setObject:object forKey:key];
56 56
   });
57 57
 }
58 58
 
@@ -77,13 +77,17 @@
77 77
 }
78 78
 
79 79
 - (id)objectForKeyedSubscript:(id<NSCopying>)key {
80
-  // The method this calls is already synchronized.
81
-  return [self objectForKey:key];
80
+  __block id object;
81
+  dispatch_sync(_queue, ^{
82
+    object = self->_objects[key];
83
+  });
84
+  return object;
82 85
 }
83 86
 
84 87
 - (void)setObject:(id)obj forKeyedSubscript:(id<NSCopying>)key {
85
-  // The method this calls is already synchronized.
86
-  [self setObject:obj forKey:key];
88
+  dispatch_async(_queue, ^{
89
+    self->_objects[key] = obj;
90
+  });
87 91
 }
88 92
 
89 93
 - (NSDictionary *)dictionary {

+ 21
- 2
Pods/GoogleUtilities/GoogleUtilities/Network/GULNetworkURLSession.m 查看文件

@@ -22,8 +22,9 @@
22 22
 #import "Private/GULNetworkMessageCode.h"
23 23
 
24 24
 @interface GULNetworkURLSession () <NSURLSessionDelegate,
25
-                                    NSURLSessionTaskDelegate,
26
-                                    NSURLSessionDownloadDelegate>
25
+                                    NSURLSessionDataDelegate,
26
+                                    NSURLSessionDownloadDelegate,
27
+                                    NSURLSessionTaskDelegate>
27 28
 @end
28 29
 
29 30
 @implementation GULNetworkURLSession {
@@ -221,6 +222,24 @@
221 222
   return _sessionID;
222 223
 }
223 224
 
225
+#pragma mark - NSURLSessionDataDelegate
226
+
227
+/// Called by the NSURLSession when the data task has received some of the expected data.
228
+/// Once the session is completed, URLSession:task:didCompleteWithError will be called and the
229
+/// completion handler will be called with the downloaded data.
230
+- (void)URLSession:(NSURLSession *)session
231
+          dataTask:(NSURLSessionDataTask *)dataTask
232
+    didReceiveData:(NSData *)data {
233
+  @synchronized(self) {
234
+    NSMutableData *mutableData = [[NSMutableData alloc] init];
235
+    if (_downloadedData) {
236
+      mutableData = _downloadedData.mutableCopy;
237
+    }
238
+    [mutableData appendData:data];
239
+    _downloadedData = mutableData;
240
+  }
241
+}
242
+
224 243
 #pragma mark - NSURLSessionTaskDelegate
225 244
 
226 245
 /// Called by the NSURLSession once the download task is completed. The file is saved in the

+ 77
- 55
Pods/Manifest.lock 查看文件

@@ -6,66 +6,80 @@ PODS:
6 6
   - AWSCore (2.8.4)
7 7
   - AWSSNS (2.8.4):
8 8
     - AWSCore (= 2.8.4)
9
-  - Firebase/Auth (5.19.0):
9
+  - Firebase/Auth (6.11.0):
10 10
     - Firebase/CoreOnly
11
-    - FirebaseAuth (= 5.4.1)
12
-  - Firebase/Core (5.19.0):
11
+    - FirebaseAuth (~> 6.3.1)
12
+  - Firebase/Core (6.11.0):
13 13
     - Firebase/CoreOnly
14
-    - FirebaseAnalytics (= 5.8.0)
15
-  - Firebase/CoreOnly (5.19.0):
16
-    - FirebaseCore (= 5.4.0)
17
-  - FirebaseAnalytics (5.8.0):
18
-    - FirebaseCore (~> 5.4)
19
-    - FirebaseInstanceID (~> 3.8)
20
-    - GoogleAppMeasurement (= 5.8.0)
21
-    - GoogleUtilities/AppDelegateSwizzler (~> 5.2)
22
-    - GoogleUtilities/MethodSwizzler (~> 5.2)
23
-    - GoogleUtilities/Network (~> 5.2)
24
-    - "GoogleUtilities/NSData+zlib (~> 5.2)"
25
-    - nanopb (~> 0.3)
26
-  - FirebaseAuth (5.4.1):
14
+    - FirebaseAnalytics (= 6.1.3)
15
+  - Firebase/CoreOnly (6.11.0):
16
+    - FirebaseCore (= 6.3.2)
17
+  - FirebaseAnalytics (6.1.3):
18
+    - FirebaseCore (~> 6.3)
19
+    - FirebaseInstanceID (~> 4.2)
20
+    - GoogleAppMeasurement (= 6.1.3)
21
+    - GoogleUtilities/AppDelegateSwizzler (~> 6.0)
22
+    - GoogleUtilities/MethodSwizzler (~> 6.0)
23
+    - GoogleUtilities/Network (~> 6.0)
24
+    - "GoogleUtilities/NSData+zlib (~> 6.0)"
25
+    - nanopb (~> 0.3.901)
26
+  - FirebaseAuth (6.3.1):
27 27
     - FirebaseAuthInterop (~> 1.0)
28
-    - FirebaseCore (~> 5.2)
29
-    - GoogleUtilities/Environment (~> 5.2)
28
+    - FirebaseCore (~> 6.2)
29
+    - GoogleUtilities/AppDelegateSwizzler (~> 6.2)
30
+    - GoogleUtilities/Environment (~> 6.2)
30 31
     - GTMSessionFetcher/Core (~> 1.1)
31 32
   - FirebaseAuthInterop (1.0.0)
32
-  - FirebaseCore (5.4.0):
33
-    - GoogleUtilities/Environment (~> 5.2)
34
-    - GoogleUtilities/Logger (~> 5.2)
35
-  - FirebaseInstanceID (3.8.0):
36
-    - FirebaseCore (~> 5.2)
37
-    - GoogleUtilities/Environment (~> 5.2)
38
-    - GoogleUtilities/UserDefaults (~> 5.2)
39
-  - GoogleAppMeasurement (5.8.0):
40
-    - GoogleUtilities/AppDelegateSwizzler (~> 5.2)
41
-    - GoogleUtilities/MethodSwizzler (~> 5.2)
42
-    - GoogleUtilities/Network (~> 5.2)
43
-    - "GoogleUtilities/NSData+zlib (~> 5.2)"
44
-    - nanopb (~> 0.3)
45
-  - GoogleUtilities/AppDelegateSwizzler (5.5.0):
33
+  - FirebaseCore (6.3.2):
34
+    - FirebaseCoreDiagnostics (~> 1.0)
35
+    - FirebaseCoreDiagnosticsInterop (~> 1.0)
36
+    - GoogleUtilities/Environment (~> 6.2)
37
+    - GoogleUtilities/Logger (~> 6.2)
38
+  - FirebaseCoreDiagnostics (1.1.1):
39
+    - FirebaseCoreDiagnosticsInterop (~> 1.0)
40
+    - GoogleDataTransportCCTSupport (~> 1.0)
41
+    - GoogleUtilities/Environment (~> 6.2)
42
+    - GoogleUtilities/Logger (~> 6.2)
43
+    - nanopb (~> 0.3.901)
44
+  - FirebaseCoreDiagnosticsInterop (1.0.0)
45
+  - FirebaseInstanceID (4.2.6):
46
+    - FirebaseCore (~> 6.0)
47
+    - GoogleUtilities/Environment (~> 6.0)
48
+    - GoogleUtilities/UserDefaults (~> 6.0)
49
+  - GoogleAppMeasurement (6.1.3):
50
+    - GoogleUtilities/AppDelegateSwizzler (~> 6.0)
51
+    - GoogleUtilities/MethodSwizzler (~> 6.0)
52
+    - GoogleUtilities/Network (~> 6.0)
53
+    - "GoogleUtilities/NSData+zlib (~> 6.0)"
54
+    - nanopb (~> 0.3.901)
55
+  - GoogleDataTransport (3.0.1)
56
+  - GoogleDataTransportCCTSupport (1.2.1):
57
+    - GoogleDataTransport (~> 3.0)
58
+    - nanopb (~> 0.3.901)
59
+  - GoogleUtilities/AppDelegateSwizzler (6.3.1):
46 60
     - GoogleUtilities/Environment
47 61
     - GoogleUtilities/Logger
48 62
     - GoogleUtilities/Network
49
-  - GoogleUtilities/Environment (5.5.0)
50
-  - GoogleUtilities/Logger (5.5.0):
63
+  - GoogleUtilities/Environment (6.3.1)
64
+  - GoogleUtilities/Logger (6.3.1):
51 65
     - GoogleUtilities/Environment
52
-  - GoogleUtilities/MethodSwizzler (5.5.0):
66
+  - GoogleUtilities/MethodSwizzler (6.3.1):
53 67
     - GoogleUtilities/Logger
54
-  - GoogleUtilities/Network (5.5.0):
68
+  - GoogleUtilities/Network (6.3.1):
55 69
     - GoogleUtilities/Logger
56 70
     - "GoogleUtilities/NSData+zlib"
57 71
     - GoogleUtilities/Reachability
58
-  - "GoogleUtilities/NSData+zlib (5.5.0)"
59
-  - GoogleUtilities/Reachability (5.5.0):
72
+  - "GoogleUtilities/NSData+zlib (6.3.1)"
73
+  - GoogleUtilities/Reachability (6.3.1):
60 74
     - GoogleUtilities/Logger
61
-  - GoogleUtilities/UserDefaults (5.5.0):
75
+  - GoogleUtilities/UserDefaults (6.3.1):
62 76
     - GoogleUtilities/Logger
63
-  - GTMSessionFetcher/Core (1.2.1)
64
-  - nanopb (0.3.901):
65
-    - nanopb/decode (= 0.3.901)
66
-    - nanopb/encode (= 0.3.901)
67
-  - nanopb/decode (0.3.901)
68
-  - nanopb/encode (0.3.901)
77
+  - GTMSessionFetcher/Core (1.3.0)
78
+  - nanopb (0.3.9011):
79
+    - nanopb/decode (= 0.3.9011)
80
+    - nanopb/encode (= 0.3.9011)
81
+  - nanopb/decode (0.3.9011)
82
+  - nanopb/encode (0.3.9011)
69 83
 
70 84
 DEPENDENCIES:
71 85
   - AWSCognitoIdentityProvider (~> 2.8.0)
@@ -85,8 +99,12 @@ SPEC REPOS:
85 99
     - FirebaseAuth
86 100
     - FirebaseAuthInterop
87 101
     - FirebaseCore
102
+    - FirebaseCoreDiagnostics
103
+    - FirebaseCoreDiagnosticsInterop
88 104
     - FirebaseInstanceID
89 105
     - GoogleAppMeasurement
106
+    - GoogleDataTransport
107
+    - GoogleDataTransportCCTSupport
90 108
     - GoogleUtilities
91 109
     - GTMSessionFetcher
92 110
     - nanopb
@@ -96,17 +114,21 @@ SPEC CHECKSUMS:
96 114
   AWSCognitoIdentityProviderASF: f94f1a502e72ef3d0a1de93e10bf7a79c8698118
97 115
   AWSCore: 734b0d67c2c77f6edae9e5520431a37310ea4193
98 116
   AWSSNS: 42b39d6628bfb40bf5f9e3c6e4738ce68a323235
99
-  Firebase: c60d49e9c2630875a96207d15e2affb8364996d1
100
-  FirebaseAnalytics: fd72a26bf8dac84cefba2f0864366f718555a5b0
101
-  FirebaseAuth: cbb892a66baed025efc179372598941252acf853
117
+  Firebase: bc9cfc7a96c73268656d5aaab453ff1b4b530e0e
118
+  FirebaseAnalytics: 0e3ecff2c5d86070f7d4325e21f1edabfbd558dc
119
+  FirebaseAuth: b401a012cc33b04df3b52bb308b04e8766f2693e
102 120
   FirebaseAuthInterop: 0ffa57668be100582bb7643d4fcb7615496c41fc
103
-  FirebaseCore: 22a79a961c3951ef2f77b67bfbc99e454247b319
104
-  FirebaseInstanceID: cf488df2f4b79782f0e430b04a0e17c0aa7979b2
105
-  GoogleAppMeasurement: 1624046ab1bcc5e170061a56ef5679000b079c8e
106
-  GoogleUtilities: 6481e6318c5fcabaaa8513ef8120f329055d7c10
107
-  GTMSessionFetcher: 32aeca0aa144acea523e1c8e053089dec2cb98ca
108
-  nanopb: 2901f78ea1b7b4015c860c2fdd1ea2fee1a18d48
121
+  FirebaseCore: beeff42c07c30ea94702471d99db2089b594fbbd
122
+  FirebaseCoreDiagnostics: af29e43048607588c050889d19204f4d7b758c9f
123
+  FirebaseCoreDiagnosticsInterop: 6829da2b8d1fc795ff1bd99df751d3788035d2cb
124
+  FirebaseInstanceID: d0eafcd8bdbd3447cd694594734078c3e3e77d8b
125
+  GoogleAppMeasurement: 434cc7be25e71dc04b8d0e3079125127b330e84a
126
+  GoogleDataTransport: 166f9b9f82cbf60a204e8fe2daa9db3e3ec1fb15
127
+  GoogleDataTransportCCTSupport: f6ab1962e9dc05ab1fb938b795e5b310209edeec
128
+  GoogleUtilities: f895fde57977df4e0233edda0dbeac490e3703b6
129
+  GTMSessionFetcher: 43b8b64263023d4f32caa0b40f4c8bfa3c5f36d8
130
+  nanopb: 18003b5e52dab79db540fe93fe9579f399bd1ccd
109 131
 
110 132
 PODFILE CHECKSUM: b32d1d4808cf6b66bc130db9af762de0d62a6d2f
111 133
 
112
-COCOAPODS: 1.6.1
134
+COCOAPODS: 1.7.4

+ 2254
- 2224
Pods/Pods.xcodeproj/project.pbxproj
文件差異過大導致無法顯示
查看文件


+ 1
- 1
Pods/Target Support Files/FirebaseAuth/FirebaseAuth-Info.plist 查看文件

@@ -15,7 +15,7 @@
15 15
   <key>CFBundlePackageType</key>
16 16
   <string>FMWK</string>
17 17
   <key>CFBundleShortVersionString</key>
18
-  <string>6.2.3</string>
18
+  <string>6.3.1</string>
19 19
   <key>CFBundleSignature</key>
20 20
   <string>????</string>
21 21
   <key>CFBundleVersion</key>

+ 1
- 1
Pods/Target Support Files/FirebaseAuth/FirebaseAuth.xcconfig 查看文件

@@ -1,7 +1,7 @@
1 1
 CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseAuth
2 2
 FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreDiagnostics" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransportCCTSupport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb"
3 3
 GCC_C_LANGUAGE_STANDARD = c99
4
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 FIRAuth_VERSION=6.2.3 FIRAuth_MINOR_VERSION=6.2
4
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 FIRAuth_VERSION=6.3.1 FIRAuth_MINOR_VERSION=6.3
5 5
 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public"
6 6
 PODS_BUILD_DIR = ${BUILD_DIR}
7 7
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

+ 1
- 1
Pods/Target Support Files/FirebaseCore/FirebaseCore-Info.plist 查看文件

@@ -15,7 +15,7 @@
15 15
   <key>CFBundlePackageType</key>
16 16
   <string>FMWK</string>
17 17
   <key>CFBundleShortVersionString</key>
18
-  <string>6.3.0</string>
18
+  <string>6.3.2</string>
19 19
   <key>CFBundleSignature</key>
20 20
   <string>????</string>
21 21
   <key>CFBundleVersion</key>

+ 1
- 1
Pods/Target Support Files/FirebaseCore/FirebaseCore.xcconfig 查看文件

@@ -1,7 +1,7 @@
1 1
 CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore
2 2
 FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreDiagnostics" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransportCCTSupport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb"
3 3
 GCC_C_LANGUAGE_STANDARD = c99
4
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 FIRCore_VERSION=6.3.0 Firebase_VERSION=6.9.0
4
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 FIRCore_VERSION=6.3.2 Firebase_VERSION=6.11.0
5 5
 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public"
6 6
 OTHER_CFLAGS = $(inherited) -fno-autolink
7 7
 PODS_BUILD_DIR = ${BUILD_DIR}

+ 1
- 1
Pods/Target Support Files/FirebaseInstanceID/FirebaseInstanceID-Info.plist 查看文件

@@ -15,7 +15,7 @@
15 15
   <key>CFBundlePackageType</key>
16 16
   <string>FMWK</string>
17 17
   <key>CFBundleShortVersionString</key>
18
-  <string>4.2.5</string>
18
+  <string>4.2.6</string>
19 19
   <key>CFBundleSignature</key>
20 20
   <string>????</string>
21 21
   <key>CFBundleVersion</key>

+ 1
- 1
Pods/Target Support Files/FirebaseInstanceID/FirebaseInstanceID.xcconfig 查看文件

@@ -1,7 +1,7 @@
1 1
 CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstanceID
2 2
 FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreDiagnostics" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransportCCTSupport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb"
3 3
 GCC_C_LANGUAGE_STANDARD = c99
4
-GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 FIRInstanceID_LIB_VERSION=4.2.5
4
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 FIRInstanceID_LIB_VERSION=4.2.6
5 5
 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public"
6 6
 PODS_BUILD_DIR = ${BUILD_DIR}
7 7
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

+ 1
- 1
Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-Info.plist 查看文件

@@ -15,7 +15,7 @@
15 15
   <key>CFBundlePackageType</key>
16 16
   <string>FMWK</string>
17 17
   <key>CFBundleShortVersionString</key>
18
-  <string>1.2.2</string>
18
+  <string>1.3.0</string>
19 19
   <key>CFBundleSignature</key>
20 20
   <string>????</string>
21 21
   <key>CFBundleVersion</key>

+ 1
- 1
Pods/Target Support Files/GoogleUtilities/GoogleUtilities-Info.plist 查看文件

@@ -15,7 +15,7 @@
15 15
   <key>CFBundlePackageType</key>
16 16
   <string>FMWK</string>
17 17
   <key>CFBundleShortVersionString</key>
18
-  <string>6.3.0</string>
18
+  <string>6.3.1</string>
19 19
   <key>CFBundleSignature</key>
20 20
   <string>????</string>
21 21
   <key>CFBundleVersion</key>

+ 203
- 1
Pods/Target Support Files/Pods-EncuestaMarle/Pods-EncuestaMarle-acknowledgements.markdown 查看文件

@@ -23,7 +23,209 @@ The AWS Mobile SDK for iOS is generally licensed under the Apache 2.0 License, w
23 23
 
24 24
 ## Firebase
25 25
 
26
-Copyright 2019 Google
26
+
27
+                                 Apache License
28
+                           Version 2.0, January 2004
29
+                        http://www.apache.org/licenses/
30
+
31
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
32
+
33
+   1. Definitions.
34
+
35
+      "License" shall mean the terms and conditions for use, reproduction,
36
+      and distribution as defined by Sections 1 through 9 of this document.
37
+
38
+      "Licensor" shall mean the copyright owner or entity authorized by
39
+      the copyright owner that is granting the License.
40
+
41
+      "Legal Entity" shall mean the union of the acting entity and all
42
+      other entities that control, are controlled by, or are under common
43
+      control with that entity. For the purposes of this definition,
44
+      "control" means (i) the power, direct or indirect, to cause the
45
+      direction or management of such entity, whether by contract or
46
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
47
+      outstanding shares, or (iii) beneficial ownership of such entity.
48
+
49
+      "You" (or "Your") shall mean an individual or Legal Entity
50
+      exercising permissions granted by this License.
51
+
52
+      "Source" form shall mean the preferred form for making modifications,
53
+      including but not limited to software source code, documentation
54
+      source, and configuration files.
55
+
56
+      "Object" form shall mean any form resulting from mechanical
57
+      transformation or translation of a Source form, including but
58
+      not limited to compiled object code, generated documentation,
59
+      and conversions to other media types.
60
+
61
+      "Work" shall mean the work of authorship, whether in Source or
62
+      Object form, made available under the License, as indicated by a
63
+      copyright notice that is included in or attached to the work
64
+      (an example is provided in the Appendix below).
65
+
66
+      "Derivative Works" shall mean any work, whether in Source or Object
67
+      form, that is based on (or derived from) the Work and for which the
68
+      editorial revisions, annotations, elaborations, or other modifications
69
+      represent, as a whole, an original work of authorship. For the purposes
70
+      of this License, Derivative Works shall not include works that remain
71
+      separable from, or merely link (or bind by name) to the interfaces of,
72
+      the Work and Derivative Works thereof.
73
+
74
+      "Contribution" shall mean any work of authorship, including
75
+      the original version of the Work and any modifications or additions
76
+      to that Work or Derivative Works thereof, that is intentionally
77
+      submitted to Licensor for inclusion in the Work by the copyright owner
78
+      or by an individual or Legal Entity authorized to submit on behalf of
79
+      the copyright owner. For the purposes of this definition, "submitted"
80
+      means any form of electronic, verbal, or written communication sent
81
+      to the Licensor or its representatives, including but not limited to
82
+      communication on electronic mailing lists, source code control systems,
83
+      and issue tracking systems that are managed by, or on behalf of, the
84
+      Licensor for the purpose of discussing and improving the Work, but
85
+      excluding communication that is conspicuously marked or otherwise
86
+      designated in writing by the copyright owner as "Not a Contribution."
87
+
88
+      "Contributor" shall mean Licensor and any individual or Legal Entity
89
+      on behalf of whom a Contribution has been received by Licensor and
90
+      subsequently incorporated within the Work.
91
+
92
+   2. Grant of Copyright License. Subject to the terms and conditions of
93
+      this License, each Contributor hereby grants to You a perpetual,
94
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
95
+      copyright license to reproduce, prepare Derivative Works of,
96
+      publicly display, publicly perform, sublicense, and distribute the
97
+      Work and such Derivative Works in Source or Object form.
98
+
99
+   3. Grant of Patent License. Subject to the terms and conditions of
100
+      this License, each Contributor hereby grants to You a perpetual,
101
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
102
+      (except as stated in this section) patent license to make, have made,
103
+      use, offer to sell, sell, import, and otherwise transfer the Work,
104
+      where such license applies only to those patent claims licensable
105
+      by such Contributor that are necessarily infringed by their
106
+      Contribution(s) alone or by combination of their Contribution(s)
107
+      with the Work to which such Contribution(s) was submitted. If You
108
+      institute patent litigation against any entity (including a
109
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
110
+      or a Contribution incorporated within the Work constitutes direct
111
+      or contributory patent infringement, then any patent licenses
112
+      granted to You under this License for that Work shall terminate
113
+      as of the date such litigation is filed.
114
+
115
+   4. Redistribution. You may reproduce and distribute copies of the
116
+      Work or Derivative Works thereof in any medium, with or without
117
+      modifications, and in Source or Object form, provided that You
118
+      meet the following conditions:
119
+
120
+      (a) You must give any other recipients of the Work or
121
+          Derivative Works a copy of this License; and
122
+
123
+      (b) You must cause any modified files to carry prominent notices
124
+          stating that You changed the files; and
125
+
126
+      (c) You must retain, in the Source form of any Derivative Works
127
+          that You distribute, all copyright, patent, trademark, and
128
+          attribution notices from the Source form of the Work,
129
+          excluding those notices that do not pertain to any part of
130
+          the Derivative Works; and
131
+
132
+      (d) If the Work includes a "NOTICE" text file as part of its
133
+          distribution, then any Derivative Works that You distribute must
134
+          include a readable copy of the attribution notices contained
135
+          within such NOTICE file, excluding those notices that do not
136
+          pertain to any part of the Derivative Works, in at least one
137
+          of the following places: within a NOTICE text file distributed
138
+          as part of the Derivative Works; within the Source form or
139
+          documentation, if provided along with the Derivative Works; or,
140
+          within a display generated by the Derivative Works, if and
141
+          wherever such third-party notices normally appear. The contents
142
+          of the NOTICE file are for informational purposes only and
143
+          do not modify the License. You may add Your own attribution
144
+          notices within Derivative Works that You distribute, alongside
145
+          or as an addendum to the NOTICE text from the Work, provided
146
+          that such additional attribution notices cannot be construed
147
+          as modifying the License.
148
+
149
+      You may add Your own copyright statement to Your modifications and
150
+      may provide additional or different license terms and conditions
151
+      for use, reproduction, or distribution of Your modifications, or
152
+      for any such Derivative Works as a whole, provided Your use,
153
+      reproduction, and distribution of the Work otherwise complies with
154
+      the conditions stated in this License.
155
+
156
+   5. Submission of Contributions. Unless You explicitly state otherwise,
157
+      any Contribution intentionally submitted for inclusion in the Work
158
+      by You to the Licensor shall be under the terms and conditions of
159
+      this License, without any additional terms or conditions.
160
+      Notwithstanding the above, nothing herein shall supersede or modify
161
+      the terms of any separate license agreement you may have executed
162
+      with Licensor regarding such Contributions.
163
+
164
+   6. Trademarks. This License does not grant permission to use the trade
165
+      names, trademarks, service marks, or product names of the Licensor,
166
+      except as required for reasonable and customary use in describing the
167
+      origin of the Work and reproducing the content of the NOTICE file.
168
+
169
+   7. Disclaimer of Warranty. Unless required by applicable law or
170
+      agreed to in writing, Licensor provides the Work (and each
171
+      Contributor provides its Contributions) on an "AS IS" BASIS,
172
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
173
+      implied, including, without limitation, any warranties or conditions
174
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
175
+      PARTICULAR PURPOSE. You are solely responsible for determining the
176
+      appropriateness of using or redistributing the Work and assume any
177
+      risks associated with Your exercise of permissions under this License.
178
+
179
+   8. Limitation of Liability. In no event and under no legal theory,
180
+      whether in tort (including negligence), contract, or otherwise,
181
+      unless required by applicable law (such as deliberate and grossly
182
+      negligent acts) or agreed to in writing, shall any Contributor be
183
+      liable to You for damages, including any direct, indirect, special,
184
+      incidental, or consequential damages of any character arising as a
185
+      result of this License or out of the use or inability to use the
186
+      Work (including but not limited to damages for loss of goodwill,
187
+      work stoppage, computer failure or malfunction, or any and all
188
+      other commercial damages or losses), even if such Contributor
189
+      has been advised of the possibility of such damages.
190
+
191
+   9. Accepting Warranty or Additional Liability. While redistributing
192
+      the Work or Derivative Works thereof, You may choose to offer,
193
+      and charge a fee for, acceptance of support, warranty, indemnity,
194
+      or other liability obligations and/or rights consistent with this
195
+      License. However, in accepting such obligations, You may act only
196
+      on Your own behalf and on Your sole responsibility, not on behalf
197
+      of any other Contributor, and only if You agree to indemnify,
198
+      defend, and hold each Contributor harmless for any liability
199
+      incurred by, or claims asserted against, such Contributor by reason
200
+      of your accepting any such warranty or additional liability.
201
+
202
+   END OF TERMS AND CONDITIONS
203
+
204
+   APPENDIX: How to apply the Apache License to your work.
205
+
206
+      To apply the Apache License to your work, attach the following
207
+      boilerplate notice, with the fields enclosed by brackets "[]"
208
+      replaced with your own identifying information. (Don't include
209
+      the brackets!)  The text should be enclosed in the appropriate
210
+      comment syntax for the file format. We also recommend that a
211
+      file or class name and description of purpose be included on the
212
+      same "printed page" as the copyright notice for easier
213
+      identification within third-party archives.
214
+
215
+   Copyright [yyyy] [name of copyright owner]
216
+
217
+   Licensed under the Apache License, Version 2.0 (the "License");
218
+   you may not use this file except in compliance with the License.
219
+   You may obtain a copy of the License at
220
+
221
+       http://www.apache.org/licenses/LICENSE-2.0
222
+
223
+   Unless required by applicable law or agreed to in writing, software
224
+   distributed under the License is distributed on an "AS IS" BASIS,
225
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
226
+   See the License for the specific language governing permissions and
227
+   limitations under the License.
228
+
27 229
 
28 230
 ## FirebaseAnalytics
29 231
 

+ 204
- 2
Pods/Target Support Files/Pods-EncuestaMarle/Pods-EncuestaMarle-acknowledgements.plist 查看文件

@@ -58,9 +58,211 @@
58 58
 		</dict>
59 59
 		<dict>
60 60
 			<key>FooterText</key>
61
-			<string>Copyright 2019 Google</string>
61
+			<string>
62
+                                 Apache License
63
+                           Version 2.0, January 2004
64
+                        http://www.apache.org/licenses/
65
+
66
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
67
+
68
+   1. Definitions.
69
+
70
+      "License" shall mean the terms and conditions for use, reproduction,
71
+      and distribution as defined by Sections 1 through 9 of this document.
72
+
73
+      "Licensor" shall mean the copyright owner or entity authorized by
74
+      the copyright owner that is granting the License.
75
+
76
+      "Legal Entity" shall mean the union of the acting entity and all
77
+      other entities that control, are controlled by, or are under common
78
+      control with that entity. For the purposes of this definition,
79
+      "control" means (i) the power, direct or indirect, to cause the
80
+      direction or management of such entity, whether by contract or
81
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
82
+      outstanding shares, or (iii) beneficial ownership of such entity.
83
+
84
+      "You" (or "Your") shall mean an individual or Legal Entity
85
+      exercising permissions granted by this License.
86
+
87
+      "Source" form shall mean the preferred form for making modifications,
88
+      including but not limited to software source code, documentation
89
+      source, and configuration files.
90
+
91
+      "Object" form shall mean any form resulting from mechanical
92
+      transformation or translation of a Source form, including but
93
+      not limited to compiled object code, generated documentation,
94
+      and conversions to other media types.
95
+
96
+      "Work" shall mean the work of authorship, whether in Source or
97
+      Object form, made available under the License, as indicated by a
98
+      copyright notice that is included in or attached to the work
99
+      (an example is provided in the Appendix below).
100
+
101
+      "Derivative Works" shall mean any work, whether in Source or Object
102
+      form, that is based on (or derived from) the Work and for which the
103
+      editorial revisions, annotations, elaborations, or other modifications
104
+      represent, as a whole, an original work of authorship. For the purposes
105
+      of this License, Derivative Works shall not include works that remain
106
+      separable from, or merely link (or bind by name) to the interfaces of,
107
+      the Work and Derivative Works thereof.
108
+
109
+      "Contribution" shall mean any work of authorship, including
110
+      the original version of the Work and any modifications or additions
111
+      to that Work or Derivative Works thereof, that is intentionally
112
+      submitted to Licensor for inclusion in the Work by the copyright owner
113
+      or by an individual or Legal Entity authorized to submit on behalf of
114
+      the copyright owner. For the purposes of this definition, "submitted"
115
+      means any form of electronic, verbal, or written communication sent
116
+      to the Licensor or its representatives, including but not limited to
117
+      communication on electronic mailing lists, source code control systems,
118
+      and issue tracking systems that are managed by, or on behalf of, the
119
+      Licensor for the purpose of discussing and improving the Work, but
120
+      excluding communication that is conspicuously marked or otherwise
121
+      designated in writing by the copyright owner as "Not a Contribution."
122
+
123
+      "Contributor" shall mean Licensor and any individual or Legal Entity
124
+      on behalf of whom a Contribution has been received by Licensor and
125
+      subsequently incorporated within the Work.
126
+
127
+   2. Grant of Copyright License. Subject to the terms and conditions of
128
+      this License, each Contributor hereby grants to You a perpetual,
129
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
130
+      copyright license to reproduce, prepare Derivative Works of,
131
+      publicly display, publicly perform, sublicense, and distribute the
132
+      Work and such Derivative Works in Source or Object form.
133
+
134
+   3. Grant of Patent License. Subject to the terms and conditions of
135
+      this License, each Contributor hereby grants to You a perpetual,
136
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
137
+      (except as stated in this section) patent license to make, have made,
138
+      use, offer to sell, sell, import, and otherwise transfer the Work,
139
+      where such license applies only to those patent claims licensable
140
+      by such Contributor that are necessarily infringed by their
141
+      Contribution(s) alone or by combination of their Contribution(s)
142
+      with the Work to which such Contribution(s) was submitted. If You
143
+      institute patent litigation against any entity (including a
144
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
145
+      or a Contribution incorporated within the Work constitutes direct
146
+      or contributory patent infringement, then any patent licenses
147
+      granted to You under this License for that Work shall terminate
148
+      as of the date such litigation is filed.
149
+
150
+   4. Redistribution. You may reproduce and distribute copies of the
151
+      Work or Derivative Works thereof in any medium, with or without
152
+      modifications, and in Source or Object form, provided that You
153
+      meet the following conditions:
154
+
155
+      (a) You must give any other recipients of the Work or
156
+          Derivative Works a copy of this License; and
157
+
158
+      (b) You must cause any modified files to carry prominent notices
159
+          stating that You changed the files; and
160
+
161
+      (c) You must retain, in the Source form of any Derivative Works
162
+          that You distribute, all copyright, patent, trademark, and
163
+          attribution notices from the Source form of the Work,
164
+          excluding those notices that do not pertain to any part of
165
+          the Derivative Works; and
166
+
167
+      (d) If the Work includes a "NOTICE" text file as part of its
168
+          distribution, then any Derivative Works that You distribute must
169
+          include a readable copy of the attribution notices contained
170
+          within such NOTICE file, excluding those notices that do not
171
+          pertain to any part of the Derivative Works, in at least one
172
+          of the following places: within a NOTICE text file distributed
173
+          as part of the Derivative Works; within the Source form or
174
+          documentation, if provided along with the Derivative Works; or,
175
+          within a display generated by the Derivative Works, if and
176
+          wherever such third-party notices normally appear. The contents
177
+          of the NOTICE file are for informational purposes only and
178
+          do not modify the License. You may add Your own attribution
179
+          notices within Derivative Works that You distribute, alongside
180
+          or as an addendum to the NOTICE text from the Work, provided
181
+          that such additional attribution notices cannot be construed
182
+          as modifying the License.
183
+
184
+      You may add Your own copyright statement to Your modifications and
185
+      may provide additional or different license terms and conditions
186
+      for use, reproduction, or distribution of Your modifications, or
187
+      for any such Derivative Works as a whole, provided Your use,
188
+      reproduction, and distribution of the Work otherwise complies with
189
+      the conditions stated in this License.
190
+
191
+   5. Submission of Contributions. Unless You explicitly state otherwise,
192
+      any Contribution intentionally submitted for inclusion in the Work
193
+      by You to the Licensor shall be under the terms and conditions of
194
+      this License, without any additional terms or conditions.
195
+      Notwithstanding the above, nothing herein shall supersede or modify
196
+      the terms of any separate license agreement you may have executed
197
+      with Licensor regarding such Contributions.
198
+
199
+   6. Trademarks. This License does not grant permission to use the trade
200
+      names, trademarks, service marks, or product names of the Licensor,
201
+      except as required for reasonable and customary use in describing the
202
+      origin of the Work and reproducing the content of the NOTICE file.
203
+
204
+   7. Disclaimer of Warranty. Unless required by applicable law or
205
+      agreed to in writing, Licensor provides the Work (and each
206
+      Contributor provides its Contributions) on an "AS IS" BASIS,
207
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
208
+      implied, including, without limitation, any warranties or conditions
209
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
210
+      PARTICULAR PURPOSE. You are solely responsible for determining the
211
+      appropriateness of using or redistributing the Work and assume any
212
+      risks associated with Your exercise of permissions under this License.
213
+
214
+   8. Limitation of Liability. In no event and under no legal theory,
215
+      whether in tort (including negligence), contract, or otherwise,
216
+      unless required by applicable law (such as deliberate and grossly
217
+      negligent acts) or agreed to in writing, shall any Contributor be
218
+      liable to You for damages, including any direct, indirect, special,
219
+      incidental, or consequential damages of any character arising as a
220
+      result of this License or out of the use or inability to use the
221
+      Work (including but not limited to damages for loss of goodwill,
222
+      work stoppage, computer failure or malfunction, or any and all
223
+      other commercial damages or losses), even if such Contributor
224
+      has been advised of the possibility of such damages.
225
+
226
+   9. Accepting Warranty or Additional Liability. While redistributing
227
+      the Work or Derivative Works thereof, You may choose to offer,
228
+      and charge a fee for, acceptance of support, warranty, indemnity,
229
+      or other liability obligations and/or rights consistent with this
230
+      License. However, in accepting such obligations, You may act only
231
+      on Your own behalf and on Your sole responsibility, not on behalf
232
+      of any other Contributor, and only if You agree to indemnify,
233
+      defend, and hold each Contributor harmless for any liability
234
+      incurred by, or claims asserted against, such Contributor by reason
235
+      of your accepting any such warranty or additional liability.
236
+
237
+   END OF TERMS AND CONDITIONS
238
+
239
+   APPENDIX: How to apply the Apache License to your work.
240
+
241
+      To apply the Apache License to your work, attach the following
242
+      boilerplate notice, with the fields enclosed by brackets "[]"
243
+      replaced with your own identifying information. (Don't include
244
+      the brackets!)  The text should be enclosed in the appropriate
245
+      comment syntax for the file format. We also recommend that a
246
+      file or class name and description of purpose be included on the
247
+      same "printed page" as the copyright notice for easier
248
+      identification within third-party archives.
249
+
250
+   Copyright [yyyy] [name of copyright owner]
251
+
252
+   Licensed under the Apache License, Version 2.0 (the "License");
253
+   you may not use this file except in compliance with the License.
254
+   You may obtain a copy of the License at
255
+
256
+       http://www.apache.org/licenses/LICENSE-2.0
257
+
258
+   Unless required by applicable law or agreed to in writing, software
259
+   distributed under the License is distributed on an "AS IS" BASIS,
260
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
261
+   See the License for the specific language governing permissions and
262
+   limitations under the License.
263
+</string>
62 264
 			<key>License</key>
63
-			<string>Copyright</string>
265
+			<string>Apache</string>
64 266
 			<key>Title</key>
65 267
 			<string>Firebase</string>
66 268
 			<key>Type</key>

+ 1
- 1
Pods/Target Support Files/nanopb/nanopb-Info.plist 查看文件

@@ -15,7 +15,7 @@
15 15
   <key>CFBundlePackageType</key>
16 16
   <string>FMWK</string>
17 17
   <key>CFBundleShortVersionString</key>
18
-  <string>0.3.901</string>
18
+  <string>0.3.9011</string>
19 19
   <key>CFBundleSignature</key>
20 20
   <string>????</string>
21 21
   <key>CFBundleVersion</key>

+ 0
- 0
Pods/nanopb/LICENSE.txt 查看文件


+ 0
- 0
Pods/nanopb/README.md 查看文件


+ 0
- 0
Pods/nanopb/pb.h 查看文件


+ 0
- 0
Pods/nanopb/pb_common.c 查看文件


+ 0
- 0
Pods/nanopb/pb_common.h 查看文件


+ 0
- 0
Pods/nanopb/pb_decode.c 查看文件


+ 0
- 0
Pods/nanopb/pb_decode.h 查看文件


+ 0
- 0
Pods/nanopb/pb_encode.c 查看文件


+ 0
- 0
Pods/nanopb/pb_encode.h 查看文件