发布于 

iOS: 应用内打开 AppStore

应用场景

我们的 App 需要在 AppStore 上面打开某个 App 或者游戏, 目的最常见的有:

1.评分评论.
2.推荐下载(App 或者游戏).

很多开发者知道打开 AppStore 只需要一句代码:

1
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itunes app url"]];

这样就很简单的打开 AppStore 了, 但是产品经理问了, 能在我们应用内打开 AppStore 吗?

你当时懵逼了吗?

不要懵逼, 以后只要遇到类似这种问题, 你就问产品经理哪个 APP 这样做了?
然后, 他就给你看别人家的效果, 你就理直气壮地说: “别人可以做到的, 我们也可以做到!”.

应用内打开 AppStore 也很简单.
在 iOS6之后, 苹果已经给我们提供了 SKStoreProductViewController, 大家看一下文档, 你就笑了.

1
2
SKStoreProductViewController
/* View controller to display iTunes Store product information */

应用内打开 AppStore

这里我以在应用内打开 微信 为例子.

效果图如下:
1

从效果图可以看出, 用户在自己的应用内打开 AppStore 后, 不仅可以下载或者打开微信, 还可以直接评论评分, 简直爽(也难怪产品经理这么干).

那我们说一下如何实现上面的效果.

实现方案和步骤

1.包含头文件 #import <StoreKit/StoreKit.h>

2.实现 SKStoreProductViewControllerDelegate

具体代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
- (void)openAppFromAppStore:(NSString *)appid
{
if (nil == appid || appid.length <= 0) {
return;
}

// 加个 loading

SKStoreProductViewController *store = [[SKStoreProductViewController alloc] init];

store.delegate = self;

NSDictionary<NSString *, id> *parameters = @{SKStoreProductParameterITunesItemIdentifier: appid};

[store loadProductWithParameters:parameters completionBlock:^(BOOL result, NSError *error) {

// 结束 loading

if (error) {

NSLog(@"error %@ with userInfo %@", error, [error userInfo]);

// 提示用户发生了错误

// 或者通过 URL 打开 AppStore App.

// NSString *url = @"https://itunes.apple.com/in/app/wechat/id414478124?mt=8";

//[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}
else {

[self presentViewController:store animated:YES completion:^{
}];
}
}];
}
/// 用户点击取消会执行该方法
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController
{
[viewController dismissViewControllerAnimated:YES completion:^{

}];
}

调用(@”414478124” 是 微信 的)方式:

1
[self openAppFromAppStore:@"414478124"];

修改 AppStore 的导航栏

产品经理说, 既然你已经实现了上面的功能, 看看能不能把 AppStore 的导航栏改一个牛逼的颜色, 就像上面的大红色.

~

可以, 干!

直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
- (void)openAppFromAppStore:(NSString *)appid
{
if (nil == appid || appid.length <= 0) {
return;
}

// 加个 loading

// 导航栏上面的文字和图片颜色变了
[[UINavigationBar appearance] setTintColor:[UIColor greenColor]];

// 导航栏的大红色出来了
[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];

[UINavigationBar appearanceWhenContainedIn:[SKStoreProductViewController class], nil];

SKStoreProductViewController *store = [[SKStoreProductViewController alloc] init];

store.delegate = self;

NSDictionary<NSString *, id> *parameters = @{SKStoreProductParameterITunesItemIdentifier: appid};

[store loadProductWithParameters:parameters completionBlock:^(BOOL result, NSError *error) {

// 结束 loading

if (error) {

NSLog(@"error %@ with userInfo %@", error, [error userInfo]);

// 提示用户发生了错误

// 或者通过 URL 打开 AppStore App.
}
else {

[self presentViewController:store animated:YES completion:^{
}];
}
}];
}

注意事项

1.打开 SKStoreProductViewController 目前只能使用 present 方式, 不可以使用 push 的方式.

否则会报错:

1
2
//Terminating app due to uncaught exception 'SKUnsupportedPresentationException',
//reason: 'SKStoreProductViewController must be used in a modal view controller'

2.加入 loading

在应用内打开 AppStore, 为了不让用户傻等(网络不好的时候, 打开很慢), 可以加入 loading, 缓解一下用户急躁的心情.


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

veryitman