Kjøp i app i IOS Med Swift 3

Hva du skal skape

Introduksjon

Kjøp av app er en flott funksjon for alle de utviklere som ønsker å få mer inntekter og tilby ekstra innhold og funksjoner gjennom deres applikasjoner. For eksempel kan du kjøpe perler eller mynter for spill, og for fotograferingsprogrammer kan du låse opp nye effekter eller verktøy. Og du kan gjøre alt dette ved hjelp av et kredittkort eller en annen betalingsmetode, uten å avslutte appen. 

I denne veiledningen vil jeg dekke alle nødvendige trinn for å opprette en Konsum og Ikke-Konsum IAP-produkt på iTunes Connect, og jeg vil vise deg koden du må kjøpe begge elementene. Jeg har laget et eksempel på Xcode-prosjekt med en etikett og to knapper, så last den ned og følg med denne opplæringen for å forstå hvordan det fungerer.

Opprett en sandkasse tester i iTunes Connect

Jeg antar at du allerede har opprettet en iOS-app i Mine apper delen på iTunes Connect. Det første du bør gjøre er å opprette en Sandkasse Tester å teste IAP på din ekte enhet (ingen simulator - den støtter ikke kjøp i app). 

Tast inn Brukere og roller, gå til Sandkasse Tester kategorien, og klikk på (+) Tegn ved siden av tester.

Fyll ut skjemaet for å legge til en ny sandkasse tester. Når du har lagret informasjonen din, går du tilbake til Min app delen og klikk på ikonet for appen din for å angi detaljer og opprette IAP-produkter.

Opprett IAP-produkter i iTunes Connect

Forbruksvarer

Klikk på Egenskaper kategorien og deretter (+) Tegn ved siden av Kjøp i app. Du kan opprette ett produkt om gangen, så la oss starte med en Konsum en.

EN Konsum IAP, som navnet antyder, er et produkt som du kan kjøpe flere ganger. Vi bruker den til å samle flere "mynter" i vår demo-app. 

Klikk Skape å initialisere ditt IAP-element. På neste skjermbilde kan du sette opp all informasjon om produktet ditt:

  • referansenavn: Dette navnet vil bli brukt på iTunes Connect og i Salg og trender rapporter. Det vises ikke i App Store, og du kan skrive inn hvilket som helst navn du vil, men det kan ikke være lenger enn 64 tegn.
  • Produkt ID: En unik alfanumerisk identifikator som hentes av appen for å gjenkjenne produktet. Vanligvis bruker utviklere en web-omvendt syntaks for produktidentifikasjoner. I dette eksemplet valgte vi com.iaptutorial.coins. Senere pakker vi inn denne ID-en som en streng i koden vår.
  • Pris: Velg en prisnivå fra rullegardinmenyen. Husk at for å kunne selge kjøperproduktet i appen på App Store, må du ha søkt om en Betalt programavtale i Avtaler, Skatt og Banking seksjon.
  • lokaliseringer: For denne veiledningens skyld har vi valgt bare engelsk, men du kan legge til flere språk ved å klikke på (+) -knappen. Skriv deretter a Visningsnavn og a Beskrivelse. Begge blir synlige på App Store. 
  • Skjermbilde: Last opp et skjermbilde for gjennomgang. Den vises ikke i App Store, og den må ha en gyldig størrelse for appplattformen din, så hvis appen din er Universal, kan du laste opp et iPad-skjermbilde.
  • Review Notes: Eventuelle tilleggsinformasjon om din IAP som kan være nyttig for korrekturleseren.

Når du er ferdig, klikk Lagre og du får denne advarselen:

Din første kjøp i appen må sendes med en ny appversjon. Velg den fra appens In-App Purchases-seksjon, og klikk på Send.

Ikke-forbruksprodukter

Klikk nå på innkjøpsknappen på listen i listen til venstre, rett over Spillsenter knappen, og legg til et nytt IAP-produkt. Denne gangen velger du Ikke-Konsum alternativ:

