Achiziționarea în aplicație este o caracteristică excelentă pentru toți dezvoltatorii care doresc să obțină mai multe venituri și să ofere conținut și funcții suplimentare prin intermediul aplicațiilor lor. De exemplu, pentru jocuri poți cumpăra pietre sau monede, iar pentru aplicațiile de fotografie poți să deblochezi noi efecte sau instrumente. Și puteți face toate acestea folosind un card de credit sau altă metodă de plată, fără a ieși din aplicație.
În acest tutorial voi acoperi toți pașii necesari pentru a crea un Consumabil și Neconsumabil Produs IAP de pe iTunes Connect și vă voi arăta codul de care aveți nevoie pentru a achiziționa ambele articole. Am facut un proiect Xcode cu o eticheta si doua butoane, asa ca descarcati-l si urmati impreuna cu acest tutorial pentru a intelege cum functioneaza.
Presupun că ați creat deja o aplicație pentru iOS în Aplicatiile mele secțiune pe iTunes Connect. Primul lucru pe care ar trebui să-l faceți este să creați a Tester de nisip pentru a testa IAP pe dispozitivul dvs. real (fără simulator - nu acceptă achiziții în aplicație).
introduce Utilizatori și roluri, du-te la Tester de nisip și faceți clic pe butonul (+) semn lângă laborant.
Completați formularul pentru a adăuga un nou tester pentru sandbox. După ce ați salvat informațiile dvs., reveniți la Aplicația mea și faceți clic pe pictograma aplicației pentru a introduce detaliile acesteia și a crea produse IAP.
Apasă pe Caracteristici tab și apoi (+) semn lângă Achiziții în aplicație. Puteți crea câte un produs la un moment dat, deci începeți cu a Consumabil unu.
A Consumabil IAP, așa cum sugerează și numele, este un produs pe care îl puteți cumpăra de mai multe ori. Îl vom folosi pentru a colecta "monede" suplimentare în aplicația noastră demo.
Clic Crea pentru a inițializa elementul dvs. IAP. În ecranul următor, puteți configura toate informațiile despre produsul dvs.:
După ce ați terminat, faceți clic pe Salvați și veți primi această alertă:
Prima achiziție în aplicație trebuie trimisă cu o nouă versiune de aplicație. Selectați-l din secțiunea Achiziții în aplicație din aplicație și faceți clic pe Trimiteți.
Faceți clic pe butonul Încărcări în aplicații din lista din stânga, chiar deasupra Centru de jocuri și adăugați un nou produs IAP. De această dată, selectați Neconsumabil opțiune:
Clic Crea și repetați pașii pe care i-am menționat mai sus. Deoarece acesta va fi a Neconsumabil produs, utilizatorii vor putea să-l achiziționeze o singură dată, iar Apple necesită capacitatea de a restabili astfel de achiziții. Acest lucru se întâmplă în cazul în care dezinstalați aplicația și reinstalați-o din nou sau o descărcați de pe un alt dispozitiv cu același ID Apple și trebuie să achiziționați înapoi achizițiile fără să le plătiți de două ori. Așa că mai târziu vom adăuga a Restabili cumpărare funcționează în codul nostru.
ID-ul produsului pe care l-am creat acum este com.iaptutorial.premium, cu un nivel de preț de 2.99 USD. Am spus-o Deblocați versiunea Premium.
După ce ați completat toate câmpurile, salvați produsul și reveniți la pagina Achiziții în aplicație. Acum ar trebui să aveți o listă a celor două produse, cu ajutorul lor Nume, Tip, ID-ul și stare a seta ca Sunteți gata să trimiteți.
Reveniți la pagina aplicației făcând clic pe Magazin de aplicații și Pregătiți-vă pentru depunere butoane. Derulați în jos până la Achiziții în aplicație secțiune, chiar mai jos Informații despre aplicația generală, și faceți clic pe (+) pentru a vă adăuga produsele IAP.
Selectați-le pe toate și faceți clic pe Terminat.
În cele din urmă, faceți clic pe Salvați în colțul din dreapta sus al ecranului și veți fi terminat cu configurarea produselor achiziționate în aplicație în iTunes Connect.
Înainte de a ajunge la cod, mai este încă un lucru de făcut. Mergi la Setări > iTunes și App Store pe dispozitivul dvs. iOS. Dacă sunteți deja conectat (ă) cu ID-ul original Apple, atingeți-l și alegeți Sign out. Apoi, conectați-vă pur și simplu cu acreditările pentru testerul de nisipuri pe care l-ați creat. După ce v-ați conectat, puteți primi o alertă de genul:
Ignorați mesajul și atingeți Anulare. Dispozitivul dvs. vă va întreba din nou acreditările de conectare la mediul de nisip în timp ce încercați să efectuați o achiziție și veți recunoaște contul dvs. de test, astfel încât să nu vi se perceapă nicio taxă pe cardul dvs. de credit pentru orice achiziție efectuată.
Ieșire Setări, conectați dispozitivul la computerul dvs. Mac prin intermediul cablului USB și începeți în cele din urmă să codificați!
Dacă ați descărcat proiectul nostru demonstrativ, veți vedea că toate codurile necesare pentru achiziționarea în aplicație au fost scrise, deci dacă îl executați, veți obține ceva de genul:
Dacă doriți să testați aplicația, ar trebui să o schimbați Identificatorul pachetului la id-ul tău. În caz contrar, Xcode nu vă va permite să rulați aplicația pe un dispozitiv real și aplicația nu va recunoaște cele două produse IAP pe care le-ați creat.
introduce ViewController.swift și verificați codul. Mai întâi am adăugat o declarație de import pentru StoreKit
și delegații de care avem nevoie pentru a urmări tranzacțiile de plată și cererile de produse.
importați clasa StoreKit ViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver
Apoi am declarat câteva opinii care vor fi utile.
/ * Vizualizări * / @IBOutlet slab var coinsLabel: UILabel! @IBOutlet slab var premiumLabel: UILabel! @IBOutlet slab var consumableLabel: UILabel! @IBOutlet slab var nonConsumableLabel: UILabel!
coinsLabel
și premiumLabel
va fi folosit pentru a arăta rezultatele achizițiilor pentru ambele produse. consumableLabel
și nonConsumableLabel
va afișa descrierea și prețul fiecărui produs IAP, cel pe care l-am creat anterior în iTunes Connect.
Acum este timpul să adăugați câteva variabile:
/ * Variabile * / let COINS_PRODUCT_ID = "com.iaptutorial.coins" lăsa PREMIUM_PRODUCT_ID = "com.iaptutorial.premium" var productID = "" var productsRequest = SKProductsRequest () var iapProducts = [SKProduct] () var nonConsumablePurchaseMade = UserDefaults.standard .bool (pentruKey: "nonConsumablePurchaseMade") var coins = UserDefaults.standard.integer (pentruKey: "monede")
Primele două linii trebuie să reamintească ID-urile produselor noastre. Este important ca acele șiruri să se potrivească exact cu cele înregistrate în secțiunea Cumpărare în aplicație a iTunes Connect.
productId
este un șir pe care îl vom folosi mai târziu pentru a detecta ce produs vom alege să cumpărăm.productsRequest
este un exemplu de SKProductsRequest
, necesar pentru a căuta produse IAP din aplicația dvs. pe iTC.iapProducts
este o gamă simplă de SKProducts
. Rețineți că prefixul SK înseamnă StoreKit, cadrul iOS pe care îl vom folosi pentru a face față achizițiilor.Ultimele două linii încarcă două variabile de tip boolean
și Întreg
necesare pentru a urmări achizițiile de monede și versiunea premium, respectiv produse consumabile și non-consumabile.
Codul următor în viewDidLoad ()
efectuează câteva lucruri de îndată ce începe aplicația:
// Verificați imprimarea achizițiilor dvs. în aplicație ("CUMPĂRILE NON CONSUMABILE MADE: \ (nonConsumablePurchaseMade)") ("COINS: \ (monede)") // Set text coinsLabel.text = "COINS: \ (monede) nonConsumablePurchaseMade premiumLabel.text = "Versiunea Premium CUMPĂRAT!" altceva premiumLabel.text = "Versiune Premium LOCKED!" // Fetch IAP Produse disponibile fetchAvailableProducts ()
Mai intai logam fiecare achizitie la consola Xcode. Apoi afișăm suma totală de monede pe care am cumpărat-o cu coinsLabel
. Deoarece executam prima aplicație demo, se va afișa MONEDELE: 0.
dacă
declarația stabilește premiumLabel
în funcție de faptul dacă produsul non-consumabil a fost achiziționat. Pentru a începe, se va afișa Versiune premium LOCKED! deoarece nu am făcut încă o achiziție premium.
Ultima linie de coduri solicită o metodă pe care o vom vedea ulterior, care pur și simplu aduce produsele pe care le-am stocat anterior în iTC.
Acum, să vedem ce două butoane de achiziționare pe care le-am stabilit în aplicația noastră demo:
// MARK: - CUMPARA 10 BUTONUL MONEDEI @IBAction func buy10coinsButt (_ expeditor: Oricare) buyMyProduct (produs: iapProducts [0]) // MARK: - BUTON PREMIUM UNLOCK @IBAction func unlockPremiumButt (expeditor: Any) purchaseMyProduct (produs: iapProducts [1])
Ambele metode vor apela o funcție care va verifica dacă dispozitivul poate face cumpărături și dacă poate, aplicația va apela metodele delegate StoreKit pentru a procesa achiziția.
Așa cum am menționat mai înainte, avem nevoie de un al treilea buton pentru a restabili achiziția non-consumabilă. Iată codul său:
// MARK: - RESTORE BUTONUL DE CUMPĂRARE NON-CONSUMABILĂ @IBAction func restoreRecord () nonConsumablePurchaseMade = true UserDefaults.standard.set (nonConsumablePurchaseMade, pentruKey: "nonConsumablePurchaseMade") UIAlertView (titlul: "Tutorial IAP", mesaj: "Ați restaurat cu succes achiziția!", delegate: nil, cancelButtonTitle: "OK") .spectacol()
IBAction
este atașată funcției Restabili cumpărare buton în storyboard și începe să se conecteze la sistemul Apple App-Purchase pentru a restabili achiziția, dacă a fost deja făcută.
paymentQueueRestoreCompletedTransactionsFinished ()
este metoda delegat din cadrul StoreKit care ne va salva nonConsumablePurchaseMade
variabilă la adevărată după ce achiziția a fost restaurată cu succes.
Am terminat cu butoane, așa că să vedem ce fetchAvailableProducts ()
funcționează:
// MARK: - FETCH DISPONIBILE PRODUSE IAP func fetchAvailableProducts () // Introduceți aici ID-ul produsului IAP lasă produsulIdentifiers = NSSet (obiecte: COINS_PRODUCT_ID, PREMIUM_PRODUCT_ID) productsRequest = SKProductsRequest (produsIdentifiers: productIdentifiers as! Set) productsRequest.delegate = produse selfRequest.start ()
Mai întâi creăm un exemplu de NSSet
, care este în esență o serie de șiruri de caractere. Vom stoca cele două coduri de produse pe care le-am declarat anterior.
Apoi începem un an SKProductsRequest
pe baza acelor identificatori, pentru ca aplicația să afișeze informațiile despre produsele IAP (descriere și preț), care vor fi procesate prin această metodă de delegat:
// MARK: - CERERE PRODUSE IAP func productsRequest (_ cerere: SKProductsRequest, răspunsRecepție răspuns: SKProductsResponse) if (answer.products.count> 0) iapProducts = răspuns.producte // Produs IAP 1 -------------------------------- let firstProduct = answer.products [0] ca SKProduct // Ia prețul de la iTunes Conectați-vă la numărul numberFormatter = NumărulFormatter () numberFormatter.formatterBehavior = .behavior10_4 numberFormatter.numberStyle = .Cursă numărFormatter.locale = firstProduct.priceLocale let price1Str = numberFormatter.string (de la: firstProduct.price) // Afișați descrierea sale consumableLabel.text = firstProduct. localizedDescription + "\ n doar pentru \ (price1Str!)" // ------------------------------------ ------------ // Produs 2 IAP (neconsumabil) ---------------------------- - permite secondProd = reply.products [1] ca SKProduct // Ia prețul de la iTunes Connect numberFormatter.locale = secondProd.priceLocale let price2Str = numberFormatter.string ( from: secondProd.price) // Afișați descrierea lui nonConsumableLabel.text = secondProd.localizedDescription + "\ n pentru doar \ (price2Str!)" // ------------------- -----------------
În funcția de mai sus trebuie mai întâi să verificăm dacă există produse înregistrate în iTunes Connect și setați-ne iapProducts
array în consecință. Apoi putem inițializa cele două SKProducts și tipăriți descrierea și prețul acestora pe etichete.
Înainte de a ajunge la baza codului de achiziție în aplicație, avem nevoie de câteva funcții suplimentare:
// MARK: - FACEȚI ACHIZIȚIA unui produs func canMakePurchases () -> Bool return SKPaymentQueue.canMakePayments () func buyMyProduct (produs: SKProduct) if self.canMakePurchases () let payment = SKPayment (PRODUCT.productIdentifier)) productID = produs.productIdentifier // Achiziții IAP dsped pe dispozitiv altceva UIAlertView (titlu: "Tutorial IAP", mesaj: "Achizițiile sunt dezactivate pe dispozitivul dvs.", delegat: nil, cancelButtonTitle: "OK").
Primul verifică dacă dispozitivul nostru poate efectua achiziții. A doua funcție este cea pe care o numim de la cele două butoane. Începe coada de plată și ne schimbă productId
variabilă în selectată productIdentifier
.
Acum am ajuns în sfârșit la ultima metodă de delegat, cea care gestionează rezultatele plăților:
// MARK: - PLĂTIREA PAUZĂ QUEUE funcția payment paymentQueue (_ queue: SKPaymentQueue, actualizatTranzacții tranzacții: [SKPaymentTransaction]) pentru tranzacție: AnyObject în tranzacții dacă trans = transaction as? SKPaymentTransaction switch trans.transactionState caz .purchase: SKPaymentQueue.default () finishTransaction (tranzacție ca! SKPaymentTransaction) // Produsul consumabil (10 monede) a fost achiziționat -> câștiga 10 monede suplimentare! dacă produsulID == COINS_PRODUCT_ID // Adaugă 10 monede și salvați monedele lor totale + = 10 UserDefaults.standard.set (monede, pentruKey: "monede") coinsLabel.text = "Monede: \ (monede)" UIAlertView "IAP Tutorial", mesaj: "Ați cumpărat cu succes 10 monede suplimentare!", Delegate: nil, cancelButtonTitle: "OK") show () // Produsul non-consumabil (Premium) altfel if productID == PREMIUM_PRODUCT_ID // Salvați achiziția locală (necesară numai pentru IAP neconsumabil) nonConsumablePurchaseMade = true UserDefaults.standard.set (nonConsumablePurchaseMade, pentruKey: "nonConsumablePurchaseMade") premiumLabel.text = "Versiunea Premium PURCHASED!" UIAlertView (titlu: "IAP Tutorial", mesaj: "Ați deblocat cu succes versiunea Premium!", Delegate: nil, cancelButtonTitle: "OK"). (tranzacție ca! SKPaymentTransaction) caz de pauză restrânsă: SKPaymentQueue.default () finalizareTransacție (tranzacție ca!
Această funcție are a intrerupator
declarație care verifică fiecare stare a plății. Primul caz
este chemat dacă achiziția a fost efectuată cu succes și își încheie tranzacția.
În interiorul acestui bloc trebuie să verificăm ce ID de produs l-am selectat și să efectuăm acțiunile necesare pentru actualizarea aplicației noastre - dacă am cumpărat 10 monede suplimentare, vom adăuga 10 monede
variabilă, salvați valoarea acesteia cu UserDefaults
, afișați noua cantitate de monede pe care am câștigat-o și faceți o alertă despre aceasta.
Rețineți că puteți efectua această achiziție de mai multe ori fără limite, deoarece este un IAP consumabil și nu este nevoie de o funcție de restaurare a achiziției.
În mod similar, dacă am cumpărat produsul premium non-consumabil, aplicația ne fixează nonConsumablePurchaseMade
variabil la Adevărat
, salvează, modifică textul textului premiumLabel
, și declanșează o alertă pentru a vă anunța că achiziția a avut succes.
Celelalte doua cazuri
gestiona rezultatele plăților pentru eșec și restaurare. Aplicația va declanșa singuri alerte personalizate dacă tranzacția dvs. nu reușește din anumite motive sau dacă ați restabilit o achiziție non-consumabilă.
Asta e! Acum, asigurați-vă că sunteți conectat (ă) cu datele de conectare ale testerului Sandbox și că rulați aplicația pentru a le testa. Prima dată, veți primi o alertă de genul:
Alege Utilizați ID-ul Apple existent și introduceți din nou numele de utilizator și parola testerului dvs. pentru a vă conecta. Aceasta se întâmplă deoarece aplicația poate recunoaște numai un utilizator real din iTunes și App Store setări, nu un Sandbox unul.
După ce v-ați conectat, veți putea efectua achiziții pentru ambele produse.
Dacă lucrați cu iOS și doriți să fiți mai profund în dezvoltarea limbajului și a aplicațiilor Swift, verificați câteva dintre șabloanele de aplicații iOS de pe CodeCanyon.
Există sute de alte șabloane de aplicații pentru iOS pe piața Envato, pregătite pentru a fi recuperate și cu siguranță să vă accelerați fluxul de lucru. Du-te să le vezi! S-ar putea să salvați ore întregi de muncă pentru următoarea aplicație.
În acest tutorial, am acoperit toți pașii necesari pentru a crea produse de achiziție în aplicație în iTunes Connect și cum să scrieți codul pentru a le permite în aplicația dvs. Sper că puteți să utilizați această cunoaștere în următoarea aplicație iOS!
Vă mulțumim pentru lectură și vă voi vedea data viitoare! Vă rugăm să verificați celelalte cursuri și tutoriale despre dezvoltarea aplicației iOS cu Swift.