iOS

Swift Package MealioSDK. iOS 15+, async/await, no dependencies, optional SwiftUI sheet.

Install

In Xcode: File, Add Package Dependencies, then the Mealio SDK repository URL. Or in Package.swift:

Package.swift
.package(url: "https://github.com/mealio/mealio-sdk", from: "0.1.0")
// target dependency: .product(name: "MealioSDK", package: "mealio-sdk")

Configure once

App.swift
import MealioSDK

@main struct MyApp: App {
    init() {
        MealioCart.configure(
            publishableKey: "pk_live_...",
            sessionTokenProvider: { try await MyAPI.mealioSessionToken() } // calls your server
        )
    }
    var body: some Scene { WindowGroup { ContentView() } }
}

Fill a cart

Swift
do {
    let recipe = Recipe(id: "tinga", title: "Chicken Tinga",
                        ingredients: [RecipeIngredient(name: "1 yellow onion"), RecipeIngredient(name: "corn tortillas")])
    let session = try await MealioCart.prepareCart(store: "heb", recipe: recipe, zip: "78704")

    // session.ready: the user's earlier choices. session.needsChoice: let the user pick.
    try session.choose(key: key, productId: productId, preferenceId: chosenPreference)
    session.skip(key: "salt")
    let result = try await session.addToCart()   // result.added, .skipped, .failed
} catch let error as MealioError {
    // error.code: login_cancelled, store_unavailable, location_required, ...
}

The store's sign-in page appears in a sheet presented over your top view controller when needed.

Drop-in sheet

SwiftUI
if let s = session {
    MealioCartSheet(session: s, accentColor: .red, onFinished: { result in session = nil })
}

Sign out

Swift
await MealioCart.signOutOfStore("heb")
await MealioCart.signOutOfAllStores()   // only store domains, your own web content is kept
Stores that offer "Sign in with Google" need email and password, because Google blocks its sign-in inside embedded WebViews.