Klikk Skape og gjenta trinnene vi nevnte ovenfor. Siden dette blir en Ikke-Konsum produkt, vil brukerne kun kunne kjøpe det en gang, og Apple krever muligheten til å gjenopprette slike kjøp. Det skjer hvis du avinstallerer appen og installerer den på nytt, eller laster den ned fra en annen enhet med samme Apple ID, og ​​du må få tilbake kjøpene dine uten å betale for dem to ganger. Så senere legger vi til en Gjenopprett kjøp fungere i vår kode.

Produkt-IDen vi opprettet nå er com.iaptutorial.premium, med en prisnivå på USD 2,99. Vi har kalt det Lås opp Premium Versjon.

Når du er ferdig med å fylle alle feltene, lagrer du produktet og går tilbake til siden for kjøp av varer. Nå bør du ha en liste over dine to produkter, med deres Navn, Type, ID og Status angitt som Klar til å sende inn.

Gå tilbake til appens side ved å klikke på App Store og Forbered deg på innsendelse knapper. Rull ned til Kjøp i app delen, rett under Generell appinformasjon, og klikk til (+) knappen for å legge til dine IAP-produkter. 

Velg alle dem og klikk Ferdig.

Til slutt klikker du Lagre i øverste høyre hjørne av skjermen, og du vil bli ferdig med å konfigurere In-App Purchase-produkter på iTunes Connect.

Logg inn på Sandbox Tester på en iOS-enhet

Før du kommer til koden, er det en ting igjen å gjøre. Gå til innstillinger > iTunes og App Store på iOS-enheten din. Hvis du allerede er logget på med din originale Apple-ID, klikker du på den og velger Logg ut. Deretter logger du ganske enkelt inn med legitimasjonene for sandkasse testeren du opprettet. Etter at du har logget inn, kan du få et varsel som dette:

Bare ignorere meldingen og trykk Avbryt. Enheten vil spørre deg om sandkassen din påloggingsinformasjonen igjen når du prøver å foreta et kjøp og vil gjenkjenne testkontoen din slik at du ikke vil bli belastet en krone på kredittkortet ditt for ethvert kjøp du gjør.

Exit innstillinger, koble enheten til din Mac via USB-kabelen, og la oss endelig starte kodingen!

Koden

Hvis du har lastet ned vårt demo-prosjekt, vil du se at all nødvendig kode for innkjøps kjøp er skrevet, så hvis du kjører det, får du noe slikt:

Hvis du vil teste appen, bør du endre Bundle Identifier til ditt eget id. Ellers vil Xcode ikke tillate deg å kjøre appen på en ekte enhet, og appen vil ikke gjenkjenne de to IAP-produktene du har opprettet.


Tast inn ViewController.swift og sjekk koden. Først av alt har vi lagt til en importerklæring for StoreKit og de delegatene vi trenger for å spore betalingstransaksjoner og produktforespørsler.

importer StoreKit klasse ViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver 

Da har vi erklært noen få visninger som vil være nyttige.

 / * Visninger * / @IBOutlet svake varmynterLabel: UILabel! @IBOutlet svak var premiumLabel: UILabel! @IBOutlet svak varforbrukbarLabel: UILabel! @IBOutlet svak var nonConsumableLabel: UILabel! 

coinsLabel og premiumLabel vil bli brukt til å vise resultatene av kjøp for begge produktene. consumableLabel og nonConsumableLabel vil vise beskrivelsen og prisen på hvert IAP-produkt, de som vi tidligere har opprettet i iTunes Connect. 

Nå er det på tide å legge til noen variabler:

/ * Variabler * / la COINS_PRODUCT_ID = "com.iaptutorial.coins" la PREMIUM_PRODUCT_ID = "com.iaptutorial.premium" var productID = "" var productsRequest = SKProductsRequest () var iapProducts = [SKProdukt] () var nonConsumablePurchaseMade = UserDefaults.standard .bool (forKey: "nonConsumablePurchaseMade") var mynter = UserDefaults.standard.integer (forKey: "mynt") 

