Jak dodać zakup w aplikacji do aplikacji iOS?

Jak dodać zakup w aplikacji do aplikacji na iOS? Jakie są wszystkie szczegóły i czy jest jakiś przykładowy kod?

to ma być haczyk-wszelkiego rodzaju, jak dodać zakupy w aplikacji do aplikacji iOS

Author: Jojodmo, 2013-10-24

4 answers

W Xcode 5+ najlepiej jest wykonać następujące czynności:]}

  1. idź do itunes.connect.apple.com i zaloguj się
  2. Kliknij My Apps następnie kliknij aplikację, którą chcesz dodać zakup do
  3. kliknij nagłówek Features, a następnie wybierz In-App Purchases po lewej stronie
  4. Kliknij ikonę + w środku
  5. W tym samouczku dodamy zakup w aplikacji, aby usunąć reklamy, więc wybierz non-consumable. Jeśli chcesz wysłać użytkownikowi fizyczny przedmiot lub dać mu coś, co może kupić więcej niż raz, wybrałbyś consumable.
  6. dla nazwy referencyjnej, umieść cokolwiek chcesz (ale upewnij się, że wiesz, co to jest)
  7. dla ID Produktu umieścić tld.websitename.appname.referencename to będzie działać najlepiej, więc na przykład, można użyć com.jojodmo.blix.removeads
  8. Wybierz cleared for sale, a następnie wybierz poziom ceny jako 1 (99¢). Poziom 2 będzie $1.99, a poziom 3 będzie $2.99. Pełna lista jest dostępna po kliknięciu view pricing matrix zalecam korzystanie z tier 1, ponieważ to zwykle najwięcej, ile ktoś zapłaci za usunięcie reklam.
  9. kliknij niebieski przycisk add language i wprowadź informacje. To wszystko zostanie pokazane klientowi, więc nie umieszczaj niczego, czego nie chcesz, aby zobaczył [78]}
  10. dla hosting content with Apple wybierz Nie
  11. możesz zostawić uwagi do recenzji puste na razie.
  12. Pomiń screenshot for review na razie do wszystkiego, co pominiemy, wrócimy.
  13. Kliknij "save"
Rejestracja identyfikatora produktu w

Może potrwać kilka godzin, więc bądź cierpliwy.

Teraz, gdy skonfigurowałeś informacje o zakupie w aplikacji na iTunesConnect, przejdź do projektu Xcode i przejdź do Menedżera aplikacji (niebieska ikona podobna do strony u góry, gdzie znajdują się Twoje metody i pliki nagłówkowe) kliknij swoją aplikację pod celami (powinna być pierwsza), a następnie przejdź do Ogólne. Na dole powinieneś zobaczyć linked frameworks and libraries kliknij mały symbol plus i dodaj framework StoreKit.framework jeśli tego nie zrobisz, zakup w aplikacji będzie Nie działać!

Jeśli używasz Objective-C jako języka aplikacji, możesz pominąć te pięć kroków. W przeciwnym razie, jeśli używasz Swift, wykonaj następujące czynności:

  1. Utwórz nowy plik .h (header), przechodząc do File > New > File... (Dowództwo ⌘ + N ). Ten plik będzie określany jako "Twój plik .h" W pozostałej części samouczka

  2. Kiedy kliknij Utwórz nagłówek pomostowy. To będzie nasz plik nagłówkowy. Jeśli nie pojawi się monit, przejdź do kroku 3. Jeśli pojawi się monit , pomiń krok 3 i przejdź bezpośrednio do kroku 4.

  3. Utwórz inny plik .h o nazwie Bridge.h w głównym folderze projektu, następnie przejdź do Menedżera aplikacji (niebieska ikona przypominająca stronę), następnie wybierz swoją aplikację w sekcji Targets i kliknij Build Settings. Znajdź opcję, która mówi Swift Compiler-Code Generowanie , a następnie ustawienie opcji Objective-C Bridging Header na Bridge.h

  4. W pliku nagłówkowym pomostowym dodaj linię #import "MyObjectiveCHeaderFile.h", gdzie MyObjectiveCHeaderFile jest nazwą pliku nagłówkowego utworzonego w pierwszym kroku. Tak więc, na przykład, jeśli nazwałeś plik nagłówka InAppPurchase.h , można dodać linię #import "InAppPurchase.h" do pliku nagłówka mostu.

  5. Utwórz nowy plik Objective - C Methods (.m), przechodząc do File > New > File... (Dowództwo ⌘ + N ). Nazwij go tak samo jak plik nagłówka utworzony w kroku 1. Na przykład, jeśli wywołałeś plik w kroku 1 InAppPurchase.h, nazwałbyś ten nowy plik InAppPurchase.m . Ten plik będzie określany jako" Twój plik .m " w pozostałej części samouczka.

