Hallo Leute!
Ich brauche unbedingt Eure Hilfe zum Thema Concurrency (speziell Actors und deren mutable state) ... aber der Reihe nach:
Kontext:
Ich modernisiere den Unterbau meiner Freemium-Apps (macOS und iOS), um Abhängigkeiten von Receigen / OpenSSL los zu werden, indem ich auf die StoreKit2 API wechsle. Betroffen ist eine dedizierten Klasse StoreManager, die alle StoreKit-Operationen durchführt und von diversen (Objective-C) Klassen aufgerufen wird. Hier wird z. B. das Receipt nach Käufen untersucht oder auf Transaktionen gelauscht und diese muss auf Swift umgestellt werden.
Problem:
Swift's strenge Überprüfung drohender "data races" führt aber immer wieder zu Compiler-Fehlern und es beisst sich die Katze in den Schwanz.
Durch Nutzung der StoreKit2 API erfolgt die Überprüfung der "Entitlements" (nach meinem Verständnis des Receipts) per
Alles anzeigen
Allerdings soll das Set purchasedProductIDs in Properties vom StoreManager genutzt werden, also ausserhalb des Actors und hier scheitere ich:
Die letzten Tage habe ich zu den Themen Swift Concurrency, Task, Actor, immutable state u.a. recherchiert und fand zum Beispiel diesen Beitrag der WWDC 2021 sehr hilfreich. Aber ich sehe keinen (praktikablen) Weg, an besagtes Set zu kommen:
Mein aktueller Plan B ist so dirty, dass ich ihn kaum nennen mag: Speichern der purchasedProductIDs in den UserDefaults und in den Properties Zugriff auf diese...
Bitte helft mir mit Hinweisen auf erklärende Literatur / Videos, einen allgemeinen oder speziellen Lösungsansatz zum StoreKit2 oder auch nur mit den richtigen Stichworten...
Ich werde noch wahnsinnig, Mattes
Ich brauche unbedingt Eure Hilfe zum Thema Concurrency (speziell Actors und deren mutable state) ... aber der Reihe nach:
Kontext:
Ich modernisiere den Unterbau meiner Freemium-Apps (macOS und iOS), um Abhängigkeiten von Receigen / OpenSSL los zu werden, indem ich auf die StoreKit2 API wechsle. Betroffen ist eine dedizierten Klasse StoreManager, die alle StoreKit-Operationen durchführt und von diversen (Objective-C) Klassen aufgerufen wird. Hier wird z. B. das Receipt nach Käufen untersucht oder auf Transaktionen gelauscht und diese muss auf Swift umgestellt werden.
Problem:
Swift's strenge Überprüfung drohender "data races" führt aber immer wieder zu Compiler-Fehlern und es beisst sich die Katze in den Schwanz.
Durch Nutzung der StoreKit2 API erfolgt die Überprüfung der "Entitlements" (nach meinem Verständnis des Receipts) per
Transaction.currentEntitlements
. Diese ist asynchron und soll entsprechende Produkt-IDs in einem Set speichern. Daher nutze ich einen entsprechenden Actor zur Isolierung:Quellcode
- private actor entitlementsActor {
- var purchasedProductIDs: Set<String> = []
- func checkPurchasedProducts() async {
- self.purchasedProductIDs.removeAll()
- for await verificationResult in Transaction.currentEntitlements {
- switch verificationResult {
- case .verified(let transaction):
- self.purchasedProductIDs.insert(transaction.productID)
- case .unverified(let unverifiedTransaction, let verificationError):
- self.purchasedProductIDs.insert(unverifiedTransaction.productID)
- }
- }
- }
- }
Die letzten Tage habe ich zu den Themen Swift Concurrency, Task, Actor, immutable state u.a. recherchiert und fand zum Beispiel diesen Beitrag der WWDC 2021 sehr hilfreich. Aber ich sehe keinen (praktikablen) Weg, an besagtes Set zu kommen:
- Ein Zugriff per
await
erfordert entweder eine Task oder asynchrone Funktion: Ich möchte für den StoreManager aber ein Property haben, das unmittelbar den (Kauf-) Status eines Produktes liefert - welcher sporadisch im Hintergrund aktualisiert wird, wenn z. B. Transaktionen geändert wurden. - Das Set ist mutable und kann damit nicht als
nonisolated
definiert werden. - Die Funktion checkPurchasedProducts ist aber die einzige, welche das Set purchasedProductIDs verändert.
async
zu erklären (und damit z. B. in den aufrufenden Objective-C Klassen Completion-Handler zu haben). Wie greife ich auf Variablen eines Actors zu - oder könnte ich die Überprüfung der Entitlements anders aufrufen? Oder welche Grundlagen habe ich komplett falsch verstanden?Mein aktueller Plan B ist so dirty, dass ich ihn kaum nennen mag: Speichern der purchasedProductIDs in den UserDefaults und in den Properties Zugriff auf diese...
Bitte helft mir mit Hinweisen auf erklärende Literatur / Videos, einen allgemeinen oder speziellen Lösungsansatz zum StoreKit2 oder auch nur mit den richtigen Stichworten...
Ich werde noch wahnsinnig, Mattes
Diese Seite bleibt aus technischen Gründen unbedruckt.