In-App Purchases i IOS Med Swift 3

Vad du ska skapa

Introduktion

In app-köp är en utmärkt funktion för alla dessa utvecklare som vill få mer intäkter och erbjuda extra innehåll och funktioner genom sina applikationer. Till exempel, för spel kan du köpa pärlor eller mynt, och för fotograferingsprogram kan du låsa upp nya effekter eller verktyg. Och du kan göra allt detta med hjälp av ett kreditkort eller annan betalningsmetod utan att avsluta appen. 

I denna handledning täcker jag alla nödvändiga steg för att skapa en förbrukningsartikel och Icke-förbruknings IAP-produkt på iTunes Connect, och jag visar koden du måste köpa båda objekten. Jag har gjort ett Xcode-projekt med en etikett och två knappar, så ladda ner det och följ med den här handledningen för att förstå hur det fungerar.

Skapa en Sandbox Tester i iTunes Connect

Jag antar att du redan har skapat en iOS-app i Mina appar avsnittet om iTunes Connect. Det första du bör göra är att skapa en Sandbox Tester för att testa IAP på din riktiga enhet (ingen simulator - den stöder inte inköp i app). 

Stiga på Användare och roller, gå till Sandbox Tester fliken och klicka på (+) tecken bredvid Testare.

Fyll i formuläret för att lägga till en ny sandbox tester. När du har sparat din info, gå tillbaka till Min app avsnittet och klicka på ikonen på din app för att ange detaljerna och skapa IAP-produkter.

Skapa IAP-produkter i iTunes Connect

Förbrukningsprodukter

Klicka på Funktioner fliken och sedan (+) tecken bredvid In-App Purchases. Du kan skapa en produkt i taget, så låt oss börja med en förbrukningsartikel ett.

en förbrukningsartikel IAP, som namnet antyder, är en produkt som du kan köpa flera gånger. Vi använder den för att samla ytterligare "mynt" i vår demo-app. 

Klick Skapa för att initiera din IAP-artikel. På nästa skärm kan du ställa in all information om din produkt:

  • referens namn: Detta namn kommer att användas på iTunes Connect och i Försäljning och trender rapporter. Den kommer inte att visas i App Store och du kan skriva vilket namn du vill, men det kan inte vara längre än 64 tecken.
  • Serienummer: En unik alfanumerisk identifierare som hämtas av appen för att känna igen din produkt. Vanligtvis använder utvecklare en web-omvänd syntax för produktsidor. I det här exemplet valde vi com.iaptutorial.coins. Senare klistrar vi in ​​detta ID som en sträng i vår kod.
  • Pris: Välj ett prisnivå i rullgardinsmenyn. Kom ihåg att för att kunna sälja din inköpsprodukt i appen i App Store måste du ha ansökt om en Betald ansökningsavtal i Avtal, Skatt & Bank sektion.
  • lokaliseringar: För denna handledning har vi valt endast engelska, men du kan lägga till fler språk genom att klicka på (+) knapp. Skriv sedan a Visningsnamn och a Beskrivning. Båda kommer att vara synliga på App Store. 
  • skärmdump: Ladda upp en skärmdump för granskning. Det kommer inte att visas i App Store och det måste ha en giltig storlek för din appplattform, så om din app är Universal kan du ladda upp en iPad skärmdump.
  • Granska Noter: Eventuella ytterligare uppgifter om din IAP som kan vara till hjälp för granskaren.

När du är klar klickar du på Spara och du får den här varningen:

Din första inköpskonto måste skickas in med en ny appversion. Markera det från appens In-App Purchases-avsnitt och klicka på Skicka.

Icke-konsumtionsprodukter

Klicka nu på knappen Köp i appen i listan till vänster, precis ovanför Spelcenter knappen och lägg till en ny IAP-produkt. Den här gången väljer du Icke-förbruknings alternativ:

Klick Skapa och upprepa de steg vi nämnde ovan. Eftersom detta kommer att bli a Icke-förbruknings produkt kan användarna bara köpa den en gång, och Apple kräver möjligheten att återställa sådana inköp. Det händer om du avinstallerar appen och installerar om den igen, eller laddar den ner från en annan enhet med samma Apple-ID och behöver få tillbaka dina inköp utan att betala för dem två gånger. Så sen lägger vi till en Återställa inköp funktion i vår kod.

Det produkt-ID som vi skapade nu är com.iaptutorial.premium, med ett prisnivå på USD 2,99. Vi har ringt det Lås upp Premium Version.

När du är klar med att fylla i alla fält, spara din produkt och gå tillbaka till sidan Köp på sidan. Nu ska du ha en lista över dina två produkter, med deras namn, Typ, ID och Status Välj som Klar att skicka in.

