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。

0 0
原创粉丝点击