Учебники

iOS — встроенная покупка

Покупка в приложении используется для приобретения дополнительного контента или обновления функций по отношению к приложению.

Вовлеченные шаги

Шаг 1. В iTunes connect убедитесь, что у вас есть уникальный идентификатор приложения, и когда мы создаем обновление приложения с идентификатором пакета и подписанием кода в Xcode с соответствующим профилем обеспечения.

Шаг 2 — Создайте новое приложение и обновите информацию о приложении. Вы можете узнать больше об этом в документации Apple по добавлению новых приложений .

Шаг 3. Добавьте новый продукт для покупки из приложения в разделе «Управление покупкой из приложения» на странице вашего приложения.

Шаг 4 — Убедитесь, что вы установили банковские реквизиты для своего приложения. Это должно быть настроено для покупки в приложении для работы. Кроме того, создайте учетную запись тестового пользователя с помощью параметра « Управление пользователями» на странице подключения iTunes в вашем приложении.

Шаг 5 — Следующие шаги связаны с обработкой кода и созданием пользовательского интерфейса для покупки в приложении.

Шаг 6 — Создайте приложение с одним представлением и введите идентификатор пакета — это идентификатор, указанный в iTunes connect.

Шаг 7 — Обновите ViewController.xib, как показано ниже —

Руководство по iOS

Шаг 8 — Создайте IBOutlets для трех меток и кнопку, назвав их productTitleLabel, productDescriptionLabel, productPriceLabel и purchaseButton соответственно.

Шаг 9 — Выберите файл проекта, затем выберите цели и затем добавьте StoreKit.framework .

Шаг 10 — Обновите ViewController.h следующим образом —

#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>

@interface ViewController : UIViewController<
SKProductsRequestDelegate,SKPaymentTransactionObserver> {
   SKProductsRequest *productsRequest;
   NSArray *validProducts;
   UIActivityIndicatorView *activityIndicatorView;
   IBOutlet UILabel *productTitleLabel;
   IBOutlet UILabel *productDescriptionLabel;
   IBOutlet UILabel *productPriceLabel;
   IBOutlet UIButton *purchaseButton;
}

- (void)fetchAvailableProducts;
- (BOOL)canMakePurchases;
- (void)purchaseMyProduct🙁SKProduct*)product;
- (IBAction)purchase🙁id)sender;

@end

Шаг 11 — Обновите ViewController.m следующим образом —

#import "ViewController.h"
#define kTutorialPointProductID 
@"com.tutorialPoints.testApp.testProduct"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
   
   // Adding activity indicator
   activityIndicatorView = [[UIActivityIndicatorView alloc]
   initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
   activityIndicatorView.center = self.view.center;
   [activityIndicatorView hidesWhenStopped];
   [self.view addSubview:activityIndicatorView];
   [activityIndicatorView startAnimating];
   
   //Hide purchase button initially
   purchaseButton.hidden = YES;
   [self fetchAvailableProducts];
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

-(void)fetchAvailableProducts {
   NSSet *productIdentifiers = [NSSet 
   setWithObjects:kTutorialPointProductID,nil];
   productsRequest = [[SKProductsRequest alloc] 
   initWithProductIdentifiers:productIdentifiers];
   productsRequest.delegate = self;
   [productsRequest start];
}

- (BOOL)canMakePurchases {
   return [SKPaymentQueue canMakePayments];
}

- (void)purchaseMyProduct🙁SKProduct*)product {
   if ([self canMakePurchases]) {
      SKPayment *payment = [SKPayment paymentWithProduct:product];
      [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
      [[SKPaymentQueue defaultQueue] addPayment:payment];
   } else {
      UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
      @"Purchases are disabled in your device" message:nil delegate:
      self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
      [alertView show];
   }
}
-(IBAction)purchase🙁id)sender {
   [self purchaseMyProduct:[validProducts objectAtIndex:0]];
   purchaseButton.enabled = NO; 
}

#pragma mark StoreKit Delegate

-(void)paymentQueue🙁SKPaymentQueue *)queue 
updatedTransactions🙁NSArray *)transactions {
   for (SKPaymentTransaction *transaction in transactions) {
      switch (transaction.transactionState) {
         case SKPaymentTransactionStatePurchasing:
            NSLog(@"Purchasing");
         break;
         
         case SKPaymentTransactionStatePurchased:
            if ([transaction.payment.productIdentifier 
            isEqualToString:kTutorialPointProductID]) {
               NSLog(@"Purchased ");
               UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
               @"Purchase is completed succesfully" message:nil delegate:
               self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
               [alertView show];
            }
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
         break;
            
         case SKPaymentTransactionStateRestored:
            NSLog(@"Restored ");
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
         break;
            
         case SKPaymentTransactionStateFailed:
            NSLog(@"Purchase failed ");
         break
         default:
         break;
      }
   }
}

-(void)productsRequest🙁SKProductsRequest *)request 
didReceiveResponse🙁SKProductsResponse *)response {
   SKProduct *validProduct = nil;
   int count = [response.products count];
   
   if (count>0) {
      validProducts = response.products;
      validProduct = [response.products objectAtIndex:0];
      
      if ([validProduct.productIdentifier 
         isEqualToString:kTutorialPointProductID]) {
         [productTitleLabel setText:[NSString stringWithFormat:
            @"Product Title: %@",validProduct.localizedTitle]];
         [productDescriptionLabel setText:[NSString stringWithFormat:
            @"Product Desc: %@",validProduct.localizedDescription]];
         [productPriceLabel setText:[NSString stringWithFormat:
            @"Product Price: %@",validProduct.price]];
      }
   } else {
      UIAlertView *tmp = [[UIAlertView alloc]
         initWithTitle:@"Not Available"
         message:@"No products to purchase"
         delegate:self
         cancelButtonTitle:nil
         otherButtonTitles:@"Ok", nil];
         [tmp show];
   }
   
   [activityIndicatorView stopAnimating];
   purchaseButton.hidden = NO;
}
@end

Заметка

Вы должны обновить kTutorialPointProductID до идентификатора продукта, который вы создали для своей покупки в приложении. Вы можете добавить более одного продукта, обновив NSSet productIdentifiers в fetchAvailableProducts. Аналогично, выполняйте действия, связанные с покупкой, для идентификаторов продуктов, которые вы добавляете.

Выход

Когда мы запустим приложение, мы получим следующий вывод —

Руководство по iOS

Убедитесь, что вы вышли из своей учетной записи на экране настроек. Нажав «Начать покупку», выберите «Использовать существующий Apple ID». Введите действительное имя пользователя и пароль тестовой учетной записи. Через несколько секунд вы увидите следующее предупреждение.

Руководство по iOS

Как только ваш продукт будет успешно приобретен, вы получите следующее предупреждение. Вы можете увидеть соответствующий код для обновления функций приложения, где мы показываем это предупреждение.