改造遗留 App 以适应苹果 AppStore 新规
前言
多年前开发的 App,由于各种原因没有翻新过,近期需要紧急上架苹果应用商店。可是应用通过 XCode 上传后,明明已经提示上传成功了,但在苹果应用管理界面看不到,苹果的拒绝邮件却出现在我的邮箱中。此后,断断续续,历时 2 个月终于搞定所有问题,上架成功。这里把遇到的问题及其解决方法总结下,方便后来者查阅。
UIWebView 改为 WKWebView
苹果的拒绝邮件中已经写明,需要使用 WKWebView:
ITMS-90809: Deprecated API Usage - New apps that use UIWebView are no longer accepted. Instead, use WKWebView for improved security and reliability.
苹果在 iOS 8 之后,出于安全考虑,建议使用 WKWebView
替代 UIWebView
。
调整 Config.xml 文件
先修改 config.xml 文件,配置 WKWebView 的相关内容:
改用 JWT 方式请求后台数据
由于 WKWebView 不支持 Cookie,如果原来采用的是 Cookie 与后台进行验证,那么就要改成 JWT 方式了。
这个需要登录后,后台返回一个 token,App 在请求的 Header 中使用 Authorization 将 token 发给后台进行验证。
.factory("httpInterceptor", function ( //... ) { return { request: function (config) { if (!angular.isUndefined(config.params)) { //... config.headers["Authorization"] = 'your token' } return config; }, } })
本地文件访问
WKWebView 下,在调试界面时,你会发现访问界面的链接已经不再是 file://方式,而是变成了 HTTP 方式。这样,界面上图片如果是本地图片,且使用 file://,就会出现图片找不到的问题。这里需要将图片的路径转换成 Http 方式:
window.resolveLocalFileSystemURL(imageURI, function (fileEntry) { fileEntry.file(function (fileObj) { var reader = new FileReader(); reader.onloadend = function (evt) { var image = new Image(); image.src = evt.target.result; image.onload = function (evt) { var item = { //... //下面这里,将fileEntry.nativeURL转换一下 imageUrl: window.Ionic.WebView.convertFileSrc(fileEntry.nativeURL), }; data.push(item); //... image = null; }; }; reader.readAsDataURL(fileObj); }); });
相关插件的升级或替换
上述问题修改完毕后,第二次上传苹果商店,再次被拒绝,原因同上。
由于不知道苹果是如何监测 App 是否使用 UIWebView,所以我干脆采用一个笨方法,用 XCode 打开 App 文件,搜索’UIWebView‘,发现有些老旧插件也用到了 UIWebView。根据实际情况可升级或替换插件。
App 上架时注意事项
- Info.plist 文件中添加如下内容,可以避免填写”出口规则“:App Uses Non-Exempt Encryption = NO
- Images.xcassets 中 AppIcon 中的图片,如果出现警告,需要从文件夹中选中对应大小的 icon 添加上去
- 提交审批时,如果拒绝的原因是要求提供视频,就录制一个视频发布到网上,提供视频链接即可
- 如果 App 中使用的相机和相册,需要在 Info.list 文件中通过 NSPhotoLibrayUsageDescription、NSCameraUsageDescription 写明使用目的
小结
苹果商店上架的条款时常会更新,上架时如果收到拒绝邮件,别慌,拒绝原因会清楚的写在邮件中,按照要求改进 App 即可。