SwiftyStoreKit Migration
This document describes how to migrate from SwiftyStoreKit to Glassfy. It assumes you have installed Glassfy following the Installation
App startup
SwiftyStoreKit app startup
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// see notes below for the meaning of Atomic / Non-Atomic
SwiftyStoreKit.completeTransactions(atomically: true) { purchases in
for purchase in purchases {
switch purchase.transaction.transactionState {
case .purchased, .restored:
if purchase.needsFinishTransaction {
// Deliver content from server, then:
SwiftyStoreKit.finishTransaction(purchase.transaction)
}
// Unlock content
case .failed, .purchasing, .deferred:
break // do nothing
}
}
}
return true
}
Glassfy app startup
There is no need in Glassfy to manually process the transaction: the SDK does that automatically. Simply replace all the SwiftyStoreKit code with Glassfy initialize.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Glassfy.initialize(apiKey: "your_api_key", watcherMode: false)
return true
}
Purchases
SwiftyStoreKit retrive purchases
SwiftyStoreKit.retrieveProductsInfo(["com.musevisions.purchase"]) { result in
if let product = result.retrievedProducts.first {
let priceString = product.localizedPrice!
print("Product: \(product.localizedDescription), price: \(priceString)")
}
else if let invalidProductId = result.invalidProductIDs.first {
print("Invalid product identifier: \(invalidProductId)")
}
else {
print("Error: \(result.error)")
}
}
Glassfy retrive purchases
In Glassfy you can organize the products in Offerings that will contains a list of SKUs. Once the offering is configured in Glassfy Dashboard{:target="_blank"} you
can remove the SwiftyStoreKit retrivedProduct with Glassfy.offerings
api.
Glassfy.offerings { offerings, err in
guard let premium = offerings?["my_premium_offering"] else {
// handle error?
return
}
for sku in premium.skus {
print("SKU \(sku.product.localizedTitle) \(sku.product.price)")
}
}
SwiftyStoreKit purchase a product
SwiftyStoreKit.purchaseProduct("com.musevisions.SwiftyStoreKit.Purchase1", quantity: 1, atomically: true) { result in
switch result {
case .success(let purchase):
print("Purchase Success: \(purchase.productId)")
case .error(let error):
switch error.code {
case .unknown: print("Unknown error. Please contact support")
case .clientInvalid: print("Not allowed to make the payment")
case .paymentCancelled: break
case .paymentInvalid: print("The purchase identifier was invalid")
case .paymentNotAllowed: print("The device is not allowed to make the payment")
case .storeProductNotAvailable: print("The product is not available in the current storefront")
case .cloudServicePermissionDenied: print("Access to cloud service information is not allowed")
case .cloudServiceNetworkConnectionFailed: print("Could not connect to the network")
case .cloudServiceRevoked: print("User has revoked permission to use this cloud service")
default: print((error as NSError).localizedDescription)
}
}
}
Glassfy purchase a product
In SwiftyStoreKit the purchase can be done using the productid while in Glassfy the best way to purchase a product is using the offerings and skus created in the step above. To verify if the product has been purchased sucessfully you can verify the permission created here
Glassfy.purchase(sku: sku) { transaction, err in
if let p = transaction?.permissions["my_premium_permission"], p.isValid{
print("Purchase Success: \(purchase.productId)")
}
}
Restore previous purchases
SwiftyStoreKit Restore previous purchases
SwiftyStoreKit.restorePurchases(atomically: true) { results in
if results.restoreFailedPurchases.count > 0 {
print("Restore Failed: \(results.restoreFailedPurchases)")
}
else if results.restoredPurchases.count > 0 {
print("Restore Success: \(results.restoredPurchases)")
}
else {
print("Nothing to Restore")
}
}
Glassfy Restore previous purchases
Please replace SwiftyStoreKit.restorePurchases
with Glassfy.restorePurchases
and then check the permissions.
Glassfy.restorePurchases { permissions, err in
if let p = permissions?["my_premium_permission"], p.isValid {
print("Restore Success: \(p.permissionIdentifier) isValid")
}
}
Receipt validation
Glassfy automatically verify the receipt and there is nothing to do in your application code.
Verifying purchases and subscriptions
SwiftyStoreKit verifying purchases and subscriptions
let appleValidator = AppleReceiptValidator(service: .production, sharedSecret: "your-shared-secret")
SwiftyStoreKit.verifyReceipt(using: appleValidator) { result in
switch result {
case .success(let receipt):
let productId = "com.musevisions.SwiftyStoreKit.Subscription"
// Verify the purchase of a Subscription
let purchaseResult = SwiftyStoreKit.verifySubscription(
ofType: .autoRenewable, // or .nonRenewing (see below)
productId: productId,
inReceipt: receipt)
switch purchaseResult {
case .purchased(let expiryDate, let items):
print("\(productId) is valid until \(expiryDate)\n\(items)\n")
case .expired(let expiryDate, let items):
print("\(productId) is expired since \(expiryDate)\n\(items)\n")
case .notPurchased:
print("The user has never purchased \(productId)")
}
case .error(let error):
print("Receipt verification failed: \(error)")
}
}
Glassfy verifying purchases and subscriptions
Replace the SwiftyStoreKit receipt validation code with Glassfy.permissions
.
Glassfy verify the receipt on its infrastructure and always keep the subscriptions status updated and can easly fetched by the app using the Glassfy.permissions
api.
Glassfy.permissions { permissions, err in
if let p = permissions?["my_premium_permission"] {
print("Is valid \(p.isValid)") // the user has "my_premium_permission" granted
if let expireDate = p.expireDate {
print("Expire date: \(expireDate )")
}
}
}
Updated over 2 years ago