Teraz przejdziemy do kodowania. Dodaj następujący kod do pliku .h:
BOOL areAdsRemoved;

- (IBAction)restore;
- (IBAction)tapsRemoveAds;

Następnie musisz zaimportować StoreKit framework do swojego .m plik, a także dodać SKProductsRequestDelegate i SKPaymentTransactionObserver po deklaracji @interface:

#import <StoreKit/StoreKit.h>

//put the name of your view controller in place of MyViewController
@interface MyViewController() <SKProductsRequestDelegate, SKPaymentTransactionObserver>

@end

@implementation MyViewController //the name of your view controller (same as above)
  //the code below will be added here
@end

A teraz dodaj następujący plik .m, ta część się komplikuje, więc sugeruję przeczytanie komentarzy w kodzie:

//If you have more than one in-app purchase, you can define both of
//of them here. So, for example, you could define both kRemoveAdsProductIdentifier
//and kBuyCurrencyProductIdentifier with their respective product ids
//
//for this example, we will only use one product

#define kRemoveAdsProductIdentifier @"put your product id (the one that we just made in iTunesConnect) in here"

- (IBAction)tapsRemoveAds{
    NSLog(@"User requests to remove ads");

    if([SKPaymentQueue canMakePayments]){
        NSLog(@"User can make payments");

        //If you have more than one in-app purchase, and would like
        //to have the user purchase a different product, simply define 
        //another function and replace kRemoveAdsProductIdentifier with 
        //the identifier for the other product

        SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:kRemoveAdsProductIdentifier]];
        productsRequest.delegate = self;
        [productsRequest start];

    }
    else{
        NSLog(@"User cannot make payments due to parental controls");
        //this is called the user cannot make payments, most likely due to parental controls
    }
}

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
    SKProduct *validProduct = nil;
    int count = [response.products count];
    if(count > 0){
        validProduct = [response.products objectAtIndex:0];
        NSLog(@"Products Available!");
        [self purchase:validProduct];
    }
    else if(!validProduct){
        NSLog(@"No products available");
        //this is called if your product id is not valid, this shouldn't be called unless that happens.
    }
}

- (void)purchase:(SKProduct *)product{
    SKPayment *payment = [SKPayment paymentWithProduct:product];

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}

- (IBAction) restore{
    //this is called when the user restores purchases, you should hook this up to a button
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
    NSLog(@"received restored transactions: %i", queue.transactions.count);
    for(SKPaymentTransaction *transaction in queue.transactions){
        if(transaction.transactionState == SKPaymentTransactionStateRestored){
            //called when the user successfully restores a purchase
            NSLog(@"Transaction state -> Restored");

            //if you have more than one in-app purchase product,
            //you restore the correct product for the identifier.
            //For example, you could use
            //if(productID == kRemoveAdsProductIdentifier)
            //to get the product identifier for the
            //restored purchases, you can use
            //
            //NSString *productID = transaction.payment.productIdentifier;
            [self doRemoveAds];
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;
        }
    }   
}

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
    for(SKPaymentTransaction *transaction in transactions){
        //if you have multiple in app purchases in your app,
        //you can get the product identifier of this transaction
        //by using transaction.payment.productIdentifier
        //
        //then, check the identifier against the product IDs
        //that you have defined to check which product the user
        //just purchased            

        switch(transaction.transactionState){
            case SKPaymentTransactionStatePurchasing: NSLog(@"Transaction state -> Purchasing");
                //called when the user is in the process of purchasing, do not add any of your own code here.
                break;
            case SKPaymentTransactionStatePurchased:
            //this is called when the user has successfully purchased the package (Cha-Ching!)
                [self doRemoveAds]; //you can add your code for what you want to happen when the user buys the purchase here, for this tutorial we use removing ads
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                NSLog(@"Transaction state -> Purchased");
                break;
            case SKPaymentTransactionStateRestored:
                NSLog(@"Transaction state -> Restored");
                //add the same code as you did from SKPaymentTransactionStatePurchased here
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                //called when the transaction does not finish
                if(transaction.error.code == SKErrorPaymentCancelled){
                    NSLog(@"Transaction state -> Cancelled");
                    //the user cancelled the payment ;(
                }
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
        }
    }
}

