iOS中app內購方法

作品鏈接:
http://www.lxweimin.com/users/1e0f5e6f73f6/top_articles

1.請求所有可賣的商品

1.導入第三方框架
2.遵守協議<SKProductsRequestDelegate>

#import <StoreKit/StoreKit.h>

- (void)requestProducts
{
    // 1.拿到所有想賣商品的ProductID
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"iapdemo.plist" ofType:nil];
    NSArray *products = [NSArray arrayWithContentsOfFile:filePath];
    NSArray *productIDs = [products valueForKeyPath:@"productId"];
    
    // 2.向蘋果發送請求,請求所有可買的商品
    //   2.1.創建請求對象
    NSSet *sets = [NSSet setWithArray:productIDs];
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:sets];
    
    //   2.2.設置代理
    request.delegate = self;
    
    //   2.3.開始請求
    [request start];
}

2.實現SKProductsRequest的代理方法

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    NSLog(@"%ld",response.products.count);
    // 1.對數組中對象進行排序(根據商品價格排序)
    NSArray *products = [response.products sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(SKProduct *obj1, SKProduct *obj2) {
        return [obj1.price compare:obj2.price];
    }];
    
    // 2.保存數組
    self.products = products;
    
    // 3.刷新表格
    [self.tableView reloadData];
}

3.實現tableView的數據源和代理方法

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.products.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 1.創建cell
    static NSString *ID = @"productCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }
    
    // 2.給cell設置是數據
    SKProduct *product = self.products[indexPath.row];
    cell.textLabel.text = product.localizedTitle;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"價格:%@",product.price];
    
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 1.取出用戶選中商品
    SKProduct *product = self.products[indexPath.row];
    // 2.購買該商品
    [self buyProduct:product];
}

4.購買商品

- (void)buyProduct:(SKProduct *)product
{
    // 1.創建票據
    SKPayment *payment = [SKPayment paymentWithProduct:product];
    // 2.將票據加入到交易隊列
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}

5.添加觀察者,監聽用戶是否付錢成功

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
    注意: 需遵守 SKPaymentTransactionObserver 協議
#pragma mark - 實現觀察者協議中的方法,來監聽交易的變化
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions
{
    /*
     SKPaymentTransactionStatePurchasing,    正在購買
     SKPaymentTransactionStatePurchased,     購買成功
     SKPaymentTransactionStateFailed,        購買失敗
     SKPaymentTransactionStateRestored,      恢復購買
     SKPaymentTransactionStateDeferred       最終狀態未決定,交易依然在隊列中
     */
    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchasing:
                NSLog(@"正在購買商品");
                break;
                
            case SKPaymentTransactionStatePurchased:
                NSLog(@"購買成功.給用戶對應商品");
                // 交易移除
                [queue finishTransaction:transaction];
                break;
                
            case SKPaymentTransactionStateFailed:
                NSLog(@"購買失敗");
                [queue finishTransaction:transaction];
                break;
                
            case SKPaymentTransactionStateRestored:
                NSLog(@"恢復購買");
                [queue finishTransaction:transaction];
                break;
                
            case SKPaymentTransactionStateDeferred:
                NSLog(@"未決定狀態");
                break;
            default:
                break;
        }
    }
}

6.加載及恢復購買

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 請求所有可賣的商品
    [self requestProducts];
    
    // 添加導航欄右側的按鈕
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"恢復" style:UIBarButtonItemStyleDone target:self action:@selector(restoreProduct)];
}

// 恢復購買
- (void)restoreProduct
{
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容

  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協議。它實...
    香橙柚子閱讀 24,001評論 8 183
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,666評論 25 708
  • 你是不是這種人呢?平時面對任何人都你可以侃侃而談,然而遇到了喜歡的女生。你整個人就處于一種懵逼的狀態,不知道如何和...
    公子義閱讀 1,798評論 0 3
  • 1、 每個男孩都有一個英雄夢,夢想著自己有一天擁有了超能力,然后做出種種英勇壯舉,解救萬民,國家,甚至地球于危難之...
    牧云則哉閱讀 924評論 0 1
  • 背離的背后是股價速度的變化, 在上升過程中,上升速度放緩,代表買盤力量的衰竭,通常導致頂部背離出現 在下降過程中,...
    后80閱讀 392評論 0 0