Was ist StoreKit und wofür wird es benötigt?
StoreKit ist ein integriertes Framework von Apple, das für die Implementierung von In-App-Käufen und Abonnements in Apps für iOS, macOS, watchOS und tvOS entwickelt wurde. Es bietet Entwicklern eine einheitliche Schnittstelle zur Interaktion mit dem App Store: Produktabfragen, Transaktionsverarbeitung, Zugriffsprüfung und Abonnementverwaltung.
Die Hauptaufgaben, die StoreKit löst:
- Monetarisierung — Verkauf digitaler Güter (Premium-Zugang, virtuelle Währung, Inhalte).
- Abonnementverwaltung — automatische Verlängerungen, Status, Testphasen.
- Sicherheit — Zahlungsabwicklung über den App Store ohne Weitergabe von Bankdaten an den Entwickler.
- Kaufwiederherstellung — Benutzer können Käufe auf ein anderes Gerät übertragen.
Wichtig zu verstehen: StoreKit ist keine externe Bibliothek, sondern Teil des Xcode SDK. Es muss nicht separat installiert werden, aber es muss in App Store Connect konfiguriert und dem Projekt hinzugefügt werden.
Einrichtung und Konfiguration
Da StoreKit ein System-Framework ist, beschränkt sich die Installation auf das Einbinden in Ihr Xcode-Projekt:
- Öffnen Sie Ihr Projekt in Xcode.
- Wählen Sie das Target (Ihre App) → Tab "General".
- Scrollen Sie zum Abschnitt "Frameworks, Libraries, and Embedded Content".
- Klicken Sie auf "+" und wählen Sie StoreKit.framework.
- Stellen Sie sicher, dass der Status "Embed" auf "Do Not Embed" gesetzt ist.
Importieren Sie anschließend das Framework in den benötigten Dateien:
import StoreKit
Konfigurieren Sie außerdem unbedingt Ihre Produkte in App Store Connect:
- Erstellen Sie Produkt-IDs (z. B.
com.example.premium). - Legen Sie Preis, Lokalisierung und Typ fest (verbrauchbar/nicht verbrauchbar/Abonnement).
- Richten Sie bei Abonnements Gruppen und Testphasen ein.
Schnellstart mit Codebeispiel
Ein minimales funktionierendes Beispiel für die Produktabfrage und den Kauf:
import StoreKit
class StoreManager: NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserver {
static let shared = StoreManager()
private var products: [SKProduct] = []
override private init() {
super.init()
SKPaymentQueue.default().add(self)
}
// 1. Produkte anfragen
func fetchProducts(productIDs: Set<String>) {
let request = SKProductsRequest(productIdentifiers: productIDs)
request.delegate = self
request.start()
}
// 2. Delegate für Produktempfang
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
self.products = response.products
for product in products {
print("Produkt gefunden: \(product.localizedTitle) — \(product.price)")
}
}
// 3. Kauf
func purchase(product: SKProduct) {
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
}
// 4. Transaktionsverarbeitung
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .purchased:
// Inhalt freischalten
print("Kauf erfolgreich: \(transaction.payment.productIdentifier)")
SKPaymentQueue.default().finishTransaction(transaction)
case .failed:
if let error = transaction.error {
print("Kauffehler: \(error.localizedDescription)")
}
SKPaymentQueue.default().finishTransaction(transaction)
case .restored:
print("Kauf wiederhergestellt")
SKPaymentQueue.default().finishTransaction(transaction)