iOS 在應用內展示App Store 【StoreKit,SKStoreProductViewController】,iosstorekit
出於什麼樣的原因你會希望使用者從你的iOS app中進入App Store呢?可能你想使用者去App Store 為你的應用評分,也可能你希望使用者看到你其他的iOS app。iOS 6引入了SKStoreProductViewController類,可以讓使用者在不離開當前應用的前提下展示App Store中的其他產品。
Store Kit
SKStoreProductViewController類是Store Kit架構的一部分。SKStoreProductViewController使用起來非常簡單,在用執行個體講解之前,瞭解一些基本的知識很有必要。
SKStoreProductViewController類是UIViewController的子類, 如果你對view controller比較熟悉的話,那SKStoreProductViewController使用起來也非常簡單了。當你希望向使用者展示App Store中產品時,你需要:
1.執行個體化一個SKStoreProductViewController類
2.設定它的delegate
3.把sotre product視圖控制器顯示給消費者
剩下的就交給作業系統來處理了。需要記住一點的是SKStoreProductViewController只能以模態的方式顯示。 SKStoreProductViewControllerDelegate協議定義了一個單獨的方法— productViewControllerDidFinish:,當消費者離開App Store時會調用這個方法—一般是通過點擊左上方畫面中的取消按鈕。通過給代理髮送productViewControllerDidFinish:消 息,作業系統就會把控制權返回到你的程式。下面我來示範一下如何在一個簡單的程式中使用SKStoreProductViewController類。
Step 1: Setting Up the Project
我們將要建立的app不是多實用,僅有一個按鈕,可以把使用者帶入App Store,向使用者展示我最近發布的一款簡單的天氣類app。通過執行個體我們可以瞭解不同的部分如何很好地契合在一起,還可以瞭解如何在項目中使用 SKStoreProductViewController類。
從模版列表中選擇一個Single View Application模版,在Xcode中建立一個新的項目。
將程式的名稱設定為UsingStoreProduct,然後輸入一個company identifier,並將device family設定為iPhone,最後勾選上Automatic Reference Counting。剩餘的勾選框不要勾選。“告訴”Xcode你希望儲存項目的地方,點擊建立按鈕。
Step 2: Adding the Store Kit Framework
由於SKStoreProductViewController類是Store Kit架構的一部分,所以我們需要將這個Store Kit架構連結到我們的工程中。在工程導航器中選中工程,然後在target列表中選中target。在畫面的頂部,選擇Build Phase選項,然後開啟Link Binary With Libraries。點擊‘+’按鈕,並在列表中搜尋StoreKit並選擇StoreKit.framework。這樣就可以成功的將Store Kit架構連結到工程中。
為了使用UsingStoreProductViewController類裡的Store Kit架構,我們需要輸入架構的標頭檔,開啟UsingStoreProductViewController.h,在頂部添加下邊這個引入文法:
#import <StoreKit/StoreKit.h>
Step 3: Using the SKStoreProductViewController Class
在視圖控制器的viewDidLoad方法中,在下面的程式碼片段中建立一個新的按鈕。按鈕的類型是UIButtonTypeRoundedRect,然後 我把這個按鈕放在視圖控制器view的正中間。同時我還給這個按鈕制定了一個title,並添加了一個target-action——匹配 UIControlEventTouchUpInside事件。這意味無論何時,使用者點擊按鈕,view controller就會收到“前往尋藝 App Store”的資訊。
- (void)viewDidLoad{ [super viewDidLoad]; [super viewDidLoad]; //初始化一個按鈕 UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button setTitle:@"前往尋藝 App Store" forState:UIControlStateNormal]; [button setFrame:CGRectMake(0.0, 0.0, 200.0, 44.0)]; [button setCenter:self.view.center]; [self.view addSubview:button]; [button addTarget:self action:@selector(openAppStore:) forControlEvents:UIControlEventTouchUpInside]; }
在openAppStore: 方法中,我對SKStoreProductViewController進行了初始化,並將自己設定為它的delegate,然後在給這個執行個體發送一個 loadProductWithParameters:completionBlock:訊息。
loadProductWithParameters:completionBlock:接收兩個參數:
(1)一個字典:用一個key指定我們想要顯示給用的程式的標示符。
(2)一個completion block。
當App store請求結束時會調用這個completion block。在完成的block中,我們要核實是否有錯誤遺漏,並把store product 視圖控制器展示給使用者。
請記住,即使使用者沒有離開你的程式,作業系統仍然會在內部進行與App store的串連。由於在請求App Store過程中,會需要稍微長的一段時間,也就是說,最好在請求還沒有返迴響應時給使用者顯示一個風火輪。一旦請求完成(成功或者不成功),已經完成的 block將會允許我們解除activity indicator。
-(void) openAppStore:(id)sender{ //初始化Product View Controller SKStoreProductViewController *storeProductViewController = [[SKStoreProductViewController alloc] init]; //配置View Controller [storeProductViewController setDelegate:self]; [storeProductViewController loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier:@"685836302"} completionBlock:^(BOOL result, NSError *error){ if(error) { NSLog(@"Error %@ with User Info %@.", error, [error userInfo]); } else { [self presentViewController:storeProductViewController animated:YES completion:nil]; } }]; }
注意:你可以在iTunes Connect找到app的唯一識別符,App Store中的每個app都有一個唯一識別符/Apple ID,注意你需要將在參數字典中以字串的形式傳遞apple id。
在產生和運行程式之前,我們需要MTViewController類通過實現productViewControllerDidFinish:方法以遵循 SKStoreProductViewControllerDelegate協議。我們可以通過告訴編譯器“UsingStoreProductController類符合 SKStoreProductViewController授權協議”來更新view controller的介面檔案,看下邊:
#import <UIKit/UIKit.h>#import <StoreKit/StoreKit.h>@interface UsingStoreProductViewController : UIViewController<SKStoreProductViewControllerDelegate>@end
Step 4: Build and Run
雖然蘋果表示SKStoreProductViewController類可以向使用者展示其他app,但這是一種理想的在使用者不離開當前app的情況下,讓使用者去App Store評分的方法。
整個的運行邏輯代碼:
UsingStoreProductViewController.m
//// UsingStoreProductViewController.m// UsingStoreProduct//// Created by david on 13-9-23.// Copyright (c) 2013年 WalkerFree. All rights reserved.//#import "UsingStoreProductViewController.h"@interface UsingStoreProductViewController ()@end@implementation UsingStoreProductViewController@synthesize indicatorView;- (void)viewDidLoad{ [super viewDidLoad]; [super viewDidLoad]; //初始化一個按鈕 UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button setTitle:@"前往尋藝 App Store" forState:UIControlStateNormal]; [button setFrame:CGRectMake(0.0, 0.0, 200.0, 44.0)]; [button setCenter:self.view.center]; [self.view addSubview:button]; [button addTarget:self action:@selector(openAppStore:) forControlEvents:UIControlEventTouchUpInside]; }-(void) openAppStore:(id)sender{ [self showIndicator]; //初始化Product View Controller SKStoreProductViewController *storeProductViewController = [[SKStoreProductViewController alloc] init]; //配置View Controller [storeProductViewController setDelegate:self]; [storeProductViewController loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier:@"685836302"} completionBlock:^(BOOL result, NSError *error){ if(error) { NSLog(@"Error %@ with User Info %@.", error, [error userInfo]); } else { [self hideIndicator]; [self presentViewController:storeProductViewController animated:YES completion:nil]; } }]; }-(void) productViewControllerDidFinish:(SKStoreProductViewController *)viewController{ [self dismissViewControllerAnimated:YES completion:nil];}- (void)showIndicator{ indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; indicatorView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; [self.view addSubview:indicatorView]; [indicatorView sizeToFit]; [indicatorView startAnimating]; indicatorView.center = self.view.center;}- (void)hideIndicator{ [indicatorView stopAnimating];}- (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}@end