Gå tillbaka till din apps sida genom att klicka på App Store och Förbered för inlämning knappar. Bläddra ner till In-App Purchases avsnittet, nedanför Allmän Appinformation, och klicka på (+) knappen för att lägga till dina IAP-produkter. 

Markera dem alla och klicka Gjort.

Slutligen klickar du på Spara i det övre högra hörnet av skärmen och du kommer att göra med att konfigurera In-App Purchase-produkter på iTunes Connect.

Logga in på Sandbox Tester på en iOS-enhet

Innan du kommer till koden finns det en sak kvar att göra. Gå till inställningar > iTunes & App Store på din iOS-enhet. Om du redan är inloggad med ditt ursprungliga Apple-ID klickar du på det och väljer Logga ut. Logga sedan enkelt in med referensuppgifterna för den sandboxprovtagare du skapade. Efter inloggning kan du få en varning så här:

Bara ignorera sitt meddelande och knacka på Annullera. Din enhet kommer att fråga dig din sandlåda inloggningsuppgifter igen när du försöker göra ett köp och kommer att känna igen ditt testkonto så att du inte debiteras ett öre på ditt kreditkort för inköp du gör.

Utgång inställningar, anslut din enhet till din Mac via USB-kabeln och låt oss äntligen börja kodning!

Koden

Om du har laddat ner vårt demoprojekt ser du att all nödvändig kod för inköp i inköp har skrivits, så om du kör det får du något av följande:

Om du vill testa appen bör du ändra Bundle Identifier till ditt eget id. Annars kan Xcode inte låta dig köra appen på en riktig enhet och appen känner inte igen de två IAP-produkterna du har skapat.


Stiga på ViewController.swift och kolla koden. Först och främst har vi lagt till ett importdeklaration för StoreKit och de delegater vi behöver för att spåra betalningstransaktioner och produktförfrågningar.

importera StoreKit-klass ViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver 

Sedan har vi förklarat några synpunkter som kommer att vara användbara.

 / * Visningar * / @IBOutlet svaga var myntLabel: UILabel! @IBOutlet svag var premiumLabel: UILabel! @IBOutlet svag varförbrukningLabel: UILabel! @IBOutlet weak var nonConsumableLabel: UILabel! 

coinsLabel och premiumLabel kommer att användas för att visa resultaten av inköp för båda produkterna. consumableLabel och nonConsumableLabel kommer att visa beskrivningen och priset för varje IAP-produkt, de som vi tidigare skapat i iTunes Connect. 

Nu är det dags att lägga till några variabler:

/ * Variabler * / låt COINS_PRODUCT_ID = "com.iaptutorial.coins" låta PREMIUM_PRODUCT_ID = "com.iaptutorial.premium" var productID = "" var productsRequest = SKProductsRequest () var iapProducts = [SKProduct] () var nonConsumablePurchaseMade = UserDefaults.standard .bool (förKey: "nonConsumablePurchaseMade") var mynt = UserDefaults.standard.integer (förKey: "mynt") 

De två första raderna är att återkalla våra produkt-ID. Det är viktigt att de här strängarna exakt matchar de som registrerats i iTunes Connects In-App Purchase-avsnitt.

  • Serienummer är en sträng vi ska använda senare för att upptäcka vilken produkt vi kommer att välja att köpa.
  • productsRequest är en förekomst av SKProductsRequest, behövs för att söka efter IAP-produkter från din app på iTC.
  • iapProducts är en enkel uppsättning av SKProducts. Observera att SK-prefixet betyder StoreKit, det iOS-ramverk som vi ska använda för att hantera inköp.

De två sista raderna laddar två variabler av typen Boolean och Heltal behövde spåra inköp av mynt och premiumversionen, respektive förbrukningsbara och icke-förbrukningsbara produkter.

Följande kod i viewDidLoad () utför några saker så snart appen startar:

 // Kontrollera dina inköp i inköp ("NON CONSUMABLE PURCHASE MADE: \ (nonConsumablePurchaseMade)") print ("COINS: \ (mynt)" // Ange textmyntLabel.text = "Mynt: \ (mynt)" om nonConsumablePurchaseMade premiumLabel.text = "Premium version KÖP!"  else premiumLabel.text = "Premium version LOCKED!" // Hämta IAP-produkter tillgängliga hämtaAvailableProducts ()

Först loggar vi bara varje köp till Xcode-konsolen. Då visar vi den totala mängden mynt som vi köpt med coinsLabel. Eftersom vi kör demo-appen för första gången kommer den att visas Mynt: 0.

De om uttalande anger premiumLabels text beroende på om den icke-förbrukningsbara produkten köptes. För att börja visas det Premium version LOCKED! eftersom vi inte har gjort premieinköp ännu.

Den sista raden av kod kallar en metod vi ser senare, som bara hämtar de produkter som vi tidigare lagrat i iTC.

