不跳转App Store 应用内直接下载应用
SKStoreProductViewController 这个类需要了解下。
/* View controller to display iTunes Store product information */
SK_EXTERN_CLASS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED @interface SKStoreProductViewController : UIViewController
官方解释:用于展示iTunes Store 商品信息的类,继承自UIViewController。
使用
1.导入头文件:#import <StoreKit/StoreKit.h>
2.初始化类,设置代理SKStoreProductViewControllerDelegate
,展示VC。必须使用Present VC方式
SKStoreProductViewController *storeVC = [[SKStoreProductViewController alloc] init];
//设置代理 SKStoreProductViewControllerDelegate
storeVC.delegate = self;
[self presentViewController:storeVC animated:YES completion:nil];
3.请求Store 信息。 必须在展示VC之后再请求
/** presentVC 之后再调取加载Store方法 官方备注:
// Load product view for the product with the given parameters. See below for parameters (SKStoreProductParameter*).
// Block is invoked when the load finishes.
*/
[storeVC loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier : @"1131090631"} completionBlock:^(BOOL result, NSError * _Nullable error) {
if (error) {
NSLog(@"error = %@", error);
}else {
NSLog(@"显示完成");
}
}];
3.1.如果你不想整个界面就单单的弹出这个下载界面,还想在这加点自己的东西,也是可以自定义视图的。 改变SKStoreProductViewController的frame。
SKStoreProductViewController *storeVC = [[SKStoreProductViewController alloc] init];
storeVC.delegate = self;
NSDictionary *appDict = @{SKStoreProductParameterProductIdentifier : @"appid" };
[storeVC loadProductWithParameters:appDict completionBlock:^(BOOL result, NSError * _Nullable error) {
if (result) {
[self presentViewController:storeVC animated:YES completion:^{
//如果这里我想自定义一个类似于Banner的视图
UIImageView *bannerImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 260)];
bannerImage.image = [UIImage imageNamed:@""];
[storeVC.view.superview addSubview:bannerImage];
//修改展示App Store的frame
storeVC.view.frame = CGRectMake(0, 300, self.view.frame.size.width, self.view.frame.size.height - 260);
}];
}else if (error) {
NSLog(@"加载失败le");
}
}];
具体请求的Paramters ,可以点进去看下具体是什么:
// iTunes Store item identifier (NSNumber) of the product
SK_EXTERN NSString * const SKStoreProductParameterITunesItemIdentifier NS_AVAILABLE_IOS(6_0);
// SKU for the In-App Purchase product (NSString) to render at the top of the product page
SK_EXTERN NSString * const SKStoreProductParameterProductIdentifier NS_AVAILABLE_IOS(11_0);
// Analytics provider token (NSString)
SK_EXTERN NSString * const SKStoreProductParameterProviderToken NS_AVAILABLE_IOS(8_3);
// Advertising partner token (NSString)
SK_EXTERN NSString * const SKStoreProductParameterAdvertisingPartnerToken NS_AVAILABLE_IOS(9_3); NS_AVAILABLE_IOS(6_0);
// SKU for the In-App Purchase product (NSString) to render at the top of the product page
SK_EXTERN NSString * const SKStoreProductParameterProductIdentifier NS_AVAILABLE_IOS(11_0);
// iTunes Store affiliate token (NSString)
SK_EXTERN NSString * const SKStoreProductParameterAffiliateToken NS_AVAILABLE_IOS(8_0);
// iTunes Store affiliate campaign token (NSString)
SK_EXTERN NSString * const SKStoreProductParameterCampaignToken NS_AVAILABLE_IOS(8_0);
// Analytics provider token (NSString)
SK_EXTERN NSString * const SKStoreProductParameterProviderToken NS_AVAILABLE_IOS(8_3);
// Advertising partner token (NSString)
SK_EXTERN NSString * const SKStoreProductParameterAdvertisingPartnerToken NS_AVAILABLE_IOS(9_3);
App Store 参数:SKStoreProductParameterITunesItemIdentifier
, 值就是的应用ID(纯数字即可,不要id)。eg: https://itunes.apple.com/cn/app/gearbest-shopping/id1131090631?l=en&mt=8 这里只取:1131090631.
4.实现代理方法, dismiss VC
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController {
//点击完成或是下载更新完成的回调,dismiss掉VC
[viewController dismissViewControllerAnimated:YES completion:nil];
}
至此,应用内下载更新应用完成。
貌似在iOS 12系统上请求比较慢.issue
这个方法没用系统跳转慢
Tips : 拓展
可以点到这里看下<StoreKit/StoreKit.h>, 还有SKStoreReviewController.h
, SKProductStorePromotionController
具体可以研究下。
后续研究的SKStoreReviewController
这个是apple在iOS10.3推出的新内容,在应用内给App评分。 这个方法一年之内最多使用三次,但是如果需求想让用户评论,感觉一年三次这个限制太少了。 详情请看官方链接:来来来看看
请求评论,非常简单,就一句话即可,后续工作系统都给你完成了:
if ([[UIDevice currentDevice].systemVersion floatValue] > 10.3) {
if ([SKStoreReviewController respondsToSelector:@selector(requestReview)]) {
[SKStoreReviewController requestReview];
}
}
UI具体效果图:
注意:在测试和TestFlight环境下,是不可以点击提交的评论的。
另外这个只是给出一个评价等级,具体评论内容还要用系统给出的Deeplink—— https://itunes.apple.com/app/idXXXXXXXXXX?action=write-review写评论。