What is the most obvious method of calling StoreKit from C++. I'm getting blocked by the fact that most of the critical StoreKit calls are async and functions marked a sync don't show up in the swift header for me to call from C++ (at least as far as I can tell).
I'm trying to call
let result = try await Product.products(for:productIDs) or
let result = try await product.purchase()
And C++ can't even see any functions I wrap these in as far as I can tell because i have to make them async. What am I missing?
I tried a lot of alternates, like wrapping in
Task { let result = try await Product.products(for:productIDs) }
and it gives me 'Passing closure as a sending parameter' errors.
Also when I try to call the same above code it gives me 'initializtion of immutable value never used' errors and the variables never appear.
Code:
struct storeChooser {
public var productIDs: [String]
public function checkProduct1 {
Task { let result = try await Product.products(for: productIDs) }
The above gives the initialization of immutable value skipped, and when I create a
@State var products
Then I get the 'passing closure as a sending parameter' error when i try to run it in a task
it appears if I could make the function async and call it from C++ and have it return nothing it may work, does anyone know how to get C++ to see an async function in the -Swift.h file?
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
I can't find a viable path to call StoreKit from C++ right now and would love some ideas.
I'm implementing the code exactly as shown at 4:09 in
https://developer.apple.com/videos/play/wwdc2023/10172/
However when I add any StoreKit functionality in I immediately get
"Actor isolated structure cannot be exposed in C++"
This makes me think I can't create a StoreKit view and call it from C++? Am I missing a better way? I don't think I can have another structure that holds the storeChooser in it because it will have the same problem (I assume, although I will check). Part of the issue seems to be that my app is C++ so there is no main function called in the swift for me to open this view with either, I was going to use the present function Zoe described (as below).
I've tried a lot of alternative approaches but it seems to be blocking async functions from showing in C++ as well. So I'm not sure how to access the basic product(for:) and purchase(product) functions.
import Foundation
import StoreKit
import SwiftUI
public struct storeChooser: View {
public var productIDs: [String]
public var fetchError: String
//@State //Note this is from the UI
@State public var products: [Product] = []
// @State private var isPresented = true
// weak private var host: UIViewController? = nil
public init() {
productIDs = ["20_super_crystals_v1"]
products = []
self.fetchError = "untried"
}
public var body: some View {
VStack(spacing: 20) {
Text( "Products")
ForEach(self.products) { product in
Button {
//dont do anything yet
} label: {
Text("\(product.displayPrice) - \(product.displayName)")
}
}
}.task {
do {
try await self.loadProducts()
} catch {
print(error)
}
}
}
public func queryProducts() {
Task {
do {
try await self.loadProducts()
} catch {
print(error)
}
}
}
public func getProduct1Name() -> String {
if self.products.count > 0 {
return self.products[0].displayName
} else {
return "empty"
}
}
private func loadProducts() async throws {
self.products = try await Product.products(for: self.productIDs)
}
/* public mutating func present(_ viewController: UIViewController) {
isPresented = true;
let host = UIHostingController(rootView: self)
host.rootView.host = host
viewController.present(host, animated: true)
} */
}
I've narrowed down my question after many rabbit holes - how can C++ code open any view in Swift. I can call functions in swift from C++ (works great), but not async or main actor (or actor at all) functions. And if I'm not mistaken all views are actors if not main actors? When calling from C+ I think its necessary that the first view be the main actor?
I've implemented the code from the WWDC23 C++ interop video (Zoe's image picker) where I made a view in a struct, and just want to call it and let the view do the work.
The compiler immediately gives me 'cannot expose main actors to C++'. If I'm not mistaken, doesn't this block the opening of any kind of swift view from C++? Hopefully I'm missing something obvious, which is likely :)
In Zoe's code was his entry point into the program still Swift and not actually C++ app?
Thanks!
Thanks!
Topic:
Programming Languages
SubTopic:
Swift
Hi, I'm doing a basic cocos2dx with spine iOS build on M1. With Xcode15 I'm getting 'undefined symbols' but it doesn't say what symbols!! How can I troubleshoot that?
Also Im getting an 'ignoring duplicate libraries' but it lists two different libraries and I can't find any duplicate of either of them in my system. It might be related, if its linking to the wrong version of a library I suppose, but the no symbol on undefined symbols is really killing me
anyone else seeing this? Nothing after the colon
Undefined symbols:
Linker command failed with exit code 1 (use -v to see invocation)
ld: warning: ignoring duplicate libraries: 'xxxx/build-ios/Debug-iphoneos/libspine-cpp.a', 'xxxx/cocos2d/external/bullet/prebuilt/ios/libLinearMath.a'
Thanks!