关于上苹果的 H5 游戏上线概况:
目前 H5 加壳游戏上线基本是靠运气上线, 纯粹的只为了加载 H5 网页的壳基本是过不了的, 一般 H5 游戏 CP 都想方设法的增大包体, 但是无用的增大包体会被苹果检查出来一般会当做混淆 2.3 处理, 严重可能封号, 所以很多 CP 都想把游戏资源 (图片, JS,JSON) 等资源放在本地, 通过拦截网页请求来加载本地资源. 拦截资源遇到的问题:
* 相信大家都在用 WKwebview 来加载游戏链接(WKWebview 相比 UIWebview 的优势就不在这里说了), 而我们拦截都是用 NSURLProtocol 来拦截的(NSURLProtocol 是 URL Loading System 的重要组成部分. 它是一个抽象类. 可以拦截网络请求. 可以拦截的网络请求包括 NSURLSession,NSURLConnection 以及 UIWebvIew), 而 NSURLProtocol 来拦截 WKWebView 会导致 Post 请求被挂起, 而被挂起基本是苹果针对 WKWebview 性能优化而舍弃的东西, 不过我们合理的拦截其实可以避免. 目前网上说的解决方案:
目前网上说的
(1)自定义 Scheme: 针对于 get 请求有效, post 请求是没有作用的!
(2)还有就是把 post 请求 body 放在 httpHead 中, 请求头的参数大小是有限制的
* 图片拦截也会出现一些图片加载不出来的情况, 究其原因是因为没有请求头, 所以涉及到自定义请求头的问题, 下面一步一步讲解
本地替换图片问题
我们现在针对于上述 2 种拦截问题以 2 种拦截方式来进行.
一: 单个 JS 的拦截
1. 首先你需要先注册 NSURLProtocol
注册代码
2. 你需要创建一个继承 NSURLProtocol 的子类, 并实现 NSURLSessionDelegate 的代理
代理
3. 注册成功后我们会发现所有的 WebView 的请求链接都会走 + (BOOL)canInitWithRequest:(NSURLRequest*)request 这个方法, 我们在这里设置拦截规则.
拦截规则
4. 当设置了拦截规则后满足该规则后会走 + (NSURLRequest*)canonicalRequestForRequest:(NSURLRequest*)request
此时我们在这里进行本地 JS 的替换. 并及时注销 NSURLProtocol 和拦截方法
拦截和解除拦截
tip: 拦截是需要同时注销这 2 种方式
二: 大量资源的本地替换
图片资源的拦截一般有以下特征:
1. 拦截资源很多, 针对游戏所以资源进行拦截的话会有很多的拦截
2. 图片需要去设置缓存
NSURLProtocol 拦截步骤:
1. 图片拦截我们通过一个 Plist 文件进行统一管理, 这种管理方式是通过本地图片名字为值, 网络图片地址为键的对应方式, 当检测到 key 是进行拦截.
2. 而我么你的替换是在在 startLoading 中加载, 实现思路: 将需要替换的地址重新拼接 response 返回, 再响应本地资源. 我们需要自定义请求头的参数, 关键代码如下:
图片上传的关键代码
支付和替换具体代码因公司在用不贴代码啦, 具体可以添加 QQ:969661780
或者微信:
前不久用本猿的壳上线 H5 游戏:
https://apps.apple.com/cn/app / 沙城天下 - 沙虫袭击 / id1461700547#?platform=iPhone
来源: http://www.jianshu.com/p/f9d0a50d8dfc