De to første linjene er å huske våre produkt-IDer. Det er viktig at disse strengene akkurat samsvarer med de som er registrert i iTunes Connects kjøp av appen.

  • Produkt ID er en streng vi bruker senere for å oppdage hvilket produkt vi vil velge å kjøpe.
  • productsRequest er en forekomst av SKProductsRequest, trengte å søke etter IAP-produkter fra appen din på iTC.
  • iapProducts er en enkel rekke av SKProducts. Vær oppmerksom på at SK-prefiks betyr StoreKit, det iOS-rammeverket vi skal bruke til å håndtere kjøp.

De to siste linjene laster to variabler av typen boolean og Integer trengte å spore kjøp av mynter og premium-versjonen, henholdsvis forbruks- og ikke-forbruksvarer.

Følgende kode i viewDidLoad () utfører noen få ting så snart appen starter:

 // Sjekk innkjøpene i appen ("IKKE FORBRUKT KJØP MADE: \ (nonConsumablePurchaseMade)") utskrift ("Mynter: \ (mynter)" // Sett tekstmynterLabel.text = "Mynter: \ (mynter)" hvis nonConsumablePurchaseMade premiumLabel.text = "Premium versjon kjøpt!"  else premiumLabel.text = "Premium versjon LOCKED!" // Hent IAP-produkter tilgjengelig henteAvailableProducts ()

Først logger vi hvert kjøp til Xcode-konsollen. Deretter viser vi samlet antall mynter som vi kjøpte med coinsLabel. Siden vi kjører demo-appen for første gang, vil den vise Mynter: 0.

De hvis setningen setter premiumLabels tekst i henhold til om ikke-forbruksproduktet ble kjøpt. For å starte, vil det vise Premium versjon LÅSET! siden vi ikke har foretatt premieinnkjøpet ennå.

Den siste kodelinjen kaller en metode vi vil se senere, som bare henter produktene vi tidligere har lagret i iTC.

La oss nå se hva de to kjøpsknappene vi har satt i vår demo-app gjør:

// MARK: - KJØP 10 MILLER KNAPP @IBAction func buy10coinsButt (_ sender: Enhver) buyMyProduct (produkt: iapProducts [0]) // MARK: - Lås opp PREMIUM KNAPP @IBAction func unlockPremiumButt (_ sender: Any) buyMyProduct (produkt: iapProducts [1])

Begge metodene kaller en funksjon som vil sjekke om enheten kan foreta kjøp, og hvis det kan, vil appen ringe StoreKit-delegatemetodene for å behandle kjøpet.

Som nevnt tidligere trenger vi en tredje knapp for å gjenopprette vårt ikke-forbruksomme kjøp. Her er koden sin:

// MARK: - Gjenopprett IKKE-FORBRUKT KJØP KNAPP @IBAction func restorePurchaseButt (_ sender: Any) SKPaymentQueue.default (). Legg til (selv) SKPaymentQueue.default (). RestoreCompletedTransactions () func paymentQueueRestoreCompletedTransactionsFinished (_ kø: SKPaymentQueue) nonConsumablePurchaseMade = ekte UserDefaults.standard.set (nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade") UIAlertView (tittel: "IAP Tutorial", melding: "Du har vellykket kjøpet ditt!", delegere: null, avbrytButtonTitle: "OK") .vise fram()  

De IBAction funksjonen er festet til Gjenopprett kjøp knappen i Storyboard og begynner å koble til Apples innkjøpssystem for kjøp for å gjenopprette kjøpet hvis det allerede er gjort.

paymentQueueRestoreCompletedTransactionsFinished () er delegatemetoden fra StoreKit-rammen som vil redde vår nonConsumablePurchaseMade variabel til sann etter at kjøpet har blitt gjenopprettet.

