Mercato
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
- iOS 15.0 / OSX 12.0 / watchOS 8.0
- Swift 5.5
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
- Apple - Meet StoreKit 2
- Apple - In-App Purchase
- WWDC by Sundell - Working With In-App Purchases in StoreKit 2
License
Mercato is released under an MIT license. See LICENSE for more information.