Make in-app product identifiers dynamic

This commit is contained in:
Davide De Rosa 2019-11-28 11:22:10 +01:00
parent d4977f499a
commit e5325cea7e
4 changed files with 66 additions and 44 deletions

View File

@ -26,21 +26,28 @@
import Foundation
import PassepartoutCore
enum Product: String {
struct Product: RawRepresentable, Equatable, Hashable {
private static let bundle = "com.algoritmico.ios.Passepartout"
private static let donationsBundle = "\(bundle).donations"
private static let featuresBundle = "\(bundle).features"
private static let providersBundle = "\(bundle).providers"
// MARK: Donations
case tinyDonation = "com.algoritmico.ios.Passepartout.donations.Tiny"
static let tinyDonation = Product(donationDescription: "Tiny")
case smallDonation = "com.algoritmico.ios.Passepartout.donations.Small"
static let smallDonation = Product(donationDescription: "Small")
case mediumDonation = "com.algoritmico.ios.Passepartout.donations.Medium"
static let mediumDonation = Product(donationDescription: "Medium")
case bigDonation = "com.algoritmico.ios.Passepartout.donations.Big"
static let bigDonation = Product(donationDescription: "Big")
case hugeDonation = "com.algoritmico.ios.Passepartout.donations.Huge"
static let hugeDonation = Product(donationDescription: "Huge")
case maxiDonation = "com.algoritmico.ios.Passepartout.donations.Maxi"
static let maxiDonation = Product(donationDescription: "Maxi")
static let allDonations: [Product] = [
.tinyDonation,
@ -51,15 +58,19 @@ enum Product: String {
.maxiDonation
]
private init(donationDescription: String) {
self.init(rawValue: "\(Product.donationsBundle).\(donationDescription)")!
}
// MARK: Features
case unlimitedHosts = "com.algoritmico.ios.Passepartout.features.unlimited_hosts"
static let unlimitedHosts = Product(featureId: "unlimited_hosts")
case trustedNetworks = "com.algoritmico.ios.Passepartout.features.trusted_networks"
static let trustedNetworks = Product(featureId: "trusted_networks")
case siriShortcuts = "com.algoritmico.ios.Passepartout.features.siri"
static let siriShortcuts = Product(featureId: "features.siri")
case fullVersion = "com.algoritmico.ios.Passepartout.features.full_version"
static let fullVersion = Product(featureId: "full_version")
static let allFeatures: [Product] = [
.unlimitedHosts,
@ -67,55 +78,64 @@ enum Product: String {
.siriShortcuts,
.fullVersion
]
private init(featureId: String) {
self.init(rawValue: "\(Product.featuresBundle).\(featureId)")!
}
// MARK: Providers
case mullvad = "com.algoritmico.ios.Passepartout.providers.Mullvad"
case nordVPN = "com.algoritmico.ios.Passepartout.providers.NordVPN"
case pia = "com.algoritmico.ios.Passepartout.providers.PIA"
case protonVPN = "com.algoritmico.ios.Passepartout.providers.ProtonVPN"
case tunnelBear = "com.algoritmico.ios.Passepartout.providers.TunnelBear"
case vyprVPN = "com.algoritmico.ios.Passepartout.providers.VyprVPN"
case windscribe = "com.algoritmico.ios.Passepartout.providers.Windscribe"
static let allProviders: [Product] = [
.mullvad,
.nordVPN,
.pia,
.protonVPN,
.tunnelBear,
.vyprVPN,
.windscribe
]
static var allProviders: [Product] {
return InfrastructureFactory.shared.allMetadata.map {
return Product(providerId: $0.description)
}
}
fileprivate init(providerId: String) {
self.init(rawValue: "\(Product.providersBundle).\(providerId)")!
}
// MARK: All
static let all: [Product] = allDonations + allFeatures + allProviders
static var all: [Product] {
return allDonations + allFeatures + allProviders
}
var isDonation: Bool {
return Product.allDonations.contains(self)
return rawValue.hasPrefix(Product.donationsBundle)
}
var isFeature: Bool {
return Product.allFeatures.contains(self)
return rawValue.hasPrefix(Product.featuresBundle)
}
var isProvider: Bool {
return Product.allProviders.contains(self)
return rawValue.hasPrefix(Product.providersBundle)
}
// MARK: RawRepresentable
let rawValue: String
init?(rawValue: String) {
self.rawValue = rawValue
}
// MARK: Equatable
static func ==(lhs: Product, rhs: Product) -> Bool {
return lhs.rawValue == rhs.rawValue
}
// MARK: Hashable
func hash(into hasher: inout Hasher) {
rawValue.hash(into: &hasher)
}
}
extension Infrastructure.Metadata {
var product: Product {
guard let product = Product(rawValue: "com.algoritmico.ios.Passepartout.providers.\(self)") else {
fatalError("Product not found for provider \(self)")
}
return product
return Product(providerId: description)
}
}

View File

@ -72,6 +72,8 @@ class ProductManager: NSObject {
return
}
inApp.requestProducts(withIdentifiers: Product.all) { _ in
log.debug("In-app products: \(self.inApp.products.map { $0.productIdentifier })")
completionHandler?(self.inApp.products)
}
}

@ -1 +1 @@
Subproject commit 0d2991f706fbb2a190ecccd390d5c993efd67c92
Subproject commit 72d464ab9291d7cb7521603742b04b3928d1d2c5

@ -1 +1 @@
Subproject commit 27aae7520abbe5c58cbeda82a51ea28ff804f766
Subproject commit 010fdccdf019f73f399f99fde2bc6bb1571b596b