Vi er ferdige med knapper, så la oss se hva fetchAvailableProducts () funksjon gjør:

// MARK: - FETCH TILGJENGELIGE IAPPRODUKTER func fetchAvailableProducts () // Sett her din IAP-produkt ID er la productIdentifiers = NSSet (objekter: COINS_PRODUCT_ID, PREMIUM_PRODUCT_ID) productsRequest = SKProductsRequest (productIdentifiers: productIdentifiers as! Set) productsRequest.delegate = selvprodukterRequest.start () 

Vi lager først en forekomst av NSSet, som er i utgangspunktet en rekke strenger. Vi lagrer de to produkt-IDene vi tidligere har erklært der.

Så starter vi en SKProductsRequest basert på disse identifikasjonene, slik at appen kan vise informasjonen om IAP-produktene (beskrivelse og pris), som behandles av denne delegatemetoden:

// MARK: - FORSØK IAPPRODUKTER func productsRequest (_ request: SKProductsRequest, didReceive respons: SKProductResponse) if (response.products.count> 0) iapProducts = response.products // 1. IAP Produkt (Forbruk) ---- -------------------------------- La førstProdukt = response.products [0] som SKProdukt // Få prisen fra iTunes Koble låt numberFormatter = NumberFormatter () numberFormatter.formatterBehavior = .behavior10_4 numberFormatter.numberStyle = .currency numberFormatter.locale = firstProduct.priceLocale la price1Str = numberFormatter.string (fra: firstProduct.price) // Vis beskrivelsen consumableLabel.text = firstProduct. localizedDescription + "\ nfor just \ (price1Str!)" // ------------------------------------ ------------ // 2. IAP-produkt (ikke-forbrukbar) ---------------------------- - la secondProd = response.products [1] som SKProdukt // Få prisen fra iTunes Koble til nummerFormatter.locale = secondProd.priceLocale la price2Str = numberFormatter.string ( fra: secondProd.price) // Vis beskrivelsen nonConsumableLabel.text = secondProd.localizedDescription + "\ nfor bare \ (price2Str!)" // ------------------- ----------------- 

I funksjonen ovenfor må vi først sjekke om det finnes produkter registrert i iTunes Connect og sett inn iapProducts array tilsvarende. Da kan vi initialisere de to SKProducts og skriv ut deres beskrivelse og pris på etikettene.

Før vi kommer til kjernen i In-App Purchase-koden, trenger vi et par flere funksjoner:

// MARK: - GJØR KJØP AV ET PRODUKTFUNKSJONKAPERMAKKOPPKØP () -> Bool return SKPaymentQueue.canMakePayments () func buyMyProduct (produkt: SKProdukt) hvis self.canMakePurchases () let payment = SKPayment (produkt: produkt) SKPaymentQueue Legg til (selv) SKPaymentQueue.default (). legg til (betaling) print ("PRODUKT TIL KJØP: \ (product.productIdentifier)") productID = product.productIdentifier // IAP Kjøp dsabled på enheten else  UIAlertView (tittel: "IAP Tutorial", melding: "Innkjøp er deaktivert i enheten!", Delegere: null, avbrytButtonTitle: "OK"). Show () 

Den første kontrollerer om enheten vår kan kjøpe. Den andre funksjonen er den vi kaller fra de to knappene. Det starter betalingskøen og endrer vår Produkt ID variabel inn i den valgte productIdentifier

Nå har vi endelig kommet til den siste delegatemetoden, den som håndterer betalingsresultatene:

