Skip to main content

Crate storekit

Crate storekit 

Source
Expand description

§storekit-rs

Safe Rust bindings for Apple’s StoreKit framework on macOS.

Status: v0.2.1 closes the remaining audited StoreKit 2 gaps with windowed purchases, formatting/localization helpers, subscription-status streams, purchase intents, external-purchase flows, advanced-commerce APIs, and typed framework errors.

§Quick start

use storekit::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let products = Product::products_for(["com.example.pro.monthly"])?;
    for product in products {
        println!("{} — {}", product.display_name, product.display_price);
    }

    println!("payments enabled: {}", AppStore::can_make_payments()?);
    Ok(())
}

§Highlights

  • Product::products_for(...), Product::purchase(...), Product::purchase_in_window(...), Product::latest_transaction(), and Product::current_entitlements()
  • Product formatting/localization helpers expose StoreKit format styles, SubscriptionPeriod convenience constructors, and enum/unit localized_description() helpers
  • PurchaseOption covers quantity, app-account tokens, custom payloads, promotional offers, win-back offers, and storefront-change policies
  • Transaction exposes all, current_entitlements, updates, unfinished, filtered product streams, latest_for, current_entitlement_for, verification, finishing, refund helpers, and advanced-commerce info
  • SubscriptionInfo::status_for(...), status_for_transaction(...), SubscriptionStatus::updates(), and SubscriptionStatus::all() surface renewal state plus status streams
  • PurchaseIntent::intents() and ExternalPurchase{,Link,CustomLink} cover the newer StoreKit purchase-intent and regulatory-link families
  • AppStore now includes merchandising presentation, age-rating lookups, and advanced-commerce product purchase support
  • StoreKitError::typed() recovers typed StoreKit, purchase, refund-request, and invalid-request framework errors
  • Storefront::current() and Storefront::updates() wrap the StoreKit storefront APIs
  • AppTransaction::shared() and AppTransaction::refresh() expose app-level verification results
  • ReceiptValidator reads the local app receipt and decodes JWS payloads without publishing or mutating store state
  • StoreContext::current() summarizes bundle, receipt, payment, and device-verification context for headless tooling

§Examples

The crate ships with numbered examples for each logical area:

  • 01_product_lookup
  • 02_transaction_stream
  • 03_app_store_context
  • 04_storefront_current
  • 05_subscription_types
  • 06_subscription_info_status
  • 07_refund_request
  • 08_receipt_validator
  • 09_message_support
  • 10_app_transaction
  • 11_store_context
  • 12_renewal_info
  • 13_renewal_state
  • 14_purchase_option
  • 15_verification_result
  • 16_purchase_intent
  • 17_external_purchase
  • 18_advanced_commerce
  • 19_typed_errors

Run them all with:

for ex in examples/*.rs; do cargo run --example "$(basename "$ex" .rs)"; done

§Notes

  • StoreKit.Message is unavailable on macOS, so the message module reports NotSupported there.
  • Refund, review, and offer-code presentation helpers still require an NSViewController-backed window; headless callers get NotSupported instead of hanging.
  • Window-based purchase and merchandising APIs accept caller-owned NSWindowHandle values when the host app has an AppKit window to lend to StoreKit.
  • The crate does not publish or call cargo publish; release tagging is separate from drip-publisher rollout.

§License

Licensed under either of Apache-2.0 or MIT at your option.

Re-exports§

pub use advanced_commerce::AdvancedCommerceProduct;
pub use advanced_commerce::AdvancedCommercePurchaseOption;
pub use advanced_commerce::AppStoreMerchandisingKind;
pub use advanced_commerce::AppStoreMerchandisingPresentationResult;
pub use advanced_commerce::RenewalInfoAdvancedCommerceInfo;
pub use advanced_commerce::RenewalInfoAdvancedCommerceItem;
pub use advanced_commerce::RenewalInfoAdvancedCommercePriceIncreaseInfo;
pub use advanced_commerce::RenewalInfoAdvancedCommercePriceIncreaseStatus;
pub use advanced_commerce::TransactionAdvancedCommerceInfo;
pub use advanced_commerce::TransactionAdvancedCommerceItem;
pub use advanced_commerce::TransactionAdvancedCommerceItemDetails;
pub use advanced_commerce::TransactionAdvancedCommerceOffer;
pub use advanced_commerce::TransactionAdvancedCommerceOfferReason;
pub use advanced_commerce::TransactionAdvancedCommerceRefund;
pub use advanced_commerce::TransactionAdvancedCommerceRefundReason;
pub use advanced_commerce::TransactionAdvancedCommerceRefundType;
pub use app_store::AppStore;
pub use app_store::AppStoreEnvironment;
pub use app_store::AppStorePlatform;
pub use app_transaction::AppTransaction;
pub use error::InvalidRequestError;
pub use error::ProductPurchaseError;
pub use error::ProductPurchaseErrorCode;
pub use error::RefundRequestError;
pub use error::RefundRequestErrorCode;
pub use error::StoreKitApiError;
pub use error::StoreKitApiErrorCode;
pub use error::StoreKitError;
pub use error::StoreKitFrameworkError;
pub use error::TypedStoreKitError;
pub use error::VerificationErrorCode;
pub use error::VerificationFailure;
pub use external_purchase::ExternalPurchase;
pub use external_purchase::ExternalPurchaseCustomLinkNoticeResult;
pub use external_purchase::ExternalPurchaseCustomLinkNoticeType;
pub use external_purchase::ExternalPurchaseCustomLinkToken;
pub use external_purchase::ExternalPurchaseNoticeResult;
pub use message::Message;
pub use message::MessageReason;
pub use message::MessageStream;
pub use product::Product;
pub use product::ProductType;
pub use purchase_intent::PurchaseIntent;
pub use purchase_intent::PurchaseIntentStream;
pub use purchase_option::PurchaseOption;
pub use purchase_option::PurchaseResult;
pub use receipt_validator::AppReceipt;
pub use receipt_validator::ReceiptValidator;
pub use refund::Refund;
pub use refund::RefundRequestStatus;
pub use renewal_info::ExpirationReason;
pub use renewal_info::PriceIncreaseStatus;
pub use renewal_info::RenewalInfo;
pub use renewal_state::RenewalState;
pub use store_context::StoreContext;
pub use storefront::Storefront;
pub use storefront::StorefrontStream;
pub use subscription::SubscriptionOffer;
pub use subscription::SubscriptionOfferType;
pub use subscription::SubscriptionPaymentMode;
pub use subscription::SubscriptionPeriod;
pub use subscription::SubscriptionPeriodUnit;
pub use subscription_info::SubscriptionInfo;
pub use subscription_info::SubscriptionStatus;
pub use transaction::OfferPaymentMode;
pub use transaction::OfferType;
pub use transaction::OwnershipType;
pub use transaction::RevocationReason;
pub use transaction::Transaction;
pub use transaction::TransactionData;
pub use transaction::TransactionOffer;
pub use transaction::TransactionReason;
pub use transaction::TransactionStream;
pub use verification_result::VerificationMetadata;
pub use verification_result::VerificationResult;
pub use window::NSWindowHandle;

Modules§

advanced_commerce
app_store
app_transaction
error
external_purchase
message
prelude
Common imports.
product
purchase_intent
purchase_option
receipt_validator
refund
renewal_info
renewal_state
store_context
storefront
subscription
subscription_info
transaction
verification_result
window

Structs§

ProductFormatting
SubscriptionGroupStatusStream
SubscriptionGroupStatuses
SubscriptionStatusStream