Skip to content

Commit

Permalink
update sample for 3.1.2 (#41)
Browse files Browse the repository at this point in the history
  • Loading branch information
namidan authored Jul 27, 2023
1 parent dfe020c commit a78edbb
Show file tree
Hide file tree
Showing 4 changed files with 181 additions and 96 deletions.
29 changes: 29 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.3.0
hooks:
- id: check-added-large-files
- id: check-case-conflict
- id: check-executables-have-shebangs
- id: check-merge-conflict
- id: check-symlinks
- id: check-toml
- id: check-xml
- id: check-json
- id: check-yaml
- id: end-of-file-fixer
- id: fix-byte-order-marker
- id: forbid-new-submodules
- id: mixed-line-ending
args: [--fix=lf]
- id: no-commit-to-branch
args: [--branch, main, --branch, develop]
- id: pretty-format-json
args: [--autofix]
- id: sort-simple-yaml
- id: trailing-whitespace
args: [--markdown-linebreak-ext=md]
- repo: https://github.com/nicklockwood/SwiftFormat
rev: 0.50.8
hooks:
- id: swiftformat
103 changes: 34 additions & 69 deletions Demo/TestNami/test/NamiDataSource.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,77 +6,31 @@ import NamiApple
import StoreKit

class NamiDataSource: ObservableObject {
@Published var purchaseManagementEnabled = Nami.isPurchaseManagementEnabled()
@Published var anonymousModeCapable = NamiCustomerManager.anonymousModeCapability()
@Published var isLoggedIn = NamiCustomerManager.isLoggedIn()
@Published var loggedInId = NamiCustomerManager.loggedInId()
@Published var deviceId = NamiCustomerManager.deviceId()
@Published var showLinkedPaywall = false
@Published var anonymousMode = NamiCustomerManager.inAnonymousMode()
@Published var activeEntitlements: [NamiEntitlement] = []
@Published var journeyState: CustomerJourneyState? = NamiCustomerManager.journeyState()
@Published var campaigns: [NamiCampaign] = NamiCampaignManager.allCampaigns()

func updateLoggedInStatus() {
self.isLoggedIn = NamiCustomerManager.isLoggedIn()
self.loggedInId = NamiCustomerManager.loggedInId()
self.deviceId = NamiCustomerManager.deviceId()
isLoggedIn = NamiCustomerManager.isLoggedIn()
loggedInId = NamiCustomerManager.loggedInId()
deviceId = NamiCustomerManager.deviceId()
anonymousMode = NamiCustomerManager.inAnonymousMode()
journeyState = NamiCustomerManager.journeyState()
}

init() {
if #available(iOS 15.0, tvOS 15.0, macOS 12.0, *) {
if !Nami.shared.isPurchaseManagementEnabled() {
StoreKit2TransactionObserver()
}
}

if #available(iOS 15.0, tvOS 15.0, *) {
NamiPaywallManager.registerBuySkuHandler { sku in
print("BYO billing buySkuHandler \(sku.storeId)")
NamiPaywallManager.dismiss(animated: true) {}
Task {
let productIdentifiers = [sku.storeId]
if let products = try? await Product.products(for: productIdentifiers) {
print("\(products)")
let product = products[0]

let purchaseResult = try await product.purchase(options: [
.appAccountToken(UUID()),
])

switch purchaseResult {
case .pending:
print("pending purchase result")
case let .success(verification):
switch verification {
case let .verified(transaction):
await transaction.finish()

#if swift(>=5.7)
let price = product.price
let currency = product.priceFormatStyle.currencyCode
let locale = product.priceFormatStyle.locale

let purchaseSuccess = NamiPurchaseSuccess(product: sku, transactionID: String(transaction.id), originalTransactionID: String(transaction.originalID), originalPurchaseDate: transaction.originalPurchaseDate, purchaseDate: transaction.purchaseDate, expiresDate: transaction.expirationDate, price: price, currencyCode: currency, locale: locale)
NamiPaywallManager.buySkuComplete(purchaseSuccess: purchaseSuccess)
#endif

// NamiPaywallManager.buySkuComplete(sku: sku, product: product, transaction: transaction)

print("verified \(transaction)")
case .unverified:
print("unverified")
}
case .userCancelled:
print("user cancelled")
@unknown default:
print("unexpected result")
}
}
}
NamiPaywallManager.registerBuySkuHandler { _ in
print("For customers implementing Nami paywalls with their own billing code or third-party such as RevenueCat")
}
}

NamiCustomerManager.setCustomerAttribute("firstName", "Dan")
NamiCustomerManager.setCustomerAttribute("fooxyz", "bar123")

updateLoggedInStatus()

// This handler is called when campaigns are loaded for the device
Expand All @@ -95,6 +49,7 @@ class NamiDataSource: ObservableObject {

// This handler is called whenever customer journey state is received from the Nami service
NamiCustomerManager.registerJourneyStateHandler { journeyState in

self.journeyState = journeyState
}

Expand All @@ -108,6 +63,8 @@ class NamiDataSource: ObservableObject {
self.isLoggedIn = NamiCustomerManager.isLoggedIn()
self.loggedInId = NamiCustomerManager.loggedInId()
self.deviceId = NamiCustomerManager.deviceId()
self.anonymousMode = NamiCustomerManager.inAnonymousMode()
self.journeyState = NamiCustomerManager.journeyState()

if success {
if accountStateAction == .login {
Expand All @@ -128,7 +85,14 @@ class NamiDataSource: ObservableObject {
print("vendor id cleared")
} else if accountStateAction == .customer_data_platform_id_cleared {
print("cdp id cleared")
} else if accountStateAction == .anonymous_mode_on {
print("anonymous mode on")
} else if accountStateAction == .anonymous_mode_off {
print("anonymous mode off")
} else if accountStateAction == .nami_device_id_set {
print("nami device id set")
}

} else if error != nil {
if accountStateAction == .login {
print("error logging in - \(String(describing: error))")
Expand All @@ -146,33 +110,34 @@ class NamiDataSource: ObservableObject {
print("error clearing vendor id - \(String(describing: error))")
} else if accountStateAction == .customer_data_platform_id_cleared {
print("error clearing cdp id - \(String(describing: error))")
} else if accountStateAction == .anonymous_mode_on {
print("error turning anonymous mode on - \(String(describing: error))")
} else if accountStateAction == .anonymous_mode_off {
print("error turning anonymous mode off - \(String(describing: error))")
} else if accountStateAction == .nami_device_id_set {
print("nami device id set - \(String(describing: error))")
}
}
}

NamiCustomerManager.setCustomerDataPlatformId(with: UUID().uuidString)
NamiCustomerManager.clearCustomerDataPlatformId()

NamiCustomerManager.setAdvertisingId(with: UUID())
NamiCustomerManager.clearAdvertisingId()

NamiCustomerManager.setVendorId(with: UUID())
NamiCustomerManager.clearVendorId()

// This handler is called when sign-in control on paywall is tapped
NamiPaywallManager.registerSignInHandler { _ in
NamiPaywallManager.dismiss(animated: true) {}
if Nami.namiWindowEnabled() {
NamiPaywallManager.hide()
} else {
NamiPaywallManager.dismiss(animated: true) {}
}
}

NamiPaywallManager.registerRestoreRequestHandler {
NamiPaywallManager.registerRestoreHandler {
print("registerRestoreRequestHandler from paywalls only plans \n")
}

NamiPurchaseManager.registerPurchasesChangedHandler { purchases, purchaseState, _ in
print("purchasesChangesHandler \(purchaseState)\n")
for purchase in purchases {
print("purchased sku_ref_id: \(purchase.skuId)\n")
print("purchased transaction id: \(purchase.transactionIdentifier)\n")
print("purchased transaction id: \(String(describing: purchase.transactionIdentifier))\n")

if let originalTransactionID = purchase.transaction?.original?.transactionIdentifier {
print("purchased original transaction id: \(originalTransactionID)\n")
Expand All @@ -186,7 +151,7 @@ class NamiDataSource: ObservableObject {
impactMed.impactOccurred()
#endif

let presentAlertFromVC = NamiPaywallManager.displayedViewController()
_ = NamiPaywallManager.displayedViewController()

print("newPurchases \(newPurchases) oldpurchases \(oldPurchases)")

Expand Down
71 changes: 66 additions & 5 deletions Demo/TestNami/test/TestApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// TestApp.swift
// Test Nami
//
// Copyright © 2022 Nami ML Inc.
// Copyright © 2023 Nami ML Inc.
//

import NamiApple
Expand All @@ -25,18 +25,17 @@ struct TestApp: App {

print("Current configuration: \(BuildConfiguration.shared.environment)")
// default to PROD
var appPlatformId = "NAMI_PRODUCTION_API_KEY"
var appPlatformId = "YOUR_PROD_APP_PLATFORM_ID"

if BuildConfiguration.shared.environment == .staging {
appPlatformId = "NAMI_STAGING_API_KEY"
appPlatformId = "YOUR_STAGING_APP_PLATFORM_ID"
}

let namiConfig = NamiConfiguration(appPlatformId: appPlatformId)

if BuildConfiguration.shared.environment == .staging {
namiConfig.namiCommands = ["useStagingAPI"]
namiConfig.logLevel = .debug
}
namiConfig.logLevel = .debug
// uses device locale by default. This is just for override
// namiConfig.namiLanguageCode = NamiLanguageCodes.ja

Expand All @@ -50,6 +49,68 @@ struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
if NamiCampaignManager.isCampaignAvailable(url: url) {
print("Attempting campaign launch from deeplink \(url.absoluteString)")

NamiCampaignManager.launch(url: url, launchHandler: { success, error in
print("campaign launch from deeplink \(url.absoluteString) - success \(success) or error \(String(describing: error))")
},
paywallActionHandler: { paywallEvent in

print("Campaign paywallActionHandler metadata: \n" +
"campaignId: \(String(describing: paywallEvent.campaignId))\n" +
"campaignName: \(String(describing: paywallEvent.campaignName))\n" +
"campaignType: \(String(describing: paywallEvent.campaignType))\n" +
"campaignLabel: \(String(describing: paywallEvent.campaignLabel))\n" +
"campaignUrl: \(String(describing: paywallEvent.campaignUrl))\n" +
"paywallId: \(String(describing: paywallEvent.paywallId))\n" +
"paywallName: \(String(describing: paywallEvent.paywallName))\n" +
"segmentId: \(String(describing: paywallEvent.segmentId))\n" +
"externalSegmentId: \(String(describing: paywallEvent.externalSegmentId))\n" +
"paywallLaunchContext: \(String(describing: paywallEvent.paywallLaunchContext))\n" +
"deeplinkUrl: \(String(describing: paywallEvent.deeplinkUrl))\n")

switch paywallEvent.action {
case .show_paywall:
print("paywall raised")

case .close_paywall:
print("paywall closed")

case .restore_purchases:
print("paywall restore purchases tapped")

case .sign_in:
print("paywall sign in tapped")

case .deeplink:
print("deeplink tapped")

case .buy_sku:
print("buy sku tapped with sku \(String(describing: paywallEvent.sku?.skuId))")

case .select_sku:
print("sku selected \(String(describing: paywallEvent.sku?.skuId))")

case .purchase_selected_sku:
print("purchase flow started for sku \(String(describing: paywallEvent.sku?.skuId))")

case .purchase_success:
print("purchase success for sku \(String(describing: paywallEvent.sku?.skuId))")

case .purchase_cancelled:
print("purchase cancelled for sku \(String(describing: paywallEvent.sku?.skuId))")

case .purchase_failed:
print("purchase failed for sku \(String(describing: paywallEvent.sku?.skuId))")

default:
print("unknown action")
}
})
}
}
}
}
}
Expand Down
Loading

0 comments on commit a78edbb

Please sign in to comment.