Skip to content

Commit 4e9c264

Browse files
committed
IosIapPurchaseResult can be Unknown
if an invalid product ID is used for a purchase (fixes #1)
1 parent 43fc81c commit 4e9c264

File tree

9 files changed

+41
-6
lines changed

9 files changed

+41
-6
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Changelog
2+
3+
All notable changes to this project will be documented in this file.
4+
5+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7+
8+
## Unreleased
9+
10+
## [ru-0.1.2] - 2024-05-06
11+
12+
### Added
13+
* `IosIapPurchaseResult` can be `Unknown` if an invalid product ID is used for a purchas (fixes #1)

Package.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ let package = Package(
1717
// Targets can depend on other targets in this package and products from dependencies.
1818
.binaryTarget(
1919
name: "RustXcframework",
20+
// for local development:
21+
// path: "RustXcframework.xcframework"),
2022
url: "https://github.com/rustunit/bevy_ios_iap/releases/download/rs-0.1.1/RustXcframework.xcframework.zip",
2123
checksum: "02ce1e897058362cf4c12db55f557c6708dd8b8dc8e4bd34fd7e895e4b3fbf26"),
2224
.target(

RustXcframework.xcframework/ios-arm64/Headers/bevy_ios_iap.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ void* __swift_bridge__$IosIapProductType$new_auto_renewable(void);
104104
void* __swift_bridge__$IosIapPurchaseResult$success(void);
105105
void* __swift_bridge__$IosIapPurchaseResult$canceled(void);
106106
void* __swift_bridge__$IosIapPurchaseResult$pending(void);
107+
void* __swift_bridge__$IosIapPurchaseResult$unknown(void* id);
107108
void* __swift_bridge__$IosIapPurchaseResult$error(void* e);
108109
void* __swift_bridge__$IosIapEnvironment$sandbox(void);
109110
void* __swift_bridge__$IosIapEnvironment$production(void);

RustXcframework.xcframework/ios-arm64_x86_64-simulator/Headers/bevy_ios_iap.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ void* __swift_bridge__$IosIapProductType$new_auto_renewable(void);
104104
void* __swift_bridge__$IosIapPurchaseResult$success(void);
105105
void* __swift_bridge__$IosIapPurchaseResult$canceled(void);
106106
void* __swift_bridge__$IosIapPurchaseResult$pending(void);
107+
void* __swift_bridge__$IosIapPurchaseResult$unknown(void* id);
107108
void* __swift_bridge__$IosIapPurchaseResult$error(void* e);
108109
void* __swift_bridge__$IosIapEnvironment$sandbox(void);
109110
void* __swift_bridge__$IosIapEnvironment$production(void);

Sources/bevy_ios_iap/BevyIosIAP.swift

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ import RustXcframework
1212
public func ios_iap_products(products:RustVec<RustString>)
1313
{
1414
Task {
15+
//TODO: wrap in do catch for error handling
16+
1517
var productIds:[String] = []
1618
for p in products {
1719
productIds.append(p.as_str().toString())
1820
}
1921

2022
let products = try await Product.products(for: productIds)
21-
// print("products:\n \(products)")
2223

2324
let rust_products = RustVec<IosIapProduct>()
2425

@@ -46,7 +47,12 @@ public func ios_iap_purchase(id: RustString)
4647
do {
4748
let productIds = [id.toString()]
4849
let products = try await Product.products(for: productIds)
49-
let purchase = try await products[0].purchase()
50+
51+
if products.isEmpty {
52+
return purchase_processed(IosIapPurchaseResult.unknown(id.toString()))
53+
}
54+
55+
let purchase = try await products.first!.purchase()
5056

5157
let result = switch purchase {
5258
case .success(_):
@@ -60,7 +66,6 @@ public func ios_iap_purchase(id: RustString)
6066

6167
purchase_processed(result)
6268
} catch {
63-
print("ios_iap_purchase error: \(error).")
6469
purchase_processed(IosIapPurchaseResult.error(error.localizedDescription))
6570
}
6671
}
@@ -88,15 +93,16 @@ public func ios_iap_transaction_finish(id: UInt64) {
8893
}
8994

9095
transaction_finished(IosIapTransactionFinished.unknown(id))
91-
}catch {
92-
print("ios_iap_transaction_finish error: \(error).")
96+
} catch {
9397
transaction_finished(IosIapTransactionFinished.error(error.localizedDescription))
9498
}
9599
}
96100
}
97101

98102
public func ios_iap_transactions_all() {
99103
Task {
104+
//TODO: wrap in do catch for error handling
105+
100106
var transactions = RustVec<IosIapTransaction>.init()
101107

102108
for await t in Transaction.all {

Sources/bevy_ios_iap/bevy_ios_iap.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,10 @@ public class IosIapPurchaseResult: IosIapPurchaseResultRefMut {
482482
}
483483
}
484484
extension IosIapPurchaseResult {
485+
class public func unknown<GenericIntoRustString: IntoRustString>(_ id: GenericIntoRustString) -> IosIapPurchaseResult {
486+
IosIapPurchaseResult(ptr: __swift_bridge__$IosIapPurchaseResult$unknown({ let rustString = id.intoRustString(); rustString.isOwned = false; return rustString.ptr }()))
487+
}
488+
485489
class public func error<GenericIntoRustString: IntoRustString>(_ e: GenericIntoRustString) -> IosIapPurchaseResult {
486490
IosIapPurchaseResult(ptr: __swift_bridge__$IosIapPurchaseResult$error({ let rustString = e.intoRustString(); rustString.isOwned = false; return rustString.ptr }()))
487491
}

bevy_ios_iap/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bevy_ios_iap"
3-
version = "0.1.1"
3+
version = "0.1.2"
44
edition = "2021"
55
build = "build.rs"
66
readme = "../README.md"

bevy_ios_iap/src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ pub enum IosIapPurchaseResult {
3232
Success,
3333
Canceled,
3434
Pending,
35+
/// Unknown / invalid product ID
36+
Unknown(String),
3537
Error(String),
3638
}
3739

@@ -48,6 +50,10 @@ impl IosIapPurchaseResult {
4850
Self::Pending
4951
}
5052

53+
fn unknown(id: String) -> Self {
54+
Self::Unknown(id)
55+
}
56+
5157
fn error(e: String) -> Self {
5258
Self::Error(e)
5359
}

bevy_ios_iap/src/native.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ mod ffi {
4848
#[swift_bridge(associated_to = IosIapPurchaseResult)]
4949
fn pending() -> IosIapPurchaseResult;
5050
#[swift_bridge(associated_to = IosIapPurchaseResult)]
51+
fn unknown(id: String) -> IosIapPurchaseResult;
52+
#[swift_bridge(associated_to = IosIapPurchaseResult)]
5153
fn error(e: String) -> IosIapPurchaseResult;
5254

5355
#[swift_bridge(associated_to = IosIapEnvironment)]

0 commit comments

Comments
 (0)