|
|
@@ -0,0 +1,71 @@
|
|
|
+// Copyright 2021 Google LLC
|
|
|
+//
|
|
|
+// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
+// you may not use this file except in compliance with the License.
|
|
|
+// You may obtain a copy of the License at
|
|
|
+//
|
|
|
+// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
+//
|
|
|
+// Unless required by applicable law or agreed to in writing, software
|
|
|
+// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
+// See the License for the specific language governing permissions and
|
|
|
+// limitations under the License.
|
|
|
+
|
|
|
+#if canImport(SwiftUI)
|
|
|
+ import FirebaseAnalytics
|
|
|
+ import SwiftUI
|
|
|
+
|
|
|
+ /// Custom view modifier to allow for easily logging screen view events.
|
|
|
+ @available(iOS 13, *)
|
|
|
+ @available(tvOS, unavailable)
|
|
|
+ @available(macOS, unavailable)
|
|
|
+ @available(macCatalyst, unavailable)
|
|
|
+ @available(watchOS, unavailable)
|
|
|
+ internal struct LoggedAnalyticsModifier: ViewModifier {
|
|
|
+ /// The name of the view to log in the `AnalyticsParameterScreenName` parameter.
|
|
|
+ let screenName: String
|
|
|
+
|
|
|
+ /// The name of the view to log in the `AnalyticsParameterScreenClass` parameter.
|
|
|
+ let screenClass: String
|
|
|
+
|
|
|
+ /// Extra parameters to log with the screen view event.
|
|
|
+ let extraParameters: [String: Any]
|
|
|
+
|
|
|
+ func body(content: Content) -> some View {
|
|
|
+ // Take the content and add an onAppear action to know when the view has appeared on screen.
|
|
|
+ content.onAppear {
|
|
|
+ // Log the event appearing, adding the appropriate keys and values needed for screen
|
|
|
+ // view events.
|
|
|
+ var parameters = extraParameters
|
|
|
+ parameters[AnalyticsParameterScreenName] = screenName
|
|
|
+ parameters[AnalyticsParameterScreenClass] = screenClass
|
|
|
+ Analytics.logEvent(AnalyticsEventScreenView, parameters: parameters)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @available(iOS 13, *)
|
|
|
+ @available(tvOS, unavailable)
|
|
|
+ @available(macOS, unavailable)
|
|
|
+ @available(macCatalyst, unavailable)
|
|
|
+ @available(watchOS, unavailable)
|
|
|
+ public extension View {
|
|
|
+ /// Logs `screen_view` events in Google Analytics for Firebase when this view appears on screen.
|
|
|
+ /// - Parameters:
|
|
|
+ /// - name: Current screen name logged with the `screen_view` event.
|
|
|
+ /// - class: Current screen class or struct logged with the `screen_view` event.
|
|
|
+ /// - extraParameters: Any additional parameters to be logged. These extra parameters must
|
|
|
+ /// follow the same rules as described in the `Analytics.logEvent(_:parameters:)` docs.
|
|
|
+ /// - Returns: A view with a custom `ViewModifier` used to log `screen_view` events when this
|
|
|
+ /// view appears on screen.
|
|
|
+ func analyticsScreen(name: String,
|
|
|
+ class: String = "View",
|
|
|
+ extraParameters: [String: Any] = [:]) -> some View {
|
|
|
+ // `self` is the view, we're just adding an `LoggedAnalyticsModifier` modifier on it.
|
|
|
+ modifier(LoggedAnalyticsModifier(screenName: name,
|
|
|
+ screenClass: `class`,
|
|
|
+ extraParameters: extraParameters))
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|