アプリ内でAppStoreを表示する方法

アプリ内でAppStoreの画面を表示する方法をまとめました。
URLスキームでAppStoreアプリを開くのではなく、アプリ内でAppStoreのアプリページを表示する方法です。
他のアプリを紹介したいときに使えます。
iOS6以上のアプリで使用可能です。

![product.jpg](https://qiita-image-store.s3.amazonaws.com/0/34488/98a9c5ae-528c-31f6-4f74-9f08f7615a19.jpeg)



#アプリのIDの調べ方
iTunesStoreで表示したいアプリのページを表示して、タイトルの部分をコピーするとURLがコピーできます。
例：https://itunes.apple.com/jp/app/doragonkuesutomonsutazu-suparaito/id710247888?mt=8
idから?mt=8までの値である710247888がアプリのIDです。


#StoreKit.frameworkの登録
StoreKitフレームワークを登録します。
プロジェクトのTARGETS→Build Phase→Link Binary With Libraryの画面を開き、
+ボタンをタップしてStoreKit.frameworkを選択してください。

![skstorekit.jpg](https://qiita-image-store.s3.amazonaws.com/0/34488/c1106afb-322c-a79c-7736-8aed9cc4a681.jpeg)


#サンプルコード

画面を開いたときにAppStoreの画面を表示するサンプルコードです。

###Objective-C

```objc:Objective-C

#import "ViewController.h"
#import <StoreKit/StoreKit.h>

@interface ViewController () <SKStoreProductViewControllerDelegate>
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self showSKStoreProductViewController];
}

// アプリ内AppStore画面を表示するメソッド
- (void)showSKStoreProductViewController {
    SKStoreProductViewController *productViewController = [[SKStoreProductViewController alloc] init];
    productViewController.delegate = self;
    
    [self presentViewController:productViewController animated:YES completion:^() {
        
        NSString *productID = @"710247888"; // 調べたアプリのID
        NSDictionary *parameters = @{SKStoreProductParameterITunesItemIdentifier:productID};
        [productViewController loadProductWithParameters:parameters
                                         completionBlock:^(BOOL result, NSError *error)
         {
             // 読み込み完了またはエラーのときの処理
             // ...
         }];
    }];
}

// キャンセルボタンが押されたときの処理
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController {
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end

```

###Swift


```swift:Swift

import UIKit
import StoreKit

class ViewController: UIViewController, SKStoreProductViewControllerDelegate {
                            
    override func viewDidLoad() {
        super.viewDidLoad()
        
        showSKStoreViewController()
    }
    
    func showSKStoreViewController() {
        let productViewController = SKStoreProductViewController()
        productViewController.delegate = self
        
        presentViewController( productViewController, animated: true, completion: {() -> Void in
            
            let productID = "710247888" // 調べたアプリのID
            let parameters:Dictionary = [SKStoreProductParameterITunesItemIdentifier: productID]
            productViewController.loadProductWithParameters( parameters, completionBlock: {(Bool, NSError) -> Void in
                // 読み込み完了またはエラーのときの処理
                // ...
                })
            })
    }
    
    // キャンセルボタンが押された時の処理
    func productViewControllerDidFinish(viewController: SKStoreProductViewController!) {
        dismissViewControllerAnimated( true, completion: nil);
    }
}


```

#裏ワザ：デベロッパーのアプリ一覧を表示する
IDにアプリのIDではなく、デベロッパーのIDを登録することでアプリ一覧を表示することができます。

![developer.jpg](https://qiita-image-store.s3.amazonaws.com/0/34488/f71b8665-bac9-3a3b-6372-8622b1e36d50.jpeg)

###注意
しかし、この方法ではFreeやOPENのボタンを押してアプリをインストールすることはできますが、
各アプリのセルをタップしてアプリの画面に遷移できなかったり、フリーズしたり、アプリが落ちたりします。
(iOS7以上。iPhone,iPadどちらもNG。)