tikhop / Mercato

Lightweight StoreKit 2 Wrapper
MIT License
68 stars 13 forks source link
in-app-purchase in-app-receipt ios macos storekit storekit2

Mercato

License Platform Language

Mercato is a lightweight In-App Purchases (StoreKit 2) library for iOS, tvOS, watchOS, macOS, and Mac Catalyst.

Installation

Swift Package Manager

To integrate using Apple's Swift package manager, add the following as a dependency to your Package.swift:

.package(url: "https://github.com/tikhop/Mercato.git", .upToNextMajor(from: "0.0.1"))

Then, specify "Mercato" as a dependency of the Target in which you wish to use Mercato.

Lastly, run the following command:

swift package update

CocoaPods

In progress...

Then, run the following command:

$ pod install

In any swift file you'd like to use Mercato, import the framework with import Mercato.

Requirements

Usage

Listen for transaction updates

Start transaction update listener as soon as your app launches so you don't miss a single transaction. This is important, for example, to handle transactions that may have occured after purchase returns, like an adult approving a child's purchase request or a purchase made on another device.

If your app has unfinished transactions, you receive them immediately after the app launches

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
{
    Mercato.listenForTransactions(finishAutomatically: false) { transaction in
        //Deliver content to the user.

        //Finish transaction
        await transaction.finish()
    }

    return true
}

Fetching products

do
{
    let productIds: Set<String> = ["com.test.product.1", "com.test.product.2", "com.test.product.3"]
    let products = try await Mercato.retrieveProducts(productIds: productIds)

    //Show products to the user
}catch{
    //Handle errors
}

Purchase a product

try await Mercato.purchase(product: product, quantity: 1, finishAutomatically: false, appAccountToken: nil, simulatesAskToBuyInSandbox: false)

Offering in-app refunds

try await Mercato.beginRefundProcess(for: product, in: windowScene)

Restore completed transactions

In general users won't need to restore completed transactions when your app is reinstalled or downloaded on a new device. Everything should automatically be fetched by StoreKit and stay up to date. In the rare case that a user thinks they should have a transaction but you don't see it, you have to provide UI in your app that allows users to initiate the sync. It should be very rare that a user needs to initiate a sync manually. Automatic synchronization should cover the majority of cases.

try await Mercato.restorePurchases()

Essential Reading

License

Mercato is released under an MIT license. See LICENSE for more information.