Swift / C++ Interop with Storekit - actor isolated structure cannot be exported to C++

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'm trying to work around this, but making a new structure that holds the view is resulting in all kinds of errors relating to the storeChooser being a main actor view. It doesn't like the constructor not being async. Is there a way to make an async init function? If there was, then C++ couldn't call it? or could it? Gahhh

You’ve got a few threads going here, all covering roughly the same topic. I’m gonna respond on this one and we can come back here if there’s need.

Share and Enjoy
—
Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

Swift / C++ Interop with Storekit - actor isolated structure cannot be exported to C++
 
 
Q