Teraz chcesz dodać swój kod, co się stanie, gdy użytkownik zakończy transakcję, w tym tutorialu, używamy usuwania dodaje, będziesz musiał dodać własny kod, co się stanie, gdy Widok banera ładuje.

- (void)doRemoveAds{
    ADBannerView *banner;
    [banner setAlpha:0];
    areAdsRemoved = YES;
    removeAdsButton.hidden = YES;
    removeAdsButton.enabled = NO;
    [[NSUserDefaults standardUserDefaults] setBool:areAdsRemoved forKey:@"areAdsRemoved"];
    //use NSUserDefaults so that you can load whether or not they bought it
    //it would be better to use KeyChain access, or something more secure
    //to store the user data, because NSUserDefaults can be changed.
    //You're average downloader won't be able to change it very easily, but
    //it's still best to use something more secure than NSUserDefaults.
    //For the purpose of this tutorial, though, we're going to use NSUserDefaults
    [[NSUserDefaults standardUserDefaults] synchronize];
}

Jeśli nie masz reklamy w aplikacji, można użyć każdej innej rzeczy, która chcesz. Na przykład, możemy zrobić kolor tła niebieski. Aby to zrobić, chcielibyśmy użyć:

- (void)doRemoveAds{
    [self.view setBackgroundColor:[UIColor blueColor]];
    areAdsRemoved = YES
    //set the bool for whether or not they purchased it to YES, you could use your own boolean here, but you would have to declare it in your .h file

    [[NSUserDefaults standardUserDefaults] setBool:areAdsRemoved forKey:@"areAdsRemoved"];
    //use NSUserDefaults so that you can load wether or not they bought it
    [[NSUserDefaults standardUserDefaults] synchronize];
}

Teraz, gdzieś w Twojej metodzie viewDidLoad, będziesz chciał dodać następujący kod:

areAdsRemoved = [[NSUserDefaults standardUserDefaults] boolForKey:@"areAdsRemoved"];
[[NSUserDefaults standardUserDefaults] synchronize];
//this will load wether or not they bought the in-app purchase

if(areAdsRemoved){
    [self.view setBackgroundColor:[UIColor blueColor]];
    //if they did buy it, set the background to blue, if your using the code above to set the background to blue, if your removing ads, your going to have to make your own code here
}

Teraz, gdy dodałeś cały kod, przejdź do pliku .xib lub storyboard i dodaj dwa przyciski, jeden mówi "kup", a drugi "Przywróć". Hook up the tapsRemoveAds IBAction do przycisku zakupu, który właśnie made, and the restore IBAction do przycisku Przywróć. Akcja restore sprawdzi, czy użytkownik wcześniej zakupił zakup w aplikacji i da mu go za darmo, jeśli jeszcze go nie posiada.

Następnie przejdź do iTunesConnect , Kliknij Users and Roles, następnie kliknij nagłówek Sandbox Testers, a następnie kliknij symbol + po lewej stronie, gdzie jest napisane Testers. Możesz po prostu umieścić losowe rzeczy na imię i nazwisko, A e-mail nie musi być prawdziwy-po prostu muszę to zapamiętać. Wprowadź hasło (które będziesz musiał zapamiętać) i wypełnij resztę informacji. Polecam zrobić Date of Birth datę, która uczyniłaby użytkownika 18 lub starszym. App Store Territory ma być we właściwym kraju. Następnie wyloguj się z istniejącego konta iTunes (możesz zalogować się ponownie po tym samouczku).

Teraz uruchom aplikację na urządzeniu z systemem iOS, jeśli spróbujesz uruchomić ją na symulatorze, zakup będzie zawsze błąd, ty trzeba uruchomić go na urządzeniu z systemem iOS. Po uruchomieniu aplikacji dotknij przycisku Zakup. Po wyświetleniu monitu o zalogowanie się na swoje konto iTunes Zaloguj się jako użytkownik testowy, który właśnie utworzyliśmy. Następnie, gdy poprosi Cię o potwierdzenie zakupu 99¢ lub cokolwiek, co ustawisz również poziom cen, Zrób zrzut ekranu to jest to, co zamierzasz wykorzystać do swojego screenshot for review na iTunesConnect. Teraz anuluj płatność.

