SKStoreProductViewController中的坑
来源:互联网 发布:java无限循环代码 编辑:程序博客网 时间:2024/05/18 22:43
作者:代培
地址:http://blog.csdn.net/dp948080952/article/details/54543527
转载请注明出处
前言
最近在使用SKStoreProductViewController时遇到很多坑,上网搜索时发现关于这个东西的讨论不多,stack overflow上也并没有找到我需要的答案,经过与其3天的抗争,总算是爬出了这些坑,赶紧写篇博客冷静一下。
正文
首先我们先从SKStoreProductViewController说起,这是一个应用内的应用商店,就是说在应用内部无须跳转到应用商店就可以预览并下载应用,和在应用商店内部并无差异,体验是相当不错,但是如果没有找到正确的使用姿势,那么会让你苦不堪言。
简单使用
先看看这个东西该怎么使用,废话不多说,直接上代码。
- (void)viewDidLoad { [super viewDidLoad]; //首先实例化一个VC SKStoreProductViewController *storeVC = [[SKStoreProductViewController alloc] init]; //然后设置代理,注意这很重要,不如弹出就没法dismiss了 storeVC.delegate = self; //接着弹出VC [self presentViewController:storeVC animated:YES completion:nil]; //最后加载应用数据 [storeVC2 loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier:@(1173412177)} completionBlock:^(BOOL result, NSError * _Nullable error) { if (error) { //handle the error } }];}- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController { //在代理方法里dismiss这个VC [viewController dismissViewControllerAnimated:YES completion:nil];}
简单的几行代码,就可以实现,但是肯定有人会问为何要弹出VC后再加载数据,那样不会比较慢吗?提前加载体验不是会更好吗?的确是这样,我也是为了这个好的体验,跳进了一个深坑,苹果总是为我们考虑很多。
预加载
在我做了预加载之后,遇到了两个问题:
- 在弹出StoreVC时没有反应,并且应用会卡住几秒
- 弹出一个连取消都没有的空白VC
在排除了我自身的bug后我确定这是SKStoreProductViewController的问题,上面的两个问题都是由于预加载出问题时导致的。
注意我这里的用词:预加载出问题而不是出错,也就是说加载的completion的block还没调用时,你还不知道这个时候加载出错时只是它内部加载有问题时,这时你present这个VC时就会导致应用卡顿。
对于弹出一个取消按钮都没有的空白VC的问题也是因为加载没有完成,导致取消没有显示出来,当然这个不是必现的,有时还会遇到一种情况就是开始弹出一个没有取消按钮的VC,过一会又加载出来了。
所以如果你一定要做预加载的话,唯一的解决方案就是当收到成功的回掉以后才能弹出这个VC,否则放弃这个VC,重新实例化一个StoreVC然后弹出并加载(不要忘记设置代理),因为这样是一定不会出问题的。
为什么可以这么肯定呢?因为如果呢实例化一个SKStoreProductViewController,不做任何加载工作此时弹出并不会出任何一个问题,只是这是一个空白的VC,但是取消按钮一定是存在的,就是说最多让别人觉得这网速很慢,加载不出来,而不会觉得这是一个bug。
我想补充的是即使这样做仍然没法避免弹出空白的VC(无取消按钮),所以最好的方案就是不做预加载,从表现来看苹果肯定是希望我们不做预加载的,至于loadProduct方法该在何时调用,在弹出VC前后调用都可以,记住别过早的调用就好。
不要两次弹出同一个VC
还有一个很奇怪的现象,就是一个做过加载操作的SKStoreProductViewController,在弹出以后,这个SKStoreProductViewController就被废弃了,什么意思呢?就是说你不能再次弹出这个VC,不然也会出现上面的bug,就是一个没有取消按钮的VC,即使你在弹出前再次调用此VC的load方法,结果都是一样,他不会理你的,就是不给你弹两次,这都是一次性的VC,这显然是苹果故意为之,只是不明白这种设计的背后是出于怎样的考虑。
总结
总之,对于SKStoreProductViewController来说,记住尽量不要去做预加载,因为在网速不错的情况下弹出后再加载体验也很不错,加载速度是很快的,这时根本不需要做什么预加载,而对于网速不好的用户,即使做了预加载也可能加载不出来,也不需要做预加载。所以能不做预加载就尽量别做,这里的预加载只会让你无比抓狂!如果呢一定要做预加载,那么记住一点很重要那就是:只有收到成功回掉SKStoreProductViewController才能弹出,否则乖乖的弹出后加载,这样才能避免一些不可描述的bug。
- SKStoreProductViewController中的坑
- StoreKit--SKStoreProductViewController
- StoreKit--SKStoreProductViewController
- StoreKit--SKStoreProductViewController
- StoreKit-SKStoreProductViewController
- StoreKit--SKStoreProductViewController
- 应用内展示AppStore SKStoreProductViewController
- 应用内展示AppStore SKStoreProductViewController
- iOS 在应用内展示App Store 【StoreKit,SKStoreProductViewController】
- SKStoreProductViewController--便捷的APP宣传推广展示方式
- hadoop 配置中的坑
- IOS7中的一些坑
- Windows API中的坑
- javascript中的一些坑
- 【坑】javascript中的prototype
- UIViewController中的一个坑
- css中的坑
- python中的坑
- 简单高效的图片降噪方法
- vs2012 格式化代码和快速注释快捷键
- 2017-1-15
- Qt for Mac 设置软件开机自启动
- Python 栈和队列
- SKStoreProductViewController中的坑
- android webView工具类
- C++易错:(四)&&与&
- PyQt5的学习之路(二)
- AOP动态代理实例
- JDK的安装与配置
- Android客户端与服务器端交互 如何保持session
- OpenCV 3 最新模块一次看个够
- Hibernate 之单表映射