无处不在的叶子
无处不在的叶子
  • 发布:2016-05-11 17:55
  • 更新:2016-11-07 14:37
  • 阅读:2163

ios原生集成h5项目自动升级提示缺少模块

分类:5+ SDK
wgt

详细问题描述
[内容]
ios原生集成h5项目自动升级提示缺少模块(列出了所有模块)
重现步骤
[步骤]
[结果]
[期望]

运行环境
[系统版本]
[浏览器版本]
[IDE版本]
[mui版本]

附件
[代码片段]

[安装包]

联系方式
[QQ]
[电话]

2016-05-11 17:55 负责人:无 分享
已邀请:

最佳回复

无处不在的叶子

无处不在的叶子 (作者)

关于这个问题,之前一直因为别的事情就没有继续研究,现在终于有时间了花了一天搞定这个问题:
一.这个wgt更新其实细节很多请耐心看:
1.首先我们的项目集成到原生一定要按照这样的目录结构/Pandora/apps/(你的h5+应用的id)/www/一开始我以为这个目录没有影响,不至于做个东西那么脆弱还必须强制目录结构,后来发现事实是残忍的,它就是这么脆弱,切记一定要按照这个目录。

  1. www文件夹下面放我们的资源,爱怎么放怎么放但是一定要有manifest.json文件在www下面,其他的随意了
  2. 把这个三层目录结构的东东放入原生项目(我只负责ios)我用的是虚拟文件夹也就是引用的方式放入的
  3. 搞好之后接下来就是我们需要调用wgt更新的代码了,这个就不多说了,大家自己应该都写过。
  4. 下载之后安装,只要你上面的目录是按照刚才的结构组织的就不会报缺少模块的错误了。
  5. 大家以为这就完了吗?远远没有,这时候安装也提示你成功了但是你重新启动你的app会发现一个问题
  6. 纳尼?为什么没有替换掉,怎么还是之前的项目,明明更新安装成功了呀?这是为什么呢?
  7. 原因很简单,就是wgt的更新机制的问题,他并没有向我们想象的那样把wgt资源包解压到我们的沙盒并且替换掉之前的文件夹,并没有。
  8. 那他解压到哪里去了呢?
  9. /Users/admin/Library/Developer/CoreSimulator/Devices/648CC54A-4D68-4543-A2D4-FF6778864B5A/data/Containers/Data/Application/6049B4B1-FC7C-41B9-B9F0-FB30E786015A/Library/Pandora/apps/XBJY(这是我们h5+的id)/www/。这个目录就是wgt资源解压释放的目录。
    11.知道问题所在了,我们要怎么办?把它拷贝进沙盒里面去?no,苹果的调性你又不是不知道,他会让你乱改沙盒里面的东西吗?
    12.唯一的解决办法就是我们h5+的代码安装成功之后就去调用原生的方法,去重新启动我们的应用并且把启动目录更换成我们的安装包解压的路径,也就是第十步我们的那个路径。
    13.上代码
    NSString
    pWWWPath =[[[NSBundlemainBundle]bundlePath]stringByAppendingPathComponent:@"/Pandora/apps/XBJY/www"];
    //获取更新包解压的路径,判断是否包含安装包来确定应用启动的路径
    NSArray paths=NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    if (paths) {
    NSString
    LibraryPath=[paths firstObject];
    NSString pUpdatapath=[LibraryPath stringByAppendingString:@"/Pandora/apps/XBJY/www/"];
    NSString
    manifestPath=[pUpdatapath stringByAppendingString:@"manifest.json"];
    NSFileManager* pFileManager=[NSFileManager defaultManager];
    if ([pFileManager fileExistsAtPath:manifestPath]) {
    pWWWPath=pUpdatapath;
    NSLog(@"===================================%@",pWWWPath);
    }
    }
  10. pWWWPath是沙盒里面我们打包进去的我们的h5+的资源路径,pUpdatapath是wgt包的路径,我这里是通过判断这个路径下面有没有manifest.json文件来知晓有没有更新包,有的话就把app的启动路径替换成我们的更新包也就是wgt资源释放的路径,这样应用启动之后就是我们想看到的更新之后的应用了。
    15.每次更新呢都是这个路径,但是还有一个问题,如果更新了好几次会不会引起app启动错乱啊?很负责任的告诉你们我测试过了,每次更新包解压释放都会覆盖掉之前的文件夹,也就是说这个文件夹下也是只有一份资源的,所以不用担心,如果作为一个严谨的程序员心里接受不了这种不严谨的东西,你可以在h5+应用里面在更新包安装之前把老的文件先删掉,本人考虑过但是那么一瞬间懒了一下就不想写了。。。
    15.到此为止整个wgt的资源更新介绍完毕了,大家有什么问题记得留言,我几乎每天都会上来看看的。
  • 天才书生

    你好,谢谢你的分享,dcloud官方不得不说,文档很烂,人手估计也不足,没有聚合所有的问题点,很多问题也没回答,人手不足的后果就是,QQ上问个问题,一天都不回答,要回答的时候,就回答一句“你按出错提示上的搞一搞”就没人影了

    2016-11-22 11:36

  • 天才书生

    我现在就是想问一下【首先我们的项目集成到原生一定要按照这样的目录结构/Pandora/apps/(你的h5+应用的id)/www/一开始我以为这个目录没有影响】,这话中的H5+的ID是指HBuilder生成的那段不规则字符串,还是自己的,我的目录结果是/Pandora/apps/QZZH/www这样子,是指前者还是后者?谢谢

    2016-11-22 11:38

  • 无处不在的叶子 (作者)

    你好兄弟,这里的id指的是manifest.json文件中的appId。

    2016-11-22 13:34

  • 天才书生

    回复 无处不在的叶子:十分感谢,再请教一下,上面那段IOS代码要放在哪里呢,能否具体说一下在哪个文件哪个方法体里

    2016-11-22 15:23

  • 无处不在的叶子 (作者)

    你加我qq1198936901,这里沟通不便利,上面的代码是集成进原生之后的ios的代码,不知道你是什么情况?

    2016-11-22 15:32

该问题目前已经被锁定, 无法添加新回复