In-App-Käufe unter iOS mit Swift 3

Was Sie erstellen werden

Einführung

Der Kauf von In-App-Apps ist eine großartige Funktion für alle Entwickler, die mehr Umsatz erzielen möchten und zusätzliche Inhalte und Funktionen in ihren Anwendungen anbieten möchten. Zum Beispiel können Sie für Spiele Edelsteine ​​oder Münzen kaufen, und für Foto-Apps können Sie neue Effekte oder Werkzeuge freischalten. Sie können dies alles mit einer Kreditkarte oder einer anderen Zahlungsmethode tun, ohne die App zu beenden. 

In diesem Tutorial werde ich alle notwendigen Schritte zur Erstellung eines Verbrauchbar und Nicht konsumierbar IAP-Produkt in iTunes Connect, und ich zeige Ihnen den Code, den Sie zum Kauf beider Artikel benötigen. Ich habe ein Xcode-Beispielprojekt mit einem Label und zwei Schaltflächen erstellt. Laden Sie es also herunter und folgen Sie diesem Tutorial, um die Funktionsweise zu verstehen.

Erstellen Sie einen Sandbox-Tester in iTunes Connect

Ich gehe davon aus, dass Sie bereits eine iOS-App im erstellt haben Meine Applikationen Abschnitt in iTunes Connect. Als erstes sollten Sie eine erstellen Sandkastentester So testen Sie IAP auf Ihrem realen Gerät (kein Simulator unterstützt In-App-Käufe nicht). 

