#ios #swift #bevy #bevy-plugin #mobile #gamedev

bevy_ios_iap

Bevy插件和Swift包,用于在Bevy应用程序中访问iOS原生StoreKit2

6个版本

0.3.0 2024年7月11日
0.2.1 2024年5月12日
0.1.2 2024年5月6日

#558游戏开发

Download history 414/week @ 2024-04-30 420/week @ 2024-05-07 27/week @ 2024-05-14 93/week @ 2024-05-21 4/week @ 2024-05-28 70/week @ 2024-06-04 27/week @ 2024-06-11 24/week @ 2024-06-18 1/week @ 2024-06-25 27/week @ 2024-07-02 129/week @ 2024-07-09 3/week @ 2024-07-16

每月下载量:159

MIT许可证

28KB
460

bevy_ios_iap

crates.io docs.rs discord

提供从Bevy应用程序中访问iOS原生StoreKit2 Swift API的功能。它使用Swift-Bridge来自动生成粘合代码和传输数据类型。

demo

使用此crate的我们游戏的演示:zoolitaire.com

另请参阅:bevy_ios_gamecenterbevy_ios_notificationsbevy_ios_alertsbevy_ios_review 以及 bevy_ios_impact

功能

  • 获取产品
  • 购买产品
  • 监听交易状态的变化
  • 获取所有交易列表(用于恢复旧的非消耗品购买)

注意

  • 不返回本地未签名/未验证的交易

待办事项

  • 支持订阅产品类型
  • 在:ios_iap_transactions_allios_iap_products 中剩余的错误处理
  • 允许访问签名以进行远程验证
  • 支持优惠
  • 支持家庭共享
  • 交易撤销原因

说明

  1. 添加到XCode:添加SPM(Swift包管理器)依赖项
  2. 添加Rust依赖项
  3. 设置插件

1. 添加到XCode

  • 添加StoreKit框架:gamekit

  • 转到 文件 -> 添加包依赖项,并将 https://github.com/rustunit/bevy_ios_iap.git 粘贴到右上角的搜索栏中:xcode

  • 不要忘记像任何其他iOS应用程序一样配置您的购买,本指南不会关注这一点,因为这无论您使用什么引擎都是相同的。本指南侧重于在Bevy项目中设置这些内容。

注意:使用的 Rust crate 版本必须与 Swift 包版本完全一致(出于二进制兼容性原因)。我建议使用特定的版本(如截图中的 0.2.0)以确保始终使用二进制匹配版本!

2. 添加 Rust 依赖

cargo add bevy_ios_iap

# always pin to the same exact version you also of the Swift package
bevy_ios_iap = { version = "=0.2.1" }

3. 设置插件

初始化 Bevy 插件

// request initialisation right on startup
app.add_plugins(IosIapPlugin::new(true));
fn bevy_system() {
    // If you set the plugin to manual init, this will register the 
    // TranscactionObserver to listen to updates to any Transactions and trigger
    // `IosIapEvents::Transaction` accordingly.
    // Note: this will require the user to be logged in into their apple-id and popup a login dialog if not
    bevy_ios_iap::init();

    // request product details, product IDs have to be explicitly provided
    // this will lead to a response: `IosIapEvents::Products`
    bevy_ios_iap::get_products(vec!["com.rustunit.zoolitaire.levelunlock".into()]);

    // trigger a product purchase for a specific product ID
    // this will lead to a response: `IosIapEvents::Purchase`
    bevy_ios_iap::purchase("com.rustunit.zoolitaire.levelunlock".into());

    // request to restore active subscriptions and non-consumables
    // this will lead to a response: `IosIapEvents::CurrentEntitlements`
    bevy_ios_iap::current_entitlements();

    // marks a transaction as finished after the product was provided to the customer.
    // if this is not called a transaction will keep being triggered automatically on 
    // app start as iOS wants us to be sure we granted the user the purchased good.
    // this will lead to a response: `IosIapEvents::TransactionFinished`
    bevy_ios_iap::finish_transaction(42);
}

处理从 iOS 返回到 Rust 的响应事件

fn process_iap_events(
    mut events: EventReader<IosIapEvents>,
) {
    for e in events.read() {
        match e {
            IosIapEvents::Products(_) => todo!(),
            IosIapEvents::Purchase(_) => todo!(),
            IosIapEvents::Transaction(_) => todo!(),
            IosIapEvents::TransactionFinished(_) => todo!(),
            IosIapEvents::AllTransactions(_) => todo!(),
            IosIapEvents::CurrentEntitlements(_) => todo!(),
        }
    }
}

Bevy 版本支持

bevy bevy_ios_iap
0.14 0.3,main
0.13 0.2

许可协议

本仓库中所有代码均采用以下两种许可协议之一:

您可选择其中一种。这意味着您可以选择您偏好的许可协议。

您的贡献

除非您明确声明,否则根据 Apache-2.0 许可协议定义的,您提交的任何旨在包含在作品中的贡献,将按照上述方式双许可,不附加任何额外条款或条件。

依赖项

~27MB
~447K SLoC