iOS13适配SKStoreProductViewController和present

3,120 阅读4分钟

准备-可以提前备份升级前数据以防万一

  1. iPhone X 安装 iOS13 下载对应描述文件. 步骤
  1. 最好使用 Safari 打开网页 ibeta.me
  1. 本地需要清空大约1.5G来下载安装包
  1. 客户端xcode升级beta版本
  1. 如果本地有多个xcode需要设置代码的运行路径以及环境避免冲突
  1. 如果环境冲突建议删除一个xcode
  1. 安装xcode Beta后可以run iOS13模拟器调试
  1. 升级系统macOS

开始适配

问题1. SKStoreProductViewController 不允许继承
2019-08-19 16:47:48.076001+0800 BUDemoDev[400:13708] [Bugly] Trapped uncaught exception 'SKUnsupportedClassException', reason: 'SKStoreProductViewController may not be subclassed.'
(
0 CoreFoundation 0x0000000185c6b28c 60CC2DF8-623A-36F3-98A1-B2EED7B5B0CB + 1225356
1 libobjc.A.dylib 0x00000001859940a4 objc_exception_throw + 56
2 CoreFoundation 0x0000000185b60ac8 60CC2DF8-623A-36F3-98A1-B2EED7B5B0CB + 133832
3 StoreKit 0x00000001943e4a48 FEC919AD-0088-3C0C-9E8E-7CF82F9459C1 + 129608
4 BUDemoDev 0x00000001032cda3c -[BUAppStorePreloadItem initWithAppID:adID:logExtra:] + 352
5 BUDemoDev 0x00000001032bb65c -[BUAppStoreManager preloadAppStoreControllerWithAppID:adID:logExtra:isDuplicate:completion:] + 1980
6 BUDemoDev 0x00000001032babbc -[BUAppStoreManager preloadAppStoreControllerWithAppID:adID:logExtra:completion:] + 204
7 BUDemoDev 0x00000001032b9aec +[BUAppStoreManager preloadAppStoreControllerWithAppID:adID:logExtra:completion:] + 188
8 BUDemoDev 0x000000010313a808 __55-[BUNativeAd registerShowContainer:withClickableViews:]_block_invoke + 2848
9 BUDemoDev 0x0000000103287490 -[BUAdViewWitnessChecker checkoutViewTracker] + 940
10 BUDemoDev 0x00000001032870cc __49-[BUAdViewWitnessChecker checkAdViewsIfWitnessed]_block_invoke + 52
11 libdispatch.dylib 0x00000001041b58ac _dispatch_call_block_and_release + 24
12 libdispatch.dylib 0x00000001041b6c88 _dispatch_client_callout + 16
13 libdispatch.dylib 0x00000001041c4ce8 _dispatch_main_queue_callback_4CF + 1316
14 CoreFoundation 0x0000000185be8c74 60CC2DF8-623A-36F3-98A1-B2EED7B5B0CB + 691316
15 CoreFoundation 0x0000000185be3c68 60CC2DF8-623A-36F3-98A1-B2EED7B5B0CB + 670824
16 CoreFoundation 0x0000000185be316c CFRunLoopRunSpecific + 464
17 GraphicsServices 0x000000018fa0d328 GSEventRunModal + 104
18 UIKitCore 0x0000000189c4be1c UIApplicationMain + 1936
19 BUDemoDev 0x0000000102cbdd0c main + 124
20 libdyld.dylib 0x0000000185a6e424 A5FE1BC7-C637-3C0B-9E9A-F929B96583A2 + 5156
)
产生问题后的堆栈信息

修改appStore涉及的相关类,将继承改为分类方式.


问题2:视频详情界面拼接被苹果严令禁止.
现在不允许拼接形式展现.只能如下展示. 找出两个修复方式,个人选择方法1,下面贴出两个不同修复方式的效果

修改方法1 : 修改SKStoreProductViewController.frame,但是UITransitionView.frame不会修改,造成如下视图问题.所以需要在iOS13的情况下修改层级顺序,将视图添加到SKStoreProductViewController.view.superview上面,也就是UITransitionView.就不会产生覆盖
上图是产生问题的原因,视图层级覆盖.
上图是修复后的层级关系

小技巧 : 由于设置frame,在present动画结束之后,会使短时间内修改frame造成视觉上的闪白问题,这里加了0.3秒的动画减少视觉上闪烁的效果.

修改方法2 : 添加转场动画,修改转场UITransitionView的frame. 有些大大说是转场动画失效了,经测试发现可行

代码:

设置动画
设置frame.
问题3:页面不是全屏展示,苹果建议以卡片形式展示. 如图.下图一为iOS13样式,图二为适配后匹配的原样式.
适配代码如下:
参考文档

由于隐私问题有些源码不能分享,有问题可以给我留言.谢谢大家打赏.