Låt oss nu se vad de två köpknapparna vi har angett i vår demoapp gör:

// MARK: - KÖP 10 COINS KNAPP @IBAction func buy10coinsButt (_ avsändare: Alla) buyMyProduct (produkt: iapProducts [0]) // // MARK: - Lås upp PREMIUM KNAPP @IBAction func unlockPremiumButt (_ avsändare: Any) buyMyProduct (produkt: iapProducts [1])

Båda metoderna kommer att ringa en funktion som kommer att kontrollera om enheten kan göra inköp, och om det kan, kommer appen att ringa till StoreKit delegatmetoderna för att behandla köpet.

Som tidigare nämnts behöver vi en tredje knapp för att återställa vårt icke-förbrukningsbara köp. Här är dess kod:

// MARK: - RESTORE NON CONSUMABLE KÖP KNAPP @IBAction func restorePurchaseButt (_ avsändare: Any) SKPaymentQueue.default (). Lägg till (själv) SKPaymentQueue.default (). RestoreCompletedTransactions () func paymentQueueRestoreCompletedTransactionsFinished (_ kö: SKPaymentQueue) nonConsumablePurchaseMade = true UserDefaults.standard.set (nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade") UIAlertView (titel: "IAP Tutorial", meddelande: "Du har lyckats återställa ditt köp!", delegera: noll, avbrytButtonTitle: "OK") .show()  

De IBAction funktionen är ansluten till Återställa inköp knapp i Storyboard och börjar ansluta till Apples inköpssystem för inköp för att återställa köpet om det redan har gjorts.

paymentQueueRestoreCompletedTransactionsFinished () är delegatmetoden från StoreKit-ramverket som kommer att spara vårt nonConsumablePurchaseMade variabel till sann efter köpet har återställts.

Vi är färdiga med knappar, så låt oss se vad fetchAvailableProducts () funktionen gör:

// MARK: - FETCH TILLGÄNGLIGA IAPPRODUKTER func fetchAvailableProducts () // Sätt här ditt IAP-produkt-IDs låt productIdentifiers = NSSet (objekt: COINS_PRODUCT_ID, PREMIUM_PRODUCT_ID) productsRequest = SKProductsRequest (productIdentifiers: productIdentifiers as! Set) produkterRequest.delegate = självprodukterRequest.start () 

Vi skapar först en förekomst av NSSet, vilket är i grunden en rad strängar. Vi lagrar de två produkt-ID-erna som vi tidigare har deklarerat där.

Då börjar vi en SKProductsRequest baserat på dessa identifierare, för att appen ska kunna visa informationen om IAP-produkterna (beskrivning och pris), som kommer att behandlas av den här delegerade metoden:

// MARK: - ANMÄRKA IAPPRODUKTER func productsRequest (_ request: SKProductsRequest, didReceive response: SKProductResponse) if (response.products.count> 0) iapProducts = response.products // 1: a IAP-produkt (förbrukningsvaror) ---- -------------------------------- låt firstProduct = response.products [0] som SKProduct // Hämta priset från iTunes Anslut låt numberFormatter = NumberFormatter () numberFormatter.formatterBehavior = .behavior10_4 numberFormatter.numberStyle = .currency numberFormatter.locale = firstProduct.priceLocale låt pris1Str = numberFormatter.string (från: firstProduct.price) // Visa dess beskrivning consumableLabel.text = firstProduct. localizedDescription + "\ nfor just \ (price1Str!)" // ------------------------------------ ------------ // 2: a IAP-produkt (icke förbrukningsbar) ---------------------------- - låt secondProd = response.products [1] som SKProdukt // Hämta priset från iTunes Anslut numberFormatter.locale = secondProd.priceLocale låt price2Str = numberFormatter.string ( från: secondProd.price) // Visa dess beskrivning nonConsumableLabel.text = secondProd.localizedDescription + "\ nfor just \ (price2Str!)" // ------------------- ----------------- 

I funktionen ovan måste vi först kontrollera om det finns några produkter registrerade i iTunes Connect och set vårt iapProducts array därefter. Då kan vi initiera de två SKProducts och skriv ut deras beskrivning och pris på etiketterna.

Innan vi kommer till kärnan i inköpskoden i app behöver vi ett par fler funktioner:

// MARK: - GÖR KÖP AV EN PRODUKTFUNKTIONSÖKNING () -> Bool return SKPaymentQueue.canMakePayments () func buyMyProduct (produkt: SKProduct) om self.canMakePurchases () let payment = SKPayment (produkt: produkt) SKPaymentQueue Lägg till (själv) SKPaymentQueue.default (). lägg till (betalning) skriv ut ("PRODUKT FÖR KÖP: \ (product.productIdentifier)") productID = product.productIdentifier // IAP Köp dsabled på enheten else  UIAlertView (titel: "IAP Tutorial", meddelande: "Inköp är inaktiverade i din enhet!", Delegera: noll, avbrytButtonTitle: "OK"). Visa () 

