diff --git a/ios/PublicApi/Measure.swiftinterface b/ios/PublicApi/Measure.swiftinterface index 9b0b9edfc..810b2a898 100644 --- a/ios/PublicApi/Measure.swiftinterface +++ b/ios/PublicApi/Measure.swiftinterface @@ -1,7 +1,7 @@ // swift-interface-format-version: 1.0 -// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1) -// swift-module-flags: -target arm64-apple-ios12-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -enable-experimental-feature OpaqueTypeErasure -enable-bare-slash-regex -module-name Measure -// swift-module-flags-ignorable: -no-verify-emitted-module-interface +// swift-compiler-version: Apple Swift version 6.2 effective-5.10 (swiftlang-6.2.0.19.9 clang-1700.3.19.1) +// swift-module-flags: -target arm64-apple-ios12-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -enable-experimental-feature DebugDescriptionMacro -enable-bare-slash-regex -module-name Measure +// swift-module-flags-ignorable: -no-verify-emitted-module-interface -formal-cxx-interoperability-mode=off -interface-compiler-version 6.2 import AVKit import CoreData import CoreMotion @@ -11,7 +11,6 @@ import Foundation import MachO import Network import ObjectiveC -import ObjectiveC.runtime import Photos import Swift import SwiftUI @@ -21,10 +20,10 @@ import WebKit import _Concurrency import _StringProcessing import _SwiftConcurrencyShims -import os import os.log +import os +import ObjectiveC.runtime import os.signpost - public enum AttributeValue { case string(Swift.String) case boolean(Swift.Bool) @@ -33,50 +32,50 @@ public enum AttributeValue { case float(Swift.Float) case double(Swift.Double) } -extension Measure.AttributeValue: Swift.Codable { +extension Measure.AttributeValue : Swift.Codable { public func encode(to encoder: any Swift.Encoder) throws public init(from decoder: any Swift.Decoder) throws } public typealias SessionObCoreDataClassSet = Foundation.NSSet -@_inheritsConvenienceInitializers @objc(SessionOb) public class SessionOb: CoreData.NSManagedObject -{ - @objc override dynamic public init( - entity: CoreData.NSEntityDescription, insertInto context: CoreData.NSManagedObjectContext?) +@_inheritsConvenienceInitializers @objc(SessionOb) nonisolated public class SessionOb : CoreData.NSManagedObject { + #if compiler(>=5.3) && $NonescapableTypes + @objc override nonisolated dynamic public init(entity: CoreData.NSEntityDescription, insertInto context: CoreData.NSManagedObjectContext?) + #endif @objc deinit } public typealias SessionObCoreDataPropertiesSet = Foundation.NSSet extension Measure.SessionOb { @nonobjc public class func fetchRequest() -> CoreData.NSFetchRequest - @objc @NSManaged dynamic public var crashed: Swift.Bool { + @objc @NSManaged nonisolated dynamic public var crashed: Swift.Bool { @objc get @objc set } - @objc @NSManaged dynamic public var createdAt: Swift.Int64 { + @objc @NSManaged nonisolated dynamic public var createdAt: Swift.Int64 { @objc get @objc set } - @objc @NSManaged dynamic public var needsReporting: Swift.Bool { + @objc @NSManaged nonisolated dynamic public var needsReporting: Swift.Bool { @objc get @objc set } - @objc @NSManaged dynamic public var pid: Swift.Int32 { + @objc @NSManaged nonisolated dynamic public var pid: Swift.Int32 { @objc get @objc set } - @objc @NSManaged dynamic public var sessionId: Swift.String? { + #if compiler(>=5.3) && $NonescapableTypes + @objc @NSManaged nonisolated dynamic public var sessionId: Swift.String? { @objc get @objc set } + #endif } -@objc final public class BaseMeasureConfig: ObjectiveC.NSObject, Swift.Codable { - public init( - enableLogging: Swift.Bool? = nil, autoStart: Swift.Bool? = nil, - requestHeadersProvider: (any Measure.MsrRequestHeadersProvider)? = nil, - maxDiskUsageInMb: Swift.Int? = nil, enableFullCollectionMode: Swift.Bool? = nil) - @objc convenience public init( - enableLogging: Swift.Bool, autoStart: Swift.Bool, - requestHeadersProvider: (any Measure.MsrRequestHeadersProvider)?, - maxDiskUsageInMb: Foundation.NSNumber?, enableFullCollectionMode: Swift.Bool) +@objc final public class BaseMeasureConfig : ObjectiveC.NSObject, Swift.Codable { + #if compiler(>=5.3) && $NonescapableTypes + public init(enableLogging: Swift.Bool? = nil, autoStart: Swift.Bool? = nil, requestHeadersProvider: (any Measure.MsrRequestHeadersProvider)? = nil, maxDiskUsageInMb: Swift.Int? = nil, enableFullCollectionMode: Swift.Bool? = nil) + #endif + #if compiler(>=5.3) && $NonescapableTypes + @objc convenience public init(enableLogging: Swift.Bool, autoStart: Swift.Bool, requestHeadersProvider: (any Measure.MsrRequestHeadersProvider)?, maxDiskUsageInMb: Foundation.NSNumber?, enableFullCollectionMode: Swift.Bool) + #endif required public init(from decoder: any Swift.Decoder) throws final public func encode(to encoder: any Swift.Encoder) throws @objc deinit @@ -84,7 +83,9 @@ extension Measure.SessionOb { public protocol Span { var traceId: Swift.String { get } var spanId: Swift.String { get } + #if compiler(>=5.3) && $NonescapableTypes var parentId: Swift.String? { get } + #endif var isSampled: Swift.Bool { get } @discardableResult func setStatus(_ status: Measure.SpanStatus) -> any Measure.Span @@ -103,7 +104,7 @@ public protocol Span { @discardableResult func setAttribute(_ key: Swift.String, value: Swift.Bool) -> any Measure.Span @discardableResult - func setAttributes(_ attributes: [Swift.String: Measure.AttributeValue]) -> any Measure.Span + func setAttributes(_ attributes: [Swift.String : Measure.AttributeValue]) -> any Measure.Span @discardableResult func removeAttribute(_ key: Swift.String) -> any Measure.Span @discardableResult @@ -113,11 +114,13 @@ public protocol Span { func hasEnded() -> Swift.Bool func getDuration() -> Swift.Int64 } -public enum SpanStatus: Swift.Int64, Swift.Codable { +public enum SpanStatus : Swift.Int64, Swift.Codable { case unset case ok case error + #if compiler(>=5.3) && $NonescapableTypes public init?(rawValue: Swift.Int64) + #endif public typealias RawValue = Swift.Int64 public var rawValue: Swift.Int64 { get @@ -128,53 +131,49 @@ public protocol SpanBuilder { func startSpan() -> any Measure.Span func startSpan(_ timestamp: Swift.Int64) -> any Measure.Span } -@objc public class MsrText: ObjectiveC.NSObject { +@objc public class MsrText : ObjectiveC.NSObject { final public let reportBugTitle: Swift.String final public let descriptionPlaceholder: Swift.String final public let sendButton: Swift.String final public let screenshotButton: Swift.String final public let galleryButton: Swift.String final public let exitScreenshotMode: Swift.String - public init( - reportBugTitle: Swift.String, descriptionPlaceholder: Swift.String, sendButton: Swift.String, - screenshotButton: Swift.String, galleryButton: Swift.String, exitScreenshotMode: Swift.String) - public func update( - reportBugTitle: Swift.String? = nil, descriptionPlaceholder: Swift.String? = nil, - sendButton: Swift.String? = nil, screenshotButton: Swift.String? = nil, - galleryButton: Swift.String? = nil, exitScreenshotMode: Swift.String? = nil - ) -> Measure.MsrText + public init(reportBugTitle: Swift.String, descriptionPlaceholder: Swift.String, sendButton: Swift.String, screenshotButton: Swift.String, galleryButton: Swift.String, exitScreenshotMode: Swift.String) + #if compiler(>=5.3) && $NonescapableTypes + public func update(reportBugTitle: Swift.String? = nil, descriptionPlaceholder: Swift.String? = nil, sendButton: Swift.String? = nil, screenshotButton: Swift.String? = nil, galleryButton: Swift.String? = nil, exitScreenshotMode: Swift.String? = nil) -> Measure.MsrText + #endif @objc deinit } -@objc final public class ClientInfo: ObjectiveC.NSObject, Swift.Codable { +@objc final public class ClientInfo : ObjectiveC.NSObject, Swift.Codable { @objc public init(apiKey: Swift.String, apiUrl: Swift.String) required public init(from decoder: any Swift.Decoder) throws @objc deinit final public func encode(to encoder: any Swift.Encoder) throws } -@objc public class MsrFonts: ObjectiveC.NSObject { +@objc public class MsrFonts : ObjectiveC.NSObject { final public let title: UIKit.UIFont final public let button: UIKit.UIFont final public let placeholder: UIKit.UIFont public init(title: UIKit.UIFont, button: UIKit.UIFont, placeholder: UIKit.UIFont) - public func update( - title: UIKit.UIFont? = nil, button: UIKit.UIFont? = nil, placeholder: UIKit.UIFont? = nil - ) -> Measure.MsrFonts + #if compiler(>=5.3) && $NonescapableTypes + public func update(title: UIKit.UIFont? = nil, button: UIKit.UIFont? = nil, placeholder: UIKit.UIFont? = nil) -> Measure.MsrFonts + #endif @objc deinit } -@_inheritsConvenienceInitializers @objc(LifecycleManagerInternal) -public class LifecycleManagerInternal: ObjectiveC.NSObject { +@_inheritsConvenienceInitializers @objc(LifecycleManagerInternal) public class LifecycleManagerInternal : ObjectiveC.NSObject { @objc public static let shared: Measure.LifecycleManagerInternal - @objc public func sendLifecycleEvent( - _ event: Measure.VCLifecycleEventType, for viewController: UIKit.UIViewController) + @objc public func sendLifecycleEvent(_ event: Measure.VCLifecycleEventType, for viewController: UIKit.UIViewController) @objc override dynamic public init() @objc deinit } -public enum ScreenshotMaskLevel: Swift.String, Swift.Codable, Swift.CaseIterable { +public enum ScreenshotMaskLevel : Swift.String, Swift.Codable, Swift.CaseIterable { case allTextAndMedia case allText case allTextExceptClickable case sensitiveFieldsOnly + #if compiler(>=5.3) && $NonescapableTypes public init?(rawValue: Swift.String) + #endif public typealias AllCases = [Measure.ScreenshotMaskLevel] public typealias RawValue = Swift.String nonisolated public static var allCases: [Measure.ScreenshotMaskLevel] { @@ -184,31 +183,29 @@ public enum ScreenshotMaskLevel: Swift.String, Swift.Codable, Swift.CaseIterable get } } -@objc public enum ScreenshotMaskLevelObjc: Swift.Int { +@objc public enum ScreenshotMaskLevelObjc : Swift.Int { case allTextAndMedia case allText case allTextExceptClickable case sensitiveFieldsOnly + #if compiler(>=5.3) && $NonescapableTypes public init?(rawValue: Swift.Int) + #endif public typealias RawValue = Swift.Int public var rawValue: Swift.Int { get } } -@objc public class BugReportConfig: ObjectiveC.NSObject { +@objc public class BugReportConfig : ObjectiveC.NSObject { final public let colors: Measure.MsrColors final public let text: Measure.MsrText final public let dimensions: Measure.MsrDimensions final public let fonts: Measure.MsrFonts - public init( - colors: Measure.MsrColors = BugReportConfig.default.colors, - text: Measure.MsrText = BugReportConfig.default.text, - dimensions: Measure.MsrDimensions = BugReportConfig.default.dimensions, - fonts: Measure.MsrFonts = BugReportConfig.default.fonts) + public init(colors: Measure.MsrColors = BugReportConfig.default.colors, text: Measure.MsrText = BugReportConfig.default.text, dimensions: Measure.MsrDimensions = BugReportConfig.default.dimensions, fonts: Measure.MsrFonts = BugReportConfig.default.fonts) public static let `default`: Measure.BugReportConfig @objc deinit } -@objc public class MsrColors: ObjectiveC.NSObject { +@objc public class MsrColors : ObjectiveC.NSObject { final public let darkBackground: UIKit.UIColor final public let lightBackground: UIKit.UIColor final public let darkButtonBackground: UIKit.UIColor @@ -247,33 +244,16 @@ public enum ScreenshotMaskLevel: Swift.String, Swift.Codable, Swift.CaseIterable public var floatingExitButtonText: UIKit.UIColor { get } - public init( - darkBackground: UIKit.UIColor, lightBackground: UIKit.UIColor, - darkButtonBackground: UIKit.UIColor, lightButtonBackground: UIKit.UIColor, - darkText: UIKit.UIColor, lightText: UIKit.UIColor, darkPlaceholder: UIKit.UIColor, - lightPlaceholder: UIKit.UIColor, darkFloatingButtonBackground: UIKit.UIColor, - lightFloatingButtonBackground: UIKit.UIColor, darkFloatingButtonIcon: UIKit.UIColor, - lightFloatingButtonIcon: UIKit.UIColor, darkfloatingExitButtonText: UIKit.UIColor, - lightfloatingExitButtonText: UIKit.UIColor, badgeColor: UIKit.UIColor, - badgeTextColor: UIKit.UIColor, isDarkMode: Swift.Bool) - public func update( - darkBackground: UIKit.UIColor? = nil, lightBackground: UIKit.UIColor? = nil, - darkButtonBackground: UIKit.UIColor? = nil, lightButtonBackground: UIKit.UIColor? = nil, - darkText: UIKit.UIColor? = nil, lightText: UIKit.UIColor? = nil, - darkPlaceholder: UIKit.UIColor? = nil, lightPlaceholder: UIKit.UIColor? = nil, - darkFloatingButtonBackground: UIKit.UIColor? = nil, - lightFloatingButtonBackground: UIKit.UIColor? = nil, - darkFloatingButtonIcon: UIKit.UIColor? = nil, lightFloatingButtonIcon: UIKit.UIColor? = nil, - darkfloatingExitButtonText: UIKit.UIColor? = nil, - lightfloatingExitButtonText: UIKit.UIColor? = nil, badgeColor: UIKit.UIColor? = nil, - badgeTextColor: UIKit.UIColor? = nil, isDarkMode: Swift.Bool? = nil - ) -> Measure.MsrColors + public init(darkBackground: UIKit.UIColor, lightBackground: UIKit.UIColor, darkButtonBackground: UIKit.UIColor, lightButtonBackground: UIKit.UIColor, darkText: UIKit.UIColor, lightText: UIKit.UIColor, darkPlaceholder: UIKit.UIColor, lightPlaceholder: UIKit.UIColor, darkFloatingButtonBackground: UIKit.UIColor, lightFloatingButtonBackground: UIKit.UIColor, darkFloatingButtonIcon: UIKit.UIColor, lightFloatingButtonIcon: UIKit.UIColor, darkfloatingExitButtonText: UIKit.UIColor, lightfloatingExitButtonText: UIKit.UIColor, badgeColor: UIKit.UIColor, badgeTextColor: UIKit.UIColor, isDarkMode: Swift.Bool) + #if compiler(>=5.3) && $NonescapableTypes + public func update(darkBackground: UIKit.UIColor? = nil, lightBackground: UIKit.UIColor? = nil, darkButtonBackground: UIKit.UIColor? = nil, lightButtonBackground: UIKit.UIColor? = nil, darkText: UIKit.UIColor? = nil, lightText: UIKit.UIColor? = nil, darkPlaceholder: UIKit.UIColor? = nil, lightPlaceholder: UIKit.UIColor? = nil, darkFloatingButtonBackground: UIKit.UIColor? = nil, lightFloatingButtonBackground: UIKit.UIColor? = nil, darkFloatingButtonIcon: UIKit.UIColor? = nil, lightFloatingButtonIcon: UIKit.UIColor? = nil, darkfloatingExitButtonText: UIKit.UIColor? = nil, lightfloatingExitButtonText: UIKit.UIColor? = nil, badgeColor: UIKit.UIColor? = nil, badgeTextColor: UIKit.UIColor? = nil, isDarkMode: Swift.Bool? = nil) -> Measure.MsrColors + #endif @objc deinit } -@objc public protocol MsrRequestHeadersProvider: ObjectiveC.NSObjectProtocol { +@objc public protocol MsrRequestHeadersProvider : ObjectiveC.NSObjectProtocol { @objc func getRequestHeaders() -> Foundation.NSDictionary } -@objc public enum VCLifecycleEventType: Swift.Int, Swift.Codable { +@objc public enum VCLifecycleEventType : Swift.Int, Swift.Codable { case viewDidLoad = 0 case viewWillAppear = 1 case viewDidAppear = 2 @@ -284,161 +264,172 @@ public enum ScreenshotMaskLevel: Swift.String, Swift.Codable, Swift.CaseIterable case initWithCoder = 7 case loadView = 8 case vcDeinit = 9 + #if compiler(>=5.3) && $NonescapableTypes public init?(rawValue: Swift.Int) + #endif public typealias RawValue = Swift.Int public var rawValue: Swift.Int { get } } -@objc public class MsrAttachment: ObjectiveC.NSObject, Swift.Codable { +@objc public class MsrAttachment : ObjectiveC.NSObject, Swift.Codable { final public let name: Swift.String final public let type: Measure.AttachmentType public var bytes: Foundation.Data? public var path: Swift.String? public var size: Swift.Int64 public var id: Swift.String - public init( - name: Swift.String, type: Measure.AttachmentType, size: Swift.Int64, id: Swift.String, - bytes: Foundation.Data? = nil, path: Swift.String? = nil) + #if compiler(>=5.3) && $NonescapableTypes + public init(name: Swift.String, type: Measure.AttachmentType, size: Swift.Int64, id: Swift.String, bytes: Foundation.Data? = nil, path: Swift.String? = nil) + #endif @objc deinit public func encode(to encoder: any Swift.Encoder) throws required public init(from decoder: any Swift.Decoder) throws } -@objc public class MsrDimensions: ObjectiveC.NSObject { +@objc public class MsrDimensions : ObjectiveC.NSObject { final public let topPadding: CoreFoundation.CGFloat public init(topPadding: CoreFoundation.CGFloat) + #if compiler(>=5.3) && $NonescapableTypes public func update(topPadding: CoreFoundation.CGFloat? = nil) -> Measure.MsrDimensions + #endif @objc deinit } @available(iOS 13, macOS 10.15, tvOS 13, watchOS 6.0, *) -@_Concurrency.MainActor @preconcurrency public struct MsrMoniterView: SwiftUICore.View -where Content: SwiftUICore.View { - @_Concurrency.MainActor @preconcurrency public init( - _ viewName: Swift.String? = nil, content: @escaping () -> Content) +@_Concurrency.MainActor @preconcurrency public struct MsrMoniterView : SwiftUICore.View where Content : SwiftUICore.View { + #if compiler(>=5.3) && $NonescapableTypes + @_Concurrency.MainActor @preconcurrency public init(_ viewName: Swift.String? = nil, content: @escaping () -> Content) + #endif @_Concurrency.MainActor @preconcurrency public var body: some SwiftUICore.View { get } @available(iOS 13, tvOS 13, watchOS 6.0, macOS 10.15, *) - public typealias Body = - @_opaqueReturnTypeOf("$s7Measure14MsrMoniterViewV4bodyQrvp", 0) __ + public typealias Body = @_opaqueReturnTypeOf("$s7Measure14MsrMoniterViewV4bodyQrvp", 0) __ } @available(iOS 13, macOS 10.15, tvOS 13, watchOS 6.0, *) extension SwiftUICore.View { - @_Concurrency.MainActor @preconcurrency public func moniterWithMsr( - _ viewName: Swift.String? = nil - ) -> some SwiftUICore.View - + #if compiler(>=5.3) && $NonescapableTypes + @_Concurrency.MainActor @preconcurrency public func moniterWithMsr(_ viewName: Swift.String? = nil) -> some SwiftUICore.View + + #endif } -@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc -final public class Measure: ObjectiveC.NSObject { +@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc final public class Measure : ObjectiveC.NSObject { @objc deinit } extension Measure.Measure { - @objc public static func initialize( - with client: Measure.ClientInfo, config: Measure.BaseMeasureConfig? = nil) + #if compiler(>=5.3) && $NonescapableTypes + @objc public static func initialize(with client: Measure.ClientInfo, config: Measure.BaseMeasureConfig? = nil) + #endif @objc public static func start() @objc public static func stop() + #if compiler(>=5.3) && $NonescapableTypes @objc public static func getSessionId() -> Swift.String? - public static func internalTrackEvent( - data: inout [Swift.String: Any?], type: Swift.String, timestamp: Swift.Int64, - attributes: [Swift.String: Any?], userDefinedAttrs: [Swift.String: Measure.AttributeValue], - userTriggered: Swift.Bool, sessionId: Swift.String?, threadName: Swift.String?, - attachments: [Measure.MsrAttachment]) - public static func internalTrackSpan( - name: Swift.String, traceId: Swift.String, spanId: Swift.String, parentId: Swift.String?, - startTime: Swift.Int64, endTime: Swift.Int64, duration: Swift.Int64, status: Swift.Int64, - attributes: [Swift.String: Any?], userDefinedAttrs: [Swift.String: Measure.AttributeValue], - checkpoints: [Swift.String: Swift.Int64], hasEnded: Swift.Bool, isSampled: Swift.Bool) - public static func trackEvent( - name: Swift.String, attributes: [Swift.String: Measure.AttributeValue], - timestamp: Swift.Int64? = nil) - @objc public static func trackEvent( - _ name: Swift.String, attributes: [Swift.String: Any], timestamp: Foundation.NSNumber? = nil) - public static func trackScreenView( - _ screenName: Swift.String, attributes: [Swift.String: Measure.AttributeValue]?) - @objc public static func trackScreenView( - _ screenName: Swift.String, attributes: [Swift.String: Any]?) + #endif + #if compiler(>=5.3) && $NonescapableTypes + public static func internalTrackEvent(data: inout [Swift.String : Any?], type: Swift.String, timestamp: Swift.Int64, attributes: [Swift.String : Any?], userDefinedAttrs: [Swift.String : Measure.AttributeValue], userTriggered: Swift.Bool, sessionId: Swift.String?, threadName: Swift.String?, attachments: [Measure.MsrAttachment]) + #endif + #if compiler(>=5.3) && $NonescapableTypes + public static func internalTrackSpan(name: Swift.String, traceId: Swift.String, spanId: Swift.String, parentId: Swift.String?, startTime: Swift.Int64, endTime: Swift.Int64, duration: Swift.Int64, status: Swift.Int64, attributes: [Swift.String : Any?], userDefinedAttrs: [Swift.String : Measure.AttributeValue], checkpoints: [Swift.String : Swift.Int64], hasEnded: Swift.Bool, isSampled: Swift.Bool) + #endif + #if compiler(>=5.3) && $NonescapableTypes + public static func trackEvent(name: Swift.String, attributes: [Swift.String : Measure.AttributeValue], timestamp: Swift.Int64? = nil) + #endif + #if compiler(>=5.3) && $NonescapableTypes + @objc public static func trackEvent(_ name: Swift.String, attributes: [Swift.String : Any], timestamp: Foundation.NSNumber? = nil) + #endif + #if compiler(>=5.3) && $NonescapableTypes + public static func trackScreenView(_ screenName: Swift.String, attributes: [Swift.String : Measure.AttributeValue]?) + #endif + #if compiler(>=5.3) && $NonescapableTypes + @objc public static func trackScreenView(_ screenName: Swift.String, attributes: [Swift.String : Any]?) + #endif @objc public static func setUserId(_ userId: Swift.String) @objc public static func clearUserId() @objc public static func getCurrentTime() -> Swift.Int64 public static func startSpan(name: Swift.String) -> any Measure.Span public static func startSpan(name: Swift.String, timestamp: Swift.Int64) -> any Measure.Span + #if compiler(>=5.3) && $NonescapableTypes public static func createSpanBuilder(name: Swift.String) -> (any Measure.SpanBuilder)? + #endif public static func getTraceParentHeaderValue(span: any Measure.Span) -> Swift.String public static func getTraceParentHeaderKey() -> Swift.String - public static func launchBugReport( - takeScreenshot: Swift.Bool = true, bugReportConfig: Measure.BugReportConfig = .default, - attributes: [Swift.String: Measure.AttributeValue]? = nil) - @objc public static func launchBugReport( - takeScreenshot: Swift.Bool = true, bugReportConfig: Measure.BugReportConfig = .default, - attributes: [Swift.String: Any]? = nil) + #if compiler(>=5.3) && $NonescapableTypes + public static func launchBugReport(takeScreenshot: Swift.Bool = true, bugReportConfig: Measure.BugReportConfig = .default, attributes: [Swift.String : Measure.AttributeValue]? = nil) + #endif + #if compiler(>=5.3) && $NonescapableTypes + @objc public static func launchBugReport(takeScreenshot: Swift.Bool = true, bugReportConfig: Measure.BugReportConfig = .default, attributes: [Swift.String : Any]? = nil) + #endif + #if compiler(>=5.3) && $NonescapableTypes @objc public static func onShake(_ handler: (() -> Swift.Void)?) - public static func trackBugReport( - description: Swift.String, attachments: [Measure.MsrAttachment] = [], - attributes: [Swift.String: Measure.AttributeValue]? = nil) - @objc public static func trackBugReport( - description: Swift.String, attachments: [Measure.MsrAttachment] = [], - attributes: [Swift.String: Any]? = nil) - @objc public static func captureScreenshot( - for viewController: UIKit.UIViewController, - completion: @escaping (Measure.MsrAttachment?) -> Swift.Void) - @objc public static func captureLayoutSnapshot( - for viewController: UIKit.UIViewController, - completion: @escaping (Measure.MsrAttachment?) -> Swift.Void) - public static func trackError( - _ error: any Swift.Error, attributes: [Swift.String: Measure.AttributeValue]? = nil, - collectStackTraces: Swift.Bool = false) - @objc public static func trackError( - _ error: Foundation.NSError, attributes: [Swift.String: Any]? = nil, - collectStackTraces: Swift.Bool = false) + #endif + #if compiler(>=5.3) && $NonescapableTypes + public static func trackBugReport(description: Swift.String, attachments: [Measure.MsrAttachment] = [], attributes: [Swift.String : Measure.AttributeValue]? = nil) + #endif + #if compiler(>=5.3) && $NonescapableTypes + @objc public static func trackBugReport(description: Swift.String, attachments: [Measure.MsrAttachment] = [], attributes: [Swift.String : Any]? = nil) + #endif + #if compiler(>=5.3) && $NonescapableTypes + @objc public static func captureScreenshot(for viewController: UIKit.UIViewController, completion: @escaping (Measure.MsrAttachment?) -> Swift.Void) + #endif + #if compiler(>=5.3) && $NonescapableTypes + @objc public static func captureLayoutSnapshot(for viewController: UIKit.UIViewController, completion: @escaping (Measure.MsrAttachment?) -> Swift.Void) + #endif + #if compiler(>=5.3) && $NonescapableTypes + public static func trackError(_ error: any Swift.Error, attributes: [Swift.String : Measure.AttributeValue]? = nil, collectStackTraces: Swift.Bool = false) + #endif + #if compiler(>=5.3) && $NonescapableTypes + @objc public static func trackError(_ error: Foundation.NSError, attributes: [Swift.String : Any]? = nil, collectStackTraces: Swift.Bool = false) + #endif + #if compiler(>=5.3) && $NonescapableTypes public static func internalGetAttachmentDirectory() -> Swift.String? + #endif + #if compiler(>=5.3) && $NonescapableTypes public static func internalGetDynamicConfigPath() -> Swift.String? - public static func trackHttpEvent( - url: Swift.String, method: Swift.String, startTime: Swift.UInt64, endTime: Swift.UInt64, - client: Swift.String = "unknown", statusCode: Swift.Int? = nil, error: (any Swift.Error)? = nil, - requestHeaders: [Swift.String: Swift.String]? = nil, - responseHeaders: [Swift.String: Swift.String]? = nil, requestBody: Swift.String? = nil, - responseBody: Swift.String? = nil) + #endif + #if compiler(>=5.3) && $NonescapableTypes + public static func trackHttpEvent(url: Swift.String, method: Swift.String, startTime: Swift.UInt64, endTime: Swift.UInt64, client: Swift.String = "unknown", statusCode: Swift.Int? = nil, error: (any Swift.Error)? = nil, requestHeaders: [Swift.String : Swift.String]? = nil, responseHeaders: [Swift.String : Swift.String]? = nil, requestBody: Swift.String? = nil, responseBody: Swift.String? = nil) + #endif } -@_inheritsConvenienceInitializers @objc public class MSRNetworkInterceptor: ObjectiveC.NSObject { - @objc(enableOn:) public static func enable( - on sessionConfiguration: Foundation.URLSessionConfiguration) +@_inheritsConvenienceInitializers @objc public class MSRNetworkInterceptor : ObjectiveC.NSObject { + @objc(enableOn:) public static func enable(on sessionConfiguration: Foundation.URLSessionConfiguration) @objc override dynamic public init() @objc deinit } -public enum AttachmentType: Swift.String, Swift.Codable { +public enum AttachmentType : Swift.String, Swift.Codable { case screenshot case layoutSnapshot case layoutSnapshotJson + #if compiler(>=5.3) && $NonescapableTypes public init?(rawValue: Swift.String) + #endif public typealias RawValue = Swift.String public var rawValue: Swift.String { get } } -@objc @_inheritsConvenienceInitializers @_Concurrency.MainActor @preconcurrency -open class MsrViewController: UIKit.UIViewController { +@objc @_inheritsConvenienceInitializers @_Concurrency.MainActor @preconcurrency open class MsrViewController : UIKit.UIViewController { @_Concurrency.MainActor @preconcurrency @objc override dynamic open func loadView() @objc deinit - @_Concurrency.MainActor @preconcurrency @objc override dynamic public init( - nibName nibNameOrNil: Swift.String?, bundle nibBundleOrNil: Foundation.Bundle?) - @_Concurrency.MainActor @preconcurrency @objc required dynamic public init?( - coder: Foundation.NSCoder) + #if compiler(>=5.3) && $NonescapableTypes + @_Concurrency.MainActor @preconcurrency @objc override dynamic public init(nibName nibNameOrNil: Swift.String?, bundle nibBundleOrNil: Foundation.Bundle?) + #endif + #if compiler(>=5.3) && $NonescapableTypes + @_Concurrency.MainActor @preconcurrency @objc required dynamic public init?(coder: Foundation.NSCoder) + #endif } -extension Measure.SpanStatus: Swift.Equatable {} -extension Measure.SpanStatus: Swift.Hashable {} -extension Measure.SpanStatus: Swift.RawRepresentable {} -extension Measure.ScreenshotMaskLevel: Swift.Equatable {} -extension Measure.ScreenshotMaskLevel: Swift.Hashable {} -extension Measure.ScreenshotMaskLevel: Swift.RawRepresentable {} -extension Measure.ScreenshotMaskLevelObjc: Swift.Equatable {} -extension Measure.ScreenshotMaskLevelObjc: Swift.Hashable {} -extension Measure.ScreenshotMaskLevelObjc: Swift.RawRepresentable {} -extension Measure.VCLifecycleEventType: Swift.Equatable {} -extension Measure.VCLifecycleEventType: Swift.Hashable {} -extension Measure.VCLifecycleEventType: Swift.RawRepresentable {} +extension Measure.SpanStatus : Swift.Equatable {} +extension Measure.SpanStatus : Swift.Hashable {} +extension Measure.SpanStatus : Swift.RawRepresentable {} +extension Measure.ScreenshotMaskLevel : Swift.Equatable {} +extension Measure.ScreenshotMaskLevel : Swift.Hashable {} +extension Measure.ScreenshotMaskLevel : Swift.RawRepresentable {} +extension Measure.ScreenshotMaskLevelObjc : Swift.Equatable {} +extension Measure.ScreenshotMaskLevelObjc : Swift.Hashable {} +extension Measure.ScreenshotMaskLevelObjc : Swift.RawRepresentable {} +extension Measure.VCLifecycleEventType : Swift.Equatable {} +extension Measure.VCLifecycleEventType : Swift.Hashable {} +extension Measure.VCLifecycleEventType : Swift.RawRepresentable {} @available(iOS 13, macOS 10.15, tvOS 13, watchOS 6.0, *) -extension Measure.MsrMoniterView: Swift.Sendable {} -extension Measure.AttachmentType: Swift.Equatable {} -extension Measure.AttachmentType: Swift.Hashable {} -extension Measure.AttachmentType: Swift.RawRepresentable {} +extension Measure.MsrMoniterView : Swift.Sendable {} +extension Measure.AttachmentType : Swift.Equatable {} +extension Measure.AttachmentType : Swift.Hashable {} +extension Measure.AttachmentType : Swift.RawRepresentable {} diff --git a/ios/Sources/MeasureSDK/Swift/Config/ConfigLoader.swift b/ios/Sources/MeasureSDK/Swift/Config/ConfigLoader.swift index 976810b24..b20c7bc47 100644 --- a/ios/Sources/MeasureSDK/Swift/Config/ConfigLoader.swift +++ b/ios/Sources/MeasureSDK/Swift/Config/ConfigLoader.swift @@ -21,17 +21,20 @@ struct BaseConfigLoader: ConfigLoader { private let decoder: JSONDecoder private let encoder: JSONEncoder private let logger: Logger + private let measureDispatchQueue: MeasureDispatchQueue init(userDefaultStorage: UserDefaultStorage, fileManager: SystemFileManager, networkClient: NetworkClient, timeProvider: TimeProvider, - logger: Logger) { + logger: Logger, + measureDispatchQueue: MeasureDispatchQueue) { self.userDefaultStorage = userDefaultStorage self.fileManager = fileManager self.networkClient = networkClient self.timeProvider = timeProvider self.logger = logger + self.measureDispatchQueue = measureDispatchQueue let decoder = JSONDecoder() self.decoder = decoder @@ -99,47 +102,49 @@ struct BaseConfigLoader: ConfigLoader { return } - let response = networkClient.getConfig(eTag: userDefaultStorage.getConfigEtag()) + measureDispatchQueue.submit { + let response = networkClient.getConfig(eTag: userDefaultStorage.getConfigEtag()) - switch response { + switch response { - case .success(let config, let eTag, let cacheControl): + case .success(let config, let eTag, let cacheControl): - saveConfigToDisk(config) + saveConfigToDisk(config) - userDefaultStorage.setConfigFetchTimestamp(now) - userDefaultStorage.setConfigCacheControl(Number(cacheControl)) + userDefaultStorage.setConfigFetchTimestamp(now) + userDefaultStorage.setConfigCacheControl(Number(cacheControl)) - if let eTag { - userDefaultStorage.setConfigEtag(eTag) - } + if let eTag { + userDefaultStorage.setConfigEtag(eTag) + } - logger.internalLog( - level: .debug, - message: "ConfigLoader: New config loaded from server successfully", - error: nil, - data: nil - ) + logger.internalLog( + level: .debug, + message: "ConfigLoader: New config loaded from server successfully", + error: nil, + data: nil + ) - case .notModified: + case .notModified: - userDefaultStorage.setConfigFetchTimestamp(now) + userDefaultStorage.setConfigFetchTimestamp(now) - logger.internalLog( - level: .debug, - message: "ConfigLoader: 304 Not Modified", - error: nil, - data: nil - ) + logger.internalLog( + level: .debug, + message: "ConfigLoader: 304 Not Modified", + error: nil, + data: nil + ) - case .error: + case .error: - logger.internalLog( - level: .error, - message: "ConfigLoader: Failed to load config from server", - error: nil, - data: nil - ) + logger.internalLog( + level: .error, + message: "ConfigLoader: Failed to load config from server", + error: nil, + data: nil + ) + } } } } diff --git a/ios/Sources/MeasureSDK/Swift/Http/URLSessionTaskSwizzler.swift b/ios/Sources/MeasureSDK/Swift/Http/URLSessionTaskSwizzler.swift index 644b3ccef..91202f406 100644 --- a/ios/Sources/MeasureSDK/Swift/Http/URLSessionTaskSwizzler.swift +++ b/ios/Sources/MeasureSDK/Swift/Http/URLSessionTaskSwizzler.swift @@ -122,9 +122,7 @@ extension URLSessionTask { objc_setAssociatedObject(self, &isHandlingStateKey, false, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } - DispatchQueue.global(qos: .utility).async { - URLSessionTaskInterceptor.shared.urlSessionTask(self, setState: state) - } + URLSessionTaskInterceptor.shared.urlSessionTask(self, setState: state) self.setStateSwizzled(state: state) } diff --git a/ios/Sources/MeasureSDK/Swift/MeasureInitializer.swift b/ios/Sources/MeasureSDK/Swift/MeasureInitializer.swift index e919884e2..6f381fa40 100644 --- a/ios/Sources/MeasureSDK/Swift/MeasureInitializer.swift +++ b/ios/Sources/MeasureSDK/Swift/MeasureInitializer.swift @@ -227,11 +227,13 @@ final class BaseMeasureInitializer: MeasureInitializer { eventSerializer: EventSerializer(), systemFileManager: systemFileManager) self.timeProvider = BaseTimeProvider() + self.measureDispatchQueue = BaseMeasureDispatchQueue() self.configLoader = BaseConfigLoader(userDefaultStorage: userDefaultStorage, fileManager: systemFileManager, networkClient: networkClient, timeProvider: timeProvider, - logger: logger) + logger: logger, + measureDispatchQueue: measureDispatchQueue) self.idProvider = UUIDProvider() self.coreDataManager = BaseCoreDataManager(logger: logger) self.sessionStore = BaseSessionStore(coreDataManager: coreDataManager, @@ -266,7 +268,6 @@ final class BaseMeasureInitializer: MeasureInitializer { self.deviceAttributeProcessor = DeviceAttributeProcessor() self.installationIdAttributeProcessor = InstallationIdAttributeProcessor(userDefaultStorage: userDefaultStorage, idProvider: idProvider) - self.measureDispatchQueue = BaseMeasureDispatchQueue() self.networkStateAttributeProcessor = NetworkStateAttributeProcessor(measureDispatchQueue: measureDispatchQueue) self.userAttributeProcessor = UserAttributeProcessor(userDefaultStorage: userDefaultStorage, measureDispatchQueue: measureDispatchQueue) diff --git a/ios/Tests/MeasureSDKTests/Config/ConfigLoaderTests.swift b/ios/Tests/MeasureSDKTests/Config/ConfigLoaderTests.swift index c416e7741..8ab073573 100644 --- a/ios/Tests/MeasureSDKTests/Config/ConfigLoaderTests.swift +++ b/ios/Tests/MeasureSDKTests/Config/ConfigLoaderTests.swift @@ -14,6 +14,7 @@ final class ConfigLoaderTests: XCTestCase { private var mockFileManager: MockSystemFileManager! private var mockTimeProvider: MockTimeProvider! private var configLoader: ConfigLoader! + private var measureDispatchQueue: MockMeasureDispatchQueue! override func setUp() { super.setUp() @@ -22,13 +23,15 @@ final class ConfigLoaderTests: XCTestCase { mockUserDefaults = MockUserDefaultStorage() mockFileManager = MockSystemFileManager() mockTimeProvider = MockTimeProvider() + measureDispatchQueue = MockMeasureDispatchQueue() configLoader = BaseConfigLoader( userDefaultStorage: mockUserDefaults, fileManager: mockFileManager, networkClient: mockNetworkClient, timeProvider: mockTimeProvider, - logger: MockLogger() + logger: MockLogger(), + measureDispatchQueue: measureDispatchQueue ) } @@ -38,6 +41,7 @@ final class ConfigLoaderTests: XCTestCase { mockUserDefaults = nil mockFileManager = nil mockTimeProvider = nil + measureDispatchQueue = nil super.tearDown() } diff --git a/ios/Tests/MeasureSDKTests/Mocks/MockMeasureInitializer.swift b/ios/Tests/MeasureSDKTests/Mocks/MockMeasureInitializer.swift index 93fc28458..4ecea6e72 100644 --- a/ios/Tests/MeasureSDKTests/Mocks/MockMeasureInitializer.swift +++ b/ios/Tests/MeasureSDKTests/Mocks/MockMeasureInitializer.swift @@ -149,11 +149,13 @@ final class MockMeasureInitializer: MeasureInitializer { eventSerializer: EventSerializer(), systemFileManager: self.systemFileManager) self.timeProvider = timeProvider ?? BaseTimeProvider() + self.measureDispatchQueue = measureDispatchQueue ?? BaseMeasureDispatchQueue() self.configLoader = configLoader ?? BaseConfigLoader(userDefaultStorage: self.userDefaultStorage, - fileManager: self.systemFileManager, - networkClient: self.networkClient, - timeProvider: self.timeProvider, - logger: self.logger) + fileManager: self.systemFileManager, + networkClient: self.networkClient, + timeProvider: self.timeProvider, + logger: self.logger, + measureDispatchQueue: self.measureDispatchQueue) self.idProvider = idProvider ?? UUIDProvider() self.coreDataManager = coreDataManager ?? BaseCoreDataManager(logger: self.logger) self.sessionStore = sessionStore ?? MockSessionStore() @@ -179,7 +181,6 @@ final class MockMeasureInitializer: MeasureInitializer { versionCode: FrameworkInfo.version, signalSampler: self.signalSampler) self.exporter = exporter ?? MockExporter() - self.measureDispatchQueue = measureDispatchQueue ?? BaseMeasureDispatchQueue() self.appAttributeProcessor = appAttributeProcessor ?? AppAttributeProcessor() self.deviceAttributeProcessor = deviceAttributeProcessor ?? DeviceAttributeProcessor() self.installationIdAttributeProcessor = installationIdAttributeProcessor ?? InstallationIdAttributeProcessor(userDefaultStorage: self.userDefaultStorage,