Eingeben Benutzer und Rollen, gehe zum Sandkastentester Registerkarte und klicken Sie auf ((+) neben Prüfer.

Füllen Sie das Formular aus, um einen neuen Sandkastentester hinzuzufügen. Sobald Sie Ihre Informationen gespeichert haben, gehen Sie zurück zu Meine App Klicken Sie auf das Symbol Ihrer App, um die Details einzugeben und IAP-Produkte zu erstellen.

Erstellen Sie IAP-Produkte in iTunes Connect

Verbrauchsmaterial

Drücke den Eigenschaften Tab und dann die (+) neben In-App Käufe. Sie können jeweils ein Produkt erstellen. Beginnen wir also mit einem Verbrauchbar ein.

EIN Verbrauchbar IAP ist, wie der Name schon sagt, ein Produkt, das Sie mehrfach kaufen können. Wir werden es verwenden, um zusätzliche "Münzen" in unserer Demo-App zu sammeln. 

Klicken Erstellen um Ihr IAP-Element zu initialisieren. Auf dem nächsten Bildschirm können Sie alle Informationen zu Ihrem Produkt einrichten:

  • Referenzname: Dieser Name wird in iTunes Connect und in verwendet Umsatz und Trends Berichte. Es wird nicht im App Store angezeigt und Sie können einen beliebigen Namen eingeben. Er darf jedoch nicht länger als 64 Zeichen sein.
  • Produkt ID: Eine eindeutige alphanumerische Kennung, die von der App abgerufen wird, um Ihr Produkt zu erkennen. Normalerweise verwenden Entwickler eine Web-Reverse-Syntax für Produkt-IDs. In diesem Beispiel haben wir gewählt com.iaptutorial.coins. Später fügen wir diese ID als Zeichenfolge in unseren Code ein.
  • Preis: Wählen Sie eine Preisstufe aus dem Dropdown-Menü. Denken Sie daran, dass Sie, um Ihr In-App-Kaufprodukt im App Store zu verkaufen, einen Antrag gestellt haben müssen Bezahlte Antragsvereinbarung in dem Vereinbarungen, Steuern und Bankwesen Sektion.
  • Lokalisierungen: In diesem Tutorial haben wir nur Englisch ausgewählt. Sie können jedoch weitere Sprachen hinzufügen, indem Sie auf die Schaltfläche (+) Taste. Geben Sie dann a ein Anzeigename und ein Beschreibung. Beide werden im App Store angezeigt. 
  • Bildschirmfoto: Laden Sie einen Screenshot zur Überprüfung hoch. Sie wird nicht im App Store angezeigt und muss eine gültige Größe für Ihre App-Plattform haben. Wenn Ihre App Universal ist, können Sie einen iPad-Screenshot hochladen.
  • Anmerkungen überprüfen: Zusätzliche Informationen zu Ihrem IAP, die für den Prüfer hilfreich sein können.

Wenn Sie fertig sind, klicken Sie auf sparen und Sie erhalten diese Benachrichtigung:

Ihr erster In-App-Kauf muss mit einer neuen App-Version übermittelt werden. Wählen Sie es im Bereich In-App-Käufe der App aus und klicken Sie auf Senden.

Nicht verbrauchbare Produkte

Klicken Sie nun auf die Schaltfläche In-App-Käufe in der Liste links über dem Spielezentrum und fügen Sie ein neues IAP-Produkt hinzu. Wählen Sie dieses Mal das Nicht konsumierbar Möglichkeit:

Klicken Erstellen und wiederholen Sie die oben genannten Schritte. Da wird das ein Nicht konsumierbar Benutzer können das Produkt nur einmal erwerben, und Apple muss die Möglichkeit haben, solche Einkäufe wiederherzustellen. Dies geschieht, wenn Sie die App deinstallieren und erneut installieren oder von einem anderen Gerät mit derselben Apple-ID herunterladen und Ihre Einkäufe zurückerhalten, ohne sie zweimal bezahlen zu müssen. Wir werden also später eine hinzufügen Kauf wiederherstellen Funktion in unserem Code.

Die Produkt-ID, die wir jetzt erstellt haben, ist com.iaptutorial.premium, mit einem Preisniveau von USD 2.99. Wir haben es genannt Premium-Version freischalten.

Wenn Sie alle Felder ausgefüllt haben, speichern Sie Ihr Produkt und kehren Sie zur Seite In-App-Käufe zurück. Jetzt sollten Sie eine Liste Ihrer beiden Produkte mit ihren haben Name, Art, ICH WÜRDE und Status festlegen als Fertig zum Abschicken.

Kehren Sie zur Seite Ihrer App zurück, indem Sie auf die Appstore und Bereiten Sie sich auf die Einreichung vor Tasten. Scrollen Sie nach unten zu In-App Käufe Abschnitt rechts unten Allgemeine App-Informationen, und klicken Sie auf das (+) Schaltfläche, um Ihre IAP-Produkte hinzuzufügen. 

Wählen Sie alle aus und klicken Sie auf Erledigt.

Klicken Sie abschließend auf sparen In der oberen rechten Ecke des Bildschirms können Sie die In-App Purchase-Produkte in iTunes Connect konfigurieren.

Melden Sie sich auf einem iOS-Gerät bei Sandbox Tester an

Bevor Sie zum Code gelangen, müssen Sie noch etwas tun. Gehe zu die Einstellungen > iTunes & App Store auf deinem iOS-Gerät. Wenn Sie bereits mit Ihrer ursprünglichen Apple-ID angemeldet sind, tippen Sie darauf und wählen Sie Ausloggen. Melden Sie sich dann einfach mit den Anmeldeinformationen für den Sandbox-Tester an, den Sie erstellt haben. Nach der Anmeldung erhalten Sie möglicherweise eine Warnmeldung wie diese:

Ignorieren Sie einfach die Nachricht und tippen Sie auf Stornieren. Ihr Gerät fragt Sie erneut nach Ihren Sandbox-Anmeldedaten, während Sie versuchen, einen Kauf abzuschließen, und erkennt Ihr Testkonto an, damit Ihnen für Ihre getätigten Einkäufe kein Pfennig von Ihrer Kreditkarte belastet wird.

Ausgang die Einstellungen, Schließen Sie Ihr Gerät über das USB-Kabel an Ihren Mac an, und starten Sie die Codierung!

Der Code

Wenn Sie unser Demo-Projekt heruntergeladen haben, werden Sie sehen, dass der gesamte erforderliche Code für In-App Purchase erstellt wurde. Wenn Sie ihn also ausführen, erhalten Sie etwa Folgendes:

Wenn Sie die App testen möchten, sollten Sie die Bundle Identifier zu deiner eigenen id Andernfalls erlaubt Xcode nicht, die App auf einem echten Gerät auszuführen, und die App erkennt die beiden von Ihnen erstellten IAP-Produkte nicht.


Eingeben ViewController.swift und überprüfen Sie den Code. Zuerst haben wir eine Import-Anweisung für hinzugefügt StoreKit und die Delegierten, die wir benötigen, um Zahlungsvorgänge und Produktanfragen zu verfolgen.

Importieren der StoreKit-Klasse ViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver 

Dann haben wir einige Ansichten erklärt, die nützlich sein werden.

 / * Views * / @IBOutlet schwache Var coinsLabel: UILabel! @IBOutlet schwach var premiumLabel: UILabel! @IBOutlet schwache Var consumableLabel: UILabel! @IBOutlet schwach var nonConsumableLabel: UILabel! 

coinsLabel und premiumLabel wird verwendet, um die Ergebnisse der Einkäufe für beide Produkte anzuzeigen. consumableLabel und nonConsumableLabel zeigt die Beschreibung und den Preis jedes IAP-Produkts an, die wir zuvor in iTunes Connect erstellt haben. 

Nun ist es Zeit, einige Variablen hinzuzufügen:

/ * Variables * / let COINS_PRODUCT_ID = "com.iaptutorial.coins" lasse PREMIUM_PRODUCT_ID = "com.iaptutorial.premium" var productID = "" var productsRequest = SKProductsRequest () var iapProducts = [SKProduct] () variabel .bool (forKey: "nonConsumablePurchaseMade") var coins = UserDefaults.standard.integer (forKey: "coins") 

In den ersten beiden Zeilen werden unsere Produkt-IDs abgerufen. Es ist wichtig, dass diese Zeichenfolgen genau denen entsprechen, die im In-App-Kaufbereich von iTunes Connect registriert sind.

  • Produkt ID ist eine Zeichenfolge, die wir später verwenden werden, um herauszufinden, welches Produkt wir kaufen möchten.
  • produkteAnfrage ist ein Beispiel von SKProdukteAnfrage, für die Suche nach IAP-Produkten in Ihrer App auf iTC erforderlich.
  • iapProdukte ist ein einfaches Array von SK-Produkte. Bitte beachten Sie, dass das Präfix "SK" "StoreKit" bedeutet, das iOS-Framework, das wir zur Abwicklung von Käufen verwenden.

Die letzten beiden Zeilen laden zwei Variablen vom Typ Boolean und Ganze Zahl benötigt, um die Einkäufe von Münzen und der Premium-Version sowie von Verbrauchsgütern und Nicht-Verbrauchsgütern zu verfolgen.

Der folgende Code in viewDidLoad () führt ein paar Dinge aus, sobald die App startet:

 // Überprüfen Sie den Druck Ihrer In-App-Käufe ("NICHT VERBRAUCHSMATERIAL KAUF AUSGEBILDET: \ (nonConsumablePurchaseMade)") print ("COINS: \ (coins)") // Setzen Sie den Text coinsLabel.text = "COINS: \ (coins)" if nonConsumablePurchaseMade premiumLabel.text = "Premium-Version PURCHASED!"  else premiumLabel.text = "Premium-Version gesperrt!" // Verfügbare IAP-Produkte abrufen fetchAvailableProducts ()

Zuerst protokollieren wir einfach jeden Einkauf in der Xcode-Konsole. Dann zeigen wir die Gesamtmenge der Münzen an, die wir mit gekauft haben coinsLabel. Da wir die Demo-App zum ersten Mal ausführen, wird dies angezeigt MÜNZEN: 0.

Das ob Anweisung setzt die premiumLabelText entsprechend dem Kauf des nicht verbrauchbaren Produkts. Zunächst wird es angezeigt Premium-Version gesperrt! da wir den Premiumkauf noch nicht getätigt haben.

Die letzte Codezeile ruft eine Methode auf, die wir später sehen werden. Sie ruft einfach die Produkte ab, die wir zuvor in iTC gespeichert haben.

Nun wollen wir sehen, was die zwei Kauf-Buttons in unserer Demo-App tun:

// MARK: - KAUFEN Sie 10 COINS BUTTON @IBAction func buy10coinsButt (_ Absender: Beliebig) purchaseMyProduct (Produkt: iapProducts [0]) // MARK: - UNLOCK PREMIUM BUTTON @IBAction func unlockPremiumButt (_ Absender: Beliebig) buyMyProduct (Produkt: iapProducts [1])

Beide Methoden rufen eine Funktion auf, mit der geprüft wird, ob das Gerät Einkäufe tätigen kann. Wenn dies möglich ist, ruft die App die StoreKit-Delegatmethoden auf, um den Kauf abzuwickeln.

Wie bereits erwähnt, benötigen wir einen dritten Knopf, um unseren nicht verbrauchbaren Einkauf wiederherzustellen. Hier ist der Code:

// MARK: - RESTORE NON-CONSUMABLE KAUFKNOPF @IBAction func restorePurchaseButt (_ sender: Any) SKPaymentQueue.default (). Add (self) SKPaymentQueue.default (). RestoreCompletedTransactions () nonConsumablePurchaseMade = true UserDefaults.standard.set (nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade") UIAlertView (Titel: "IAP-Tutorial", Meldung: "Sie haben Ihren Einkauf erfolgreich wiederhergestellt!", delegieren: nil, cancelButtonTitle: "OK") .Show()  

Das IBAction Funktion ist an der Kauf wiederherstellen Taste in der Storyboard und stellt eine Verbindung mit dem In-App Purchase-System von Apple her, um den Kauf wiederherzustellen, falls dies bereits erfolgt ist.

paymentQueueRestoreCompletedTransactionsFinished () ist die Delegat-Methode aus dem StoreKit-Framework, mit der unser gespeichert wird nonConsumablePurchaseMade Variable auf wahr, nachdem der Kauf erfolgreich wiederhergestellt wurde.

Wir sind mit den Knöpfen fertig fetchAvailableProducts () Funktion macht:

// MARK: - FETCH VERFÜGBARE IAP-PRODUKTE func fetchAvailableProducts () // Fügen Sie hier Ihre IAP-Produkt-IDs productIdentifiers = NSSet (Objekte: COINS_PRODUCT_ID, PREMIUM_PRODUCT_ID) ein) productsRequest.delegate = self productsRequest.start () 

Wir erstellen zuerst eine Instanz von NSSet, Das ist im Grunde ein Array von Strings. Wir speichern die zwei Produkt-IDs, die wir dort zuvor deklariert haben.

Dann fangen wir an SKProdukteAnfrage basierend auf diesen Bezeichnern, damit die App die Informationen zu den IAP-Produkten (Beschreibung und Preis) anzeigt, die von dieser Delegatenmethode verarbeitet werden:

// MARK: - IAP-PRODUKTE ANFORDERN func productsRequest (_ request: SKProductsRequest, didReceive response: SKProductsResponse) if (response.products.count> 0) iapProducts = antwort.products // 1. IAP-Produkt (konsumierbar) ---- -------------------------------- Lassen Sie firstProduct = response.products [0] als SKProduct // den Preis von iTunes erhalten Connect let numberFormatter = NumberFormatter () numberFormatter.formatterBehavior = .behavior10_4 numberFormatter.numberStyle = .currency numberFormatter.locale = firstProduct.priceLocale let price1Str = numberFormatter.string (from: firstProduct.price) // Beschreibe die Beschreibung. localizedDescription + "\ nfür nur \ (price1Str!)" // -------------------------------- ------------ // Zweites IAP-Produkt (nicht konsumierbar) ---------------------------- - let secondProd = response.products [1] as SKProduct // Preis von iTunes Connect abrufen numberFormatter.locale = secondProd.priceLocale let price2Str = numberFormatter.string ( from: secondProd.price) // Beschreibung anzeigen nonConsumableLabel.text = secondProd.localizedDescription + "\ nfor just \ (price2Str!)" // ------------------- ----------------- 

In der oben genannten Funktion müssen wir zunächst prüfen, ob in iTunes Connect Produkte registriert sind, und unsere Einstellungen vornehmen iapProdukte Array entsprechend. Dann können wir die beiden initialisieren SK-Produkte und drucken Sie die Beschreibung und den Preis auf die Etiketten.

Bevor wir zum Kern des In-App Purchase-Codes gelangen, benötigen wir ein paar weitere Funktionen:

// MARK: - EINKAUF EINES PRODUKTS KAUFEN func canMakePurchases () -> Bool return SKPaymentQueue.canMakePayments () func purchaseMyProduct (Produkt: SKProduct) if self.canMakePurchases () lassen Sie Zahlung = SKPaymentQueue .default (). add (self) SKPaymentQueue.default (). add (payment) print ("PRODUKT ZUM KAUF: \ (product.productIdentifier)") productID = product.productIdentifier // IAP-Einkäufe sind auf dem Gerät verfügbar else  UIAlertView (Titel: "IAP-Lernprogramm", Nachricht: "Einkäufe sind auf Ihrem Gerät deaktiviert!", Delegate: nil, cancelButtonTitle: "OK"). Show () 

Die erste prüft, ob unser Gerät Einkäufe tätigen kann. Die zweite Funktion ist die, die wir von den beiden Tasten aus aufrufen. Es startet die Zahlungswarteschlange und ändert unsere Produkt ID Variable in die ausgewählte Produktidentifikator

Nun sind wir endlich bei der letzten Delegatenmethode angekommen, bei der die Zahlungsergebnisse verarbeitet werden:

// MARK: - IAP PAYMENT QUEUE func paymentQueue (Warteschlange: SKPaymentQueue, Transaktionstransaktionen aktualisiert: [SKPaymentTransaction]) für Transaktion: AnyObject in Transaktionen wenn Trans = Transaktion als zulässig ist? SKPaymentTransaction switch trans.transactionState Fall. Gekauft: SKPaymentQueue.default (). FinishTransaction (Transaktion als! SKPaymentTransaction) // Das Verbrauchsmaterial (10 Münzen) wurde gekauft -> 10 zusätzliche Münzen gewinnen! if productID == COINS_PRODUCT_ID // Addiere 10 Münzen und speichere ihren Gesamtbetrag Münzen + = 10 UserDefaults.standard.set (Münzen, fürSchlüssel: "Münzen") coinsLabel.text = "COINS: \ (coins)" UIAlertView (Titel: "IAP Tutorial", Nachricht: "Sie haben erfolgreich 10 zusätzliche Münzen gekauft!", Delegieren: nil, cancelButtonTitle: "OK"). Show () // Das Nicht-Verbrauchsmaterial (Premium) wurde gekauft!  else if productID == PREMIUM_PRODUCT_ID // Speichern Sie Ihren Einkauf lokal (nur für nicht konsumierbarer IAP erforderlich) nonConsumablePurchaseMade = true UserDefaults.standard.set (nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade") UIAlertView (Titel: "IAP-Lernprogramm", Nachricht: "Sie haben die Premium-Version erfolgreich entsperrt!", Delegate: nil, cancelButtonTitle: "OK"). Show () break case (Transaktion als! SKPaymentTransaction) break case .restored: SKPaymentQueue.default (). finishTransaction (Transaktion als! SKPaymentTransaction) break default: break

Diese Funktion hat eine Schalter Aussage, die jeden Zustand der Zahlung überprüft. Der Erste Fall Wird aufgerufen, wenn der Kauf erfolgreich abgeschlossen wurde und die Transaktion abgeschlossen ist. 

In diesem Block müssen wir prüfen, welche Produkt-ID wir ausgewählt haben, und die erforderlichen Aktionen zum Aktualisieren unserer App durchführen. Wenn wir also 10 zusätzliche Münzen kaufen, erhöhen wir unsere Münzen um 10 Münzen Variable, speichern Sie ihren Wert mit UserDefaults, Zeigen Sie die neue Menge an Münzen an, die wir gewonnen haben, und lösen Sie einen Alarm aus. 

Bitte beachten Sie, dass Sie diesen Kauf mehrmals ohne Einschränkungen durchführen können, da es sich um einen IAP für Verbrauchsmaterialien handelt und keine Wiederherstellungskauffunktion erforderlich ist.

Wenn wir ein nicht verbrauchbares Premium-Produkt gekauft haben, legt die App unseren Wert fest nonConsumablePurchaseMade Variable zu wahr, speichert es, ändert den Text der premiumLabel, und gibt eine Warnmeldung aus, um Sie über den erfolgreichen Kauf zu informieren. 

Die anderen zwei Fälle die Zahlungsergebnisse für Fehler und Wiederherstellung behandeln. Die App löst selbst benutzerdefinierte Benachrichtigungen aus, wenn Ihre Transaktion aus irgendeinem Grund fehlschlägt oder wenn Sie einen nicht-verbrauchbaren Einkauf wiederhergestellt haben.

Das ist es! Stellen Sie jetzt sicher, dass Sie mit Ihren Sandbox Tester-Anmeldeinformationen angemeldet sind, und führen Sie die App aus, um sie zu testen. Beim ersten Mal erhalten Sie eine Benachrichtigung wie diese:

Wählen Verwenden Sie die bestehende Apple-ID und geben Sie den Benutzernamen und das Kennwort Ihres Sandbox-Testers erneut ein, um sich anzumelden. Dies geschieht, weil die App nur einen echten Benutzer von der erkennt iTunes & App Store Einstellungen, keine Sandbox eins.

Sobald Sie sich angemeldet haben, können Sie beide Produkte kaufen.

CodeCanyon-Vorlagen

Wenn Sie mit iOS arbeiten und mehr über die Entwicklung von Swift Language und Apps erfahren möchten, überprüfen Sie einige meiner iOS-App-Vorlagen auf CodeCanyon. 

Es gibt auch Hunderte von anderen iOS-App-Vorlagen auf dem Envato-Markt, die bereit sind, neue Wege zu gehen und Ihren Arbeitsablauf zu beschleunigen. Geh und schau sie dir an! Sie sparen vielleicht nur Stunden an Arbeit für Ihre nächste App.

Fazit

In diesem Lernprogramm haben wir alle Schritte beschrieben, die zum Erstellen von In-App Purchase-Produkten in iTunes Connect erforderlich sind, und darüber, wie Sie den Code schreiben, um sie in Ihrer App zu aktivieren. Ich hoffe, Sie können dieses Wissen in Ihrer nächsten iOS-App einsetzen!

Danke fürs Lesen und bis zum nächsten Mal! Informieren Sie sich auch in unseren anderen Kursen und Tutorials zur Entwicklung von iOS-Apps mit Swift.