Den första kontrollerar om enheten kan göra inköp. Den andra funktionen är den som vi ringer från de två knapparna. Det startar betalningskön och ändrar vår Serienummer variabel i den valda Produktidentifierare

Nu har vi äntligen kommit fram till den sista delegatmetoden, den som hanterar betalningsresultat:

// MARK: - IAP BETALNING QUEUE func paymentQueue (_ kö: SKPaymentQueue, updatedTransactions transaktioner: [SKPaymentTransaction]) för transaktion: AnyObject i transaktioner om låt trans = transaktion som? SKPaymentTransaction switch trans.transactionState case.curchased: SKPaymentQueue.default (). FinishTransaction (transaktion som! SKPaymentTransaction) // Konsumtionsprodukten (10 mynt) har köpts -> få 10 extra mynt! om productID == COINS_PRODUCT_ID // Lägg till 10 mynt och spara deras totala antal mynt + = 10 UserDefaults.standard.set (mynt, förKey: "mynt") coinsLabel.text = "COINS: \ (mynt)" UIAlertView (titel: "IAP Tutorial", meddelande: "Du har framgångsrikt köpt 10 extra mynt!", Delegera: noll, cancelButtonTitle: "OK"). Visa () // Den icke-förbrukningsbara produkten (Premium) har köpts!  annars om productID == PREMIUM_PRODUCT_ID // Spara ditt köp lokalt (behövs endast för icke-förbrukningsbara IAP) nonConsumablePurchaseMade = sant UserDefaults.standard.set (nonConsumablePurchaseMade, förKey: "nonConsumablePurchaseMade") premiumLabel.text = "Premium version KÖP!" UIAlertView (titel: "IAP Tutorial", meddelande: "Du har framgångsrikt låst upp Premium-versionen!", Delegera: noll, avbrytButtonTitle: "OK"). Visa () fallbyte. Misslyckades: SKPaymentQueue.default (). FinishTransaction (transaktion som! SKPaymentTransaction) break case .restored: SKPaymentQueue.default (). finishTransaction (transaktion som! SKPaymentTransaction) break default: break

Denna funktion har a växla uttalande som kontrollerar alla betalningsvillkor. Den första fall kallas om inköpet har blivit framgångsrikt och slutfört sin transaktion. 

Inom det här blocket måste vi kolla vilket produkt-ID vi har valt och utföra nödvändiga åtgärder för att uppdatera vår app-så om vi köpte 10 extra mynt lägger vi 10 till vår mynt variabel, spara dess värde med UserDefaults, visa den nya mängden mynt vi fått och skjut en varning om det. 

Observera att du kan göra detta köp flera gånger utan gränser eftersom det är en förbrukningsbar IAP, och det är inte nödvändigt att återställa köpfunktionen.

På samma sätt, om vi köpte den icke-förbrukningsbara premiumprodukten, stämmer appen vår nonConsumablePurchaseMade variabel till Sann, sparar det, ändrar texten till premiumLabel, och avfyras för att meddela dig att köpet har blivit framgångsrikt. 

De andra två fall hantera betalningsresultatet för fel och återställande. Appen kommer att branda anpassade varningar på egen hand om din transaktion misslyckas av någon anledning eller om du har återställt ett icke-förbrukat köp.

Det är allt! Nu bara se till att du är inloggad med dina Sandbox Tester-uppgifter och kör appen för att testa den. Första gången får du en varning så här:

Välja Använd existerande Apple id och ange ditt Sandbox Tester användarnamn och lösenord igen för att logga in. Det här händer eftersom appen bara kan känna igen en riktig användare från iTunes & App Store inställningar, inte en sandlåda en.

När du har loggat in kan du göra inköp av båda produkterna.

CodeCanyon Templates

Om du arbetar med iOS och vill bli djupare in i Swift språk och apps utveckling, kolla in några av mina iOS-appmallar på CodeCanyon. 

Det finns hundratals andra iOS-appmallar på Envato-marknaden, redo att bli omhändertagna och säker på att påskynda ditt arbetsflöde. Gå kolla in dem! Du kanske bara sparar arbetstid på din nästa app.

Slutsats

I den här handledningen har vi täckt alla steg som behövs för att skapa In-App Purchase-produkter på iTunes Connect och hur du skriver koden för att aktivera dem i din app. Jag hoppas att du kan använda denna kunskap i din nästa iOS-app!

Tack för att du läser, och vi ses nästa gång! Vänligen kolla in våra andra kurser och handledning om iOS apputveckling med Swift.