Skip to content

Commit

Permalink
create applePurchaseAttempt
Browse files Browse the repository at this point in the history
  • Loading branch information
vegaro committed Sep 9, 2024
1 parent edeff27 commit a64875d
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 1 deletion.
5 changes: 5 additions & 0 deletions Sources/Diagnostics/DiagnosticsEvent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ extension DiagnosticsEvent {
case httpRequestPerformed
case customerInfoVerificationResult
case maxEventsStoredLimitReached
case applePurchaseAttempt

}

Expand All @@ -41,9 +42,13 @@ extension DiagnosticsEvent {
case verificationResultKey
case endpointNameKey
case responseTimeMillisKey
case storeKitVersion
case successfulKey
case responseCodeKey
case backendErrorCodeKey
case errorMessageKey
case errorCodeKey
case skErrorCodeKey
case eTagHitKey

}
Expand Down
25 changes: 25 additions & 0 deletions Sources/Diagnostics/DiagnosticsTracker.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ protocol DiagnosticsTrackerType {
resultOrigin: HTTPResponseOrigin?,
verificationResult: VerificationResult) async

@available(iOS 15.0, tvOS 15.0, macOS 12.0, watchOS 8.0, *)
func trackPurchaseRequest(wasSuccessful: Bool,
storeKitVersion: StoreKitVersion,
errorMessage: String?,
errorCode: Int?,
skErrorCode: Int?) async

}

@available(iOS 15.0, tvOS 15.0, macOS 12.0, watchOS 8.0, *)
Expand Down Expand Up @@ -91,6 +98,24 @@ final class DiagnosticsTracker: DiagnosticsTrackerType {
)
}

func trackPurchaseRequest(wasSuccessful: Bool,
storeKitVersion: StoreKitVersion,
errorMessage: String?,
errorCode: Int?,
skErrorCode: Int?) async {
await track(
DiagnosticsEvent(eventType: .applePurchaseAttempt,
properties: [
.successfulKey: AnyEncodable(wasSuccessful),
.storeKitVersion: AnyEncodable("store_kit_\(storeKitVersion.debugDescription)"),
.errorMessageKey: AnyEncodable(errorMessage),
.errorCodeKey: AnyEncodable(errorCode),
.skErrorCodeKey: AnyEncodable(skErrorCode)
],
timestamp: self.dateProvider.now())
)
}

}

@available(iOS 15.0, tvOS 15.0, macOS 12.0, watchOS 8.0, *)
Expand Down
9 changes: 9 additions & 0 deletions Sources/Diagnostics/Networking/DiagnosticsEventsRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ private extension DiagnosticsEvent.EventType {
case .httpRequestPerformed: return "http_request_performed"
case .customerInfoVerificationResult: return "customer_info_verification_result"
case .maxEventsStoredLimitReached: return "max_events_stored_limit_reached"
case .applePurchaseAttempt: return "apple_purchase_attempt"
}

}
Expand All @@ -80,12 +81,20 @@ private extension DiagnosticsEvent.DiagnosticsPropertyKey {
return "endpoint_name"
case .responseTimeMillisKey:
return "response_time_millis"
case .storeKitVersion:
return "store_kit_version"
case .successfulKey:
return "successful"
case .responseCodeKey:
return "response_code"
case .backendErrorCodeKey:
return "backend_error_code"
case .errorMessageKey:
return "error_message"
case .errorCodeKey:
return "error_code"
case .skErrorCodeKey:
return "sk_error_code"
case .eTagHitKey:
return "etag_hit"
}
Expand Down
29 changes: 28 additions & 1 deletion Sources/Purchasing/Purchases/PurchasesOrchestrator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ final class PurchasesOrchestrator {
var _storeKit2TransactionListener: Any?
var _storeKit2StorefrontListener: Any?
var _diagnosticsSynchronizer: Any?
var _diagnosticsTracker: Any?
var _storeKit2ObserverModePurchaseDetector: Any?
// swiftlint:enable identifier_name

Expand All @@ -95,6 +96,11 @@ final class PurchasesOrchestrator {
return self._diagnosticsSynchronizer as? DiagnosticsSynchronizerType
}

@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
var diagnosticsTracker: DiagnosticsTrackerType? {
return self._diagnosticsTracker as? DiagnosticsTrackerType
}

@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
var storeKit2ObserverModePurchaseDetector: StoreKit2ObserverModePurchaseDetectorType? {
return self._storeKit2ObserverModePurchaseDetector as? StoreKit2ObserverModePurchaseDetectorType
Expand Down Expand Up @@ -122,7 +128,8 @@ final class PurchasesOrchestrator {
storeKit2StorefrontListener: StoreKit2StorefrontListener,
storeKit2ObserverModePurchaseDetector: StoreKit2ObserverModePurchaseDetectorType,
storeMessagesHelper: StoreMessagesHelperType?,
diagnosticsSynchronizer: DiagnosticsSynchronizerType?
diagnosticsSynchronizer: DiagnosticsSynchronizerType?,
diagnosticsTracker: DiagnosticsTrackerType?
) {
self.init(
productsManager: productsManager,
Expand All @@ -146,6 +153,7 @@ final class PurchasesOrchestrator {
)

self._diagnosticsSynchronizer = diagnosticsSynchronizer
self._diagnosticsTracker = diagnosticsTracker

self._storeKit2TransactionListener = storeKit2TransactionListener
self._storeKit2StorefrontListener = storeKit2StorefrontListener
Expand Down Expand Up @@ -415,6 +423,7 @@ final class PurchasesOrchestrator {
productIdentifier: productIdentifier,
completion: { transaction, customerInfo, error, cancelled in
if !cancelled {
self.trackPurchaseEventIfNeeded(storeKitVersion: .storeKit1, error: error)
if let error = error {
Logger.rcPurchaseError(Strings.purchase.product_purchase_failed(
productIdentifier: productIdentifier,
Expand Down Expand Up @@ -872,6 +881,24 @@ private extension PurchasesOrchestrator {
}
}

func trackPurchaseEventIfNeeded(storeKitVersion: StoreKitVersion,
error: PublicError?) {
if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *),
let diagnosticsTracker = self.diagnosticsTracker {
let errorMessage = (error?.userInfo[NSUnderlyingErrorKey] as? Error)?.localizedDescription ?? error?.localizedDescription
let errorCode = error?.code
let skError = error?.userInfo[NSUnderlyingErrorKey] as? SKError
let skErrorCode = skError?.code
Async.call(with: {}, asyncMethod: {
await diagnosticsTracker.trackPurchaseRequest(wasSuccessful: error == nil,
storeKitVersion: storeKitVersion,
errorMessage: errorMessage,
errorCode: errorCode,
skErrorCode: skErrorCode?.rawValue)
})
}
}

/// - Parameter restored: whether the transaction state was `.restored` instead of `.purchased`.
private func purchaseSource(
for productIdentifier: String,
Expand Down

0 comments on commit a64875d

Please sign in to comment.