Latest 0.3.2
Homepage https://github.com/WildDylan/APKit
License MIT
Platforms ios 7.1
Frameworks UIKit, StoreKit, Foundation
Authors

APKit

MIT Licence FOSSA Status

How to use

The under code block only for OS X:

if ( ![NSData dataWithContentsOfURL:[NSBundle mainBundle].appStoreReceiptURL] ) {
  exit(173);
}

Can be used in Objective-C or swift:

pod 'APKit', '~> 0.3.1'

run command pod update --no-repo-update.

InAppDelegate.m

#import <StoreKit/StoreKit.h>
#import <APKit/APKit.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
#warning Add transaction observer
    [[SKPaymentQueue defaultQueue] addTransactionObserver:[APStoreObserver sharedInstance]];

    return YES;
}
- (void)applicationWillTerminate:(UIApplication *)application {
#warning Remove transaction observer
    [[SKPaymentQueue defaultQueue] removeTransactionObserver: [APStoreObserver sharedInstance]];
}

Set result listener:

- (instancetype)init {
    self = [super init];
    if ( self ) {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(handleProductRequestNotification:)
                                                     name:APProductRequestNotification
                                                   object:[APProductManager sharedInstance]];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(handlePurchasesNotification:)
                                                     name:APPurchaseNotification
                                                   object:[APStoreObserver sharedInstance]];
    }
    return self;
}

handleProductRequestNotificationwill be fired when get response for product.

handlePurchasesNotification will be fired when get response for purchase.

Request product with identifier:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *productIdentifiers = @[
                                    @"1994101101",
                                    @"1994101102",
                                    @"1994101103"
                                    ];

    APProductManager *productManager = [APProductManager sharedInstance];
    [productManager
     fetchProductInformationForIds:productIdentifiers];
}
-(void)handleProductRequestNotification: (NSNotification *)notification {
    APProductManager *productRequestNotification = (APProductManager*)notification.object;
    APProductRequestStatus result = (APProductRequestStatus)productRequestNotification.status;

    if (result == APProductRequestSuccess) {
        NSLog(@"VALID: %@", productRequestNotification.availableProducts);
        NSLog(@"INVALID: %@", productRequestNotification.invalidProductIds);
    }
}

APKit

1994101103 is an invalid product identifier.

Purchase:

NSArray *productArray = productRequestNotification.availableProducts;
if ( productArray.count > 0 ) {
    SKProduct *product_1 = productArray.firstObject;

    APStoreObserver *storeObs = [APStoreObserver sharedInstance];
    [storeObs buy:product_1];
}
#pragma mark - Handle purchase notification

-(void)handlePurchasesNotification: (NSNotification *)notification {
    APStoreObserver *purchasesNotification = (APStoreObserver *)notification.object;
    APPurchaseStatus status = (APPurchaseStatus)purchasesNotification.status;

    switch ( status ) {
#pragma - Purchase
        case APPurchaseSucceeded: {
            NSLog(@"Purchase-Success: %@", purchasesNotification.productsPurchased);
            // Verify receipts step.
            [self verifyReceipts];
            break;
        }
        case APPurchaseFailed: {
            NSLog(@"Purchase-Failed %@", purchasesNotification.errorMessage);
            break;
        }
        case APPurchaseCancelled: {
            NSLog(@"Purchase-Cancelled!");
            break;
        }
#pragma - Restore
        case APRestoredSucceeded: {
            NSLog(@"Restored-Success: %@", purchasesNotification.productsRestored);
            break;
        }
        case APRestoredFailed: {
            NSLog(@"Restored-Failed %@", purchasesNotification.errorMessage);
            break;
        }
        case APRestoredCancelled: {
            NSLog(@"Restored-Cancelled!");
            break;
        }
        default:
            break;
    }
}

Watch for line 12, [self verifyReceipts]; it’s important.

Verify receipt:

If you get some error, try to use SKReceiptRefreshRequest

NSURL *localReceiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *data = [NSData dataWithContentsOfURL:localReceiptURL];
NSString *receiptStr = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

send receiptStrto your server.

About local receipt verify local verify your receipt.

or use go-iap-verify-receipt

Release note
  • 0.3.2: Update comments and add some documents, update license, remove unused files and folders.

  • 0.3.0, 0.3.1: Clean workspace, format code with 2 indent.
  • 0.2.0: Download Hosted content.
  • 0.1.0: basic features develope, initialized repo.
ReadMe in cdn

APKit introduction

License

MIT.

FOSSA Status

Latest podspec

{
    "name": "APKit",
    "version": "0.3.2",
    "summary": "APKit, easy for use in app purchase.",
    "description": "Use APKit for In-app purchase easier, set observer then click product, wait ... Wow, completed!",
    "homepage": "https://github.com/WildDylan/APKit",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    },
    "authors": {
        "Dylan": "[email protected]"
    },
    "source": {
        "git": "https://github.com/WildDylan/APKit.git",
        "tag": "0.3.2"
    },
    "social_media_url": "https://twitter.com/dylanccccc",
    "platforms": {
        "ios": "7.1"
    },
    "source_files": "APKit/Classes/**/*",
    "public_header_files": "APKit/Classes/**/*.h",
    "frameworks": [
        "UIKit",
        "StoreKit",
        "Foundation"
    ]
}

Pin It on Pinterest

Share This