In-App Purchases in iOS 6

Trong bài viết này , tôi chỉ viết những phần quan trọng nhất , nếu bạn muốn tham khảo toàn bộ , bạn có thể vào link cuối để xem toàn bộ bằng tiếng anh . Lấy danh sách Sản Phẩm

Trước khi bạn có thể cho phép người sử dụng mua bất kỳ các sản phẩm từ ứng dụng của bạn, bạn phải lấy danh sách sản phẩm ra bằng cách truy vấn vào iTunes Connect để lấy danh sách các sản phẩm có sẵn từ máy chủ.

Chúng ta chỉ có thể code để làm điều này , nhưng vấn đề tái sử dụng sẽ khó khăn hơn , vậy nên theo tôi nghĩ chúng ta sẽ tạo 1 class tên là : Helper, sau này vấn đề tái sử dụng cũng dễ dàng hơn .

Ok! Chúng ta hãy bắt đầu , đầu tiên vào XCode, chọn iOS\Application\Master-Detail Application mẫu. Enter InAppRage nhập tên project bạn muốn, chọn chọn lựa vào Iphone vì ở đây ta làm ứng dụng iPhone, và chắc chắn sử dụng Storyboards and sử dụng ARC là có (nên sử dụng ARC).

Project Settings for creating project

Tiếp theo , Chúng ta cần thêm thư viên cho In-App Purchases đến project : StoreKit. Để làm điều này , chọn project của bạn trong Project Navigator và chọn In App Rage target.tiếp theo chọn tag Build Phases, mở rộng phần Link Binary with Libraries, sau đó ấn nút+. Cuối cùng StoreKit.framework trong danh sách và ấn Add.

Adding StoreKit to the project

Một bước cuối để config ứng dụng của chúng ta – mở file Supporting Files\In App Rage-Info.plist va thay đổi " Bundle identifier " theo cái app ID của bạn:

Changing bundle identifier in info.plist

Phù! vậy là phần setup xong rồi , giờ chúng ta code thôi nào 😄 . Tạo 1 file theo mẫuiOS\Cocoa Touch\Objective-C class, và ấn Next. Tên của class trong này tôi sẽ đặt là IAPHelper, nhớ là nó "subclass" từ NSObject, sau đó ấn Next và cuối cùng là Create.

Mở file IAPHelper.h và thay thế code theo mẫu sau :

typedef void (^RequestProductsCompletionHandler)(BOOL success, NSArray * products);

@interface IAPHelper : NSObject

  • (id)initWithProductIdentifiers:(NSSet *)productIdentifiers;
  • (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler;

@end Class này có 2 điều : method 1 là khởi tạo , điều này tạo dánh sách " product identifiers" (ví dụ đây là : com.razeware.inapprage.nightlyrage), và cái còn lại là thông tin products được trả về từ iTunes Connect. Vấn đề thứ 2 là " asynchronous ", và nó là 1 block giống như là parameter và điều này được xử lý cho đến khi hoàn thành.

Note: Bạn thấy khó khăn với block không ? đây là một khái niệm mới về IOS 4 ++ . Bạn có thể xem theo tutorial này Sử dụng Block như thế nào ?.

Tiếp theo là IAPHelper.m và thêm vào phần : " implementation ":

// 1

import "IAPHelper.h"

import <StoreKit/StoreKit.h>

// 2 @interface IAPHelper () <SKProductsRequestDelegate> @end

@implementation IAPHelper { // 3 SKProductsRequest * _productsRequest; // 4 RequestProductsCompletionHandler _completionHandler; NSSet * _productIdentifiers; NSMutableSet * _purchasedProductIdentifiers; }

@end Chúng ta hãy xem xét nó từng phần một

Bạn cần sử dụng StoreKit để truy cập In-App Purchase APIs, vì vậy bạn cần import StoreKit ở đầu . Để nhận danh sách products từ StoreKit, bạn cần thực hiện SKProductsRequestDelegate protocol (giao thức , protocol delegate- uỷ nhiệm). ở đây chúng ta thực hiện sự uỷ nhiệm Bạn tạo một instance variable để lưu trữ SKProductsRequest để nhận danh sách products, Tiếp theo, thêm vào cái khởi tạo :

  • (id)initWithProductIdentifiers:(NSSet *)productIdentifiers {

    if ((self = [super init])) {

      // Store product identifiers
      _productIdentifiers = productIdentifiers;
    
      // Check for previously purchased products
      _purchasedProductIdentifiers = [NSMutableSet set];
      for (NSString * productIdentifier in _productIdentifiers) {
          BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier];
          if (productPurchased) {
              [_purchasedProductIdentifiers addObject:productIdentifier];
              NSLog(@"Previously purchased: %@", productIdentifier);
          } else {
              NSLog(@"Not purchased: %@", productIdentifier);
          }
      }
    

    } return self; } Điều này sẽ kiểm tra products nào đã được thanh toán hoặc không ? (dựa trên giá trị lưu trữ NSUserDefaults).

Tiếp theo, thêm một danh sách thông tin sản phẩm trả về từ iTunes Connect:

  • (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler {

    // 1 _completionHandler = [completionHandler copy];

    // 2 _productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers]; _productsRequest.delegate = self; [_productsRequest start];

} This first squirrels a copy of the completion handler block inside the instance variable so it can notify the caller when the product request asynchronously completes.

It then creates a new instance of SKProductsRequest, which is the Apple-written class that contains the code to pull the info from iTunes Connect. It’s very easy to use – you just give it a delegate (that conforms to the SKProductsRequestDelegate protocol) and then call start to get things running.

We set the IAPHelper class itself as the delegate, which means that it will receive a callback when the products list completes (productsRequest:didReceiveResponse) or fails (request:didFailWithErorr).

Speaking of delegate callbacks, add those next! Add the following code before the @end:

pragma mark - SKProductsRequestDelegate

  • (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

    NSLog(@"Loaded list of products..."); _productsRequest = nil;

    NSArray * skProducts = response.products; for (SKProduct * skProduct in skProducts) { NSLog(@"Found product: %@ %@ %0.2f", skProduct.productIdentifier, skProduct.localizedTitle, skProduct.price.floatValue); }

    _completionHandler(YES, skProducts); _completionHandler = nil;

}

  • (void)request:(SKRequest *)request didFailWithError:(NSError *)error {

    NSLog(@"Failed to load list of products."); _productsRequest = nil;

    _completionHandler(NO, nil); _completionHandler = nil;

} Đây là bạn đã thực hiện 2 cái "Delegate" thành công hoặc không , nếu thành công , bạn sẽ có thông tin trả về gồm như là : "identifier", "localized title", và "price". Dù bằng cách nào , bạn nên đặt giá trị _productsRequest instance variable trở lại " nil " .

OK! giờ tờ hãy build thử Product\Build, và kiểm tra xem có lỗi hay không ? ở đây thì không có lỗi .

Phù , tạm thời tôi hướng dẫn như vậy , nếu như bạn thấy thích thú với việc kiếm tiền từ làm app , và bạn thấy muốn xem đầy đủ và chi tiết , hãy nhìn vào dòng cuối cùng , có link tiếng anh , cho bạn tham khảo thêm ,

source : http://www.raywenderlich.com/21081/introduction-to-in-app-purchases-in-ios-6-tutorial