// MARK: - IAP BETALING QUEUE func paymentQueue (_ kø: SKPaymentQueue, updatedTransactions transaksjoner: [SKPaymentTransaction]) for transaksjon: AnyObject i transaksjoner hvis la trans = transaksjon som? SKPaymentTransaction switch trans.transactionState case.curchased: SKPaymentQueue.default (). FinishTransaction (transaksjon som! SKPaymentTransaction) // Konsumproduktet (10 mynter) er kjøpt -> få 10 ekstra mynter! hvis productID == COINS_PRODUCT_ID // Legg til 10 mynter og lagre deres totale antall mynter + = 10 UserDefaults.standard.set (mynter, forKey: "mynter") coinsLabel.text = "COINS: \ (mynter)" UIAlertView (tittel: "IAP Tutorial", melding: "Du har vellykket kjøpt 10 ekstra mynter!", Delegere: null, avbrytButtonTitle: "OK"). Show () // Ikke-forbruksproduktet (Premium) er kjøpt!  ellers hvis productID == PREMIUM_PRODUCT_ID // Lagre kjøpet ditt lokalt (kun nødvendig for ikke-forbrukbare IAP) nonConsumablePurchaseMade = ekte UserDefaults.standard.set (nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade") premiumLabel.text = "Premium versjon kjøpt!" UIAlertView (tittel: "IAP Tutorial", melding: "Du har lykkes opplåses Premium-versjonen!", Delegere: null, avbrytButtonTitle: "OK"). Show () pause sak .failed: SKPaymentQueue.default (). FinishTransaction (transaksjon som! SKPaymentTransaction) pause tilfelle .restored: SKPaymentQueue.default (). finishTransaction (transaksjon som! SKPaymentTransaction) pause standard: pause

Denne funksjonen har a bytte om uttalelse som kontrollerer hver betalingsform. Den første sak blir ringt hvis kjøpet har blitt gjort og fullfører transaksjonen. 

I denne blokken må vi sjekke hvilken produkt-ID vi har valgt, og utfør de nødvendige tiltakene for å oppdatere appen vår, så hvis vi bruker 10 ekstra mynter, legger vi 10 til vår mynter variabel, lagre verdien med UserDefaults, vis den nye mengden mynter vi har fått, og brann et varsel om det. 

Vær oppmerksom på at du kan gjøre dette kjøpet flere ganger uten begrensninger, siden det er en forbruksvarer-IAP, og det er ikke behov for gjenopprettingsfunksjon.

På samme måte, hvis vi kjøpte det ikke-forbruksmessige premiumproduktet, setter appen vår nonConsumablePurchaseMade variabel til ekte, lagrer det, endrer teksten til premiumLabel, og brenner et varsel for å varsle deg om at kjøpet har vært vellykket. 

De to andre saker håndter betalingsresultatene for feil og gjenoppretting. Appen vil brenne egendefinerte varsler selv hvis transaksjonen din mislykkes av en eller annen grunn, eller hvis du har gjenopprettet et ikke-forbrukbart kjøp.

Det er det! Nå bare sørg for at du er logget inn med din Sandbox Tester-legitimasjon og kjør appen for å teste den. Første gang får du et varsel slik:

Velge Bruk eksisterende Apple ID og skriv inn ditt Sandbox Tester brukernavn og passord igjen for å logge på. Dette skjer fordi appen bare kan gjenkjenne en ekte bruker fra iTunes og App Store innstillinger, ikke en sandkasse en.

Når du har logget inn, kan du utføre kjøp av begge produktene.

CodeCanyon Maler

Hvis du jobber med iOS og ønsker å bli dypere i utviklingen av swift språk og apps, kan du sjekke noen av mine iOS-appmaler på CodeCanyon. 

Det finnes hundrevis av andre iOS-appmaler på Envato-markedet, klar til å bli reskinned og sikker på å øke hastigheten på arbeidsflyten din. Gå sjekk dem ut! Du kan bare spare arbeidstimer på din neste app.

Konklusjon

I denne opplæringen har vi dekket alle trinnene som trengs for å lage innkjøpsprodukter for apper på iTunes Connect, og hvordan du skriver koden for å aktivere dem i appen din. Jeg håper du kan sette denne kunnskapen i bruk i din neste iOS-app!

Takk for at du leser, og jeg ser deg neste gang! Vennligst sjekk ut våre andre kurs og opplæringsprogrammer om iOS app utvikling med Swift.