iOS — Покупка в приложении

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

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

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

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

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

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

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

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

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

Учебник iOS

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

Шаг 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 до productID, который вы создали для покупки в приложении. Вы можете добавить более одного продукта, обновив NSSet productIdentifiers в fetchAvailableProducts. Точно так же обрабатывайте действия, связанные с покупкой, для добавленных идентификаторов продуктов.

Вывод

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

Учебник iOS

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

Учебник iOS

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

Учебник iOS

Выберите поля, которые будут показаны. Прочие будут скрыты. Перктаскивайте мышкой для изменения порядка полей.
  • Изображение
  • SKU
  • Рейтинг
  • Цена
  • Запасы
  • Доступность
  • В корзину
  • Описание
  • Содержимое
  • Вес
  • Размеры
  • Дополнительная информация
  • Атрибуты
  • Custom attributes
  • Настраиваемые поля
Сравнить
Список желаний 0
Открыть страницу желаний Продолжить покупки