12/08/2018, 17:28

SwiftyStoreKit framework giúp thêm In App Purchases vào app một cách dễ dàng.

SwiftyStoreKit là một thư viện hỗ trợ bạn làm việc In App Purchases một cách đơn giản và thuận tiện. Support iOS 8.0+, tvOS 9.0+ and macOS 10.10+. Khi một giao dịch trước đó chưa hoàn thành thì ở đây, SwiftyStoreKit support user hoàn thành In App và update lại UI của app. func ...

SwiftyStoreKit là một thư viện hỗ trợ bạn làm việc In App Purchases một cách đơn giản và thuận tiện. Support iOS 8.0+, tvOS 9.0+ and macOS 10.10+.

Khi một giao dịch trước đó chưa hoàn thành thì ở đây, SwiftyStoreKit support user hoàn thành In App và update lại UI của app.

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
}
SwiftyStoreKit.retrieveProductsInfo(["com.musevisions.SwiftyStoreKit.Purchase1"]) { 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)")
    }
}

- Atomic:

Khi user mua product và UI được update cùng thời điểm.

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")
        }
    }
}

- Non-Atomic:

Khi user mua product và app cần server riêng đễ xử lý mua hàng.

SwiftyStoreKit.purchaseProduct("com.musevisions.SwiftyStoreKit.Purchase1", quantity: 1, atomically: false) { result in
    switch result {
    case .success(let product):
        // fetch content from your server, then:
        if product.needsFinishTransaction {
            SwiftyStoreKit.finishTransaction(product.transaction)
        }
        print("Purchase Success: (product.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")
        }
    }
}

- Atomic:

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")
    }
}

- Non-Atomic:

SwiftyStoreKit.restorePurchases(atomically: false) { results in
    if results.restoreFailedPurchases.count > 0 {
        print("Restore Failed: (results.restoreFailedPurchases)")
    }
    else if results.restoredPurchases.count > 0 {
        for purchase in results.restoredPurchases {
            // fetch content from your server, then:
            if purchase.needsFinishTransaction {
                SwiftyStoreKit.finishTransaction(purchase.transaction)
            }
        }
        print("Restore Success: (results.restoredPurchases)")
    }
    else {
        print("Nothing to Restore")
    }
}
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.Purchase1"
        // Verify the purchase of Consumable or NonConsumable
        let purchaseResult = SwiftyStoreKit.verifyPurchase(
            productId: productId,
            inReceipt: receipt)
            
        switch purchaseResult {
        case .purchased(let receiptItem):
            print("(productId) is purchased: (receiptItem)")
        case .notPurchased:
            print("The user has never purchased (productId)")
        }
    case .error(let error):
        print("Receipt verification failed: (error)")
    }
}

Subcription bây giờ rất phổ biến trong các ứng dụng, có thể subcriptions 1 chức năng nào đó trong app trong vòng 1 ngày, 1 tuần...

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)
(items)
")
        case .expired(let expiryDate, let items):
            print("(productId) is expired since (expiryDate)
(items)
")
        case .notPurchased:
            print("The user has never purchased (productId)")
        }

    case .error(let error):
        print("Receipt verification failed: (error)")
    }
}

- Auto-Renewable:

Tự động làm mới subcriptions khi hết hạn, ví dụ khi subcriptions 1 tuần đến hết hạn nó sẽ tự động đăng ký 1 tuần nữa cứ như vậy cho đến khi user huỷ bỏ việc tự động.

let purchaseResult = SwiftyStoreKit.verifySubscription(
            ofType: .autoRenewable,
            productId: "com.musevisions.SwiftyStoreKit.Subscription",
            inReceipt: receipt)

- Non-Renewing:

Không tự động đăng ký mới khi hết hạn.

// validDuration: time interval in seconds
let purchaseResult = SwiftyStoreKit.verifySubscription(
            ofType: .nonRenewing(validDuration: 3600 * 24 * 30),
            productId: "com.musevisions.SwiftyStoreKit.Subscription",
            inReceipt: receipt)

https://github.com/bizz84/SwiftyStoreKit

0