Ver Fonte

[Firebase 10] Revamp FIRLogger for Swift use (#10286)

* [Firebase 10] Revamp FIRLogger for Swift use

* Fix test impl and only run firebasepod.yml

* re-enable actions

* Implement logger

* Global TAP

* Revert .pbxproj

* Call directly to GULs

* Review

* Undo API breaks

* [skip ci] Avoid NS_SWIFT_NAME due to macro collisions
This fixes the warning that broke the Auth x watchOS job.

* [skip ci] Revert Gemfile
Nick Cooke há 3 anos atrás
pai
commit
71972ab0e8

+ 28 - 13
FirebaseCore/Extension/FIRLogger.h

@@ -147,27 +147,42 @@ extern void FIRLogWarningSwift(FIRLoggerService service, NSString *messageCode,
 }  // extern "C"
 #endif  // __cplusplus
 
+NS_SWIFT_NAME(FirebaseLogger)
 @interface FIRLoggerWrapper : NSObject
 
-/**
- * Objective-C wrapper for FirebaseLogBasic to allow weak linking to FirebaseLogger
- * (required) log level (one of the FirebaseLoggerLevel enum values).
- * (required) service name of type FirebaseLoggerService.
- * (required) message code starting with "I-" which means iOS, followed by a capitalized
- *            three-character service identifier and a six digit integer message ID that is unique
- *            within the service.
- *            An example of the message code is @"I-COR000001".
- * (required) message string which can be a format string.
- * (optional) variable arguments list obtained from calling va_start, used when message is a format
- *            string.
- */
-
+/// Logs a given message at a given log level. This API is effectively a wrapper for the
+/// `FIRLogBasic` C API.
+///
+/// - Parameters:
+///   - level: The log level to use (defined by `FirebaseLoggerLevel` enum values).
+///   - service: The service name of type `FirebaseLoggerService`.
+///   - code: The mesage code. Starting with "I-" which means iOS, followed by a capitalized
+///   three-character service identifier and a six digit integer message ID that is unique within
+///   the service. An example of the message code is @"I-COR000001".
+///   - message: Formatted string to be used as the log's message.
+///   - args: Arguments list obtained from calling `va_start`, used when message is a format string.
 + (void)logWithLevel:(FIRLoggerLevel)level
          withService:(FIRLoggerService)service
             withCode:(NSString *)messageCode
          withMessage:(NSString *)message
             withArgs:(va_list)args;
 
+/// Logs a given message at a given log level.
+///
+/// - Parameters:
+///   - level: The log level to use (defined by `FirebaseLoggerLevel` enum values).
+///   - service: The service name of type `FirebaseLoggerService`.
+///   - code: The mesage code. Starting with "I-" which means iOS, followed by a capitalized
+///   three-character service identifier and a six digit integer message ID that is unique within
+///   the service. An example of the message code is @"I-COR000001".
+///   - message: Formatted string to be used as the log's message.
+///   - args: Arguments list obtained from calling `va_start`, used when message is a format string.
++ (void)logWithLevel:(FIRLoggerLevel)level
+             service:(FIRLoggerService)service
+                code:(NSString *)code
+             message:(NSString *)message
+    __attribute__((__swift_name__("log(level:service:code:message:)")));
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 7 - 9
FirebaseCore/Sources/FIRLogger.m

@@ -157,15 +157,6 @@ FIR_LOGGING_FUNCTION(Notice)
 FIR_LOGGING_FUNCTION(Info)
 FIR_LOGGING_FUNCTION(Debug)
 
-// Swift does not support variadic function calls
-void FIRLogDebugSwift(FIRLoggerService service, NSString *messageCode, NSString *message) {
-  FIRLogDebug(service, messageCode, @"%@", message);
-}
-
-void FIRLogWarningSwift(FIRLoggerService service, NSString *messageCode, NSString *message) {
-  FIRLogWarning(service, messageCode, @"%@", message);
-}
-
 #undef FIR_MAKE_LOGGER
 
 #pragma mark - FIRLoggerWrapper
@@ -180,4 +171,11 @@ void FIRLogWarningSwift(FIRLoggerService service, NSString *messageCode, NSStrin
   FIRLogBasic(level, service, messageCode, message, args);
 }
 
++ (void)logWithLevel:(FIRLoggerLevel)level
+             service:(FIRLoggerService)service
+                code:(NSString *)code
+             message:(NSString *)message {
+  FIRLogBasic(level, service, code, message, NULL);
+}
+
 @end

+ 5 - 4
FirebaseStorage/Sources/Internal/StorageTokenAuthorizer.swift

@@ -64,10 +64,11 @@ internal class StorageTokenAuthorizer: NSObject, GTMSessionFetcherAuthorizer {
         request?.setValue(tokenResult.token, forHTTPHeaderField: "X-Firebase-AppCheck")
 
         if let error = tokenResult.error {
-          FIRLogDebugSwift(
-            "[FirebaseStorage]",
-            "I-STR000001",
-            "Failed to fetch AppCheck token. Error: \(error)"
+          FirebaseLogger.log(
+            level: .debug,
+            service: "[FirebaseStorage]",
+            code: "I-STR000001",
+            message: "Failed to fetch AppCheck token. Error: \(error)"
           )
         }
         fetchTokenGroup.leave()

+ 8 - 7
Firestore/Swift/Source/Codable/DocumentID.swift

@@ -109,7 +109,7 @@ public struct DocumentID<Value: DocumentIDWrappable & Codable>:
 
   public init(wrappedValue value: Value?) {
     if let value = value {
-      logWarning(for: value)
+      logIgnoredValueWarning(value: value)
     }
     self.value = value
   }
@@ -118,17 +118,18 @@ public struct DocumentID<Value: DocumentIDWrappable & Codable>:
     get { value }
     set {
       if let someNewValue = newValue {
-        logWarning(for: someNewValue)
+        logIgnoredValueWarning(value: someNewValue)
       }
       value = newValue
     }
   }
 
-  private func logWarning(for value: Value) {
-    FIRLogWarningSwift(
-      "[FirebaseFirestoreSwift]",
-      "I-FST000002",
-      """
+  private func logIgnoredValueWarning(value: Value) {
+    FirebaseLogger.log(
+      level: .warning,
+      service: "[FirebaseFirestoreSwift]",
+      code: "I-FST000002",
+      message: """
       Attempting to initialize or set a @DocumentID property with a non-nil
       value: \(value). The document ID is managed by Firestore and any
       initialized or set value will be ignored. The ID is automatically set