Teraz przejdź do iTunesConnect , a następnie przejdź do My Apps > the app you have the In-app purchase on > In-App Purchases. Następnie kliknij zakup w aplikacji i kliknij Edytuj pod szczegółami zakupu w aplikacji. Gdy to zrobisz, zaimportuj zdjęcie, które właśnie zrobiłeś na iPhonie, do komputera i prześlij je jako zrzut ekranu do przeglądu, a następnie w Uwagach do recenzji umieść e-mail użytkownika testowego {97]} i hasło. Pomoże to apple w procesie recenzowania.

Po wykonaniu tej czynności wróć do aplikacji na urządzeniu z systemem iOS, nadal zalogowanej jako konto testowe i kliknij przycisk zakupu. Tym razem Potwierdź płatność Nie martw się, to nie obciąży Twojego konta żadnymi pieniędzmi, testowe konta użytkowników uzyskaj wszystkie zakupy w aplikacji za darmo po potwierdzeniu płatności upewnij się, że to, co się dzieje, gdy użytkownik kupuje twój produkt, faktycznie się dzieje. Jeśli nie, to będzie to błąd w Twojej metodzie doRemoveAds. Ponownie zalecam zmianę tła na niebieskie do testowania zakupu w aplikacji, nie powinno to być rzeczywiste zakupy w aplikacji chociaż. Jeśli wszystko działa i jesteś gotowy! Pamiętaj tylko, aby uwzględnić zakup w aplikacji w Nowym pliku binarnym podczas przesyłania go do iTunesConnect!


Oto kilka typowych błędów:

Zalogowani: No Products Available

To może oznaczać trzy rzeczy:]}
    W kodzie nie wpisano poprawnego identyfikatora zakupu w aplikacji (dla identyfikatora kRemoveAdsProductIdentifier w powyższym kodzie
  • nie wyczyściłeś swojego zakupu w aplikacji do sprzedaży na iTunesConnect
  • Nie czekałeś, aż identyfikator zakupu w aplikacji zostanie zarejestrowany w iTunesConnect. Poczekaj kilka godzin od utworzenia identyfikatora, a problem powinien zostać rozwiązany. Nie wypełniłeś swoich umów, podatków i informacji bankowych.

Jeśli to nie zadziała za pierwszym razem, nie denerwuj się! Nie poddawaj się! Zajęło mi to około 5 godzin, zanim udało mi się to uruchomić, i około 10 godzin szukania odpowiedniego kod! Jeśli używasz powyższego kodu dokładnie, powinno działać dobrze. Zapraszam do komentowania, jeśli masz jakiekolwiek pytania w ogóle.

Mam nadzieję, że pomoże to wszystkim tym, którzy chcą dodać zakup w aplikacji do swojej aplikacji na iOS. Zdrowie!

 532
Author: Jojodmo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 00:20:36

Wystarczy przetłumaczyć kod Jojodmo na Swift:

class InAppPurchaseManager: NSObject , SKProductsRequestDelegate, SKPaymentTransactionObserver{





//If you have more than one in-app purchase, you can define both of
//of them here. So, for example, you could define both kRemoveAdsProductIdentifier
//and kBuyCurrencyProductIdentifier with their respective product ids
//
//for this example, we will only use one product

let kRemoveAdsProductIdentifier = "put your product id (the one that we just made in iTunesConnect) in here"

@IBAction func tapsRemoveAds() {

    NSLog("User requests to remove ads")

    if SKPaymentQueue.canMakePayments() {
        NSLog("User can make payments")

        //If you have more than one in-app purchase, and would like
        //to have the user purchase a different product, simply define
        //another function and replace kRemoveAdsProductIdentifier with
        //the identifier for the other product
        let set : Set<String> = [kRemoveAdsProductIdentifier]
        let productsRequest = SKProductsRequest(productIdentifiers: set)
        productsRequest.delegate = self
        productsRequest.start()

    }
    else {
        NSLog("User cannot make payments due to parental controls")
        //this is called the user cannot make payments, most likely due to parental controls
    }
}


func purchase(product : SKProduct) {

    let payment = SKPayment(product: product)
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    SKPaymentQueue.defaultQueue().addPayment(payment)
}

func restore() {
    //this is called when the user restores purchases, you should hook this up to a button
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}


func doRemoveAds() {
    //TODO: implement
}

/////////////////////////////////////////////////
//////////////// store delegate /////////////////
/////////////////////////////////////////////////
// MARK: - store delegate -


func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {

    if let validProduct = response.products.first {
        NSLog("Products Available!")
        self.purchase(validProduct)
    }
    else {
        NSLog("No products available")
        //this is called if your product id is not valid, this shouldn't be called unless that happens.
    }
}

func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) {


    NSLog("received restored transactions: \(queue.transactions.count)")
    for transaction in queue.transactions {
        if transaction.transactionState == .Restored {
            //called when the user successfully restores a purchase
            NSLog("Transaction state -> Restored")

            //if you have more than one in-app purchase product,
            //you restore the correct product for the identifier.
            //For example, you could use
            //if(productID == kRemoveAdsProductIdentifier)
            //to get the product identifier for the
            //restored purchases, you can use
            //
            //NSString *productID = transaction.payment.productIdentifier;
            self.doRemoveAds()
            SKPaymentQueue.defaultQueue().finishTransaction(transaction)
            break;
        }
    }
}


func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {

    for transaction in transactions {
        switch transaction.transactionState {
        case .Purchasing: NSLog("Transaction state -> Purchasing")
            //called when the user is in the process of purchasing, do not add any of your own code here.
        case .Purchased:
            //this is called when the user has successfully purchased the package (Cha-Ching!)
            self.doRemoveAds() //you can add your code for what you want to happen when the user buys the purchase here, for this tutorial we use removing ads
            SKPaymentQueue.defaultQueue().finishTransaction(transaction)
            NSLog("Transaction state -> Purchased")
        case .Restored:
            NSLog("Transaction state -> Restored")
            //add the same code as you did from SKPaymentTransactionStatePurchased here
            SKPaymentQueue.defaultQueue().finishTransaction(transaction)
        case .Failed:
            //called when the transaction does not finish
            if transaction.error?.code == SKErrorPaymentCancelled {
                NSLog("Transaction state -> Cancelled")
                //the user cancelled the payment ;(
            }
            SKPaymentQueue.defaultQueue().finishTransaction(transaction)
        case .Deferred:
            // The transaction is in the queue, but its final status is pending external action.
            NSLog("Transaction state -> Deferred")

        }


    }
}
} 
 12
