From 5dbb33f49f391ab79a53eda57e1a3e84de5917b2 Mon Sep 17 00:00:00 2001 From: Veronique Date: Thu, 21 May 2020 12:36:17 +0200 Subject: [PATCH] test docs with jazzy and swift-doc --- Sources/InAppPurchaseLib/InAppPurchase.swift | 85 +- .../InAppPurchaseLib/InAppPurchaseLib.swift | 107 +- .../InAppPurchaseLib/Product/IAPProduct.swift | 10 + .../Product/SKProductExtension.swift | 12 +- _config.yml | 1 - docs/_config.yml | 1 - docs/jazzy/Classes.html | 205 ++++ .../Classes/DefaultPurchaseDelegate.html | 215 ++++ docs/jazzy/Classes/InAppPurchase.html | 1027 +++++++++++++++++ docs/jazzy/Enums.html | 276 +++++ docs/jazzy/Enums/IAPErrorCode.html | 412 +++++++ docs/jazzy/Enums/IAPPeriodFormat.html | 196 ++++ docs/jazzy/Enums/IAPProductType.html | 250 ++++ docs/jazzy/Enums/IAPPurchaseResultState.html | 250 ++++ docs/jazzy/Enums/IAPRefreshResultState.html | 223 ++++ docs/jazzy/Extensions.html | 163 +++ docs/jazzy/Extensions/SKProduct.html | 330 ++++++ docs/jazzy/Protocols.html | 233 ++++ docs/jazzy/Protocols/IAPErrorProtocol.html | 169 +++ docs/jazzy/Protocols/IAPPurchaseDelegate.html | 193 ++++ docs/jazzy/Protocols/InAppPurchaseLib.html | 1019 ++++++++++++++++ docs/jazzy/Structs.html | 248 ++++ docs/jazzy/Structs/IAPError.html | 196 ++++ docs/jazzy/Structs/IAPProduct.html | 264 +++++ docs/jazzy/Structs/IAPPurchaseResult.html | 250 ++++ docs/jazzy/Structs/IAPRefreshResult.html | 250 ++++ docs/jazzy/Typealiases.html | 190 +++ docs/jazzy/badge.svg | 28 + docs/jazzy/css/highlight.css | 200 ++++ docs/jazzy/css/jazzy.css | 374 ++++++ .../Contents/Info.plist | 20 + .../Contents/Resources/Documents/Classes.html | 205 ++++ .../Classes/DefaultPurchaseDelegate.html | 215 ++++ .../Documents/Classes/InAppPurchase.html | 1027 +++++++++++++++++ .../Contents/Resources/Documents/Enums.html | 276 +++++ .../Documents/Enums/IAPErrorCode.html | 412 +++++++ .../Documents/Enums/IAPPeriodFormat.html | 196 ++++ .../Documents/Enums/IAPProductType.html | 250 ++++ .../Enums/IAPPurchaseResultState.html | 250 ++++ .../Enums/IAPRefreshResultState.html | 223 ++++ .../Resources/Documents/Extensions.html | 163 +++ .../Documents/Extensions/SKProduct.html | 330 ++++++ .../Resources/Documents/Protocols.html | 233 ++++ .../Documents/Protocols/IAPErrorProtocol.html | 169 +++ .../Protocols/IAPPurchaseDelegate.html | 193 ++++ .../Documents/Protocols/InAppPurchaseLib.html | 1019 ++++++++++++++++ .../Contents/Resources/Documents/Structs.html | 248 ++++ .../Resources/Documents/Structs/IAPError.html | 196 ++++ .../Documents/Structs/IAPProduct.html | 264 +++++ .../Documents/Structs/IAPPurchaseResult.html | 250 ++++ .../Documents/Structs/IAPRefreshResult.html | 250 ++++ .../Resources/Documents/Typealiases.html | 190 +++ .../Resources/Documents/css/highlight.css | 200 ++++ .../Resources/Documents/css/jazzy.css | 374 ++++++ .../Resources/Documents/img/carat.png | Bin 0 -> 274 bytes .../Contents/Resources/Documents/img/dash.png | Bin 0 -> 1338 bytes .../Contents/Resources/Documents/img/gh.png | Bin 0 -> 1571 bytes .../Contents/Resources/Documents/index.html | 699 +++++++++++ .../Contents/Resources/Documents/js/jazzy.js | 70 ++ .../Resources/Documents/js/jquery.min.js | 2 + .../Contents/Resources/Documents/search.json | 1 + .../Contents/Resources/docSet.dsidx | Bin 0 -> 45056 bytes docs/jazzy/docsets/InAppPurchaseLib.tgz | Bin 0 -> 71508 bytes docs/jazzy/img/carat.png | Bin 0 -> 274 bytes docs/jazzy/img/dash.png | Bin 0 -> 1338 bytes docs/jazzy/img/gh.png | Bin 0 -> 1571 bytes docs/jazzy/index.html | 699 +++++++++++ docs/jazzy/js/jazzy.js | 70 ++ docs/jazzy/js/jquery.min.js | 2 + docs/jazzy/search.json | 1 + docs/jazzy/undocumented.json | 348 ++++++ .../DefaultPurchaseDelegate/index.html | 62 +- docs/{ => swift-doc}/IAPError/index.html | 30 +- docs/{ => swift-doc}/IAPErrorCode/index.html | 6 +- .../IAPErrorProtocol/index.html | 44 +- .../IAPPeriodFormat/index.html | 6 +- docs/{ => swift-doc}/IAPProduct/index.html | 55 +- .../{ => swift-doc}/IAPProductType/index.html | 6 +- .../IAPPurchaseCallback/index.html | 6 +- .../IAPPurchaseDelegate/index.html | 68 +- .../IAPPurchaseResult/index.html | 14 +- .../IAPPurchaseResultState/index.html | 6 +- .../IAPRefreshCallback/index.html | 6 +- .../IAPRefreshResult/index.html | 6 +- .../IAPRefreshResultState/index.html | 6 +- docs/{ => swift-doc}/InAppPurchase/index.html | 428 ++++++- .../InAppPurchaseLib/index.html | 415 ++++++- docs/{ => swift-doc}/all.css | 0 docs/{ => swift-doc}/index.html | 15 +- 89 files changed, 17369 insertions(+), 232 deletions(-) delete mode 100644 _config.yml delete mode 100644 docs/_config.yml create mode 100644 docs/jazzy/Classes.html create mode 100644 docs/jazzy/Classes/DefaultPurchaseDelegate.html create mode 100644 docs/jazzy/Classes/InAppPurchase.html create mode 100644 docs/jazzy/Enums.html create mode 100644 docs/jazzy/Enums/IAPErrorCode.html create mode 100644 docs/jazzy/Enums/IAPPeriodFormat.html create mode 100644 docs/jazzy/Enums/IAPProductType.html create mode 100644 docs/jazzy/Enums/IAPPurchaseResultState.html create mode 100644 docs/jazzy/Enums/IAPRefreshResultState.html create mode 100644 docs/jazzy/Extensions.html create mode 100644 docs/jazzy/Extensions/SKProduct.html create mode 100644 docs/jazzy/Protocols.html create mode 100644 docs/jazzy/Protocols/IAPErrorProtocol.html create mode 100644 docs/jazzy/Protocols/IAPPurchaseDelegate.html create mode 100644 docs/jazzy/Protocols/InAppPurchaseLib.html create mode 100644 docs/jazzy/Structs.html create mode 100644 docs/jazzy/Structs/IAPError.html create mode 100644 docs/jazzy/Structs/IAPProduct.html create mode 100644 docs/jazzy/Structs/IAPPurchaseResult.html create mode 100644 docs/jazzy/Structs/IAPRefreshResult.html create mode 100644 docs/jazzy/Typealiases.html create mode 100644 docs/jazzy/badge.svg create mode 100644 docs/jazzy/css/highlight.css create mode 100644 docs/jazzy/css/jazzy.css create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Info.plist create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Classes.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Classes/DefaultPurchaseDelegate.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Classes/InAppPurchase.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPErrorCode.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPPeriodFormat.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPProductType.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPPurchaseResultState.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPRefreshResultState.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Extensions.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Extensions/SKProduct.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols/IAPErrorProtocol.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols/IAPPurchaseDelegate.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols/InAppPurchaseLib.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPError.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPProduct.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPPurchaseResult.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPRefreshResult.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Typealiases.html create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/css/highlight.css create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/css/jazzy.css create mode 100755 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/img/carat.png create mode 100755 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/img/dash.png create mode 100755 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/img/gh.png create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/index.html create mode 100755 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/js/jazzy.js create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/js/jquery.min.js create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/search.json create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/docSet.dsidx create mode 100644 docs/jazzy/docsets/InAppPurchaseLib.tgz create mode 100755 docs/jazzy/img/carat.png create mode 100755 docs/jazzy/img/dash.png create mode 100755 docs/jazzy/img/gh.png create mode 100644 docs/jazzy/index.html create mode 100755 docs/jazzy/js/jazzy.js create mode 100644 docs/jazzy/js/jquery.min.js create mode 100644 docs/jazzy/search.json create mode 100644 docs/jazzy/undocumented.json rename docs/{ => swift-doc}/DefaultPurchaseDelegate/index.html (67%) rename docs/{ => swift-doc}/IAPError/index.html (77%) rename docs/{ => swift-doc}/IAPErrorCode/index.html (95%) rename docs/{ => swift-doc}/IAPErrorProtocol/index.html (70%) rename docs/{ => swift-doc}/IAPPeriodFormat/index.html (88%) rename docs/{ => swift-doc}/IAPProduct/index.html (68%) rename docs/{ => swift-doc}/IAPProductType/index.html (92%) rename docs/{ => swift-doc}/IAPPurchaseCallback/index.html (83%) rename docs/{ => swift-doc}/IAPPurchaseDelegate/index.html (61%) rename docs/{ => swift-doc}/IAPPurchaseResult/index.html (76%) rename docs/{ => swift-doc}/IAPPurchaseResultState/index.html (91%) rename docs/{ => swift-doc}/IAPRefreshCallback/index.html (83%) rename docs/{ => swift-doc}/IAPRefreshResult/index.html (92%) rename docs/{ => swift-doc}/IAPRefreshResultState/index.html (90%) rename docs/{ => swift-doc}/InAppPurchase/index.html (54%) rename docs/{ => swift-doc}/InAppPurchaseLib/index.html (53%) rename docs/{ => swift-doc}/all.css (100%) rename docs/{ => swift-doc}/index.html (88%) diff --git a/Sources/InAppPurchaseLib/InAppPurchase.swift b/Sources/InAppPurchaseLib/InAppPurchase.swift index 3d382de..5eb946f 100644 --- a/Sources/InAppPurchaseLib/InAppPurchase.swift +++ b/Sources/InAppPurchaseLib/InAppPurchase.swift @@ -10,28 +10,37 @@ import StoreKit public class InAppPurchase: NSObject, InAppPurchaseLib { - /// InAppPurchaseLib version number. + // InAppPurchaseLib version number. internal static let versionNumber = "1.0.2" - /// The initialize function has been called. + // The initialize function has been called. internal static var initialized: Bool { return !iapProducts.isEmpty && iapPurchaseDelegate != nil && validatorUrlString != nil } - /// Callbacks that are waiting for the refresh. + // Callbacks that are waiting for the refresh. private static var refreshCallbacks: Array = [] - /// The date of the last refresh. + // The date of the last refresh. private static var lastRefreshDate: Date? = nil /* MARK: - Properties */ + /// The array of `IAPProduct`. public static var iapProducts: Array = [] - public static var iapPurchaseDelegate: IAPPurchaseDelegate? = nil + /// The validator url retrieved from Fovea. public static var validatorUrlString: String? = nil + /// The instance of class that adopts the `IAPPurchaseDelegate` protocol. + public static var iapPurchaseDelegate: IAPPurchaseDelegate? = nil + /// The user name, if your app implements user login. public static var applicationUsername: String? = nil /* MARK: - Main methods */ - // Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt. - public static func initialize(iapProducts: Array, iapPurchaseDelegate: IAPPurchaseDelegate, validatorUrlString: String, applicationUsername: String?) { + /// Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt. + /// - Parameters: + /// - iapProducts: An array of `IAPProduct`. + /// - validatorUrlString: The validator url retrieved from Fovea. + /// - iapPurchaseDelegate: An instance of class that adopts the `IAPPurchaseDelegate` protocol (default value = `DefaultPurchaseDelegate`). + /// - applicationUsername: The user name, if your app implements user login. + public static func initialize(iapProducts: Array, validatorUrlString: String, iapPurchaseDelegate: IAPPurchaseDelegate, applicationUsername: String?) { InAppPurchase.iapProducts = iapProducts InAppPurchase.iapPurchaseDelegate = iapPurchaseDelegate @@ -42,12 +51,14 @@ public class InAppPurchase: NSObject, InAppPurchaseLib { IAPTransactionObserver.shared.start() } - // Stop observing the payment queue, when the application will terminate, for proper cleanup. + /// Stop observing the payment queue, when the application will terminate, for proper cleanup. public static func stop() { IAPTransactionObserver.shared.stop() } - // Refresh Product list and user Receipt. + /// Refresh Product list and user Receipt. + /// - Parameter callback: The function that will be called after processing. + /// - See also:`IAPRefreshCallback` and `IAPRefreshResult`. public static func refresh(callback: @escaping IAPRefreshCallback) { if !initialized { callback(IAPRefreshResult(state: .failed, iapError: IAPError(code: .libraryNotInitialized))) @@ -111,19 +122,35 @@ public class InAppPurchase: NSObject, InAppPurchaseLib { /* MARK: - Products information */ - // Returns all products retrieved from the App Store. + /// Gets all products retrieved from the App Store + /// - Returns: An array of products. + /// - See also: `SKProduct`. public static func getProducts() -> Array { return IAPProductService.shared.getProducts() } - // Gets the product by its identifier from the list of products retrieved from the App Store. + /// Gets the product by its identifier from the list of products retrieved from the App Store. + /// - Parameter identifier: The identifier of the product. + /// - Returns: The product if it was retrieved from the App Store. + /// - See also: `SKProduct`. public static func getProductBy(identifier: String) -> SKProduct? { return IAPProductService.shared.getProductBy(identifier: identifier) } /* MARK: - Purchasing and Restoring */ - // Request a Payment from the App Store. + /// Checks if the user is allowed to authorize payments. + /// - Returns: A boolean indicates if the user is allowed. + public static func canMakePayments() -> Bool { + return IAPTransactionObserver.shared.canMakePayments() + } + + /// Request a Payment from the App Store. + /// - Parameters: + /// - productIdentifier: The identifier of the product to purchase. + /// - quantity: The quantity to purchase (default value = 1). + /// - callback: The function that will be called after processing. + /// - See also:`IAPPurchaseCallback` and `IAPPurchaseResult`. public static func purchase(productIdentifier: String, quantity: Int, callback: @escaping IAPPurchaseCallback) { if !initialized { callback(IAPPurchaseResult(state: .failed, iapError: IAPError(code: .libraryNotInitialized))) @@ -137,7 +164,9 @@ public class InAppPurchase: NSObject, InAppPurchaseLib { IAPTransactionObserver.shared.purchase(product: product, quantity: quantity, applicationUsername: applicationUsername, callback: callback) } - // Restore purchased products. + /// Restore purchased products. + /// - Parameter callback: The function that will be called after processing. + /// - See also:`IAPRefreshCallback` and `IAPRefreshResult`. public static func restorePurchases(callback: @escaping IAPRefreshCallback) { if !initialized { callback(IAPRefreshResult(state: .failed, iapError: IAPError(code: .libraryNotInitialized))) @@ -147,34 +176,36 @@ public class InAppPurchase: NSObject, InAppPurchaseLib { IAPReceiptService.shared.refresh(callback: callback) } - // Checks if the user is allowed to authorize payments. - public static func canMakePayments() -> Bool { - return IAPTransactionObserver.shared.canMakePayments() - } - - // Finish all transactions for the product. + /// Finish all transactions for the product. + /// - Parameter productIdentifier: The identifier of the product. public static func finishTransactions(for productIdentifier: String) { IAPTransactionObserver.shared.finishTransactions(for: productIdentifier) } - // Checks if the last transaction state for a given product was deferred. + /// Checks if the last transaction state for a given product was deferred. + /// - Parameter productIdentifier: The identifier of the product. + /// - Returns: A boolean indicates if the last transaction state was deferred. public static func hasDeferredTransaction(for productIdentifier: String) -> Bool { return IAPTransactionObserver.shared.hasDeferredTransaction(for: productIdentifier) } /* MARK: - Purchases information */ - // Checks if the user has already purchased at least one product. + /// Checks if the user has already purchased at least one product. + /// - Returns: A boolean indicates if the . public static func hasAlreadyPurchased() -> Bool { return IAPReceiptService.shared.hasAlreadyPurchased() } - // Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription). + /// Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription). + /// - Parameter productIdentifier: The identifier of the product. + /// - Returns: A boolean indicates if the user currently own (or is subscribed to) a given product. public static func hasActivePurchase(for productIdentifier: String) -> Bool { return IAPReceiptService.shared.hasActivePurchase(for: productIdentifier) } - // Checks if the user has an active auto renewable subscription. + /// Checks if the user has an active auto renewable subscription regardless of the product identifier. + /// - Returns: A boolean indicates if the user has an active auto renewable subscription. public static func hasActiveSubscription() -> Bool { for productIdentifier in (InAppPurchase.iapProducts.filter{ $0.productType == IAPProductType.autoRenewableSubscription }.map{ $0.productIdentifier }) { if IAPReceiptService.shared.hasActivePurchase(for: productIdentifier){ @@ -184,12 +215,16 @@ public class InAppPurchase: NSObject, InAppPurchaseLib { return false; } - // Returns the latest purchased date for a given product. + /// Returns the latest purchased date for a given product. + /// - Parameter productIdentifier: The identifier of the product. + /// - Returns: The latest purchase `Date` if set or `nil`. public static func getPurchaseDate(for productIdentifier: String) -> Date? { return IAPReceiptService.shared.getPurchaseDate(for: productIdentifier) } - // Returns the expiry date for a subcription. May be past or future. + /// Returns the expiry date for a subcription. May be past or future. + /// - Parameter productIdentifier: The identifier of the product. + /// - Returns: The expiry `Date` is set or `nil`. public static func getExpiryDate(for productIdentifier: String) -> Date? { return IAPReceiptService.shared.getExpiryDate(for: productIdentifier) } diff --git a/Sources/InAppPurchaseLib/InAppPurchaseLib.swift b/Sources/InAppPurchaseLib/InAppPurchaseLib.swift index ee8d09f..8e746ab 100644 --- a/Sources/InAppPurchaseLib/InAppPurchaseLib.swift +++ b/Sources/InAppPurchaseLib/InAppPurchaseLib.swift @@ -9,69 +9,104 @@ import Foundation import StoreKit -/* MARK: - The protocol that InAppPurchase adopts. */ +/// The protocol that `InAppPurchase`` adopts. public protocol InAppPurchaseLib { + /// The array of `IAPProduct`. static var iapProducts: Array { get } - static var iapPurchaseDelegate: IAPPurchaseDelegate? { get } + /// The validator url retrieved from Fovea. static var validatorUrlString: String? { get } + /// The instance of class that adopts the `IAPPurchaseDelegate` protocol. + static var iapPurchaseDelegate: IAPPurchaseDelegate? { get } + /// The user name, if your app implements user login. static var applicationUsername: String? { get set } - // Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt. - static func initialize(iapProducts: Array, iapPurchaseDelegate: IAPPurchaseDelegate, validatorUrlString: String, applicationUsername: String?) + /// Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt. + /// - Parameters: + /// - iapProducts: An array of `IAPProduct`. + /// - validatorUrlString: The validator url retrieved from Fovea. + /// - iapPurchaseDelegate: An instance of class that adopts the `IAPPurchaseDelegate` protocol (default value = `DefaultPurchaseDelegate`). + /// - applicationUsername: The user name, if your app implements user login. + static func initialize(iapProducts: Array, validatorUrlString: String, iapPurchaseDelegate: IAPPurchaseDelegate, applicationUsername: String?) -> Void - // Stop observing the payment queue, when the application will terminate, for proper cleanup. - static func stop() + /// Stop observing the payment queue, when the application will terminate, for proper cleanup. + static func stop() -> Void - // Refresh Product list and user Receipt. - static func refresh(callback: @escaping IAPRefreshCallback) + /// Refresh Product list and user Receipt. + /// - Parameter callback: The function that will be called after processing. + /// - See also:`IAPRefreshCallback` and `IAPRefreshResult`. + static func refresh(callback: @escaping IAPRefreshCallback) -> Void /* MARK: - Products information */ - // Returns all products retrieved from the App Store. + /// Gets all products retrieved from the App Store + /// - Returns: An array of products. + /// - See also: `SKProduct`. static func getProducts() -> Array - // Gets the product by its identifier from the list of products retrieved from the App Store. + /// Gets the product by its identifier from the list of products retrieved from the App Store. + /// - Parameter identifier: The identifier of the product. + /// - Returns: The product if it was retrieved from the App Store. + /// - See also: `SKProduct`. static func getProductBy(identifier: String) -> SKProduct? /* MARK: - Purchasing and Restoring */ - // Checks if the user is allowed to authorize payments. + /// Checks if the user is allowed to authorize payments. + /// - Returns: A boolean indicates if the user is allowed. static func canMakePayments() -> Bool - // Request a Payment from the App Store. - static func purchase(productIdentifier: String, quantity: Int, callback: @escaping IAPPurchaseCallback) - - // Restore purchased products. - static func restorePurchases(callback: @escaping IAPRefreshCallback) - - // Finish all transactions for the product. - static func finishTransactions(for productIdentifier: String) - - // Checks if the last transaction state for a given product was deferred. + /// Request a Payment from the App Store. + /// - Parameters: + /// - productIdentifier: The identifier of the product to purchase. + /// - quantity: The quantity to purchase (default value = 1). + /// - callback: The function that will be called after processing. + /// - See also:`IAPPurchaseCallback` and `IAPPurchaseResult`. + static func purchase(productIdentifier: String, quantity: Int, callback: @escaping IAPPurchaseCallback) -> Void + + /// Restore purchased products. + /// - Parameter callback: The function that will be called after processing. + /// - See also:`IAPRefreshCallback` and `IAPRefreshResult`. + static func restorePurchases(callback: @escaping IAPRefreshCallback) -> Void + + /// Finish all transactions for the product. + /// - Parameter productIdentifier: The identifier of the product. + static func finishTransactions(for productIdentifier: String) -> Void + + /// Checks if the last transaction state for a given product was deferred. + /// - Parameter productIdentifier: The identifier of the product. + /// - Returns: A boolean indicates if the last transaction state was deferred. static func hasDeferredTransaction(for productIdentifier: String) -> Bool /* MARK: - Purchases information */ - // Checks if the user has already purchased at least one product. + /// Checks if the user has already purchased at least one product. + /// - Returns: A boolean indicates if the . static func hasAlreadyPurchased() -> Bool - // Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription). + /// Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription). + /// - Parameter productIdentifier: The identifier of the product. + /// - Returns: A boolean indicates if the user currently own (or is subscribed to) a given product. static func hasActivePurchase(for productIdentifier: String) -> Bool - // Checks if the user has an active auto renewable subscription. + /// Checks if the user has an active auto renewable subscription regardless of the product identifier. + /// - Returns: A boolean indicates if the user has an active auto renewable subscription. static func hasActiveSubscription() -> Bool - // Returns the latest purchased date for a given product. + /// Returns the latest purchased date for a given product. + /// - Parameter productIdentifier: The identifier of the product. + /// - Returns: The latest purchase `Date` if set or `nil`. static func getPurchaseDate(for productIdentifier: String) -> Date? - // Returns the expiry date for a subcription. May be past or future. + /// Returns the expiry date for a subcription. May be past or future. + /// - Parameter productIdentifier: The identifier of the product. + /// - Returns: The expiry `Date` is set or `nil`. static func getExpiryDate(for productIdentifier: String) -> Date? } public extension InAppPurchaseLib { - // Sets default IAPPurchaseDelegate - static func initialize(iapProducts: Array, iapPurchaseDelegate: IAPPurchaseDelegate = DefaultPurchaseDelegate(), validatorUrlString: String, applicationUsername: String? = nil) { - return initialize(iapProducts: iapProducts, iapPurchaseDelegate: iapPurchaseDelegate, validatorUrlString: validatorUrlString, applicationUsername: applicationUsername) + // Sets default `iapPurchaseDelegate` and `applicationUsername` + static func initialize(iapProducts: Array, validatorUrlString: String, iapPurchaseDelegate: IAPPurchaseDelegate = DefaultPurchaseDelegate(), applicationUsername: String? = nil) { + return initialize(iapProducts: iapProducts, validatorUrlString: validatorUrlString, iapPurchaseDelegate: iapPurchaseDelegate, applicationUsername: applicationUsername) } // Sets 1 as default value for the quantity. @@ -82,17 +117,23 @@ public extension InAppPurchaseLib { /* MARK: - The protocol that you must adopt. */ +/// The protocol that you must adopt if you have `consumable` and/or `nonRenewingSubscription` products. public protocol IAPPurchaseDelegate { - // Called when a product is newly purchased, updated or restored. - func productPurchased(productIdentifier: String) + /// Called when a product is newly purchased, updated or restored. + /// - Parameter productIdentifier: The identifier of the product. + /// + /// - Important: You have to acknowledge delivery of the (virtual) item to finalize the transaction. Then you have to call `InAppPurchase.finishTransactions(for: productIdentifier)`as soon as you have delivered the product. + func productPurchased(productIdentifier: String) -> Void } -// The default implementation of IAPPurchaseDelegate if no other is provided. +/// The default implementation of `IAPPurchaseDelegate` if no other is provided. public class DefaultPurchaseDelegate: IAPPurchaseDelegate { public init(){} + + /// Finish the product transactions when a product is newly purchased, updated or restored. + /// - Parameter productIdentifier: The identifier of the product. public func productPurchased(productIdentifier: String) { - // Finish the product transactions. InAppPurchase.finishTransactions(for: productIdentifier) } } diff --git a/Sources/InAppPurchaseLib/Product/IAPProduct.swift b/Sources/InAppPurchaseLib/Product/IAPProduct.swift index 1bb9950..74e919e 100644 --- a/Sources/InAppPurchaseLib/Product/IAPProduct.swift +++ b/Sources/InAppPurchaseLib/Product/IAPProduct.swift @@ -9,9 +9,19 @@ import Foundation public struct IAPProduct { + + /// The identifier of the product. public var productIdentifier: String + + /// The type of the product. + /// - See also: `IAPProductType`. public var productType: IAPProductType + /// Initializes an `IAPProduct` with its identifier and type. + /// - Parameters: + /// - productIdentifier: The identifier of the product. + /// - productType: The type of the product. + /// - See also: `IAPProductType`. public init(productIdentifier: String, productType: IAPProductType) { self.productIdentifier = productIdentifier self.productType = productType diff --git a/Sources/InAppPurchaseLib/Product/SKProductExtension.swift b/Sources/InAppPurchaseLib/Product/SKProductExtension.swift index aeda2a5..d8c61d2 100644 --- a/Sources/InAppPurchaseLib/Product/SKProductExtension.swift +++ b/Sources/InAppPurchaseLib/Product/SKProductExtension.swift @@ -19,37 +19,37 @@ public enum IAPPeriodFormat { extension SKProduct { public static var localizedPeriodFormat: IAPPeriodFormat = .short - // Checks if the product has an introductory price the user is eligible to. + /// Checks if the product has an introductory price the user is eligible to. public func hasIntroductoryPriceEligible() -> Bool { let ineligibleForIntroPriceProductIDs = IAPStorageService.getStringArray(forKey: INELIGIBLE_FOR_INTRO_PRICE_PRODUCT_IDS_KEY) return !ineligibleForIntroPriceProductIDs.contains(productIdentifier) && introductoryPrice != nil } - // Returns a localized string with the cost of the product in the local currency. + /// Returns a localized string with the cost of the product in the local currency. public var localizedPrice: String { return getLocalizedPrice(locale: priceLocale, price: price) } - // Returns a localized string with the period of the subscription product. + /// Returns a localized string with the period of the subscription product. public var localizedSubscriptionPeriod: String? { if subscriptionPeriod == nil { return nil } return getLocalizedPeriod(unit: subscriptionPeriod!.unit, numberOfUnits: subscriptionPeriod!.numberOfUnits) } - // Returns a localized string with the introductory price if available, in the local currency. + /// Returns a localized string with the introductory price if available, in the local currency. public var localizedIntroductoryPrice: String? { if introductoryPrice == nil { return nil } return getLocalizedPrice(locale: introductoryPrice!.priceLocale, price: introductoryPrice!.price) } - // Returns a localized string with the introductory price period of the subscription product. + /// Returns a localized string with the introductory price period of the subscription product. public var localizedIntroductoryPeriod: String? { if introductoryPrice == nil { return nil } return getLocalizedPeriod(unit: introductoryPrice!.subscriptionPeriod.unit, numberOfUnits: introductoryPrice!.subscriptionPeriod.numberOfUnits) } - // Returns a localized string with the duration of the introductory price. + /// Returns a localized string with the duration of the introductory price. public var localizedIntroductoryDuration: String? { if introductoryPrice == nil { return nil } let numberOfUnits = introductoryPrice!.subscriptionPeriod.numberOfUnits * introductoryPrice!.numberOfPeriods diff --git a/_config.yml b/_config.yml deleted file mode 100644 index c419263..0000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-cayman \ No newline at end of file diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index c419263..0000000 --- a/docs/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-cayman \ No newline at end of file diff --git a/docs/jazzy/Classes.html b/docs/jazzy/Classes.html new file mode 100644 index 0000000..d33eafb --- /dev/null +++ b/docs/jazzy/Classes.html @@ -0,0 +1,205 @@ + + + + Classes Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

Classes

+

The following classes are available globally.

+ +
+
+
+ +
+
+
+ + +
+ +

The protocol that you must adopt.

+

+
+
+ +
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Classes/DefaultPurchaseDelegate.html b/docs/jazzy/Classes/DefaultPurchaseDelegate.html new file mode 100644 index 0000000..3a8424b --- /dev/null +++ b/docs/jazzy/Classes/DefaultPurchaseDelegate.html @@ -0,0 +1,215 @@ + + + + DefaultPurchaseDelegate Class Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

DefaultPurchaseDelegate

+
+
+
public class DefaultPurchaseDelegate : IAPPurchaseDelegate
+ +
+
+

The default implementation of IAPPurchaseDelegate if no other is provided.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Finish the product transactions when a product is newly purchased, updated or restored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func productPurchased(productIdentifier: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Classes/InAppPurchase.html b/docs/jazzy/Classes/InAppPurchase.html new file mode 100644 index 0000000..b43f50e --- /dev/null +++ b/docs/jazzy/Classes/InAppPurchase.html @@ -0,0 +1,1027 @@ + + + + InAppPurchase Class Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

InAppPurchase

+
+
+
public class InAppPurchase : NSObject, InAppPurchaseLib
+ +
+
+

Undocumented

+ +
+
+
+
+ + +
+ +

Properties

+

+
+
+
    +
  • +
    + + + + iapProducts + +
    +
    +
    +
    +
    +
    +

    The array of IAPProduct.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var iapProducts: Array<IAPProduct>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validatorUrlString + +
    +
    +
    +
    +
    +
    +

    The validator url retrieved from Fovea.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var validatorUrlString: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + iapPurchaseDelegate + +
    +
    +
    +
    +
    +
    +

    The instance of class that adopts the IAPPurchaseDelegate protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var iapPurchaseDelegate: IAPPurchaseDelegate?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + applicationUsername + +
    +
    +
    +
    +
    +
    +

    The user name, if your app implements user login.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var applicationUsername: String?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Main methods

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func initialize(iapProducts: Array<IAPProduct>, validatorUrlString: String, iapPurchaseDelegate: IAPPurchaseDelegate, applicationUsername: String?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + iapProducts + + +
    +

    An array of IAPProduct.

    +
    +
    + + validatorUrlString + + +
    +

    The validator url retrieved from Fovea.

    +
    +
    + + iapPurchaseDelegate + + +
    +

    An instance of class that adopts the IAPPurchaseDelegate protocol (default value = DefaultPurchaseDelegate).

    +
    +
    + + applicationUsername + + +
    +

    The user name, if your app implements user login.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + stop() + +
    +
    +
    +
    +
    +
    +

    Stop observing the payment queue, when the application will terminate, for proper cleanup.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func stop()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + refresh(callback:) + +
    +
    +
    +
    +
    +
    +

    Refresh Product list and user Receipt.

    +
    +

    See

    + See also:IAPRefreshCallback and IAPRefreshResult. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func refresh(callback: @escaping IAPRefreshCallback)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + callback + + +
    +

    The function that will be called after processing.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Products information

+

+
+
+
    +
  • +
    + + + + getProducts() + +
    +
    +
    +
    +
    +
    +

    Gets all products retrieved from the App Store

    +
    +

    See

    + See also: SKProduct. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func getProducts() -> Array<SKProduct>
    + +
    +
    +
    +

    Return Value

    +

    An array of products.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Gets the product by its identifier from the list of products retrieved from the App Store.

    +
    +

    See

    + See also: SKProduct. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func getProductBy(identifier: String) -> SKProduct?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + identifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    The product if it was retrieved from the App Store.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Purchasing and Restoring

+

+
+
+
    +
  • +
    + + + + canMakePayments() + +
    +
    +
    +
    +
    +
    +

    Checks if the user is allowed to authorize payments.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func canMakePayments() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the user is allowed.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Request a Payment from the App Store.

    +
    +

    See

    + See also:IAPPurchaseCallback and IAPPurchaseResult. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func purchase(productIdentifier: String, quantity: Int, callback: @escaping IAPPurchaseCallback)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product to purchase.

    +
    +
    + + quantity + + +
    +

    The quantity to purchase (default value = 1).

    +
    +
    + + callback + + +
    +

    The function that will be called after processing.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Restore purchased products.

    +
    +

    See

    + See also:IAPRefreshCallback and IAPRefreshResult. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func restorePurchases(callback: @escaping IAPRefreshCallback)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + callback + + +
    +

    The function that will be called after processing.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Finish all transactions for the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func finishTransactions(for productIdentifier: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the last transaction state for a given product was deferred.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func hasDeferredTransaction(for productIdentifier: String) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the last transaction state was deferred.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Purchases information

+

+
+
+
    +
  • +
    + + + + hasAlreadyPurchased() + +
    +
    +
    +
    +
    +
    +

    Checks if the user has already purchased at least one product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func hasAlreadyPurchased() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the .

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func hasActivePurchase(for productIdentifier: String) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the user currently own (or is subscribed to) a given product.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the user has an active auto renewable subscription regardless of the product identifier.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func hasActiveSubscription() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the user has an active auto renewable subscription.

    +
    +
    +
    +
  • +
  • +
    + + + + getPurchaseDate(for:) + +
    +
    +
    +
    +
    +
    +

    Returns the latest purchased date for a given product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func getPurchaseDate(for productIdentifier: String) -> Date?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    The latest purchase Date if set or nil.

    +
    +
    +
    +
  • +
  • +
    + + + + getExpiryDate(for:) + +
    +
    +
    +
    +
    +
    +

    Returns the expiry date for a subcription. May be past or future.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func getExpiryDate(for productIdentifier: String) -> Date?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    The expiry Date is set or nil.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Enums.html b/docs/jazzy/Enums.html new file mode 100644 index 0000000..b724f25 --- /dev/null +++ b/docs/jazzy/Enums.html @@ -0,0 +1,276 @@ + + + + Enumerations Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

Enumerations

+

The following enumerations are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum IAPPurchaseResultState
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPRefreshResultState + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum IAPRefreshResultState
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPErrorCode + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum IAPErrorCode
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPProductType + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum IAPProductType
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPPeriodFormat + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum IAPPeriodFormat
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Enums/IAPErrorCode.html b/docs/jazzy/Enums/IAPErrorCode.html new file mode 100644 index 0000000..b78db89 --- /dev/null +++ b/docs/jazzy/Enums/IAPErrorCode.html @@ -0,0 +1,412 @@ + + + + IAPErrorCode Enumeration Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPErrorCode

+
+
+
public enum IAPErrorCode
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + libraryNotInitialized + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case libraryNotInitialized
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + productNotFound + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case productNotFound
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cannotMakePurchase + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case cannotMakePurchase
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + alreadyPurchasing + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case alreadyPurchasing
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bundleIdentifierInvalid
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validatorUrlInvalid + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case validatorUrlInvalid
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + refreshReceiptFailed + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case refreshReceiptFailed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validateReceiptFailed + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case validateReceiptFailed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + readReceiptFailed + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case readReceiptFailed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + refreshProductsFailed + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case refreshProductsFailed
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Enums/IAPPeriodFormat.html b/docs/jazzy/Enums/IAPPeriodFormat.html new file mode 100644 index 0000000..b5080fe --- /dev/null +++ b/docs/jazzy/Enums/IAPPeriodFormat.html @@ -0,0 +1,196 @@ + + + + IAPPeriodFormat Enumeration Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPPeriodFormat

+
+
+
public enum IAPPeriodFormat
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + short + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case short
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + long + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case long
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Enums/IAPProductType.html b/docs/jazzy/Enums/IAPProductType.html new file mode 100644 index 0000000..5f397d9 --- /dev/null +++ b/docs/jazzy/Enums/IAPProductType.html @@ -0,0 +1,250 @@ + + + + IAPProductType Enumeration Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPProductType

+
+
+
public enum IAPProductType
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + consumable + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case consumable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + nonConsumable + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case nonConsumable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case nonRenewingSubscription
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case autoRenewableSubscription
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Enums/IAPPurchaseResultState.html b/docs/jazzy/Enums/IAPPurchaseResultState.html new file mode 100644 index 0000000..ade15de --- /dev/null +++ b/docs/jazzy/Enums/IAPPurchaseResultState.html @@ -0,0 +1,250 @@ + + + + IAPPurchaseResultState Enumeration Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPPurchaseResultState

+
+
+
public enum IAPPurchaseResultState
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + purchased + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case purchased
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failed + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case failed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cancelled + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case cancelled
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + deferred + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case deferred
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Enums/IAPRefreshResultState.html b/docs/jazzy/Enums/IAPRefreshResultState.html new file mode 100644 index 0000000..ce460b0 --- /dev/null +++ b/docs/jazzy/Enums/IAPRefreshResultState.html @@ -0,0 +1,223 @@ + + + + IAPRefreshResultState Enumeration Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPRefreshResultState

+
+
+
public enum IAPRefreshResultState
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + succeeded + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case succeeded
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failed + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case failed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + skipped + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case skipped
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Extensions.html b/docs/jazzy/Extensions.html new file mode 100644 index 0000000..922e9fa --- /dev/null +++ b/docs/jazzy/Extensions.html @@ -0,0 +1,163 @@ + + + + Extensions Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

Extensions

+

The following extensions are available globally.

+ +
+
+
+
    +
  • +
    + + + + SKProduct + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension SKProduct
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Extensions/SKProduct.html b/docs/jazzy/Extensions/SKProduct.html new file mode 100644 index 0000000..19d937b --- /dev/null +++ b/docs/jazzy/Extensions/SKProduct.html @@ -0,0 +1,330 @@ + + + + SKProduct Extension Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

SKProduct

+
+
+
extension SKProduct
+ +
+
+ +
+
+
+
    +
  • +
    + + + + localizedPeriodFormat + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var localizedPeriodFormat: IAPPeriodFormat
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the product has an introductory price the user is eligible to.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hasIntroductoryPriceEligible() -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + localizedPrice + +
    +
    +
    +
    +
    +
    +

    Returns a localized string with the cost of the product in the local currency.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedPrice: String { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a localized string with the period of the subscription product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedSubscriptionPeriod: String? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a localized string with the introductory price if available, in the local currency.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedIntroductoryPrice: String? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a localized string with the introductory price period of the subscription product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedIntroductoryPeriod: String? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a localized string with the duration of the introductory price.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedIntroductoryDuration: String? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Protocols.html b/docs/jazzy/Protocols.html new file mode 100644 index 0000000..33bac01 --- /dev/null +++ b/docs/jazzy/Protocols.html @@ -0,0 +1,233 @@ + + + + Protocols Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • +
    + + + + IAPErrorProtocol + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol IAPErrorProtocol : LocalizedError
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + InAppPurchaseLib + +
    +
    +
    +
    +
    +
    +

    The protocol that InAppPurchase` adopts.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol InAppPurchaseLib
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

The protocol that you must adopt.

+

+
+
+
    +
  • +
    + + + + IAPPurchaseDelegate + +
    +
    +
    +
    +
    +
    +

    The protocol that you must adopt if you have consumable and/or nonRenewingSubscription products.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol IAPPurchaseDelegate
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Protocols/IAPErrorProtocol.html b/docs/jazzy/Protocols/IAPErrorProtocol.html new file mode 100644 index 0000000..39a040c --- /dev/null +++ b/docs/jazzy/Protocols/IAPErrorProtocol.html @@ -0,0 +1,169 @@ + + + + IAPErrorProtocol Protocol Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPErrorProtocol

+
+
+
public protocol IAPErrorProtocol : LocalizedError
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + code + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var code: IAPErrorCode { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Protocols/IAPPurchaseDelegate.html b/docs/jazzy/Protocols/IAPPurchaseDelegate.html new file mode 100644 index 0000000..ced2b91 --- /dev/null +++ b/docs/jazzy/Protocols/IAPPurchaseDelegate.html @@ -0,0 +1,193 @@ + + + + IAPPurchaseDelegate Protocol Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPPurchaseDelegate

+
+
+
public protocol IAPPurchaseDelegate
+ +
+
+

The protocol that you must adopt if you have consumable and/or nonRenewingSubscription products.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Called when a product is newly purchased, updated or restored.

    +
    +

    Important

    +

    You have to acknowledge delivery of the (virtual) item to finalize the transaction. Then you have to call InAppPurchase.finishTransactions(for: productIdentifier)as soon as you have delivered the product.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func productPurchased(productIdentifier: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Protocols/InAppPurchaseLib.html b/docs/jazzy/Protocols/InAppPurchaseLib.html new file mode 100644 index 0000000..63ceafc --- /dev/null +++ b/docs/jazzy/Protocols/InAppPurchaseLib.html @@ -0,0 +1,1019 @@ + + + + InAppPurchaseLib Protocol Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

InAppPurchaseLib

+
+
+
public protocol InAppPurchaseLib
+ +
+
+

The protocol that InAppPurchase` adopts.

+ +
+
+
+
    +
  • +
    + + + + iapProducts + +
    +
    +
    +
    +
    +
    +

    The array of IAPProduct.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static var iapProducts: Array<IAPProduct> { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validatorUrlString + +
    +
    +
    +
    +
    +
    +

    The validator url retrieved from Fovea.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static var validatorUrlString: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + iapPurchaseDelegate + +
    +
    +
    +
    +
    +
    +

    The instance of class that adopts the IAPPurchaseDelegate protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static var iapPurchaseDelegate: IAPPurchaseDelegate? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + applicationUsername + +
    +
    +
    +
    +
    +
    +

    The user name, if your app implements user login.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static var applicationUsername: String? { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func initialize(iapProducts: Array<IAPProduct>, validatorUrlString: String, iapPurchaseDelegate: IAPPurchaseDelegate, applicationUsername: String?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + iapProducts + + +
    +

    An array of IAPProduct.

    +
    +
    + + validatorUrlString + + +
    +

    The validator url retrieved from Fovea.

    +
    +
    + + iapPurchaseDelegate + + +
    +

    An instance of class that adopts the IAPPurchaseDelegate protocol (default value = DefaultPurchaseDelegate).

    +
    +
    + + applicationUsername + + +
    +

    The user name, if your app implements user login.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + stop() + +
    +
    +
    +
    +
    +
    +

    Stop observing the payment queue, when the application will terminate, for proper cleanup.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func stop()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + refresh(callback:) + +
    +
    +
    +
    +
    +
    +

    Refresh Product list and user Receipt.

    +
    +

    See

    + See also:IAPRefreshCallback and IAPRefreshResult. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func refresh(callback: @escaping IAPRefreshCallback)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + callback + + +
    +

    The function that will be called after processing.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Products information

+

+
+
+
    +
  • +
    + + + + getProducts() + +
    +
    +
    +
    +
    +
    +

    Gets all products retrieved from the App Store

    +
    +

    See

    + See also: SKProduct. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func getProducts() -> Array<SKProduct>
    + +
    +
    +
    +

    Return Value

    +

    An array of products.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Gets the product by its identifier from the list of products retrieved from the App Store.

    +
    +

    See

    + See also: SKProduct. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func getProductBy(identifier: String) -> SKProduct?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + identifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    The product if it was retrieved from the App Store.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Purchasing and Restoring

+

+
+
+
    +
  • +
    + + + + canMakePayments() + +
    +
    +
    +
    +
    +
    +

    Checks if the user is allowed to authorize payments.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func canMakePayments() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the user is allowed.

    +
    +
    +
    +
  • +
  • +
    + + + + purchase(productIdentifier:quantity:callback:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Request a Payment from the App Store.

    +
    +

    See

    + See also:IAPPurchaseCallback and IAPPurchaseResult. + +
    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func purchase(productIdentifier: String, quantity: Int, callback: @escaping IAPPurchaseCallback)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product to purchase.

    +
    +
    + + quantity + + +
    +

    The quantity to purchase (default value = 1).

    +
    +
    + + callback + + +
    +

    The function that will be called after processing.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Restore purchased products.

    +
    +

    See

    + See also:IAPRefreshCallback and IAPRefreshResult. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func restorePurchases(callback: @escaping IAPRefreshCallback)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + callback + + +
    +

    The function that will be called after processing.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Finish all transactions for the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func finishTransactions(for productIdentifier: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the last transaction state for a given product was deferred.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func hasDeferredTransaction(for productIdentifier: String) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the last transaction state was deferred.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Purchases information

+

+
+
+
    +
  • +
    + + + + hasAlreadyPurchased() + +
    +
    +
    +
    +
    +
    +

    Checks if the user has already purchased at least one product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func hasAlreadyPurchased() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the .

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func hasActivePurchase(for productIdentifier: String) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the user currently own (or is subscribed to) a given product.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the user has an active auto renewable subscription regardless of the product identifier.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func hasActiveSubscription() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the user has an active auto renewable subscription.

    +
    +
    +
    +
  • +
  • +
    + + + + getPurchaseDate(for:) + +
    +
    +
    +
    +
    +
    +

    Returns the latest purchased date for a given product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func getPurchaseDate(for productIdentifier: String) -> Date?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    The latest purchase Date if set or nil.

    +
    +
    +
    +
  • +
  • +
    + + + + getExpiryDate(for:) + +
    +
    +
    +
    +
    +
    +

    Returns the expiry date for a subcription. May be past or future.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func getExpiryDate(for productIdentifier: String) -> Date?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    The expiry Date is set or nil.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Structs.html b/docs/jazzy/Structs.html new file mode 100644 index 0000000..7b7bec2 --- /dev/null +++ b/docs/jazzy/Structs.html @@ -0,0 +1,248 @@ + + + + Structures Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

Structures

+

The following structures are available globally.

+ +
+
+
+
    +
  • +
    + + + + IAPPurchaseResult + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct IAPPurchaseResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPRefreshResult + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct IAPRefreshResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPError + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct IAPError : IAPErrorProtocol
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPProduct + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct IAPProduct
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Structs/IAPError.html b/docs/jazzy/Structs/IAPError.html new file mode 100644 index 0000000..b1e121c --- /dev/null +++ b/docs/jazzy/Structs/IAPError.html @@ -0,0 +1,196 @@ + + + + IAPError Structure Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPError

+
+
+
public struct IAPError : IAPErrorProtocol
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + code + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var code: IAPErrorCode
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + localizedDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Structs/IAPProduct.html b/docs/jazzy/Structs/IAPProduct.html new file mode 100644 index 0000000..889974f --- /dev/null +++ b/docs/jazzy/Structs/IAPProduct.html @@ -0,0 +1,264 @@ + + + + IAPProduct Structure Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPProduct

+
+
+
public struct IAPProduct
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + productIdentifier + +
    +
    +
    +
    +
    +
    +

    The identifier of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var productIdentifier: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + productType + +
    +
    +
    +
    +
    +
    +

    The type of the product.

    +
    +

    See

    + See also: IAPProductType. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var productType: IAPProductType
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initializes an IAPProduct with its identifier and type.

    +
    +

    See

    + See also: IAPProductType. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(productIdentifier: String, productType: IAPProductType)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    + + productType + + +
    +

    The type of the product.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Structs/IAPPurchaseResult.html b/docs/jazzy/Structs/IAPPurchaseResult.html new file mode 100644 index 0000000..6bc3b5d --- /dev/null +++ b/docs/jazzy/Structs/IAPPurchaseResult.html @@ -0,0 +1,250 @@ + + + + IAPPurchaseResult Structure Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPPurchaseResult

+
+
+
public struct IAPPurchaseResult
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + state + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var state: IAPPurchaseResultState { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + iapError + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var iapError: IAPError? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + skError + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var skError: SKError? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + localizedDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedDescription: String? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Structs/IAPRefreshResult.html b/docs/jazzy/Structs/IAPRefreshResult.html new file mode 100644 index 0000000..8d70385 --- /dev/null +++ b/docs/jazzy/Structs/IAPRefreshResult.html @@ -0,0 +1,250 @@ + + + + IAPRefreshResult Structure Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPRefreshResult

+
+
+
public struct IAPRefreshResult
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + state + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var state: IAPRefreshResultState { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + iapError + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var iapError: IAPError? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + addedPurchases + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var addedPurchases: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + updatedPurchases + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var updatedPurchases: Int { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/Typealiases.html b/docs/jazzy/Typealiases.html new file mode 100644 index 0000000..17dd0f5 --- /dev/null +++ b/docs/jazzy/Typealiases.html @@ -0,0 +1,190 @@ + + + + Type Aliases Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

Type Aliases

+

The following type aliases are available globally.

+ +
+
+
+ +
+
+
+ +
+
+ + + diff --git a/docs/jazzy/badge.svg b/docs/jazzy/badge.svg new file mode 100644 index 0000000..81f3c9b --- /dev/null +++ b/docs/jazzy/badge.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + documentation + + + documentation + + + 52% + + + 52% + + + diff --git a/docs/jazzy/css/highlight.css b/docs/jazzy/css/highlight.css new file mode 100644 index 0000000..d0db0e1 --- /dev/null +++ b/docs/jazzy/css/highlight.css @@ -0,0 +1,200 @@ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight { + /* Comment */ + /* Error */ + /* Keyword */ + /* Operator */ + /* Comment.Multiline */ + /* Comment.Preproc */ + /* Comment.Single */ + /* Comment.Special */ + /* Generic.Deleted */ + /* Generic.Deleted.Specific */ + /* Generic.Emph */ + /* Generic.Error */ + /* Generic.Heading */ + /* Generic.Inserted */ + /* Generic.Inserted.Specific */ + /* Generic.Output */ + /* Generic.Prompt */ + /* Generic.Strong */ + /* Generic.Subheading */ + /* Generic.Traceback */ + /* Keyword.Constant */ + /* Keyword.Declaration */ + /* Keyword.Pseudo */ + /* Keyword.Reserved */ + /* Keyword.Type */ + /* Literal.Number */ + /* Literal.String */ + /* Name.Attribute */ + /* Name.Builtin */ + /* Name.Class */ + /* Name.Constant */ + /* Name.Entity */ + /* Name.Exception */ + /* Name.Function */ + /* Name.Namespace */ + /* Name.Tag */ + /* Name.Variable */ + /* Operator.Word */ + /* Text.Whitespace */ + /* Literal.Number.Float */ + /* Literal.Number.Hex */ + /* Literal.Number.Integer */ + /* Literal.Number.Oct */ + /* Literal.String.Backtick */ + /* Literal.String.Char */ + /* Literal.String.Doc */ + /* Literal.String.Double */ + /* Literal.String.Escape */ + /* Literal.String.Heredoc */ + /* Literal.String.Interpol */ + /* Literal.String.Other */ + /* Literal.String.Regex */ + /* Literal.String.Single */ + /* Literal.String.Symbol */ + /* Name.Builtin.Pseudo */ + /* Name.Variable.Class */ + /* Name.Variable.Global */ + /* Name.Variable.Instance */ + /* Literal.Number.Integer.Long */ } + .highlight .c { + color: #999988; + font-style: italic; } + .highlight .err { + color: #a61717; + background-color: #e3d2d2; } + .highlight .k { + color: #000000; + font-weight: bold; } + .highlight .o { + color: #000000; + font-weight: bold; } + .highlight .cm { + color: #999988; + font-style: italic; } + .highlight .cp { + color: #999999; + font-weight: bold; } + .highlight .c1 { + color: #999988; + font-style: italic; } + .highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + .highlight .gd { + color: #000000; + background-color: #ffdddd; } + .highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + .highlight .ge { + color: #000000; + font-style: italic; } + .highlight .gr { + color: #aa0000; } + .highlight .gh { + color: #999999; } + .highlight .gi { + color: #000000; + background-color: #ddffdd; } + .highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + .highlight .go { + color: #888888; } + .highlight .gp { + color: #555555; } + .highlight .gs { + font-weight: bold; } + .highlight .gu { + color: #aaaaaa; } + .highlight .gt { + color: #aa0000; } + .highlight .kc { + color: #000000; + font-weight: bold; } + .highlight .kd { + color: #000000; + font-weight: bold; } + .highlight .kp { + color: #000000; + font-weight: bold; } + .highlight .kr { + color: #000000; + font-weight: bold; } + .highlight .kt { + color: #445588; } + .highlight .m { + color: #009999; } + .highlight .s { + color: #d14; } + .highlight .na { + color: #008080; } + .highlight .nb { + color: #0086B3; } + .highlight .nc { + color: #445588; + font-weight: bold; } + .highlight .no { + color: #008080; } + .highlight .ni { + color: #800080; } + .highlight .ne { + color: #990000; + font-weight: bold; } + .highlight .nf { + color: #990000; } + .highlight .nn { + color: #555555; } + .highlight .nt { + color: #000080; } + .highlight .nv { + color: #008080; } + .highlight .ow { + color: #000000; + font-weight: bold; } + .highlight .w { + color: #bbbbbb; } + .highlight .mf { + color: #009999; } + .highlight .mh { + color: #009999; } + .highlight .mi { + color: #009999; } + .highlight .mo { + color: #009999; } + .highlight .sb { + color: #d14; } + .highlight .sc { + color: #d14; } + .highlight .sd { + color: #d14; } + .highlight .s2 { + color: #d14; } + .highlight .se { + color: #d14; } + .highlight .sh { + color: #d14; } + .highlight .si { + color: #d14; } + .highlight .sx { + color: #d14; } + .highlight .sr { + color: #009926; } + .highlight .s1 { + color: #d14; } + .highlight .ss { + color: #990073; } + .highlight .bp { + color: #999999; } + .highlight .vc { + color: #008080; } + .highlight .vg { + color: #008080; } + .highlight .vi { + color: #008080; } + .highlight .il { + color: #009999; } diff --git a/docs/jazzy/css/jazzy.css b/docs/jazzy/css/jazzy.css new file mode 100644 index 0000000..c3090c0 --- /dev/null +++ b/docs/jazzy/css/jazzy.css @@ -0,0 +1,374 @@ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +a { + color: #0088cc; + text-decoration: none; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 26px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 2; } + header img { + padding-right: 6px; + vertical-align: -4px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 27px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 2; + margin-top: 26px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 20px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section-name-container { + position: relative; + display: inline-block; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + .item .declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4b8afb; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: relative; + top: 10px; + bottom: 0px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } + +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } + +html.dash .height-container { + display: block; } + +html.dash .item .token { + margin-left: 0; } + +html.dash .content-wrapper { + width: auto; } + +html.dash #footer { + position: static; } diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Info.plist b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Info.plist new file mode 100644 index 0000000..bced676 --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleIdentifier + com.jazzy.inapppurchaselib + CFBundleName + InAppPurchaseLib + DocSetPlatformFamily + inapppurchaselib + isDashDocset + + dashIndexFilePath + index.html + isJavaScriptEnabled + + DashDocSetFamily + dashtoc + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Classes.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Classes.html new file mode 100644 index 0000000..d33eafb --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Classes.html @@ -0,0 +1,205 @@ + + + + Classes Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

Classes

+

The following classes are available globally.

+ +
+
+
+ +
+
+
+ + +
+ +

The protocol that you must adopt.

+

+
+
+ +
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Classes/DefaultPurchaseDelegate.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Classes/DefaultPurchaseDelegate.html new file mode 100644 index 0000000..3a8424b --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Classes/DefaultPurchaseDelegate.html @@ -0,0 +1,215 @@ + + + + DefaultPurchaseDelegate Class Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

DefaultPurchaseDelegate

+
+
+
public class DefaultPurchaseDelegate : IAPPurchaseDelegate
+ +
+
+

The default implementation of IAPPurchaseDelegate if no other is provided.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Finish the product transactions when a product is newly purchased, updated or restored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func productPurchased(productIdentifier: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Classes/InAppPurchase.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Classes/InAppPurchase.html new file mode 100644 index 0000000..b43f50e --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Classes/InAppPurchase.html @@ -0,0 +1,1027 @@ + + + + InAppPurchase Class Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

InAppPurchase

+
+
+
public class InAppPurchase : NSObject, InAppPurchaseLib
+ +
+
+

Undocumented

+ +
+
+
+
+ + +
+ +

Properties

+

+
+
+
    +
  • +
    + + + + iapProducts + +
    +
    +
    +
    +
    +
    +

    The array of IAPProduct.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var iapProducts: Array<IAPProduct>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validatorUrlString + +
    +
    +
    +
    +
    +
    +

    The validator url retrieved from Fovea.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var validatorUrlString: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + iapPurchaseDelegate + +
    +
    +
    +
    +
    +
    +

    The instance of class that adopts the IAPPurchaseDelegate protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var iapPurchaseDelegate: IAPPurchaseDelegate?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + applicationUsername + +
    +
    +
    +
    +
    +
    +

    The user name, if your app implements user login.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var applicationUsername: String?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Main methods

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func initialize(iapProducts: Array<IAPProduct>, validatorUrlString: String, iapPurchaseDelegate: IAPPurchaseDelegate, applicationUsername: String?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + iapProducts + + +
    +

    An array of IAPProduct.

    +
    +
    + + validatorUrlString + + +
    +

    The validator url retrieved from Fovea.

    +
    +
    + + iapPurchaseDelegate + + +
    +

    An instance of class that adopts the IAPPurchaseDelegate protocol (default value = DefaultPurchaseDelegate).

    +
    +
    + + applicationUsername + + +
    +

    The user name, if your app implements user login.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + stop() + +
    +
    +
    +
    +
    +
    +

    Stop observing the payment queue, when the application will terminate, for proper cleanup.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func stop()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + refresh(callback:) + +
    +
    +
    +
    +
    +
    +

    Refresh Product list and user Receipt.

    +
    +

    See

    + See also:IAPRefreshCallback and IAPRefreshResult. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func refresh(callback: @escaping IAPRefreshCallback)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + callback + + +
    +

    The function that will be called after processing.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Products information

+

+
+
+
    +
  • +
    + + + + getProducts() + +
    +
    +
    +
    +
    +
    +

    Gets all products retrieved from the App Store

    +
    +

    See

    + See also: SKProduct. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func getProducts() -> Array<SKProduct>
    + +
    +
    +
    +

    Return Value

    +

    An array of products.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Gets the product by its identifier from the list of products retrieved from the App Store.

    +
    +

    See

    + See also: SKProduct. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func getProductBy(identifier: String) -> SKProduct?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + identifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    The product if it was retrieved from the App Store.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Purchasing and Restoring

+

+
+
+
    +
  • +
    + + + + canMakePayments() + +
    +
    +
    +
    +
    +
    +

    Checks if the user is allowed to authorize payments.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func canMakePayments() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the user is allowed.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Request a Payment from the App Store.

    +
    +

    See

    + See also:IAPPurchaseCallback and IAPPurchaseResult. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func purchase(productIdentifier: String, quantity: Int, callback: @escaping IAPPurchaseCallback)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product to purchase.

    +
    +
    + + quantity + + +
    +

    The quantity to purchase (default value = 1).

    +
    +
    + + callback + + +
    +

    The function that will be called after processing.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Restore purchased products.

    +
    +

    See

    + See also:IAPRefreshCallback and IAPRefreshResult. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func restorePurchases(callback: @escaping IAPRefreshCallback)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + callback + + +
    +

    The function that will be called after processing.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Finish all transactions for the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func finishTransactions(for productIdentifier: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the last transaction state for a given product was deferred.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func hasDeferredTransaction(for productIdentifier: String) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the last transaction state was deferred.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Purchases information

+

+
+
+
    +
  • +
    + + + + hasAlreadyPurchased() + +
    +
    +
    +
    +
    +
    +

    Checks if the user has already purchased at least one product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func hasAlreadyPurchased() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the .

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func hasActivePurchase(for productIdentifier: String) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the user currently own (or is subscribed to) a given product.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the user has an active auto renewable subscription regardless of the product identifier.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func hasActiveSubscription() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the user has an active auto renewable subscription.

    +
    +
    +
    +
  • +
  • +
    + + + + getPurchaseDate(for:) + +
    +
    +
    +
    +
    +
    +

    Returns the latest purchased date for a given product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func getPurchaseDate(for productIdentifier: String) -> Date?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    The latest purchase Date if set or nil.

    +
    +
    +
    +
  • +
  • +
    + + + + getExpiryDate(for:) + +
    +
    +
    +
    +
    +
    +

    Returns the expiry date for a subcription. May be past or future.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func getExpiryDate(for productIdentifier: String) -> Date?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    The expiry Date is set or nil.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums.html new file mode 100644 index 0000000..b724f25 --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums.html @@ -0,0 +1,276 @@ + + + + Enumerations Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

Enumerations

+

The following enumerations are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum IAPPurchaseResultState
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPRefreshResultState + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum IAPRefreshResultState
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPErrorCode + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum IAPErrorCode
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPProductType + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum IAPProductType
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPPeriodFormat + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum IAPPeriodFormat
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPErrorCode.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPErrorCode.html new file mode 100644 index 0000000..b78db89 --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPErrorCode.html @@ -0,0 +1,412 @@ + + + + IAPErrorCode Enumeration Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPErrorCode

+
+
+
public enum IAPErrorCode
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + libraryNotInitialized + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case libraryNotInitialized
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + productNotFound + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case productNotFound
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cannotMakePurchase + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case cannotMakePurchase
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + alreadyPurchasing + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case alreadyPurchasing
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bundleIdentifierInvalid
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validatorUrlInvalid + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case validatorUrlInvalid
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + refreshReceiptFailed + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case refreshReceiptFailed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validateReceiptFailed + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case validateReceiptFailed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + readReceiptFailed + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case readReceiptFailed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + refreshProductsFailed + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case refreshProductsFailed
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPPeriodFormat.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPPeriodFormat.html new file mode 100644 index 0000000..b5080fe --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPPeriodFormat.html @@ -0,0 +1,196 @@ + + + + IAPPeriodFormat Enumeration Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPPeriodFormat

+
+
+
public enum IAPPeriodFormat
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + short + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case short
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + long + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case long
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPProductType.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPProductType.html new file mode 100644 index 0000000..5f397d9 --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPProductType.html @@ -0,0 +1,250 @@ + + + + IAPProductType Enumeration Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPProductType

+
+
+
public enum IAPProductType
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + consumable + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case consumable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + nonConsumable + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case nonConsumable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case nonRenewingSubscription
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case autoRenewableSubscription
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPPurchaseResultState.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPPurchaseResultState.html new file mode 100644 index 0000000..ade15de --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPPurchaseResultState.html @@ -0,0 +1,250 @@ + + + + IAPPurchaseResultState Enumeration Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPPurchaseResultState

+
+
+
public enum IAPPurchaseResultState
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + purchased + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case purchased
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failed + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case failed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cancelled + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case cancelled
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + deferred + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case deferred
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPRefreshResultState.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPRefreshResultState.html new file mode 100644 index 0000000..ce460b0 --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Enums/IAPRefreshResultState.html @@ -0,0 +1,223 @@ + + + + IAPRefreshResultState Enumeration Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPRefreshResultState

+
+
+
public enum IAPRefreshResultState
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + succeeded + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case succeeded
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failed + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case failed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + skipped + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case skipped
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Extensions.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Extensions.html new file mode 100644 index 0000000..922e9fa --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Extensions.html @@ -0,0 +1,163 @@ + + + + Extensions Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

Extensions

+

The following extensions are available globally.

+ +
+
+
+
    +
  • +
    + + + + SKProduct + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension SKProduct
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Extensions/SKProduct.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Extensions/SKProduct.html new file mode 100644 index 0000000..19d937b --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Extensions/SKProduct.html @@ -0,0 +1,330 @@ + + + + SKProduct Extension Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

SKProduct

+
+
+
extension SKProduct
+ +
+
+ +
+
+
+
    +
  • +
    + + + + localizedPeriodFormat + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var localizedPeriodFormat: IAPPeriodFormat
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the product has an introductory price the user is eligible to.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hasIntroductoryPriceEligible() -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + localizedPrice + +
    +
    +
    +
    +
    +
    +

    Returns a localized string with the cost of the product in the local currency.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedPrice: String { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a localized string with the period of the subscription product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedSubscriptionPeriod: String? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a localized string with the introductory price if available, in the local currency.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedIntroductoryPrice: String? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a localized string with the introductory price period of the subscription product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedIntroductoryPeriod: String? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a localized string with the duration of the introductory price.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedIntroductoryDuration: String? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols.html new file mode 100644 index 0000000..33bac01 --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols.html @@ -0,0 +1,233 @@ + + + + Protocols Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • +
    + + + + IAPErrorProtocol + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol IAPErrorProtocol : LocalizedError
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + InAppPurchaseLib + +
    +
    +
    +
    +
    +
    +

    The protocol that InAppPurchase` adopts.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol InAppPurchaseLib
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

The protocol that you must adopt.

+

+
+
+
    +
  • +
    + + + + IAPPurchaseDelegate + +
    +
    +
    +
    +
    +
    +

    The protocol that you must adopt if you have consumable and/or nonRenewingSubscription products.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol IAPPurchaseDelegate
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols/IAPErrorProtocol.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols/IAPErrorProtocol.html new file mode 100644 index 0000000..39a040c --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols/IAPErrorProtocol.html @@ -0,0 +1,169 @@ + + + + IAPErrorProtocol Protocol Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPErrorProtocol

+
+
+
public protocol IAPErrorProtocol : LocalizedError
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + code + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var code: IAPErrorCode { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols/IAPPurchaseDelegate.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols/IAPPurchaseDelegate.html new file mode 100644 index 0000000..ced2b91 --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols/IAPPurchaseDelegate.html @@ -0,0 +1,193 @@ + + + + IAPPurchaseDelegate Protocol Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPPurchaseDelegate

+
+
+
public protocol IAPPurchaseDelegate
+ +
+
+

The protocol that you must adopt if you have consumable and/or nonRenewingSubscription products.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Called when a product is newly purchased, updated or restored.

    +
    +

    Important

    +

    You have to acknowledge delivery of the (virtual) item to finalize the transaction. Then you have to call InAppPurchase.finishTransactions(for: productIdentifier)as soon as you have delivered the product.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func productPurchased(productIdentifier: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols/InAppPurchaseLib.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols/InAppPurchaseLib.html new file mode 100644 index 0000000..63ceafc --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Protocols/InAppPurchaseLib.html @@ -0,0 +1,1019 @@ + + + + InAppPurchaseLib Protocol Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

InAppPurchaseLib

+
+
+
public protocol InAppPurchaseLib
+ +
+
+

The protocol that InAppPurchase` adopts.

+ +
+
+
+
    +
  • +
    + + + + iapProducts + +
    +
    +
    +
    +
    +
    +

    The array of IAPProduct.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static var iapProducts: Array<IAPProduct> { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validatorUrlString + +
    +
    +
    +
    +
    +
    +

    The validator url retrieved from Fovea.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static var validatorUrlString: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + iapPurchaseDelegate + +
    +
    +
    +
    +
    +
    +

    The instance of class that adopts the IAPPurchaseDelegate protocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static var iapPurchaseDelegate: IAPPurchaseDelegate? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + applicationUsername + +
    +
    +
    +
    +
    +
    +

    The user name, if your app implements user login.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static var applicationUsername: String? { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func initialize(iapProducts: Array<IAPProduct>, validatorUrlString: String, iapPurchaseDelegate: IAPPurchaseDelegate, applicationUsername: String?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + iapProducts + + +
    +

    An array of IAPProduct.

    +
    +
    + + validatorUrlString + + +
    +

    The validator url retrieved from Fovea.

    +
    +
    + + iapPurchaseDelegate + + +
    +

    An instance of class that adopts the IAPPurchaseDelegate protocol (default value = DefaultPurchaseDelegate).

    +
    +
    + + applicationUsername + + +
    +

    The user name, if your app implements user login.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + stop() + +
    +
    +
    +
    +
    +
    +

    Stop observing the payment queue, when the application will terminate, for proper cleanup.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func stop()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + refresh(callback:) + +
    +
    +
    +
    +
    +
    +

    Refresh Product list and user Receipt.

    +
    +

    See

    + See also:IAPRefreshCallback and IAPRefreshResult. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func refresh(callback: @escaping IAPRefreshCallback)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + callback + + +
    +

    The function that will be called after processing.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Products information

+

+
+
+
    +
  • +
    + + + + getProducts() + +
    +
    +
    +
    +
    +
    +

    Gets all products retrieved from the App Store

    +
    +

    See

    + See also: SKProduct. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func getProducts() -> Array<SKProduct>
    + +
    +
    +
    +

    Return Value

    +

    An array of products.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Gets the product by its identifier from the list of products retrieved from the App Store.

    +
    +

    See

    + See also: SKProduct. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func getProductBy(identifier: String) -> SKProduct?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + identifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    The product if it was retrieved from the App Store.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Purchasing and Restoring

+

+
+
+
    +
  • +
    + + + + canMakePayments() + +
    +
    +
    +
    +
    +
    +

    Checks if the user is allowed to authorize payments.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func canMakePayments() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the user is allowed.

    +
    +
    +
    +
  • +
  • +
    + + + + purchase(productIdentifier:quantity:callback:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Request a Payment from the App Store.

    +
    +

    See

    + See also:IAPPurchaseCallback and IAPPurchaseResult. + +
    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func purchase(productIdentifier: String, quantity: Int, callback: @escaping IAPPurchaseCallback)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product to purchase.

    +
    +
    + + quantity + + +
    +

    The quantity to purchase (default value = 1).

    +
    +
    + + callback + + +
    +

    The function that will be called after processing.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Restore purchased products.

    +
    +

    See

    + See also:IAPRefreshCallback and IAPRefreshResult. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func restorePurchases(callback: @escaping IAPRefreshCallback)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + callback + + +
    +

    The function that will be called after processing.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Finish all transactions for the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func finishTransactions(for productIdentifier: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the last transaction state for a given product was deferred.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func hasDeferredTransaction(for productIdentifier: String) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the last transaction state was deferred.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Purchases information

+

+
+
+
    +
  • +
    + + + + hasAlreadyPurchased() + +
    +
    +
    +
    +
    +
    +

    Checks if the user has already purchased at least one product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func hasAlreadyPurchased() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the .

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func hasActivePurchase(for productIdentifier: String) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the user currently own (or is subscribed to) a given product.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks if the user has an active auto renewable subscription regardless of the product identifier.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func hasActiveSubscription() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    A boolean indicates if the user has an active auto renewable subscription.

    +
    +
    +
    +
  • +
  • +
    + + + + getPurchaseDate(for:) + +
    +
    +
    +
    +
    +
    +

    Returns the latest purchased date for a given product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func getPurchaseDate(for productIdentifier: String) -> Date?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    The latest purchase Date if set or nil.

    +
    +
    +
    +
  • +
  • +
    + + + + getExpiryDate(for:) + +
    +
    +
    +
    +
    +
    +

    Returns the expiry date for a subcription. May be past or future.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func getExpiryDate(for productIdentifier: String) -> Date?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    +
    +
    +

    Return Value

    +

    The expiry Date is set or nil.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs.html new file mode 100644 index 0000000..7b7bec2 --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs.html @@ -0,0 +1,248 @@ + + + + Structures Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

Structures

+

The following structures are available globally.

+ +
+
+
+
    +
  • +
    + + + + IAPPurchaseResult + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct IAPPurchaseResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPRefreshResult + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct IAPRefreshResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPError + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct IAPError : IAPErrorProtocol
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IAPProduct + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct IAPProduct
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPError.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPError.html new file mode 100644 index 0000000..b1e121c --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPError.html @@ -0,0 +1,196 @@ + + + + IAPError Structure Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPError

+
+
+
public struct IAPError : IAPErrorProtocol
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + code + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var code: IAPErrorCode
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + localizedDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPProduct.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPProduct.html new file mode 100644 index 0000000..889974f --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPProduct.html @@ -0,0 +1,264 @@ + + + + IAPProduct Structure Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPProduct

+
+
+
public struct IAPProduct
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + productIdentifier + +
    +
    +
    +
    +
    +
    +

    The identifier of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var productIdentifier: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + productType + +
    +
    +
    +
    +
    +
    +

    The type of the product.

    +
    +

    See

    + See also: IAPProductType. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var productType: IAPProductType
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initializes an IAPProduct with its identifier and type.

    +
    +

    See

    + See also: IAPProductType. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(productIdentifier: String, productType: IAPProductType)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + productIdentifier + + +
    +

    The identifier of the product.

    +
    +
    + + productType + + +
    +

    The type of the product.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPPurchaseResult.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPPurchaseResult.html new file mode 100644 index 0000000..6bc3b5d --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPPurchaseResult.html @@ -0,0 +1,250 @@ + + + + IAPPurchaseResult Structure Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPPurchaseResult

+
+
+
public struct IAPPurchaseResult
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + state + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var state: IAPPurchaseResultState { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + iapError + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var iapError: IAPError? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + skError + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var skError: SKError? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + localizedDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedDescription: String? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPRefreshResult.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPRefreshResult.html new file mode 100644 index 0000000..8d70385 --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Structs/IAPRefreshResult.html @@ -0,0 +1,250 @@ + + + + IAPRefreshResult Structure Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

IAPRefreshResult

+
+
+
public struct IAPRefreshResult
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + state + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var state: IAPRefreshResultState { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + iapError + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var iapError: IAPError? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + addedPurchases + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var addedPurchases: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + updatedPurchases + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var updatedPurchases: Int { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Typealiases.html b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Typealiases.html new file mode 100644 index 0000000..17dd0f5 --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/Typealiases.html @@ -0,0 +1,190 @@ + + + + Type Aliases Reference + + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+

Type Aliases

+

The following type aliases are available globally.

+ +
+
+
+ +
+
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/css/highlight.css b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/css/highlight.css new file mode 100644 index 0000000..d0db0e1 --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/css/highlight.css @@ -0,0 +1,200 @@ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight { + /* Comment */ + /* Error */ + /* Keyword */ + /* Operator */ + /* Comment.Multiline */ + /* Comment.Preproc */ + /* Comment.Single */ + /* Comment.Special */ + /* Generic.Deleted */ + /* Generic.Deleted.Specific */ + /* Generic.Emph */ + /* Generic.Error */ + /* Generic.Heading */ + /* Generic.Inserted */ + /* Generic.Inserted.Specific */ + /* Generic.Output */ + /* Generic.Prompt */ + /* Generic.Strong */ + /* Generic.Subheading */ + /* Generic.Traceback */ + /* Keyword.Constant */ + /* Keyword.Declaration */ + /* Keyword.Pseudo */ + /* Keyword.Reserved */ + /* Keyword.Type */ + /* Literal.Number */ + /* Literal.String */ + /* Name.Attribute */ + /* Name.Builtin */ + /* Name.Class */ + /* Name.Constant */ + /* Name.Entity */ + /* Name.Exception */ + /* Name.Function */ + /* Name.Namespace */ + /* Name.Tag */ + /* Name.Variable */ + /* Operator.Word */ + /* Text.Whitespace */ + /* Literal.Number.Float */ + /* Literal.Number.Hex */ + /* Literal.Number.Integer */ + /* Literal.Number.Oct */ + /* Literal.String.Backtick */ + /* Literal.String.Char */ + /* Literal.String.Doc */ + /* Literal.String.Double */ + /* Literal.String.Escape */ + /* Literal.String.Heredoc */ + /* Literal.String.Interpol */ + /* Literal.String.Other */ + /* Literal.String.Regex */ + /* Literal.String.Single */ + /* Literal.String.Symbol */ + /* Name.Builtin.Pseudo */ + /* Name.Variable.Class */ + /* Name.Variable.Global */ + /* Name.Variable.Instance */ + /* Literal.Number.Integer.Long */ } + .highlight .c { + color: #999988; + font-style: italic; } + .highlight .err { + color: #a61717; + background-color: #e3d2d2; } + .highlight .k { + color: #000000; + font-weight: bold; } + .highlight .o { + color: #000000; + font-weight: bold; } + .highlight .cm { + color: #999988; + font-style: italic; } + .highlight .cp { + color: #999999; + font-weight: bold; } + .highlight .c1 { + color: #999988; + font-style: italic; } + .highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + .highlight .gd { + color: #000000; + background-color: #ffdddd; } + .highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + .highlight .ge { + color: #000000; + font-style: italic; } + .highlight .gr { + color: #aa0000; } + .highlight .gh { + color: #999999; } + .highlight .gi { + color: #000000; + background-color: #ddffdd; } + .highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + .highlight .go { + color: #888888; } + .highlight .gp { + color: #555555; } + .highlight .gs { + font-weight: bold; } + .highlight .gu { + color: #aaaaaa; } + .highlight .gt { + color: #aa0000; } + .highlight .kc { + color: #000000; + font-weight: bold; } + .highlight .kd { + color: #000000; + font-weight: bold; } + .highlight .kp { + color: #000000; + font-weight: bold; } + .highlight .kr { + color: #000000; + font-weight: bold; } + .highlight .kt { + color: #445588; } + .highlight .m { + color: #009999; } + .highlight .s { + color: #d14; } + .highlight .na { + color: #008080; } + .highlight .nb { + color: #0086B3; } + .highlight .nc { + color: #445588; + font-weight: bold; } + .highlight .no { + color: #008080; } + .highlight .ni { + color: #800080; } + .highlight .ne { + color: #990000; + font-weight: bold; } + .highlight .nf { + color: #990000; } + .highlight .nn { + color: #555555; } + .highlight .nt { + color: #000080; } + .highlight .nv { + color: #008080; } + .highlight .ow { + color: #000000; + font-weight: bold; } + .highlight .w { + color: #bbbbbb; } + .highlight .mf { + color: #009999; } + .highlight .mh { + color: #009999; } + .highlight .mi { + color: #009999; } + .highlight .mo { + color: #009999; } + .highlight .sb { + color: #d14; } + .highlight .sc { + color: #d14; } + .highlight .sd { + color: #d14; } + .highlight .s2 { + color: #d14; } + .highlight .se { + color: #d14; } + .highlight .sh { + color: #d14; } + .highlight .si { + color: #d14; } + .highlight .sx { + color: #d14; } + .highlight .sr { + color: #009926; } + .highlight .s1 { + color: #d14; } + .highlight .ss { + color: #990073; } + .highlight .bp { + color: #999999; } + .highlight .vc { + color: #008080; } + .highlight .vg { + color: #008080; } + .highlight .vi { + color: #008080; } + .highlight .il { + color: #009999; } diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/css/jazzy.css b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/css/jazzy.css new file mode 100644 index 0000000..c3090c0 --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/css/jazzy.css @@ -0,0 +1,374 @@ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +a { + color: #0088cc; + text-decoration: none; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 26px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 2; } + header img { + padding-right: 6px; + vertical-align: -4px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 27px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 2; + margin-top: 26px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 20px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section-name-container { + position: relative; + display: inline-block; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + .item .declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4b8afb; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: relative; + top: 10px; + bottom: 0px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } + +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } + +html.dash .height-container { + display: block; } + +html.dash .item .token { + margin-left: 0; } + +html.dash .content-wrapper { + width: auto; } + +html.dash #footer { + position: static; } diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/img/carat.png b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/img/carat.png new file mode 100755 index 0000000000000000000000000000000000000000..29d2f7fd4955fca6bc6fb740e0373a2c358c398e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRo!3HEV4DF?Wlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqAi{-jv*Ddl5#RKJQ5NTUZgiPI4RUKGIKU?u8L&ndhX1t za+0CMVUnT(Gnb}ei=c~x==tMH^F1_tBocXwcoSWoO-SZY-o>!8%^=Bms)(~h;m_U( zXNixk28L}0LS5-jKyq@#2gyS|J&f#pGCLkTc<@2s1dqeyqJ*Rc0tSIETAgmODY;(s z2y|Mcp&2}7rpBprBBB~1qM1`N+}4SoxYVPqsXi&l`rxZp{(w0iSy$Nv5*Vy!RapG^ S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/img/dash.png b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 ShohtYzipXxh2)4xTk + + + InAppPurchaseLib Reference + + + + + + + + + +
+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+ +

+ +

+ +
+

An easy-to-use library for In-App Purchases, using Fovea.Billing for receipts validation.

+
+ + +

Features

+ +
    +
  • ✅ Purchase a product
  • +
  • ✅ Restore purchased products
  • +
  • ✅ Verify transactions with the App Store on Fovea.Billing server
  • +
  • ✅ Handle and notify payment transaction states
  • +
  • ✅ Retreive products information from the App Store
  • +
  • ✅ Support all product types (consumable, non-consumable, auto-renewable subscription, non-renewing subscription)
  • +
  • ✅ Status of purchases available when offline
  • +
  • ✅ Server integration with a Webhook
  • +
+

Getting Started

+ +

If you haven’t already, I highly recommend your read the Overview and Preparing section of Apple’s In-App Purchase official documentation

+

Requirements

+ +
    +
  • Configure your App and Xcode to support In-App Purchases. + +
  • +
  • Create and configure your Fovea.Billing project account: + +
      +
    • Set your bundle ID
    • +
    • The iOS Shared Secret (or shared key) is to be retrieved from AppStoreConnect
    • +
    • The iOS Subscription Status URL (only if you want subscriptions)
    • +
  • +
+

Installation

+ +

+ +

+ +
    +
  • Select your project in Xcode
  • +
  • Go to the section Swift Package
  • +
  • Click on (+) Add Package Dependency
  • +
  • Copy the Git URL: https://github.com/iridescent-dev/iap-swift-lib.git
  • +
  • Click on Next > Next
  • +
  • Make sure your project is selected in Add to target
  • +
  • Click on Finish
  • +
+ +

Note: You have to import InAppPurchaseLib wherever you use the library.

+

Usage

+ +

The process of implementing in-app purchases involves several steps:

+ +
    +
  1. Displaying the list of purchasable products
  2. +
  3. Initiating a purchase
  4. +
  5. Delivering and finalizing a purchase
  6. +
  7. Checking the current ownership of non-consumables and subscriptions
  8. +
  9. Implementing the Restore Purchases button
  10. +
+

Initialization

+ +

Before everything else the library must be initialized. This has to happen as soon as possible. A good way is to call the InAppPurchase.initialize() method when the application did finish launching. In the background, this will load your products and refresh the status of purchases and subscriptions.

+ +

InAppPurchase.initialize() accepts the following arguments:

+ +
    +
  • iapProducts - An array of IAPProduct (REQUIRED)
  • +
  • validatorUrlString - The validator url retrieved from Fovea (REQUIRED)
  • +
  • applicationUsername - The user name, if your app implements user login (optional)
  • +
+ +

Each IAPProduct contains the following fields:

+ +
    +
  • productIdentifier - The product unique identifier
  • +
  • productType - The IAPProductType (consumable, nonConsumable, nonRenewingSubscription or autoRenewableSubscription)
  • +
+ +

Example:

+ +

A good place is generally in your application delegate’s didFinishLaunchingWithOptions function, like below:

+
import InAppPurchaseLib
+
+class AppDelegate: UIResponder, UIApplicationDelegate, IAPPurchaseDelegate {
+  ...
+  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+    InAppPurchase.initialize(
+      iapProducts: [
+        IAPProduct(productIdentifier: "monthly_plan", productType: .autoRenewableSubscription),
+        IAPProduct(productIdentifier: "yearly_plan",  productType: .autoRenewableSubscription),
+        IAPProduct(productIdentifier: "disable_ads",  productType: .nonConsumable)
+      ],
+      validatorUrlString: "https://validator.fovea.cc/v1/validate?appName=demo&apiKey=12345678")
+  }
+
+  func productPurchased(productIdentifier: String) {
+    // ... process purchase (we'll see that later)
+  }
+}
+
+ +

You should also call the stop method when the application will terminate, for proper cleanup.

+
  func applicationWillTerminate(_ application: UIApplication) {
+    InAppPurchase.stop()
+  }
+
+ +

For more advanced use cases, in particular when you have implemented user login, you’ll have to make some adjustments. We’ll learn more about this in the Server integration section.

+ +

Tip: If initialization was successful, you should see a new receipt validation event in Fovea’s Dashboard.

+

Displaying products

+ +

Let’s start with the simplest case: you have a single product.

+ +

You can retrieve all information about this product using the function InAppPurchase.getProductBy(identifier: "my_product_id"). This returns an SKProduct extended with helpful methods.

+ +

Those are the most important:

+ +
    +
  • productIdentifier: String - The string that identifies the product to the Apple AppStore.
  • +
  • localizedTitle: String - The name of the product, in the language of the device, as retrieved from the AppStore.
  • +
  • localizedDescription: String - A description of the product, in the language of the device, as retrieved from the AppStore.
  • +
  • localizedPrice: String - The cost of the product in the local currency (read-only property added by this library).
  • +
+ +

Example:

+ +

You can add a function similar to this to your view.

+
@objc func refreshView() {
+  guard let product: SKProduct = InAppPurchase.getProductBy(identifier: "my_product_id") else {
+    self.titleLabel.text = "Product unavailable"
+    return
+  }
+  self.titleLabel.text = product.localizedTitle
+  self.descriptionLabel.text = product.localizedDescription
+  self.priceLabel.text = product.localizedPrice
+}
+
+ +

This example assumes self.titleLabel is a UILabel, etc.

+ +

Make sure to call this function when the view appears on screen, for instance by calling it from viewWillAppear.

+
override func viewWillAppear(_ animated: Bool) {
+  self.refreshView()
+}
+
+

Displaying subscriptions

+ +

For subscription products, you also have some data about subscription periods and introductory offers.

+ +
    +
  • func hasIntroductoryPriceEligible() -> Bool - The product has an introductory price the user is eligible to.
  • +
  • localizedSubscriptionPeriod: String? - The period of the subscription.
  • +
  • localizedIntroductoryPrice: String? - The cost of the introductory offer if available in the local currency.
  • +
  • localizedIntroductoryPeriod: String? - The subscription period of the introductory offer.
  • +
  • localizedIntroductoryDuration: String? - The duration of the introductory offer.
  • +
+ +

Example

+
@objc func refreshView() {
+  guard let product: SKProduct = InAppPurchase.getProductBy(identifier: "my_product_id") else {
+    self.titleLabel.text = "Product unavailable"
+    return
+  }
+  self.titleLabel.text = product.localizedTitle
+  self.descriptionLabel.text = product.localizedDescription
+
+  // Format price text. Example: "0,99€ / month for 3 months (then 3,99 € / month)"
+  var priceText = "\(product.localizedPrice) / \(product.localizedSubscriptionPeriod!)"
+  if product.hasIntroductoryPriceEligible() {
+      if product.introductoryPrice!.numberOfPeriods == 1 {
+          priceText = "\(product.localizedIntroductoryPrice!) for \(product.localizedIntroductoryDuration!)" +
+          " (then \(priceText))"
+      } else {
+          priceText = "\(product.localizedIntroductoryPrice!) / \(product.localizedIntroductoryPeriod!)" +
+          " for \(product.localizedIntroductoryDuration!) (then \(priceText))"
+      }
+  }
+  self.priceLabel.text = priceText
+}
+
+ +

Note: You have to import StoreKit wherever you use SKProduct.

+

Refreshing

+ +

Data might change or not be yet available when your “product” view is presented. In order to properly handle those cases, you should refresh your view after refreshing in-app products metadata. You want to be sure you’re displaying up-to-date information.

+ +

To achieve this, call InAppPurchase.refresh() when your view is presented.

+
override func viewWillAppear(_ animated: Bool) {
+  self.refreshView()
+  InAppPurchase.refresh(callback: { _ in
+      self.refreshView()
+  })
+}
+
+

Purchasing

+ +

The purchase process is generally a little bit more involving than most people would expect. Why is it not just: purchase → on success unlock the feature?

+ +

Several reasons:

+ +
    +
  • In-app purchases can be initiated outside the app
  • +
  • In-app purchases can be deferred, pending parental approval
  • +
  • Apple wants to be sure you delivered the product before charging the user
  • +
+ +

That is why the process looks like so:

+ +
    +
  • being ready to handle purchase events from app startup
  • +
  • finalizing transactions when product delivery is complete
  • +
  • sending purchase request, for which successful doesn’t always mean complete
  • +
+

Initiating a purchase

+ +

To initiate a purchase, use the InAppPurchase.purchase() function. It takes the productIdentifier and a callback function, called when the purchase has been processed.

+ +

Important: Do not process the purchase here, we’ll handle that later!

+ +

From this callback, you can for example unlock the UI by hiding your loading indicator and display a message to the user.

+ +

Example:

+
self.loaderView.show()
+InAppPurchase.purchase(
+  productIdentifier: "my_product_id",
+  callback: { _ in
+    self.loaderView.hide()
+})
+
+ +

This simple example locks the UI with a loader when the purchase is in progress. We’ll see later how the purchase has to be processed by your applicaiton.

+ +

The callback also gives more information about the outcome of the purchase, you might want to use it to update your UI as well. Note that some events are useful for analytics. So here’s a more complete example.

+
self.loaderView.show()
+InAppPurchase.purchase(
+  productIdentifier: "my_product_id",
+  callback: { result in
+    self.loaderView.hide()
+
+    switch result.state {
+    case .purchased:
+      // Product successfully purchased
+      // Reminder: Do not process the purchase here, only update your UI.
+      //           that's why we do not send data to analytics.
+      openThankYouScreen()
+    case .failed:
+      // Purchase failed
+      // - Human formated reason can be found in result.localizedDescription
+      // - More details in either result.skError or result.iapError
+      showError(result.localizedDescription)
+    case .deferred:
+      // The purchase is deferred, waiting for the parent's approval
+      openWaitingParentApprovalScreen()
+    case .cancelled:
+      // The user canceled the request, generally only useful for analytics.
+  }
+})
+
+ +

If the purchase fails, result will contain either .skError, a SKError from StoreKit, or .iapError, an IAPError.

+ +

Tip: After a successful purchase, you should see a new transaction in Fovea’s dashboard.

+

Handling purchases

+ +

Finally, the magic happened: a user purchased one of your products! Let’s see how we handle the different types of products.

+

Non-Consumables

+ +

Wherever your app needs to know if a non-consumable product has been purchased, use InAppPurchase.hasActivePurchase(for: +productIdentifier). This will return true if the user currently owns the product.

+ +

Note: The last known state for the user’s purchases is stored as UserDefaults. As such, their status is always available to your app, even when offline.

+ +

If you have a server that needs to know about the purchase. You should rely on Fovea’s webhook instead of doing anything in here. We will see that later in the Server integration section.

+

Auto-Renewable Subscriptions

+ +

As with non-consumables, you will use InAppPurchase.hasActivePurchase(for: productIdentifier) to check if the user is an active subscriber to a given product.

+ +

You might also like to call refresh regularly, for example when entering your main view. When appropriate, the library will refresh the receipt to detect subscription renewals or expiry.

+ +

As we’ve seend in the Refreshing section:

+
override func viewWillAppear(_ animated: Bool) {
+  self.refreshView()
+  InAppPurchase.refresh(callback: { _ in
+      self.refreshView()
+  })
+}
+
+ +

Note: Don’t be reluctant to call refresh() often. Internally, the library ensures heavy operation are only performed if necessary: for example when a subscription just expired. So in 99% of cases this call will result in no-operations.

+

Consumables

+ +

If the purchased products in a consumable, your app is responsible for delivering the purchase then acknowlege that you’ve done so. Delivering generally consists in increasing a counter for some sort of virtual currency.

+ +

Your app can be notified of a purchase at any time. So the library asks you to provide an IAPPurchaseDelegate from initialization.

+ +

In InAppPurchase.initialize(), we can pass an IAPPurchaseDelegate instance. This object implements the productPurchased(productIdentifier:) function, which is called whenever a purchase is approved.

+ +

Here’s a example implementation:

+
class AppDelegate: UIResponder, UIApplicationDelegate, IAPPurchaseDelegate {
+  ...
+  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+    InAppPurchase.initialize(
+      iapProducts: [...],
+      iapPurchaseDelegate: self, // ADDED: iapPurchaseDelegate
+      validatorUrlString: "https://validator.fovea.cc/v1/validate?appName=demo&apiKey=12345678")
+  }
+
+  // IAPPurchaseDelegate implementation
+  func productPurchased(productIdentifier: String) {
+    // TODO
+  }
+}
+
+ +

It’s also important to know that when a purchase is approved, money isn’t yet to reach your bank account. You have to acknowledge delivery of the (virtual) item to finalize the transaction. That is why we have to call InAppPurchase.finishTransactions(for: productIdentifier) as soon as we delivered the product.

+ +

Example

+ +

Let’s define a class that adopts the IAPPurchaseDelegate protocol, it can very well be your application delegate.

+
func productPurchased(productIdentifier: String) {
+  switch productIdenfier {
+  case "10_silver":
+    addSilver(10)
+  case "100_silver":
+    addSilver(100)
+  }
+  InAppPurchase.finishTransactions(for: productIdentifier)
+  Analytics.trackEvent("purchase succeeded", productIdentifier)
+}
+
+ +

Here, we implement our own unlocking logic and call InAppPurchase.finishTransactions() afterward (assuming addSilver is synchronous).

+ +

Note: productPurchased is called when a purchase has been confirmed by Fovea’s receipt validator. If you have a server, he probably already has been notified of this purchase using the webhook.

+ +

Reminder: Keep in mind that purchase notifications might occur even if you never called the InAppPurchase.purchase() function: purchases can be made from another device or the AppStore, they can be approved by parents when the app isn’t running, purchase flows can be interupted, etc. The pattern above ensures your app is always ready to handle purchase events.

+

Non-Renewing Subscriptions

+ +

For non-renewing subscriptions, delivering consists in increasing the amount of time a user can access a given feature. Apple doesn’t manage the length and expiry of non-renewing subscriptions: you have to do this yourself, as for consumables.

+ +

Basically, everything is identical to consumables.

+

Restoring purchases

+ +

Except if you only sell consumable products, Apple requires that you provide a “Restore Purchases” button to your users. In general, it is found in your application settings.

+ +

Call this method when this button is pressed.

+
@IBAction func restorePurchases(_ sender: Any) {
+  self.loaderView.show()
+  InAppPurchase.restorePurchases(callback: { result in
+      self.loaderView.hide()
+      switch result.state {
+      case .succeeded:
+          if result.addedPurchases > 0 {
+              print("Restore purchases successful.")
+          } else {
+              print("No purchase to restore.")
+          }
+      case .failed:
+          print("Restore purchases failed.")
+      }
+  })
+}
+
+ +

The callback method is called once the operation is complete. You can use it to unlock the UI, by hiding your loader for example, and display the adapted message to the user.

+

Displaying products with purchases

+ +

In your store screen, where you present your products titles and prices with a purchase button, there are some cases to handle that we skipped. Owned products and deferred purchases.

+

Owned products

+ +

Non-consumables and active auto-renewing subscriptions cannot be purchased again. You should adjust your UI to reflect that state. Refer to InAppPurchase.hasActivePurchase() to and to the example later in this section.

+

Deferred purchases

+ +

Apple’s Ask to Buy feature lets parents approve any purchases initiated by children, including in-app purchases.

+ +

With Ask to Buy enabled, when a child requests to make a purchase, the app is notified that the purchase is awaiting the parent’s approval in the purchase callback:

+
InAppPurchase.purchase(
+  productIdentifier: productIdentifier,
+  callback: { result in
+    switch result.state {
+    case .deferred:
+      // Pending parent approval
+  }
+})
+
+ +

In the deferred case, the child has been notified by StoreKit that the parents have to approve the purchase. He might then close the app and come back later. You don’t have much to do, but to display in your UI that there is a purchase waiting for parental approval in your views.

+ +

We will use the hasDeferredTransaction method:

+
InAppPurchase.hasDeferredTransaction(for productIdentifier: String) -> Bool
+
+

Example

+ +

Here’s an example that covers what has been discussed above. We will update our example refreshView function from before:

+
@objc func refreshView() {
+  guard let product: SKProduct = InAppPurchase.getProductBy(identifier: "my_product_id") else {
+    self.titleLabel.text = "Product unavailable"
+    return
+  }
+  self.titleLabel.text = product.localizedTitle
+  // ...
+
+  // "Ask to Buy" deferred purchase waiting for parent's approval
+  if InAppPurchase.hasDeferredTransaction(for: "my_product_id") {
+    self.statusLabel.text = "Waiting for Approval..."
+    self.purchaseButton.isPointerInteractionEnabled = false
+  }
+  // "Owned" product
+  else if InAppPurchase.hasActivePurchase(for: "my_product_id") {
+    self.statusLabel.text = "OWNED"
+    self.purchaseButton.isPointerInteractionEnabled = false
+  }
+  else {
+    self.purchaseButton.isPointerInteractionEnabled = true
+  }
+}
+
+ +

When a product is owned or has a deferred purchase, we make sure the purchase button is grayed out. We also use a status label to display some details. Of course, you are free to design your UI as you see fit.

+

Errors

+ +

When calling refresh(), purchase() or restorePurchases(), the callback can return an IAPError if the state is failed. +Here is the list of IAPErrorCode you can receive:

+ +
    +
  • Errors returned by refresh(), purchase() or restorePurchases()

    + +
      +
    • libraryNotInitialized - You must call the initialize fuction before using the library.
    • +
    • bundleIdentifierInvalid - The Bundle Identifier is invalid.
    • +
    • validatorUrlInvalid - The Validator URL String is invalid.
    • +
    • refreshReceiptFailed - Failed to refresh the App Store receipt.
    • +
    • validateReceiptFailed - Failed to validate the App Store receipt with Fovea.
    • +
    • readReceiptFailed - Failed to read the receipt validation.
    • +
  • +
  • Errors returned by refresh()

    + +
      +
    • refreshProductsFailed - Failed to refresh products from the App Store.
    • +
  • +
  • Errors returned by purchase()

    + +
      +
    • productNotFound - The product was not found on the App Store and cannot be purchased.
    • +
    • cannotMakePurchase - The user is not allowed to authorize payments.
    • +
    • alreadyPurchasing - A purchase is already in progress.
    • +
  • +
+

Analytics

+ +

Tracking the purchase flow is a common things in apps. Especially as it’s core to your revenue model.

+ +

We can track 5 events, which step in the purchase pipeline a user reached.

+ +
    +
  1. purchase initiated
  2. +
  3. purchase cancelled
  4. +
  5. purchase failed
  6. +
  7. purchase deferred
  8. +
  9. purchase succeeded
  10. +
+ +

Here’s a quick example showing how to implement this correctly.

+
func makePurchase() {
+  Analytics.trackEvent("purchase initiated")
+  InAppPurchase.purchase(
+    productIdentifier: "my_product_id",
+    callback: { result in
+      switch result.state {
+      case .purchased:
+        // Reminder: We are not processing the purchase here, only updating your UI.
+        //           That's why we do not send an event to analytics.
+      case .failed:
+        Analytics.trackEvent("purchase failed")
+      case .deferred:
+        Analytics.trackEvent("purchase deferred")
+      case .cancelled:
+        Analytics.trackEvent("purchase cancelled")
+    }
+  })
+}
+
+// IAPPurchaseDelegate implementation
+func productPurchased(productIdentifier: String) {
+  Analytics.trackEvent("purchase succeeded")
+  InAppPurchase.finishTransactions(for: productIdentifier)
+}
+
+ +

The important part to remember is that a purchase can occur outside your app (or be approved when the app is not running), that’s why tracking purchase succeeded has to be part of the productPurchased delegate function.

+ +

Refer to the Consumables section to learn more about the productPurchased function.

+

Server integration

+ +

In more advanced use cases, you have a server component. Users are logged in and you’ll like to unlock the content for this user on your server. The safest approach is to setup a Webhook on Fovea. You’ll receive notifications from Fovea that transaction have been processed and/or subscriptions updated.

+ +

The information sent from Fovea has been verified from Apple’s server, which makes it way more trustable than information sent from your app itself.

+ +

To take advantage of this, you have to inform the library of your application username. This applicationUsername can be provided as a parameter of the InAppPurchase.initialize method and updated later by changing the associated property.

+ +

Example:

+
InAppPurchase.initialize(
+  iapProducts: [...],
+  validatorUrlString: "..."),
+  applicationUsername: UserSession.getUserId())
+
+// later ...
+InAppPurchase.applicationUsername = UserSession.getUserId()
+
+ +

If a user account is mandatory in your app, you will want to delay calls to InAppPurchase.initialize() to when your user’s session is ready.

+ +

Do not hesitate to contact Fovea for help.

+

Xcode Demo Project

+ +

Do not hesitate to check the demo project available on here: iap-swift-lib-demo.

+

References

+ + +

Coding

+ +

Generate the documentation, using this fork of swift-doc (on --minimum-access-level is part of the main distrib).

+
swift-doc generate sources --module-name InAppPurchase --format html --output docs --minimum-access-level public --base-url /iap-swift-lib/
+
+

Troubleshooting

+ +

Common issues are covered here: https://github.com/iridescent-dev/iap-swift-lib/wiki/Troubleshooting

+

License

+ +

InAppPurchaseLib is open-sourced library licensed under the MIT License. See LICENSE for details.

+ +
+
+ +
+
+ + + diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/js/jazzy.js b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/js/jazzy.js new file mode 100755 index 0000000..1e55d6e --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/js/jazzy.js @@ -0,0 +1,70 @@ +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/js/jquery.min.js b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/js/jquery.min.js new file mode 100644 index 0000000..a1c07fd --- /dev/null +++ b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/Documents/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0Undocumented

"},"Typealiases.html#/s:16InAppPurchaseLib18IAPRefreshCallbacka":{"name":"IAPRefreshCallback","abstract":"

Undocumented

"},"Structs/IAPProduct.html#/s:16InAppPurchaseLib10IAPProductV17productIdentifierSSvp":{"name":"productIdentifier","abstract":"

The identifier of the product.

","parent_name":"IAPProduct"},"Structs/IAPProduct.html#/s:16InAppPurchaseLib10IAPProductV11productTypeAA0eG0Ovp":{"name":"productType","abstract":"

The type of the product.

","parent_name":"IAPProduct"},"Structs/IAPProduct.html#/s:16InAppPurchaseLib10IAPProductV17productIdentifier0F4TypeACSS_AA0eH0Otcfc":{"name":"init(productIdentifier:productType:)","abstract":"

Initializes an IAPProduct with its identifier and type.

","parent_name":"IAPProduct"},"Structs/IAPError.html#/s:16InAppPurchaseLib8IAPErrorV4codeAA0E4CodeOvp":{"name":"code","abstract":"

Undocumented

","parent_name":"IAPError"},"Structs/IAPError.html#/s:16InAppPurchaseLib8IAPErrorV20localizedDescriptionSSvp":{"name":"localizedDescription","abstract":"

Undocumented

","parent_name":"IAPError"},"Structs/IAPRefreshResult.html#/s:16InAppPurchaseLib16IAPRefreshResultV5stateAA0eF5StateOvp":{"name":"state","abstract":"

Undocumented

","parent_name":"IAPRefreshResult"},"Structs/IAPRefreshResult.html#/s:16InAppPurchaseLib16IAPRefreshResultV8iapErrorAA8IAPErrorVSgvp":{"name":"iapError","abstract":"

Undocumented

","parent_name":"IAPRefreshResult"},"Structs/IAPRefreshResult.html#/s:16InAppPurchaseLib16IAPRefreshResultV14addedPurchasesSivp":{"name":"addedPurchases","abstract":"

Undocumented

","parent_name":"IAPRefreshResult"},"Structs/IAPRefreshResult.html#/s:16InAppPurchaseLib16IAPRefreshResultV16updatedPurchasesSivp":{"name":"updatedPurchases","abstract":"

Undocumented

","parent_name":"IAPRefreshResult"},"Structs/IAPPurchaseResult.html#/s:16InAppPurchaseLib17IAPPurchaseResultV5stateAA0eF5StateOvp":{"name":"state","abstract":"

Undocumented

","parent_name":"IAPPurchaseResult"},"Structs/IAPPurchaseResult.html#/s:16InAppPurchaseLib17IAPPurchaseResultV8iapErrorAA8IAPErrorVSgvp":{"name":"iapError","abstract":"

Undocumented

","parent_name":"IAPPurchaseResult"},"Structs/IAPPurchaseResult.html#/s:16InAppPurchaseLib17IAPPurchaseResultV7skErrorSC11SKErrorCodeLeVSgvp":{"name":"skError","abstract":"

Undocumented

","parent_name":"IAPPurchaseResult"},"Structs/IAPPurchaseResult.html#/s:16InAppPurchaseLib17IAPPurchaseResultV20localizedDescriptionSSSgvp":{"name":"localizedDescription","abstract":"

Undocumented

","parent_name":"IAPPurchaseResult"},"Structs/IAPPurchaseResult.html":{"name":"IAPPurchaseResult","abstract":"

Undocumented

"},"Structs/IAPRefreshResult.html":{"name":"IAPRefreshResult","abstract":"

Undocumented

"},"Structs/IAPError.html":{"name":"IAPError","abstract":"

Undocumented

"},"Structs/IAPProduct.html":{"name":"IAPProduct","abstract":"

Undocumented

"},"Protocols/IAPPurchaseDelegate.html#/s:16InAppPurchaseLib19IAPPurchaseDelegateP16productPurchased0G10IdentifierySS_tF":{"name":"productPurchased(productIdentifier:)","abstract":"

Called when a product is newly purchased, updated or restored.

","parent_name":"IAPPurchaseDelegate"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP11iapProductsSayAA10IAPProductVGvpZ":{"name":"iapProducts","abstract":"

The array of IAPProduct.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP18validatorUrlStringSSSgvpZ":{"name":"validatorUrlString","abstract":"

The validator url retrieved from Fovea.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP03iapC8DelegateAA011IAPPurchaseF0_pSgvpZ":{"name":"iapPurchaseDelegate","abstract":"

The instance of class that adopts the IAPPurchaseDelegate protocol.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP19applicationUsernameSSSgvpZ":{"name":"applicationUsername","abstract":"

The user name, if your app implements user login.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP10initialize11iapProducts18validatorUrlString0fC8Delegate19applicationUsernameySayAA10IAPProductVG_SSAA011IAPPurchaseK0_pSSSgtFZ":{"name":"initialize(iapProducts:validatorUrlString:iapPurchaseDelegate:applicationUsername:)","abstract":"

Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP4stopyyFZ":{"name":"stop()","abstract":"

Stop observing the payment queue, when the application will terminate, for proper cleanup.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP7refresh8callbackyyAA16IAPRefreshResultVc_tFZ":{"name":"refresh(callback:)","abstract":"

Refresh Product list and user Receipt.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP11getProductsSaySo9SKProductCGyFZ":{"name":"getProducts()","abstract":"

Gets all products retrieved from the App Store

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP12getProductBy10identifierSo9SKProductCSgSS_tFZ":{"name":"getProductBy(identifier:)","abstract":"

Gets the product by its identifier from the list of products retrieved from the App Store.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP15canMakePaymentsSbyFZ":{"name":"canMakePayments()","abstract":"

Checks if the user is allowed to authorize payments.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP8purchase17productIdentifier8quantity8callbackySS_SiyAA17IAPPurchaseResultVctFZ":{"name":"purchase(productIdentifier:quantity:callback:)","abstract":"

Request a Payment from the App Store.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP16restorePurchases8callbackyyAA16IAPRefreshResultVc_tFZ":{"name":"restorePurchases(callback:)","abstract":"

Restore purchased products.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP18finishTransactions3forySS_tFZ":{"name":"finishTransactions(for:)","abstract":"

Finish all transactions for the product.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP22hasDeferredTransaction3forSbSS_tFZ":{"name":"hasDeferredTransaction(for:)","abstract":"

Checks if the last transaction state for a given product was deferred.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP19hasAlreadyPurchasedSbyFZ":{"name":"hasAlreadyPurchased()","abstract":"

Checks if the user has already purchased at least one product.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP09hasActiveC03forSbSS_tFZ":{"name":"hasActivePurchase(for:)","abstract":"

Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription).

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP21hasActiveSubscriptionSbyFZ":{"name":"hasActiveSubscription()","abstract":"

Checks if the user has an active auto renewable subscription regardless of the product identifier.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP03getC4Date3for10Foundation0F0VSgSS_tFZ":{"name":"getPurchaseDate(for:)","abstract":"

Returns the latest purchased date for a given product.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP13getExpiryDate3for10Foundation0G0VSgSS_tFZ":{"name":"getExpiryDate(for:)","abstract":"

Returns the expiry date for a subcription. May be past or future.

","parent_name":"InAppPurchaseLib"},"Protocols/IAPErrorProtocol.html#/s:16InAppPurchaseLib16IAPErrorProtocolP4codeAA0E4CodeOvp":{"name":"code","abstract":"

Undocumented

","parent_name":"IAPErrorProtocol"},"Protocols/IAPErrorProtocol.html":{"name":"IAPErrorProtocol","abstract":"

Undocumented

"},"Protocols/InAppPurchaseLib.html":{"name":"InAppPurchaseLib","abstract":"

The protocol that InAppPurchase` adopts.

"},"Protocols/IAPPurchaseDelegate.html":{"name":"IAPPurchaseDelegate","abstract":"

The protocol that you must adopt if you have consumable and/or nonRenewingSubscription products.

"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE21localizedPeriodFormatAC09IAPPeriodH0OvpZ":{"name":"localizedPeriodFormat","abstract":"

Undocumented

","parent_name":"SKProduct"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE28hasIntroductoryPriceEligibleSbyF":{"name":"hasIntroductoryPriceEligible()","abstract":"

Checks if the product has an introductory price the user is eligible to.

","parent_name":"SKProduct"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE14localizedPriceSSvp":{"name":"localizedPrice","abstract":"

Returns a localized string with the cost of the product in the local currency.

","parent_name":"SKProduct"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE27localizedSubscriptionPeriodSSSgvp":{"name":"localizedSubscriptionPeriod","abstract":"

Returns a localized string with the period of the subscription product.

","parent_name":"SKProduct"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE26localizedIntroductoryPriceSSSgvp":{"name":"localizedIntroductoryPrice","abstract":"

Returns a localized string with the introductory price if available, in the local currency.

","parent_name":"SKProduct"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE27localizedIntroductoryPeriodSSSgvp":{"name":"localizedIntroductoryPeriod","abstract":"

Returns a localized string with the introductory price period of the subscription product.

","parent_name":"SKProduct"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE29localizedIntroductoryDurationSSSgvp":{"name":"localizedIntroductoryDuration","abstract":"

Returns a localized string with the duration of the introductory price.

","parent_name":"SKProduct"},"Extensions/SKProduct.html":{"name":"SKProduct"},"Enums/IAPPeriodFormat.html#/s:16InAppPurchaseLib15IAPPeriodFormatO5shortyA2CmF":{"name":"short","abstract":"

Undocumented

","parent_name":"IAPPeriodFormat"},"Enums/IAPPeriodFormat.html#/s:16InAppPurchaseLib15IAPPeriodFormatO4longyA2CmF":{"name":"long","abstract":"

Undocumented

","parent_name":"IAPPeriodFormat"},"Enums/IAPProductType.html#/s:16InAppPurchaseLib14IAPProductTypeO10consumableyA2CmF":{"name":"consumable","abstract":"

Undocumented

","parent_name":"IAPProductType"},"Enums/IAPProductType.html#/s:16InAppPurchaseLib14IAPProductTypeO13nonConsumableyA2CmF":{"name":"nonConsumable","abstract":"

Undocumented

","parent_name":"IAPProductType"},"Enums/IAPProductType.html#/s:16InAppPurchaseLib14IAPProductTypeO23nonRenewingSubscriptionyA2CmF":{"name":"nonRenewingSubscription","abstract":"

Undocumented

","parent_name":"IAPProductType"},"Enums/IAPProductType.html#/s:16InAppPurchaseLib14IAPProductTypeO25autoRenewableSubscriptionyA2CmF":{"name":"autoRenewableSubscription","abstract":"

Undocumented

","parent_name":"IAPProductType"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO21libraryNotInitializedyA2CmF":{"name":"libraryNotInitialized","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO15productNotFoundyA2CmF":{"name":"productNotFound","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO010cannotMakeC0yA2CmF":{"name":"cannotMakePurchase","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO17alreadyPurchasingyA2CmF":{"name":"alreadyPurchasing","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO23bundleIdentifierInvalidyA2CmF":{"name":"bundleIdentifierInvalid","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO19validatorUrlInvalidyA2CmF":{"name":"validatorUrlInvalid","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO20refreshReceiptFailedyA2CmF":{"name":"refreshReceiptFailed","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO21validateReceiptFailedyA2CmF":{"name":"validateReceiptFailed","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO17readReceiptFailedyA2CmF":{"name":"readReceiptFailed","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO21refreshProductsFailedyA2CmF":{"name":"refreshProductsFailed","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPRefreshResultState.html#/s:16InAppPurchaseLib21IAPRefreshResultStateO9succeededyA2CmF":{"name":"succeeded","abstract":"

Undocumented

","parent_name":"IAPRefreshResultState"},"Enums/IAPRefreshResultState.html#/s:16InAppPurchaseLib21IAPRefreshResultStateO6failedyA2CmF":{"name":"failed","abstract":"

Undocumented

","parent_name":"IAPRefreshResultState"},"Enums/IAPRefreshResultState.html#/s:16InAppPurchaseLib21IAPRefreshResultStateO7skippedyA2CmF":{"name":"skipped","abstract":"

Undocumented

","parent_name":"IAPRefreshResultState"},"Enums/IAPPurchaseResultState.html#/s:16InAppPurchaseLib22IAPPurchaseResultStateO9purchasedyA2CmF":{"name":"purchased","abstract":"

Undocumented

","parent_name":"IAPPurchaseResultState"},"Enums/IAPPurchaseResultState.html#/s:16InAppPurchaseLib22IAPPurchaseResultStateO6failedyA2CmF":{"name":"failed","abstract":"

Undocumented

","parent_name":"IAPPurchaseResultState"},"Enums/IAPPurchaseResultState.html#/s:16InAppPurchaseLib22IAPPurchaseResultStateO9cancelledyA2CmF":{"name":"cancelled","abstract":"

Undocumented

","parent_name":"IAPPurchaseResultState"},"Enums/IAPPurchaseResultState.html#/s:16InAppPurchaseLib22IAPPurchaseResultStateO8deferredyA2CmF":{"name":"deferred","abstract":"

Undocumented

","parent_name":"IAPPurchaseResultState"},"Enums/IAPPurchaseResultState.html":{"name":"IAPPurchaseResultState","abstract":"

Undocumented

"},"Enums/IAPRefreshResultState.html":{"name":"IAPRefreshResultState","abstract":"

Undocumented

"},"Enums/IAPErrorCode.html":{"name":"IAPErrorCode","abstract":"

Undocumented

"},"Enums/IAPProductType.html":{"name":"IAPProductType","abstract":"

Undocumented

"},"Enums/IAPPeriodFormat.html":{"name":"IAPPeriodFormat","abstract":"

Undocumented

"},"Classes/DefaultPurchaseDelegate.html#/s:16InAppPurchaseLib07DefaultC8DelegateCACycfc":{"name":"init()","abstract":"

Undocumented

","parent_name":"DefaultPurchaseDelegate"},"Classes/DefaultPurchaseDelegate.html#/s:16InAppPurchaseLib07DefaultC8DelegateC16productPurchased0G10IdentifierySS_tF":{"name":"productPurchased(productIdentifier:)","abstract":"

Finish the product transactions when a product is newly purchased, updated or restored.

","parent_name":"DefaultPurchaseDelegate"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C11iapProductsSayAA10IAPProductVGvpZ":{"name":"iapProducts","abstract":"

The array of IAPProduct.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C18validatorUrlStringSSSgvpZ":{"name":"validatorUrlString","abstract":"

The validator url retrieved from Fovea.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C03iapC8DelegateAA011IAPPurchaseF0_pSgvpZ":{"name":"iapPurchaseDelegate","abstract":"

The instance of class that adopts the IAPPurchaseDelegate protocol.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C19applicationUsernameSSSgvpZ":{"name":"applicationUsername","abstract":"

The user name, if your app implements user login.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C10initialize11iapProducts18validatorUrlString0fC8Delegate19applicationUsernameySayAA10IAPProductVG_SSAA011IAPPurchaseK0_pSSSgtFZ":{"name":"initialize(iapProducts:validatorUrlString:iapPurchaseDelegate:applicationUsername:)","abstract":"

Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C4stopyyFZ":{"name":"stop()","abstract":"

Stop observing the payment queue, when the application will terminate, for proper cleanup.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C7refresh8callbackyyAA16IAPRefreshResultVc_tFZ":{"name":"refresh(callback:)","abstract":"

Refresh Product list and user Receipt.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C11getProductsSaySo9SKProductCGyFZ":{"name":"getProducts()","abstract":"

Gets all products retrieved from the App Store

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C12getProductBy10identifierSo9SKProductCSgSS_tFZ":{"name":"getProductBy(identifier:)","abstract":"

Gets the product by its identifier from the list of products retrieved from the App Store.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C15canMakePaymentsSbyFZ":{"name":"canMakePayments()","abstract":"

Checks if the user is allowed to authorize payments.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C8purchase17productIdentifier8quantity8callbackySS_SiyAA17IAPPurchaseResultVctFZ":{"name":"purchase(productIdentifier:quantity:callback:)","abstract":"

Request a Payment from the App Store.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C16restorePurchases8callbackyyAA16IAPRefreshResultVc_tFZ":{"name":"restorePurchases(callback:)","abstract":"

Restore purchased products.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C18finishTransactions3forySS_tFZ":{"name":"finishTransactions(for:)","abstract":"

Finish all transactions for the product.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C22hasDeferredTransaction3forSbSS_tFZ":{"name":"hasDeferredTransaction(for:)","abstract":"

Checks if the last transaction state for a given product was deferred.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C19hasAlreadyPurchasedSbyFZ":{"name":"hasAlreadyPurchased()","abstract":"

Checks if the user has already purchased at least one product.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C09hasActiveC03forSbSS_tFZ":{"name":"hasActivePurchase(for:)","abstract":"

Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription).

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C21hasActiveSubscriptionSbyFZ":{"name":"hasActiveSubscription()","abstract":"

Checks if the user has an active auto renewable subscription regardless of the product identifier.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C03getC4Date3for10Foundation0F0VSgSS_tFZ":{"name":"getPurchaseDate(for:)","abstract":"

Returns the latest purchased date for a given product.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C13getExpiryDate3for10Foundation0G0VSgSS_tFZ":{"name":"getExpiryDate(for:)","abstract":"

Returns the expiry date for a subcription. May be past or future.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html":{"name":"InAppPurchase","abstract":"

Undocumented

"},"Classes/DefaultPurchaseDelegate.html":{"name":"DefaultPurchaseDelegate","abstract":"

The default implementation of IAPPurchaseDelegate if no other is provided.

"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

"},"Enums.html":{"name":"Enumerations","abstract":"

The following enumerations are available globally.

"},"Extensions.html":{"name":"Extensions","abstract":"

The following extensions are available globally.

"},"Protocols.html":{"name":"Protocols","abstract":"

The following protocols are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"},"Typealiases.html":{"name":"Type Aliases","abstract":"

The following type aliases are available globally.

"}} \ No newline at end of file diff --git a/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/docSet.dsidx b/docs/jazzy/docsets/InAppPurchaseLib.docset/Contents/Resources/docSet.dsidx new file mode 100644 index 0000000000000000000000000000000000000000..cf3069f1311183d6dcd7f3df0616d213b570da2b GIT binary patch literal 45056 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 literal 0 HcmV?d00001 diff --git a/docs/jazzy/docsets/InAppPurchaseLib.tgz b/docs/jazzy/docsets/InAppPurchaseLib.tgz new file mode 100644 index 0000000000000000000000000000000000000000..1579f8147941cabc1faa3487cea265b1d9d1aad7 GIT binary patch literal 71508 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

bOlj3WEBhCL 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 literal 0 HcmV?d00001 diff --git a/docs/jazzy/img/carat.png b/docs/jazzy/img/carat.png new file mode 100755 index 0000000000000000000000000000000000000000..29d2f7fd4955fca6bc6fb740e0373a2c358c398e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRo!3HEV4DF?Wlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqAi{-jv*Ddl5#RKJQ5NTUZgiPI4RUKGIKU?u8L&ndhX1t za+0CMVUnT(Gnb}ei=c~x==tMH^F1_tBocXwcoSWoO-SZY-o>!8%^=Bms)(~h;m_U( zXNixk28L}0LS5-jKyq@#2gyS|J&f#pGCLkTc<@2s1dqeyqJ*Rc0tSIETAgmODY;(s z2y|Mcp&2}7rpBprBBB~1qM1`N+}4SoxYVPqsXi&l`rxZp{(w0iSy$Nv5*Vy!RapG^ S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/docs/jazzy/img/dash.png b/docs/jazzy/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 ShohtYzipXxh2)4xTk + + + InAppPurchaseLib Reference + + + + + + + + + +

+
+

InAppPurchaseLib (52% documented)

+

View on GitHub

+
+
+
+ +
+
+ +
+
+
+ +

+ +

+ +
+

An easy-to-use library for In-App Purchases, using Fovea.Billing for receipts validation.

+
+ + +

Features

+ +
    +
  • ✅ Purchase a product
  • +
  • ✅ Restore purchased products
  • +
  • ✅ Verify transactions with the App Store on Fovea.Billing server
  • +
  • ✅ Handle and notify payment transaction states
  • +
  • ✅ Retreive products information from the App Store
  • +
  • ✅ Support all product types (consumable, non-consumable, auto-renewable subscription, non-renewing subscription)
  • +
  • ✅ Status of purchases available when offline
  • +
  • ✅ Server integration with a Webhook
  • +
+

Getting Started

+ +

If you haven’t already, I highly recommend your read the Overview and Preparing section of Apple’s In-App Purchase official documentation

+

Requirements

+ +
    +
  • Configure your App and Xcode to support In-App Purchases. + +
  • +
  • Create and configure your Fovea.Billing project account: + +
      +
    • Set your bundle ID
    • +
    • The iOS Shared Secret (or shared key) is to be retrieved from AppStoreConnect
    • +
    • The iOS Subscription Status URL (only if you want subscriptions)
    • +
  • +
+

Installation

+ +

+ +

+ +
    +
  • Select your project in Xcode
  • +
  • Go to the section Swift Package
  • +
  • Click on (+) Add Package Dependency
  • +
  • Copy the Git URL: https://github.com/iridescent-dev/iap-swift-lib.git
  • +
  • Click on Next > Next
  • +
  • Make sure your project is selected in Add to target
  • +
  • Click on Finish
  • +
+ +

Note: You have to import InAppPurchaseLib wherever you use the library.

+

Usage

+ +

The process of implementing in-app purchases involves several steps:

+ +
    +
  1. Displaying the list of purchasable products
  2. +
  3. Initiating a purchase
  4. +
  5. Delivering and finalizing a purchase
  6. +
  7. Checking the current ownership of non-consumables and subscriptions
  8. +
  9. Implementing the Restore Purchases button
  10. +
+

Initialization

+ +

Before everything else the library must be initialized. This has to happen as soon as possible. A good way is to call the InAppPurchase.initialize() method when the application did finish launching. In the background, this will load your products and refresh the status of purchases and subscriptions.

+ +

InAppPurchase.initialize() accepts the following arguments:

+ +
    +
  • iapProducts - An array of IAPProduct (REQUIRED)
  • +
  • validatorUrlString - The validator url retrieved from Fovea (REQUIRED)
  • +
  • applicationUsername - The user name, if your app implements user login (optional)
  • +
+ +

Each IAPProduct contains the following fields:

+ +
    +
  • productIdentifier - The product unique identifier
  • +
  • productType - The IAPProductType (consumable, nonConsumable, nonRenewingSubscription or autoRenewableSubscription)
  • +
+ +

Example:

+ +

A good place is generally in your application delegate’s didFinishLaunchingWithOptions function, like below:

+
import InAppPurchaseLib
+
+class AppDelegate: UIResponder, UIApplicationDelegate, IAPPurchaseDelegate {
+  ...
+  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+    InAppPurchase.initialize(
+      iapProducts: [
+        IAPProduct(productIdentifier: "monthly_plan", productType: .autoRenewableSubscription),
+        IAPProduct(productIdentifier: "yearly_plan",  productType: .autoRenewableSubscription),
+        IAPProduct(productIdentifier: "disable_ads",  productType: .nonConsumable)
+      ],
+      validatorUrlString: "https://validator.fovea.cc/v1/validate?appName=demo&apiKey=12345678")
+  }
+
+  func productPurchased(productIdentifier: String) {
+    // ... process purchase (we'll see that later)
+  }
+}
+
+ +

You should also call the stop method when the application will terminate, for proper cleanup.

+
  func applicationWillTerminate(_ application: UIApplication) {
+    InAppPurchase.stop()
+  }
+
+ +

For more advanced use cases, in particular when you have implemented user login, you’ll have to make some adjustments. We’ll learn more about this in the Server integration section.

+ +

Tip: If initialization was successful, you should see a new receipt validation event in Fovea’s Dashboard.

+

Displaying products

+ +

Let’s start with the simplest case: you have a single product.

+ +

You can retrieve all information about this product using the function InAppPurchase.getProductBy(identifier: "my_product_id"). This returns an SKProduct extended with helpful methods.

+ +

Those are the most important:

+ +
    +
  • productIdentifier: String - The string that identifies the product to the Apple AppStore.
  • +
  • localizedTitle: String - The name of the product, in the language of the device, as retrieved from the AppStore.
  • +
  • localizedDescription: String - A description of the product, in the language of the device, as retrieved from the AppStore.
  • +
  • localizedPrice: String - The cost of the product in the local currency (read-only property added by this library).
  • +
+ +

Example:

+ +

You can add a function similar to this to your view.

+
@objc func refreshView() {
+  guard let product: SKProduct = InAppPurchase.getProductBy(identifier: "my_product_id") else {
+    self.titleLabel.text = "Product unavailable"
+    return
+  }
+  self.titleLabel.text = product.localizedTitle
+  self.descriptionLabel.text = product.localizedDescription
+  self.priceLabel.text = product.localizedPrice
+}
+
+ +

This example assumes self.titleLabel is a UILabel, etc.

+ +

Make sure to call this function when the view appears on screen, for instance by calling it from viewWillAppear.

+
override func viewWillAppear(_ animated: Bool) {
+  self.refreshView()
+}
+
+

Displaying subscriptions

+ +

For subscription products, you also have some data about subscription periods and introductory offers.

+ +
    +
  • func hasIntroductoryPriceEligible() -> Bool - The product has an introductory price the user is eligible to.
  • +
  • localizedSubscriptionPeriod: String? - The period of the subscription.
  • +
  • localizedIntroductoryPrice: String? - The cost of the introductory offer if available in the local currency.
  • +
  • localizedIntroductoryPeriod: String? - The subscription period of the introductory offer.
  • +
  • localizedIntroductoryDuration: String? - The duration of the introductory offer.
  • +
+ +

Example

+
@objc func refreshView() {
+  guard let product: SKProduct = InAppPurchase.getProductBy(identifier: "my_product_id") else {
+    self.titleLabel.text = "Product unavailable"
+    return
+  }
+  self.titleLabel.text = product.localizedTitle
+  self.descriptionLabel.text = product.localizedDescription
+
+  // Format price text. Example: "0,99€ / month for 3 months (then 3,99 € / month)"
+  var priceText = "\(product.localizedPrice) / \(product.localizedSubscriptionPeriod!)"
+  if product.hasIntroductoryPriceEligible() {
+      if product.introductoryPrice!.numberOfPeriods == 1 {
+          priceText = "\(product.localizedIntroductoryPrice!) for \(product.localizedIntroductoryDuration!)" +
+          " (then \(priceText))"
+      } else {
+          priceText = "\(product.localizedIntroductoryPrice!) / \(product.localizedIntroductoryPeriod!)" +
+          " for \(product.localizedIntroductoryDuration!) (then \(priceText))"
+      }
+  }
+  self.priceLabel.text = priceText
+}
+
+ +

Note: You have to import StoreKit wherever you use SKProduct.

+

Refreshing

+ +

Data might change or not be yet available when your “product” view is presented. In order to properly handle those cases, you should refresh your view after refreshing in-app products metadata. You want to be sure you’re displaying up-to-date information.

+ +

To achieve this, call InAppPurchase.refresh() when your view is presented.

+
override func viewWillAppear(_ animated: Bool) {
+  self.refreshView()
+  InAppPurchase.refresh(callback: { _ in
+      self.refreshView()
+  })
+}
+
+

Purchasing

+ +

The purchase process is generally a little bit more involving than most people would expect. Why is it not just: purchase → on success unlock the feature?

+ +

Several reasons:

+ +
    +
  • In-app purchases can be initiated outside the app
  • +
  • In-app purchases can be deferred, pending parental approval
  • +
  • Apple wants to be sure you delivered the product before charging the user
  • +
+ +

That is why the process looks like so:

+ +
    +
  • being ready to handle purchase events from app startup
  • +
  • finalizing transactions when product delivery is complete
  • +
  • sending purchase request, for which successful doesn’t always mean complete
  • +
+

Initiating a purchase

+ +

To initiate a purchase, use the InAppPurchase.purchase() function. It takes the productIdentifier and a callback function, called when the purchase has been processed.

+ +

Important: Do not process the purchase here, we’ll handle that later!

+ +

From this callback, you can for example unlock the UI by hiding your loading indicator and display a message to the user.

+ +

Example:

+
self.loaderView.show()
+InAppPurchase.purchase(
+  productIdentifier: "my_product_id",
+  callback: { _ in
+    self.loaderView.hide()
+})
+
+ +

This simple example locks the UI with a loader when the purchase is in progress. We’ll see later how the purchase has to be processed by your applicaiton.

+ +

The callback also gives more information about the outcome of the purchase, you might want to use it to update your UI as well. Note that some events are useful for analytics. So here’s a more complete example.

+
self.loaderView.show()
+InAppPurchase.purchase(
+  productIdentifier: "my_product_id",
+  callback: { result in
+    self.loaderView.hide()
+
+    switch result.state {
+    case .purchased:
+      // Product successfully purchased
+      // Reminder: Do not process the purchase here, only update your UI.
+      //           that's why we do not send data to analytics.
+      openThankYouScreen()
+    case .failed:
+      // Purchase failed
+      // - Human formated reason can be found in result.localizedDescription
+      // - More details in either result.skError or result.iapError
+      showError(result.localizedDescription)
+    case .deferred:
+      // The purchase is deferred, waiting for the parent's approval
+      openWaitingParentApprovalScreen()
+    case .cancelled:
+      // The user canceled the request, generally only useful for analytics.
+  }
+})
+
+ +

If the purchase fails, result will contain either .skError, a SKError from StoreKit, or .iapError, an IAPError.

+ +

Tip: After a successful purchase, you should see a new transaction in Fovea’s dashboard.

+

Handling purchases

+ +

Finally, the magic happened: a user purchased one of your products! Let’s see how we handle the different types of products.

+

Non-Consumables

+ +

Wherever your app needs to know if a non-consumable product has been purchased, use InAppPurchase.hasActivePurchase(for: +productIdentifier). This will return true if the user currently owns the product.

+ +

Note: The last known state for the user’s purchases is stored as UserDefaults. As such, their status is always available to your app, even when offline.

+ +

If you have a server that needs to know about the purchase. You should rely on Fovea’s webhook instead of doing anything in here. We will see that later in the Server integration section.

+

Auto-Renewable Subscriptions

+ +

As with non-consumables, you will use InAppPurchase.hasActivePurchase(for: productIdentifier) to check if the user is an active subscriber to a given product.

+ +

You might also like to call refresh regularly, for example when entering your main view. When appropriate, the library will refresh the receipt to detect subscription renewals or expiry.

+ +

As we’ve seend in the Refreshing section:

+
override func viewWillAppear(_ animated: Bool) {
+  self.refreshView()
+  InAppPurchase.refresh(callback: { _ in
+      self.refreshView()
+  })
+}
+
+ +

Note: Don’t be reluctant to call refresh() often. Internally, the library ensures heavy operation are only performed if necessary: for example when a subscription just expired. So in 99% of cases this call will result in no-operations.

+

Consumables

+ +

If the purchased products in a consumable, your app is responsible for delivering the purchase then acknowlege that you’ve done so. Delivering generally consists in increasing a counter for some sort of virtual currency.

+ +

Your app can be notified of a purchase at any time. So the library asks you to provide an IAPPurchaseDelegate from initialization.

+ +

In InAppPurchase.initialize(), we can pass an IAPPurchaseDelegate instance. This object implements the productPurchased(productIdentifier:) function, which is called whenever a purchase is approved.

+ +

Here’s a example implementation:

+
class AppDelegate: UIResponder, UIApplicationDelegate, IAPPurchaseDelegate {
+  ...
+  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+    InAppPurchase.initialize(
+      iapProducts: [...],
+      iapPurchaseDelegate: self, // ADDED: iapPurchaseDelegate
+      validatorUrlString: "https://validator.fovea.cc/v1/validate?appName=demo&apiKey=12345678")
+  }
+
+  // IAPPurchaseDelegate implementation
+  func productPurchased(productIdentifier: String) {
+    // TODO
+  }
+}
+
+ +

It’s also important to know that when a purchase is approved, money isn’t yet to reach your bank account. You have to acknowledge delivery of the (virtual) item to finalize the transaction. That is why we have to call InAppPurchase.finishTransactions(for: productIdentifier) as soon as we delivered the product.

+ +

Example

+ +

Let’s define a class that adopts the IAPPurchaseDelegate protocol, it can very well be your application delegate.

+
func productPurchased(productIdentifier: String) {
+  switch productIdenfier {
+  case "10_silver":
+    addSilver(10)
+  case "100_silver":
+    addSilver(100)
+  }
+  InAppPurchase.finishTransactions(for: productIdentifier)
+  Analytics.trackEvent("purchase succeeded", productIdentifier)
+}
+
+ +

Here, we implement our own unlocking logic and call InAppPurchase.finishTransactions() afterward (assuming addSilver is synchronous).

+ +

Note: productPurchased is called when a purchase has been confirmed by Fovea’s receipt validator. If you have a server, he probably already has been notified of this purchase using the webhook.

+ +

Reminder: Keep in mind that purchase notifications might occur even if you never called the InAppPurchase.purchase() function: purchases can be made from another device or the AppStore, they can be approved by parents when the app isn’t running, purchase flows can be interupted, etc. The pattern above ensures your app is always ready to handle purchase events.

+

Non-Renewing Subscriptions

+ +

For non-renewing subscriptions, delivering consists in increasing the amount of time a user can access a given feature. Apple doesn’t manage the length and expiry of non-renewing subscriptions: you have to do this yourself, as for consumables.

+ +

Basically, everything is identical to consumables.

+

Restoring purchases

+ +

Except if you only sell consumable products, Apple requires that you provide a “Restore Purchases” button to your users. In general, it is found in your application settings.

+ +

Call this method when this button is pressed.

+
@IBAction func restorePurchases(_ sender: Any) {
+  self.loaderView.show()
+  InAppPurchase.restorePurchases(callback: { result in
+      self.loaderView.hide()
+      switch result.state {
+      case .succeeded:
+          if result.addedPurchases > 0 {
+              print("Restore purchases successful.")
+          } else {
+              print("No purchase to restore.")
+          }
+      case .failed:
+          print("Restore purchases failed.")
+      }
+  })
+}
+
+ +

The callback method is called once the operation is complete. You can use it to unlock the UI, by hiding your loader for example, and display the adapted message to the user.

+

Displaying products with purchases

+ +

In your store screen, where you present your products titles and prices with a purchase button, there are some cases to handle that we skipped. Owned products and deferred purchases.

+

Owned products

+ +

Non-consumables and active auto-renewing subscriptions cannot be purchased again. You should adjust your UI to reflect that state. Refer to InAppPurchase.hasActivePurchase() to and to the example later in this section.

+

Deferred purchases

+ +

Apple’s Ask to Buy feature lets parents approve any purchases initiated by children, including in-app purchases.

+ +

With Ask to Buy enabled, when a child requests to make a purchase, the app is notified that the purchase is awaiting the parent’s approval in the purchase callback:

+
InAppPurchase.purchase(
+  productIdentifier: productIdentifier,
+  callback: { result in
+    switch result.state {
+    case .deferred:
+      // Pending parent approval
+  }
+})
+
+ +

In the deferred case, the child has been notified by StoreKit that the parents have to approve the purchase. He might then close the app and come back later. You don’t have much to do, but to display in your UI that there is a purchase waiting for parental approval in your views.

+ +

We will use the hasDeferredTransaction method:

+
InAppPurchase.hasDeferredTransaction(for productIdentifier: String) -> Bool
+
+

Example

+ +

Here’s an example that covers what has been discussed above. We will update our example refreshView function from before:

+
@objc func refreshView() {
+  guard let product: SKProduct = InAppPurchase.getProductBy(identifier: "my_product_id") else {
+    self.titleLabel.text = "Product unavailable"
+    return
+  }
+  self.titleLabel.text = product.localizedTitle
+  // ...
+
+  // "Ask to Buy" deferred purchase waiting for parent's approval
+  if InAppPurchase.hasDeferredTransaction(for: "my_product_id") {
+    self.statusLabel.text = "Waiting for Approval..."
+    self.purchaseButton.isPointerInteractionEnabled = false
+  }
+  // "Owned" product
+  else if InAppPurchase.hasActivePurchase(for: "my_product_id") {
+    self.statusLabel.text = "OWNED"
+    self.purchaseButton.isPointerInteractionEnabled = false
+  }
+  else {
+    self.purchaseButton.isPointerInteractionEnabled = true
+  }
+}
+
+ +

When a product is owned or has a deferred purchase, we make sure the purchase button is grayed out. We also use a status label to display some details. Of course, you are free to design your UI as you see fit.

+

Errors

+ +

When calling refresh(), purchase() or restorePurchases(), the callback can return an IAPError if the state is failed. +Here is the list of IAPErrorCode you can receive:

+ +
    +
  • Errors returned by refresh(), purchase() or restorePurchases()

    + +
      +
    • libraryNotInitialized - You must call the initialize fuction before using the library.
    • +
    • bundleIdentifierInvalid - The Bundle Identifier is invalid.
    • +
    • validatorUrlInvalid - The Validator URL String is invalid.
    • +
    • refreshReceiptFailed - Failed to refresh the App Store receipt.
    • +
    • validateReceiptFailed - Failed to validate the App Store receipt with Fovea.
    • +
    • readReceiptFailed - Failed to read the receipt validation.
    • +
  • +
  • Errors returned by refresh()

    + +
      +
    • refreshProductsFailed - Failed to refresh products from the App Store.
    • +
  • +
  • Errors returned by purchase()

    + +
      +
    • productNotFound - The product was not found on the App Store and cannot be purchased.
    • +
    • cannotMakePurchase - The user is not allowed to authorize payments.
    • +
    • alreadyPurchasing - A purchase is already in progress.
    • +
  • +
+

Analytics

+ +

Tracking the purchase flow is a common things in apps. Especially as it’s core to your revenue model.

+ +

We can track 5 events, which step in the purchase pipeline a user reached.

+ +
    +
  1. purchase initiated
  2. +
  3. purchase cancelled
  4. +
  5. purchase failed
  6. +
  7. purchase deferred
  8. +
  9. purchase succeeded
  10. +
+ +

Here’s a quick example showing how to implement this correctly.

+
func makePurchase() {
+  Analytics.trackEvent("purchase initiated")
+  InAppPurchase.purchase(
+    productIdentifier: "my_product_id",
+    callback: { result in
+      switch result.state {
+      case .purchased:
+        // Reminder: We are not processing the purchase here, only updating your UI.
+        //           That's why we do not send an event to analytics.
+      case .failed:
+        Analytics.trackEvent("purchase failed")
+      case .deferred:
+        Analytics.trackEvent("purchase deferred")
+      case .cancelled:
+        Analytics.trackEvent("purchase cancelled")
+    }
+  })
+}
+
+// IAPPurchaseDelegate implementation
+func productPurchased(productIdentifier: String) {
+  Analytics.trackEvent("purchase succeeded")
+  InAppPurchase.finishTransactions(for: productIdentifier)
+}
+
+ +

The important part to remember is that a purchase can occur outside your app (or be approved when the app is not running), that’s why tracking purchase succeeded has to be part of the productPurchased delegate function.

+ +

Refer to the Consumables section to learn more about the productPurchased function.

+

Server integration

+ +

In more advanced use cases, you have a server component. Users are logged in and you’ll like to unlock the content for this user on your server. The safest approach is to setup a Webhook on Fovea. You’ll receive notifications from Fovea that transaction have been processed and/or subscriptions updated.

+ +

The information sent from Fovea has been verified from Apple’s server, which makes it way more trustable than information sent from your app itself.

+ +

To take advantage of this, you have to inform the library of your application username. This applicationUsername can be provided as a parameter of the InAppPurchase.initialize method and updated later by changing the associated property.

+ +

Example:

+
InAppPurchase.initialize(
+  iapProducts: [...],
+  validatorUrlString: "..."),
+  applicationUsername: UserSession.getUserId())
+
+// later ...
+InAppPurchase.applicationUsername = UserSession.getUserId()
+
+ +

If a user account is mandatory in your app, you will want to delay calls to InAppPurchase.initialize() to when your user’s session is ready.

+ +

Do not hesitate to contact Fovea for help.

+

Xcode Demo Project

+ +

Do not hesitate to check the demo project available on here: iap-swift-lib-demo.

+

References

+ + +

Coding

+ +

Generate the documentation, using this fork of swift-doc (on --minimum-access-level is part of the main distrib).

+
swift-doc generate sources --module-name InAppPurchase --format html --output docs --minimum-access-level public --base-url /iap-swift-lib/
+
+

Troubleshooting

+ +

Common issues are covered here: https://github.com/iridescent-dev/iap-swift-lib/wiki/Troubleshooting

+

License

+ +

InAppPurchaseLib is open-sourced library licensed under the MIT License. See LICENSE for details.

+ +
+
+ +
+
+ + + diff --git a/docs/jazzy/js/jazzy.js b/docs/jazzy/js/jazzy.js new file mode 100755 index 0000000..1e55d6e --- /dev/null +++ b/docs/jazzy/js/jazzy.js @@ -0,0 +1,70 @@ +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/docs/jazzy/js/jquery.min.js b/docs/jazzy/js/jquery.min.js new file mode 100644 index 0000000..a1c07fd --- /dev/null +++ b/docs/jazzy/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0Undocumented

"},"Typealiases.html#/s:16InAppPurchaseLib18IAPRefreshCallbacka":{"name":"IAPRefreshCallback","abstract":"

Undocumented

"},"Structs/IAPProduct.html#/s:16InAppPurchaseLib10IAPProductV17productIdentifierSSvp":{"name":"productIdentifier","abstract":"

The identifier of the product.

","parent_name":"IAPProduct"},"Structs/IAPProduct.html#/s:16InAppPurchaseLib10IAPProductV11productTypeAA0eG0Ovp":{"name":"productType","abstract":"

The type of the product.

","parent_name":"IAPProduct"},"Structs/IAPProduct.html#/s:16InAppPurchaseLib10IAPProductV17productIdentifier0F4TypeACSS_AA0eH0Otcfc":{"name":"init(productIdentifier:productType:)","abstract":"

Initializes an IAPProduct with its identifier and type.

","parent_name":"IAPProduct"},"Structs/IAPError.html#/s:16InAppPurchaseLib8IAPErrorV4codeAA0E4CodeOvp":{"name":"code","abstract":"

Undocumented

","parent_name":"IAPError"},"Structs/IAPError.html#/s:16InAppPurchaseLib8IAPErrorV20localizedDescriptionSSvp":{"name":"localizedDescription","abstract":"

Undocumented

","parent_name":"IAPError"},"Structs/IAPRefreshResult.html#/s:16InAppPurchaseLib16IAPRefreshResultV5stateAA0eF5StateOvp":{"name":"state","abstract":"

Undocumented

","parent_name":"IAPRefreshResult"},"Structs/IAPRefreshResult.html#/s:16InAppPurchaseLib16IAPRefreshResultV8iapErrorAA8IAPErrorVSgvp":{"name":"iapError","abstract":"

Undocumented

","parent_name":"IAPRefreshResult"},"Structs/IAPRefreshResult.html#/s:16InAppPurchaseLib16IAPRefreshResultV14addedPurchasesSivp":{"name":"addedPurchases","abstract":"

Undocumented

","parent_name":"IAPRefreshResult"},"Structs/IAPRefreshResult.html#/s:16InAppPurchaseLib16IAPRefreshResultV16updatedPurchasesSivp":{"name":"updatedPurchases","abstract":"

Undocumented

","parent_name":"IAPRefreshResult"},"Structs/IAPPurchaseResult.html#/s:16InAppPurchaseLib17IAPPurchaseResultV5stateAA0eF5StateOvp":{"name":"state","abstract":"

Undocumented

","parent_name":"IAPPurchaseResult"},"Structs/IAPPurchaseResult.html#/s:16InAppPurchaseLib17IAPPurchaseResultV8iapErrorAA8IAPErrorVSgvp":{"name":"iapError","abstract":"

Undocumented

","parent_name":"IAPPurchaseResult"},"Structs/IAPPurchaseResult.html#/s:16InAppPurchaseLib17IAPPurchaseResultV7skErrorSC11SKErrorCodeLeVSgvp":{"name":"skError","abstract":"

Undocumented

","parent_name":"IAPPurchaseResult"},"Structs/IAPPurchaseResult.html#/s:16InAppPurchaseLib17IAPPurchaseResultV20localizedDescriptionSSSgvp":{"name":"localizedDescription","abstract":"

Undocumented

","parent_name":"IAPPurchaseResult"},"Structs/IAPPurchaseResult.html":{"name":"IAPPurchaseResult","abstract":"

Undocumented

"},"Structs/IAPRefreshResult.html":{"name":"IAPRefreshResult","abstract":"

Undocumented

"},"Structs/IAPError.html":{"name":"IAPError","abstract":"

Undocumented

"},"Structs/IAPProduct.html":{"name":"IAPProduct","abstract":"

Undocumented

"},"Protocols/IAPPurchaseDelegate.html#/s:16InAppPurchaseLib19IAPPurchaseDelegateP16productPurchased0G10IdentifierySS_tF":{"name":"productPurchased(productIdentifier:)","abstract":"

Called when a product is newly purchased, updated or restored.

","parent_name":"IAPPurchaseDelegate"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP11iapProductsSayAA10IAPProductVGvpZ":{"name":"iapProducts","abstract":"

The array of IAPProduct.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP18validatorUrlStringSSSgvpZ":{"name":"validatorUrlString","abstract":"

The validator url retrieved from Fovea.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP03iapC8DelegateAA011IAPPurchaseF0_pSgvpZ":{"name":"iapPurchaseDelegate","abstract":"

The instance of class that adopts the IAPPurchaseDelegate protocol.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP19applicationUsernameSSSgvpZ":{"name":"applicationUsername","abstract":"

The user name, if your app implements user login.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP10initialize11iapProducts18validatorUrlString0fC8Delegate19applicationUsernameySayAA10IAPProductVG_SSAA011IAPPurchaseK0_pSSSgtFZ":{"name":"initialize(iapProducts:validatorUrlString:iapPurchaseDelegate:applicationUsername:)","abstract":"

Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP4stopyyFZ":{"name":"stop()","abstract":"

Stop observing the payment queue, when the application will terminate, for proper cleanup.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP7refresh8callbackyyAA16IAPRefreshResultVc_tFZ":{"name":"refresh(callback:)","abstract":"

Refresh Product list and user Receipt.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP11getProductsSaySo9SKProductCGyFZ":{"name":"getProducts()","abstract":"

Gets all products retrieved from the App Store

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP12getProductBy10identifierSo9SKProductCSgSS_tFZ":{"name":"getProductBy(identifier:)","abstract":"

Gets the product by its identifier from the list of products retrieved from the App Store.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP15canMakePaymentsSbyFZ":{"name":"canMakePayments()","abstract":"

Checks if the user is allowed to authorize payments.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP8purchase17productIdentifier8quantity8callbackySS_SiyAA17IAPPurchaseResultVctFZ":{"name":"purchase(productIdentifier:quantity:callback:)","abstract":"

Request a Payment from the App Store.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP16restorePurchases8callbackyyAA16IAPRefreshResultVc_tFZ":{"name":"restorePurchases(callback:)","abstract":"

Restore purchased products.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP18finishTransactions3forySS_tFZ":{"name":"finishTransactions(for:)","abstract":"

Finish all transactions for the product.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP22hasDeferredTransaction3forSbSS_tFZ":{"name":"hasDeferredTransaction(for:)","abstract":"

Checks if the last transaction state for a given product was deferred.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP19hasAlreadyPurchasedSbyFZ":{"name":"hasAlreadyPurchased()","abstract":"

Checks if the user has already purchased at least one product.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP09hasActiveC03forSbSS_tFZ":{"name":"hasActivePurchase(for:)","abstract":"

Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription).

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP21hasActiveSubscriptionSbyFZ":{"name":"hasActiveSubscription()","abstract":"

Checks if the user has an active auto renewable subscription regardless of the product identifier.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP03getC4Date3for10Foundation0F0VSgSS_tFZ":{"name":"getPurchaseDate(for:)","abstract":"

Returns the latest purchased date for a given product.

","parent_name":"InAppPurchaseLib"},"Protocols/InAppPurchaseLib.html#/s:16InAppPurchaseLibAAP13getExpiryDate3for10Foundation0G0VSgSS_tFZ":{"name":"getExpiryDate(for:)","abstract":"

Returns the expiry date for a subcription. May be past or future.

","parent_name":"InAppPurchaseLib"},"Protocols/IAPErrorProtocol.html#/s:16InAppPurchaseLib16IAPErrorProtocolP4codeAA0E4CodeOvp":{"name":"code","abstract":"

Undocumented

","parent_name":"IAPErrorProtocol"},"Protocols/IAPErrorProtocol.html":{"name":"IAPErrorProtocol","abstract":"

Undocumented

"},"Protocols/InAppPurchaseLib.html":{"name":"InAppPurchaseLib","abstract":"

The protocol that InAppPurchase` adopts.

"},"Protocols/IAPPurchaseDelegate.html":{"name":"IAPPurchaseDelegate","abstract":"

The protocol that you must adopt if you have consumable and/or nonRenewingSubscription products.

"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE21localizedPeriodFormatAC09IAPPeriodH0OvpZ":{"name":"localizedPeriodFormat","abstract":"

Undocumented

","parent_name":"SKProduct"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE28hasIntroductoryPriceEligibleSbyF":{"name":"hasIntroductoryPriceEligible()","abstract":"

Checks if the product has an introductory price the user is eligible to.

","parent_name":"SKProduct"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE14localizedPriceSSvp":{"name":"localizedPrice","abstract":"

Returns a localized string with the cost of the product in the local currency.

","parent_name":"SKProduct"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE27localizedSubscriptionPeriodSSSgvp":{"name":"localizedSubscriptionPeriod","abstract":"

Returns a localized string with the period of the subscription product.

","parent_name":"SKProduct"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE26localizedIntroductoryPriceSSSgvp":{"name":"localizedIntroductoryPrice","abstract":"

Returns a localized string with the introductory price if available, in the local currency.

","parent_name":"SKProduct"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE27localizedIntroductoryPeriodSSSgvp":{"name":"localizedIntroductoryPeriod","abstract":"

Returns a localized string with the introductory price period of the subscription product.

","parent_name":"SKProduct"},"Extensions/SKProduct.html#/s:So9SKProductC16InAppPurchaseLibE29localizedIntroductoryDurationSSSgvp":{"name":"localizedIntroductoryDuration","abstract":"

Returns a localized string with the duration of the introductory price.

","parent_name":"SKProduct"},"Extensions/SKProduct.html":{"name":"SKProduct"},"Enums/IAPPeriodFormat.html#/s:16InAppPurchaseLib15IAPPeriodFormatO5shortyA2CmF":{"name":"short","abstract":"

Undocumented

","parent_name":"IAPPeriodFormat"},"Enums/IAPPeriodFormat.html#/s:16InAppPurchaseLib15IAPPeriodFormatO4longyA2CmF":{"name":"long","abstract":"

Undocumented

","parent_name":"IAPPeriodFormat"},"Enums/IAPProductType.html#/s:16InAppPurchaseLib14IAPProductTypeO10consumableyA2CmF":{"name":"consumable","abstract":"

Undocumented

","parent_name":"IAPProductType"},"Enums/IAPProductType.html#/s:16InAppPurchaseLib14IAPProductTypeO13nonConsumableyA2CmF":{"name":"nonConsumable","abstract":"

Undocumented

","parent_name":"IAPProductType"},"Enums/IAPProductType.html#/s:16InAppPurchaseLib14IAPProductTypeO23nonRenewingSubscriptionyA2CmF":{"name":"nonRenewingSubscription","abstract":"

Undocumented

","parent_name":"IAPProductType"},"Enums/IAPProductType.html#/s:16InAppPurchaseLib14IAPProductTypeO25autoRenewableSubscriptionyA2CmF":{"name":"autoRenewableSubscription","abstract":"

Undocumented

","parent_name":"IAPProductType"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO21libraryNotInitializedyA2CmF":{"name":"libraryNotInitialized","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO15productNotFoundyA2CmF":{"name":"productNotFound","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO010cannotMakeC0yA2CmF":{"name":"cannotMakePurchase","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO17alreadyPurchasingyA2CmF":{"name":"alreadyPurchasing","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO23bundleIdentifierInvalidyA2CmF":{"name":"bundleIdentifierInvalid","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO19validatorUrlInvalidyA2CmF":{"name":"validatorUrlInvalid","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO20refreshReceiptFailedyA2CmF":{"name":"refreshReceiptFailed","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO21validateReceiptFailedyA2CmF":{"name":"validateReceiptFailed","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO17readReceiptFailedyA2CmF":{"name":"readReceiptFailed","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPErrorCode.html#/s:16InAppPurchaseLib12IAPErrorCodeO21refreshProductsFailedyA2CmF":{"name":"refreshProductsFailed","abstract":"

Undocumented

","parent_name":"IAPErrorCode"},"Enums/IAPRefreshResultState.html#/s:16InAppPurchaseLib21IAPRefreshResultStateO9succeededyA2CmF":{"name":"succeeded","abstract":"

Undocumented

","parent_name":"IAPRefreshResultState"},"Enums/IAPRefreshResultState.html#/s:16InAppPurchaseLib21IAPRefreshResultStateO6failedyA2CmF":{"name":"failed","abstract":"

Undocumented

","parent_name":"IAPRefreshResultState"},"Enums/IAPRefreshResultState.html#/s:16InAppPurchaseLib21IAPRefreshResultStateO7skippedyA2CmF":{"name":"skipped","abstract":"

Undocumented

","parent_name":"IAPRefreshResultState"},"Enums/IAPPurchaseResultState.html#/s:16InAppPurchaseLib22IAPPurchaseResultStateO9purchasedyA2CmF":{"name":"purchased","abstract":"

Undocumented

","parent_name":"IAPPurchaseResultState"},"Enums/IAPPurchaseResultState.html#/s:16InAppPurchaseLib22IAPPurchaseResultStateO6failedyA2CmF":{"name":"failed","abstract":"

Undocumented

","parent_name":"IAPPurchaseResultState"},"Enums/IAPPurchaseResultState.html#/s:16InAppPurchaseLib22IAPPurchaseResultStateO9cancelledyA2CmF":{"name":"cancelled","abstract":"

Undocumented

","parent_name":"IAPPurchaseResultState"},"Enums/IAPPurchaseResultState.html#/s:16InAppPurchaseLib22IAPPurchaseResultStateO8deferredyA2CmF":{"name":"deferred","abstract":"

Undocumented

","parent_name":"IAPPurchaseResultState"},"Enums/IAPPurchaseResultState.html":{"name":"IAPPurchaseResultState","abstract":"

Undocumented

"},"Enums/IAPRefreshResultState.html":{"name":"IAPRefreshResultState","abstract":"

Undocumented

"},"Enums/IAPErrorCode.html":{"name":"IAPErrorCode","abstract":"

Undocumented

"},"Enums/IAPProductType.html":{"name":"IAPProductType","abstract":"

Undocumented

"},"Enums/IAPPeriodFormat.html":{"name":"IAPPeriodFormat","abstract":"

Undocumented

"},"Classes/DefaultPurchaseDelegate.html#/s:16InAppPurchaseLib07DefaultC8DelegateCACycfc":{"name":"init()","abstract":"

Undocumented

","parent_name":"DefaultPurchaseDelegate"},"Classes/DefaultPurchaseDelegate.html#/s:16InAppPurchaseLib07DefaultC8DelegateC16productPurchased0G10IdentifierySS_tF":{"name":"productPurchased(productIdentifier:)","abstract":"

Finish the product transactions when a product is newly purchased, updated or restored.

","parent_name":"DefaultPurchaseDelegate"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C11iapProductsSayAA10IAPProductVGvpZ":{"name":"iapProducts","abstract":"

The array of IAPProduct.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C18validatorUrlStringSSSgvpZ":{"name":"validatorUrlString","abstract":"

The validator url retrieved from Fovea.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C03iapC8DelegateAA011IAPPurchaseF0_pSgvpZ":{"name":"iapPurchaseDelegate","abstract":"

The instance of class that adopts the IAPPurchaseDelegate protocol.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C19applicationUsernameSSSgvpZ":{"name":"applicationUsername","abstract":"

The user name, if your app implements user login.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C10initialize11iapProducts18validatorUrlString0fC8Delegate19applicationUsernameySayAA10IAPProductVG_SSAA011IAPPurchaseK0_pSSSgtFZ":{"name":"initialize(iapProducts:validatorUrlString:iapPurchaseDelegate:applicationUsername:)","abstract":"

Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C4stopyyFZ":{"name":"stop()","abstract":"

Stop observing the payment queue, when the application will terminate, for proper cleanup.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C7refresh8callbackyyAA16IAPRefreshResultVc_tFZ":{"name":"refresh(callback:)","abstract":"

Refresh Product list and user Receipt.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C11getProductsSaySo9SKProductCGyFZ":{"name":"getProducts()","abstract":"

Gets all products retrieved from the App Store

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C12getProductBy10identifierSo9SKProductCSgSS_tFZ":{"name":"getProductBy(identifier:)","abstract":"

Gets the product by its identifier from the list of products retrieved from the App Store.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C15canMakePaymentsSbyFZ":{"name":"canMakePayments()","abstract":"

Checks if the user is allowed to authorize payments.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C8purchase17productIdentifier8quantity8callbackySS_SiyAA17IAPPurchaseResultVctFZ":{"name":"purchase(productIdentifier:quantity:callback:)","abstract":"

Request a Payment from the App Store.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C16restorePurchases8callbackyyAA16IAPRefreshResultVc_tFZ":{"name":"restorePurchases(callback:)","abstract":"

Restore purchased products.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C18finishTransactions3forySS_tFZ":{"name":"finishTransactions(for:)","abstract":"

Finish all transactions for the product.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C22hasDeferredTransaction3forSbSS_tFZ":{"name":"hasDeferredTransaction(for:)","abstract":"

Checks if the last transaction state for a given product was deferred.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C19hasAlreadyPurchasedSbyFZ":{"name":"hasAlreadyPurchased()","abstract":"

Checks if the user has already purchased at least one product.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C09hasActiveC03forSbSS_tFZ":{"name":"hasActivePurchase(for:)","abstract":"

Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription).

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C21hasActiveSubscriptionSbyFZ":{"name":"hasActiveSubscription()","abstract":"

Checks if the user has an active auto renewable subscription regardless of the product identifier.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C03getC4Date3for10Foundation0F0VSgSS_tFZ":{"name":"getPurchaseDate(for:)","abstract":"

Returns the latest purchased date for a given product.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html#/s:16InAppPurchaseLib0abC0C13getExpiryDate3for10Foundation0G0VSgSS_tFZ":{"name":"getExpiryDate(for:)","abstract":"

Returns the expiry date for a subcription. May be past or future.

","parent_name":"InAppPurchase"},"Classes/InAppPurchase.html":{"name":"InAppPurchase","abstract":"

Undocumented

"},"Classes/DefaultPurchaseDelegate.html":{"name":"DefaultPurchaseDelegate","abstract":"

The default implementation of IAPPurchaseDelegate if no other is provided.

"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

"},"Enums.html":{"name":"Enumerations","abstract":"

The following enumerations are available globally.

"},"Extensions.html":{"name":"Extensions","abstract":"

The following extensions are available globally.

"},"Protocols.html":{"name":"Protocols","abstract":"

The following protocols are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"},"Typealiases.html":{"name":"Type Aliases","abstract":"

The following type aliases are available globally.

"}} \ No newline at end of file diff --git a/docs/jazzy/undocumented.json b/docs/jazzy/undocumented.json new file mode 100644 index 0000000..e44d55a --- /dev/null +++ b/docs/jazzy/undocumented.json @@ -0,0 +1,348 @@ +{ + "warnings": [ + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 12, + "symbol": "IAPPurchaseCallback", + "symbol_kind": "source.lang.swift.decl.typealias", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 13, + "symbol": "IAPPurchaseResult", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 14, + "symbol": "IAPPurchaseResult.state", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 15, + "symbol": "IAPPurchaseResult.iapError", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 16, + "symbol": "IAPPurchaseResult.skError", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 18, + "symbol": "IAPPurchaseResult.localizedDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 25, + "symbol": "IAPPurchaseResultState", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 26, + "symbol": "IAPPurchaseResultState.purchased", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 27, + "symbol": "IAPPurchaseResultState.failed", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 28, + "symbol": "IAPPurchaseResultState.cancelled", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 29, + "symbol": "IAPPurchaseResultState.deferred", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 33, + "symbol": "IAPRefreshCallback", + "symbol_kind": "source.lang.swift.decl.typealias", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 34, + "symbol": "IAPRefreshResult", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 35, + "symbol": "IAPRefreshResult.state", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 36, + "symbol": "IAPRefreshResult.iapError", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 37, + "symbol": "IAPRefreshResult.addedPurchases", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 38, + "symbol": "IAPRefreshResult.updatedPurchases", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 41, + "symbol": "IAPRefreshResultState", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 42, + "symbol": "IAPRefreshResultState.succeeded", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 43, + "symbol": "IAPRefreshResultState.failed", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPCallback.swift", + "line": 44, + "symbol": "IAPRefreshResultState.skipped", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 11, + "symbol": "IAPErrorProtocol", + "symbol_kind": "source.lang.swift.decl.protocol", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 12, + "symbol": "IAPErrorProtocol.code", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 15, + "symbol": "IAPErrorCode", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 16, + "symbol": "IAPErrorCode.libraryNotInitialized", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 17, + "symbol": "IAPErrorCode.productNotFound", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 18, + "symbol": "IAPErrorCode.cannotMakePurchase", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 19, + "symbol": "IAPErrorCode.alreadyPurchasing", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 21, + "symbol": "IAPErrorCode.bundleIdentifierInvalid", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 22, + "symbol": "IAPErrorCode.validatorUrlInvalid", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 23, + "symbol": "IAPErrorCode.refreshReceiptFailed", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 24, + "symbol": "IAPErrorCode.validateReceiptFailed", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 25, + "symbol": "IAPErrorCode.readReceiptFailed", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 27, + "symbol": "IAPErrorCode.refreshProductsFailed", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 30, + "symbol": "IAPError", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 31, + "symbol": "IAPError.code", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Common/IAPError.swift", + "line": 32, + "symbol": "IAPError.localizedDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/InAppPurchase.swift", + "line": 12, + "symbol": "InAppPurchase", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/InAppPurchaseLib.swift", + "line": 132, + "symbol": "DefaultPurchaseDelegate.init()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Product/IAPProduct.swift", + "line": 11, + "symbol": "IAPProduct", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Product/IAPProduct.swift", + "line": 31, + "symbol": "IAPProductType", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Product/IAPProduct.swift", + "line": 32, + "symbol": "IAPProductType.consumable", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Product/IAPProduct.swift", + "line": 33, + "symbol": "IAPProductType.nonConsumable", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Product/IAPProduct.swift", + "line": 34, + "symbol": "IAPProductType.nonRenewingSubscription", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Product/IAPProduct.swift", + "line": 35, + "symbol": "IAPProductType.autoRenewableSubscription", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Product/SKProductExtension.swift", + "line": 12, + "symbol": "IAPPeriodFormat", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Product/SKProductExtension.swift", + "line": 13, + "symbol": "IAPPeriodFormat.short", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Product/SKProductExtension.swift", + "line": 14, + "symbol": "IAPPeriodFormat.long", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/veronique/Documents/iap-swift-lib/Sources/InAppPurchaseLib/Product/SKProductExtension.swift", + "line": 20, + "symbol": "SKProduct.localizedPeriodFormat", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + } + ], + "source_directory": "/Users/veronique/Documents/iap-swift-lib" +} \ No newline at end of file diff --git a/docs/DefaultPurchaseDelegate/index.html b/docs/swift-doc/DefaultPurchaseDelegate/index.html similarity index 67% rename from docs/DefaultPurchaseDelegate/index.html rename to docs/swift-doc/DefaultPurchaseDelegate/index.html index ded1307..60ef6bd 100755 --- a/docs/DefaultPurchaseDelegate/index.html +++ b/docs/swift-doc/DefaultPurchaseDelegate/index.html @@ -4,12 +4,12 @@ InAppPurchase - DefaultPurchaseDelegate - +
- + InAppPurchase @@ -39,40 +39,46 @@

public class DefaultPurchaseDelegate: IAPPurchaseDelegate
+
+

The default implementation of IAPPurchaseDelegate if no other is provided.

+ +
- - + -%3 -DefaultPurchaseDelegate + +DefaultPurchaseDelegate -DefaultPurchaseDelegate +DefaultPurchaseDelegate -IAPPurchaseDelegate + +IAPPurchaseDelegate - -IAPPurchaseDelegate + +IAPPurchaseDelegate -DefaultPurchaseDelegate->IAPPurchaseDelegate - - + +DefaultPurchaseDelegate->IAPPurchaseDelegate + + @@ -83,7 +89,8 @@

Conforms To

IAPPurchaseDelegate
-
+

The protocol that you must adopt if you have consumable and/or nonRenewingSubscription products.

+
@@ -93,7 +100,7 @@

Initializers

init()

-
public required init()
+
public init()
@@ -104,6 +111,29 @@

product​Purchased(product​Identifier:​)

public func productPurchased(productIdentifier: String)
+
+

Finish the product transactions when a product is newly purchased, updated or restored.

+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product.

+
@@ -114,7 +144,7 @@

- Generated on using swift-doc. + Generated on using swift-doc.

diff --git a/docs/IAPError/index.html b/docs/swift-doc/IAPError/index.html similarity index 77% rename from docs/IAPError/index.html rename to docs/swift-doc/IAPError/index.html index eba534a..948cd13 100755 --- a/docs/IAPError/index.html +++ b/docs/swift-doc/IAPError/index.html @@ -4,12 +4,12 @@ InAppPurchase - IAPError - +
- + InAppPurchase @@ -45,34 +45,36 @@ - - + -%3 -IAPError + +IAPError -IAPError +IAPError -IAPErrorProtocol + +IAPErrorProtocol - -IAPErrorProtocol + +IAPErrorProtocol -IAPError->IAPErrorProtocol - - + +IAPError->IAPErrorProtocol + + @@ -110,7 +112,7 @@

diff --git a/docs/IAPErrorCode/index.html b/docs/swift-doc/IAPErrorCode/index.html similarity index 95% rename from docs/IAPErrorCode/index.html rename to docs/swift-doc/IAPErrorCode/index.html index 1678f88..aa4e9ad 100755 --- a/docs/IAPErrorCode/index.html +++ b/docs/swift-doc/IAPErrorCode/index.html @@ -4,12 +4,12 @@ InAppPurchase - IAPErrorCode - +
- + InAppPurchase @@ -112,7 +112,7 @@

diff --git a/docs/IAPErrorProtocol/index.html b/docs/swift-doc/IAPErrorProtocol/index.html similarity index 70% rename from docs/IAPErrorProtocol/index.html rename to docs/swift-doc/IAPErrorProtocol/index.html index 570387a..b4490ac 100755 --- a/docs/IAPErrorProtocol/index.html +++ b/docs/swift-doc/IAPErrorProtocol/index.html @@ -4,12 +4,12 @@ InAppPurchase - IAPErrorProtocol - +
- + InAppPurchase @@ -45,44 +45,48 @@ - - + -%3 -IAPErrorProtocol + +IAPErrorProtocol -IAPErrorProtocol +IAPErrorProtocol -LocalizedError - -LocalizedError + +LocalizedError + +LocalizedError -IAPErrorProtocol->LocalizedError - - + +IAPErrorProtocol->LocalizedError + + -IAPError - + +IAPError + -IAPError +IAPError -IAPError->IAPErrorProtocol - - + +IAPError->IAPErrorProtocol + + @@ -118,7 +122,7 @@

diff --git a/docs/IAPPeriodFormat/index.html b/docs/swift-doc/IAPPeriodFormat/index.html similarity index 88% rename from docs/IAPPeriodFormat/index.html rename to docs/swift-doc/IAPPeriodFormat/index.html index 2f52867..551b536 100755 --- a/docs/IAPPeriodFormat/index.html +++ b/docs/swift-doc/IAPPeriodFormat/index.html @@ -4,12 +4,12 @@ InAppPurchase - IAPPeriodFormat - +
- + InAppPurchase @@ -64,7 +64,7 @@

diff --git a/docs/IAPProduct/index.html b/docs/swift-doc/IAPProduct/index.html similarity index 68% rename from docs/IAPProduct/index.html rename to docs/swift-doc/IAPProduct/index.html index 791b2e4..db7e392 100755 --- a/docs/IAPProduct/index.html +++ b/docs/swift-doc/IAPProduct/index.html @@ -4,12 +4,12 @@ InAppPurchase - IAPProduct - +
- + InAppPurchase @@ -48,6 +48,41 @@

init(product​Identifier:​product​Type:​)

public init(productIdentifier: String, productType: IAPProductType)
+
+

Initializes an IAPProduct with its identifier and type.

+ +
+
+ + +
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product.

+
product​TypeIAPProduct​Type

The type of the product.

+
@@ -58,12 +93,26 @@

product​Identifier

var productIdentifier: String
+
+

The identifier of the product.

+ +

product​Type

var productType: IAPProductType
+
+

The type of the product.

+ +
+
+ + +
@@ -74,7 +123,7 @@

- Generated on using swift-doc. + Generated on using swift-doc.

diff --git a/docs/IAPProductType/index.html b/docs/swift-doc/IAPProductType/index.html similarity index 92% rename from docs/IAPProductType/index.html rename to docs/swift-doc/IAPProductType/index.html index 52610f7..3f641db 100755 --- a/docs/IAPProductType/index.html +++ b/docs/swift-doc/IAPProductType/index.html @@ -4,12 +4,12 @@ InAppPurchase - IAPProductType - +
- + InAppPurchase @@ -76,7 +76,7 @@

diff --git a/docs/IAPPurchaseCallback/index.html b/docs/swift-doc/IAPPurchaseCallback/index.html similarity index 83% rename from docs/IAPPurchaseCallback/index.html rename to docs/swift-doc/IAPPurchaseCallback/index.html index 46785ba..7b663d9 100755 --- a/docs/IAPPurchaseCallback/index.html +++ b/docs/swift-doc/IAPPurchaseCallback/index.html @@ -4,12 +4,12 @@ InAppPurchase - IAPPurchaseCallback - +
- + InAppPurchase @@ -44,7 +44,7 @@

diff --git a/docs/IAPPurchaseDelegate/index.html b/docs/swift-doc/IAPPurchaseDelegate/index.html similarity index 61% rename from docs/IAPPurchaseDelegate/index.html rename to docs/swift-doc/IAPPurchaseDelegate/index.html index 6d14f18..58bda97 100755 --- a/docs/IAPPurchaseDelegate/index.html +++ b/docs/swift-doc/IAPPurchaseDelegate/index.html @@ -4,12 +4,12 @@ InAppPurchase - IAPPurchaseDelegate - +
- + InAppPurchase @@ -39,40 +39,46 @@

public protocol IAPPurchaseDelegate
+
+

The protocol that you must adopt if you have consumable and/or nonRenewingSubscription products.

+ +
- - + -%3 -IAPPurchaseDelegate + +IAPPurchaseDelegate - -IAPPurchaseDelegate + +IAPPurchaseDelegate -DefaultPurchaseDelegate + +DefaultPurchaseDelegate -DefaultPurchaseDelegate +DefaultPurchaseDelegate -DefaultPurchaseDelegate->IAPPurchaseDelegate - - + +DefaultPurchaseDelegate->IAPPurchaseDelegate + + @@ -83,7 +89,8 @@

Types Conforming to IAPPurchase​Delegate

DefaultPurchaseDelegate
-
+

The default implementation of IAPPurchaseDelegate if no other is provided.

+
@@ -96,7 +103,36 @@

Requirements

product​Purchased(product​Identifier:​)

-
func productPurchased(productIdentifier: String)
+
func productPurchased(productIdentifier: String) -> Void
+
+

Called when a product is newly purchased, updated or restored.

+ +
+
+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product.

+
@@ -104,7 +140,7 @@

- Generated on using swift-doc. + Generated on using swift-doc.

diff --git a/docs/IAPPurchaseResult/index.html b/docs/swift-doc/IAPPurchaseResult/index.html similarity index 76% rename from docs/IAPPurchaseResult/index.html rename to docs/swift-doc/IAPPurchaseResult/index.html index deac7d2..19f0064 100755 --- a/docs/IAPPurchaseResult/index.html +++ b/docs/swift-doc/IAPPurchaseResult/index.html @@ -4,12 +4,12 @@ InAppPurchase - IAPPurchaseResult - +
- + InAppPurchase @@ -27,7 +27,7 @@ @@ -60,6 +60,12 @@

sk​Error

var skError: SKError?
+ +
+

+ localized​Description +

+
var localizedDescription: String?
@@ -70,7 +76,7 @@

- Generated on using swift-doc. + Generated on using swift-doc.

diff --git a/docs/IAPPurchaseResultState/index.html b/docs/swift-doc/IAPPurchaseResultState/index.html similarity index 91% rename from docs/IAPPurchaseResultState/index.html rename to docs/swift-doc/IAPPurchaseResultState/index.html index 9a235a7..9722438 100755 --- a/docs/IAPPurchaseResultState/index.html +++ b/docs/swift-doc/IAPPurchaseResultState/index.html @@ -4,12 +4,12 @@ InAppPurchase - IAPPurchaseResultState - +
- + InAppPurchase @@ -76,7 +76,7 @@

diff --git a/docs/IAPRefreshCallback/index.html b/docs/swift-doc/IAPRefreshCallback/index.html similarity index 83% rename from docs/IAPRefreshCallback/index.html rename to docs/swift-doc/IAPRefreshCallback/index.html index dbca3a3..5184db2 100755 --- a/docs/IAPRefreshCallback/index.html +++ b/docs/swift-doc/IAPRefreshCallback/index.html @@ -4,12 +4,12 @@ InAppPurchase - IAPRefreshCallback - +
- + InAppPurchase @@ -44,7 +44,7 @@

diff --git a/docs/IAPRefreshResult/index.html b/docs/swift-doc/IAPRefreshResult/index.html similarity index 92% rename from docs/IAPRefreshResult/index.html rename to docs/swift-doc/IAPRefreshResult/index.html index ea4c742..7d40928 100755 --- a/docs/IAPRefreshResult/index.html +++ b/docs/swift-doc/IAPRefreshResult/index.html @@ -4,12 +4,12 @@ InAppPurchase - IAPRefreshResult - +
- + InAppPurchase @@ -76,7 +76,7 @@

diff --git a/docs/IAPRefreshResultState/index.html b/docs/swift-doc/IAPRefreshResultState/index.html similarity index 90% rename from docs/IAPRefreshResultState/index.html rename to docs/swift-doc/IAPRefreshResultState/index.html index e0c657e..34365cd 100755 --- a/docs/IAPRefreshResultState/index.html +++ b/docs/swift-doc/IAPRefreshResultState/index.html @@ -4,12 +4,12 @@ InAppPurchase - IAPRefreshResultState - +
- + InAppPurchase @@ -70,7 +70,7 @@

diff --git a/docs/InAppPurchase/index.html b/docs/swift-doc/InAppPurchase/index.html similarity index 54% rename from docs/InAppPurchase/index.html rename to docs/swift-doc/InAppPurchase/index.html index a768e04..559e980 100755 --- a/docs/InAppPurchase/index.html +++ b/docs/swift-doc/InAppPurchase/index.html @@ -4,12 +4,12 @@ InAppPurchase - InAppPurchase - +
- + InAppPurchase @@ -27,7 +27,7 @@ @@ -45,44 +45,48 @@ - - + -%3 -InAppPurchase + +InAppPurchase -InAppPurchase +InAppPurchase -NSObject - -NSObject + +NSObject + +NSObject -InAppPurchase->NSObject - - + +InAppPurchase->NSObject + + -InAppPurchaseLib + +InAppPurchaseLib - -InAppPurchaseLib + +InAppPurchaseLib -InAppPurchase->InAppPurchaseLib - - + +InAppPurchase->InAppPurchaseLib + + @@ -93,7 +97,8 @@

Conforms To

InAppPurchaseLib
-
+

The protocol that `InAppPurchase`` adopts.

+
NSObject
@@ -105,118 +110,471 @@

iap​Products

var iapProducts: Array<IAPProduct>
+
+

The array of IAPProduct.

+
-
-

- iap​Purchase​Delegate -

-
var iapPurchaseDelegate: IAPPurchaseDelegate?

validator​Url​String

var validatorUrlString: String?
+
+

The validator url retrieved from Fovea.

+ +
+
+
+

+ iap​Purchase​Delegate +

+
var iapPurchaseDelegate: IAPPurchaseDelegate?
+
+

The instance of class that adopts the IAPPurchaseDelegate protocol.

+ +

application​Username

var applicationUsername: String?
+
+

The user name, if your app implements user login.

+ +

Methods

-
+

- initialize(iap​Products:​iap​Purchase​Delegate:​validator​Url​String:​application​Username:​) + initialize(iap​Products:​validator​Url​String:​iap​Purchase​Delegate:​application​Username:​)

-
public static func initialize(iapProducts: Array<IAPProduct>, iapPurchaseDelegate: IAPPurchaseDelegate, validatorUrlString: String, applicationUsername: String?)
+
public static func initialize(iapProducts: Array<IAPProduct>, validatorUrlString: String, iapPurchaseDelegate: IAPPurchaseDelegate, applicationUsername: String?)
+
+

Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt.

+ +
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
iap​ProductsArray<IAPProduct>

An array of IAPProduct.

+
validator​Url​StringString

The validator url retrieved from Fovea.

+
iap​Purchase​DelegateIAPPurchase​Delegate

An instance of class that adopts the IAPPurchaseDelegate protocol (default value = DefaultPurchaseDelegate).

+
application​UsernameString?

The user name, if your app implements user login.

+

stop()

public static func stop()
+
+

Stop observing the payment queue, when the application will terminate, for proper cleanup.

+ +

refresh(callback:​)

public static func refresh(callback: @escaping IAPRefreshCallback)
+
+

Refresh Product list and user Receipt.

+ +
+
+ + +
+

Parameters

+ + + + + + + + + + + + + + + + +
callback@escaping IAPRefresh​Callback

The function that will be called after processing.

+

get​Products()

public static func getProducts() -> Array<SKProduct>
+
+

Gets all products retrieved from the App Store

+ +
+
+
    +
  • See also: SKProduct.
  • +
+ +
+

Returns

+

An array of products.

+

get​Product​By(identifier:​)

public static func getProductBy(identifier: String) -> SKProduct?
+
+

Gets the product by its identifier from the list of products retrieved from the App Store.

+ +
+
+
    +
  • See also: SKProduct.
  • +
+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
identifierString

The identifier of the product.

+
+

Returns

+

The product if it was retrieved from the App Store.

+ +
+
+

+ can​Make​Payments() +

+
public static func canMakePayments() -> Bool
+
+

Checks if the user is allowed to authorize payments.

+ +
+

Returns

+

A boolean indicates if the user is allowed.

+

purchase(product​Identifier:​quantity:​callback:​)

public static func purchase(productIdentifier: String, quantity: Int, callback: @escaping IAPPurchaseCallback)
+
+

Request a Payment from the App Store.

+ +
+
+ + +
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product to purchase.

+
quantityInt

The quantity to purchase (default value = 1).

+
callback@escaping IAPPurchase​Callback

The function that will be called after processing.

+

restore​Purchases(callback:​)

public static func restorePurchases(callback: @escaping IAPRefreshCallback)
+
+

Restore purchased products.

+
-
-

- can​Make​Payments() -

-
public static func canMakePayments() -> Bool
+
+ + +
+

Parameters

+ + + + + + + + + + + + + + + + +
callback@escaping IAPRefresh​Callback

The function that will be called after processing.

+

finish​Transactions(for:​)

public static func finishTransactions(for productIdentifier: String)
+
+

Finish all transactions for the product.

+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product.

+

has​Deferred​Transaction(for:​)

public static func hasDeferredTransaction(for productIdentifier: String) -> Bool
+
+

Checks if the last transaction state for a given product was deferred.

+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product.

+
+

Returns

+

A boolean indicates if the last transaction state was deferred.

+

has​Already​Purchased()

public static func hasAlreadyPurchased() -> Bool
+
+

Checks if the user has already purchased at least one product.

+ +
+

Returns

+

A boolean indicates if the .

+

has​Active​Purchase(for:​)

public static func hasActivePurchase(for productIdentifier: String) -> Bool
+
+

Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription).

+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product.

+
+

Returns

+

A boolean indicates if the user currently own (or is subscribed to) a given product.

+

has​Active​Subscription()

public static func hasActiveSubscription() -> Bool
+
+

Checks if the user has an active auto renewable subscription regardless of the product identifier.

+ +
+

Returns

+

A boolean indicates if the user has an active auto renewable subscription.

+

get​Purchase​Date(for:​)

public static func getPurchaseDate(for productIdentifier: String) -> Date?
+
+

Returns the latest purchased date for a given product.

+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product.

+
+

Returns

+

The latest purchase Date if set or nil.

+

get​Expiry​Date(for:​)

public static func getExpiryDate(for productIdentifier: String) -> Date?
+
+

Returns the expiry date for a subcription. May be past or future.

+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product.

+
+

Returns

+

The expiry Date is set or nil.

+
@@ -227,7 +585,7 @@

- Generated on using swift-doc. + Generated on using swift-doc.

diff --git a/docs/InAppPurchaseLib/index.html b/docs/swift-doc/InAppPurchaseLib/index.html similarity index 53% rename from docs/InAppPurchaseLib/index.html rename to docs/swift-doc/InAppPurchaseLib/index.html index 439a315..5f0d7ed 100755 --- a/docs/InAppPurchaseLib/index.html +++ b/docs/swift-doc/InAppPurchaseLib/index.html @@ -4,12 +4,12 @@ InAppPurchase - InAppPurchaseLib - +
- + InAppPurchase @@ -27,7 +27,7 @@ @@ -39,40 +39,46 @@

public protocol InAppPurchaseLib
+
+

The protocol that `InAppPurchase`` adopts.

+ +
- - + -%3 -InAppPurchaseLib + +InAppPurchaseLib - -InAppPurchaseLib + +InAppPurchaseLib -InAppPurchase + +InAppPurchase -InAppPurchase +InAppPurchase -InAppPurchase->InAppPurchaseLib - - + +InAppPurchase->InAppPurchaseLib + + @@ -97,114 +103,467 @@

iap​Products

var iapProducts: Array<IAPProduct>
+
+

The array of IAPProduct.

+
-
-

- iap​Purchase​Delegate -

-
var iapPurchaseDelegate: IAPPurchaseDelegate?

validator​Url​String

var validatorUrlString: String?
+
+

The validator url retrieved from Fovea.

+ +
+
+
+

+ iap​Purchase​Delegate +

+
var iapPurchaseDelegate: IAPPurchaseDelegate?
+
+

The instance of class that adopts the IAPPurchaseDelegate protocol.

+ +

application​Username

var applicationUsername: String?
+
+

The user name, if your app implements user login.

+
-
+
+

- initialize(iap​Products:​iap​Purchase​Delegate:​validator​Url​String:​application​Username:​) + initialize(iap​Products:​validator​Url​String:​iap​Purchase​Delegate:​application​Username:​)

-
static func initialize(iapProducts: Array<IAPProduct>, iapPurchaseDelegate: IAPPurchaseDelegate, validatorUrlString: String, applicationUsername: String?)
+
static func initialize(iapProducts: Array<IAPProduct>, validatorUrlString: String, iapPurchaseDelegate: IAPPurchaseDelegate, applicationUsername: String?) -> Void
+
+

Start observing the payment queue, as soon as possible, and refresh Product list and user Receipt.

+ +
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
iap​ProductsArray<IAPProduct>

An array of IAPProduct.

+
validator​Url​StringString

The validator url retrieved from Fovea.

+
iap​Purchase​DelegateIAPPurchase​Delegate

An instance of class that adopts the IAPPurchaseDelegate protocol (default value = DefaultPurchaseDelegate).

+
application​UsernameString?

The user name, if your app implements user login.

+

stop()

-
static func stop()
+
static func stop() -> Void
+
+

Stop observing the payment queue, when the application will terminate, for proper cleanup.

+ +

refresh(callback:​)

-
static func refresh(callback: @escaping IAPRefreshCallback)
+
static func refresh(callback: @escaping IAPRefreshCallback) -> Void
+
+

Refresh Product list and user Receipt.

+ +
+
+ + +
+

Parameters

+ + + + + + + + + + + + + + + + +
callback@escaping IAPRefresh​Callback

The function that will be called after processing.

+

get​Products()

static func getProducts() -> Array<SKProduct>
+
+

Gets all products retrieved from the App Store

+ +
+
+
    +
  • See also: SKProduct.
  • +
+ +
+

Returns

+

An array of products.

+

get​Product​By(identifier:​)

static func getProductBy(identifier: String) -> SKProduct?
+
+

Gets the product by its identifier from the list of products retrieved from the App Store.

+ +
+
+
    +
  • See also: SKProduct.
  • +
+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
identifierString

The identifier of the product.

+
+

Returns

+

The product if it was retrieved from the App Store.

+

can​Make​Payments()

static func canMakePayments() -> Bool
+
+

Checks if the user is allowed to authorize payments.

+ +
+

Returns

+

A boolean indicates if the user is allowed.

+

purchase(product​Identifier:​quantity:​callback:​)

-
static func purchase(productIdentifier: String, quantity: Int, callback: @escaping IAPPurchaseCallback)
+
static func purchase(productIdentifier: String, quantity: Int, callback: @escaping IAPPurchaseCallback) -> Void
+
+

Request a Payment from the App Store.

+ +
+
+ + +
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product to purchase.

+
quantityInt

The quantity to purchase (default value = 1).

+
callback@escaping IAPPurchase​Callback

The function that will be called after processing.

+

restore​Purchases(callback:​)

-
static func restorePurchases(callback: @escaping IAPRefreshCallback)
+
static func restorePurchases(callback: @escaping IAPRefreshCallback) -> Void
+
+

Restore purchased products.

+ +
+
+ + +
+

Parameters

+ + + + + + + + + + + + + + + + +
callback@escaping IAPRefresh​Callback

The function that will be called after processing.

+

finish​Transactions(for:​)

-
static func finishTransactions(for productIdentifier: String)
+
static func finishTransactions(for productIdentifier: String) -> Void
+
+

Finish all transactions for the product.

+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product.

+

has​Deferred​Transaction(for:​)

static func hasDeferredTransaction(for productIdentifier: String) -> Bool
+
+

Checks if the last transaction state for a given product was deferred.

+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product.

+
+

Returns

+

A boolean indicates if the last transaction state was deferred.

+

has​Already​Purchased()

static func hasAlreadyPurchased() -> Bool
+
+

Checks if the user has already purchased at least one product.

+ +
+

Returns

+

A boolean indicates if the .

+

has​Active​Purchase(for:​)

static func hasActivePurchase(for productIdentifier: String) -> Bool
+
+

Checks if the user currently own (or is subscribed to) a given product (nonConsumable or autoRenewableSubscription).

+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product.

+
+

Returns

+

A boolean indicates if the user currently own (or is subscribed to) a given product.

+

has​Active​Subscription()

static func hasActiveSubscription() -> Bool
+
+

Checks if the user has an active auto renewable subscription regardless of the product identifier.

+ +
+

Returns

+

A boolean indicates if the user has an active auto renewable subscription.

+

get​Purchase​Date(for:​)

static func getPurchaseDate(for productIdentifier: String) -> Date?
+
+

Returns the latest purchased date for a given product.

+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product.

+
+

Returns

+

The latest purchase Date if set or nil.

+

get​Expiry​Date(for:​)

static func getExpiryDate(for productIdentifier: String) -> Date?
+
+

Returns the expiry date for a subcription. May be past or future.

+ +
+

Parameters

+ + + + + + + + + + + + + + + + +
product​IdentifierString

The identifier of the product.

+
+

Returns

+

The expiry Date is set or nil.

+
@@ -212,7 +571,7 @@

- Generated on using swift-doc. + Generated on using swift-doc.

diff --git a/docs/all.css b/docs/swift-doc/all.css similarity index 100% rename from docs/all.css rename to docs/swift-doc/all.css diff --git a/docs/index.html b/docs/swift-doc/index.html similarity index 88% rename from docs/index.html rename to docs/swift-doc/index.html index e1e1b7d..666ea3b 100755 --- a/docs/index.html +++ b/docs/swift-doc/index.html @@ -4,12 +4,12 @@ InAppPurchase - InAppPurchase - +
- + InAppPurchase @@ -50,7 +50,8 @@

Classes

- +

The default implementation of IAPPurchaseDelegate if no other is provided.

+
@@ -153,7 +154,8 @@

Protocols

- +

The protocol that `InAppPurchase`` adopts.

+
@@ -161,7 +163,8 @@

Protocols

- +

The protocol that you must adopt if you have consumable and/or nonRenewingSubscription products.

+
@@ -194,7 +197,7 @@

Typealiases