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 这里我以在应用内打开 微信
为例子.
效果图如下:
从效果图可以看出, 用户在自己的应用内打开 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, 缓解一下用户急躁的心情.