Author: Yedidya Reiss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-28 18:37:01

RMStore to lekka biblioteka iOS do zakupów w aplikacji. Zawiera API StoreKit i zapewnia przydatne bloki dla żądań asynchronicznych. Zakup produktu jest tak prosty, jak wywołanie jednej metody.

Dla zaawansowanych użytkowników Biblioteka ta zapewnia również weryfikację odbioru, pobieranie zawartości i trwałość transakcji.

 4
Author: Vladimir Grigorov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-30 13:15:54

Wiem, że jestem dość późno, aby to opublikować, ale podzielam podobne doświadczenie, gdy nauczyłem się zasad modelu IAP.

[2]}zakup w aplikacji to jeden z najbardziej kompleksowych przepływów pracy w systemie iOS zaimplementowany przez Storekit framework. cała dokumentacja jest dość jasna, jeśli masz cierpliwość, aby ją przeczytać, ale jest nieco zaawansowana pod względem technicznym.

Podsumowując:

1-poproś o produkty-użyj klas SKProductRequest i SKProductRequestDelegate, aby wydać żądanie Identyfikatory produktów i odbierz je z własnego sklepu itunesconnect.

Te produkty skp powinny być używane do wypełniania interfejsu sklepu, którego użytkownik może użyć do zakupu określonego produktu.

2-wystaw żądanie płatności-użyj SKPayment & SKPaymentQueue, aby dodać płatność do kolejki transakcji.

3-Monitoruj kolejkę transakcji w celu aktualizacji statusu - użyj metody zaktualizowanej transakcji protokołu SKPaymentTransactionObserver do monitorowania stanu:

SKPaymentTransactionStatePurchasing - don't do anything
SKPaymentTransactionStatePurchased - unlock product, finish the transaction
SKPaymentTransactionStateFailed - show error, finish the transaction
SKPaymentTransactionStateRestored - unlock product, finish the transaction

4 - Przywróć przepływ przycisku-użyj Skpaymentqueue ' s restoreCompletedTransactions aby to osiągnąć-Krok 3 zajmie się resztą, wraz z następującymi metodami SKPaymentTransactionObserver:

paymentQueueRestoreCompletedTransactionsFinished
restoreCompletedTransactionsFailedWithError

Tutaj jest tutorial krok po kroku (stworzony przeze mnie w wyniku moich własnych prób zrozumienia), który to wyjaśnia. Na koniec zapewnia również próbkę kodu, z której możesz bezpośrednio korzystać.

Tutaj {[6] } jest kolejny, który stworzyłem, aby wyjaśnić pewne rzeczy, które tylko tekst mógł opisać lepiej sposób.

 0
Author: Nirav Bhatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-28 17:29:01