iOS集成Dcloud_weixin_30764883的博客-程序员宅基地

技术标签: git  ui  runtime  

 

 

先把补充放在最前面

2016年10月25号更新。正如老大所说,愿望是美好的,现阶段h5融合技术难点,我们还没法解决,h5界面相比原生交互性能问题,管理类app操作设置太多。总结下Dcloud,可能不应该是下面这种方法,不能本地一个h5应用,而是应该直接把他当前webview使用就好了。下面可以参考,也可以不参考,可能有错的地方,阶段性弃用了,应该有段时间不去更新修改下面的啦。

2016年6月19号更新补充,由于tabbar上需要这个模块,并且发现runtime一直跑起的话,手机太热,耗电严重。引擎本就是单例,所以控制器单例不适用和不使用了。

感觉由于使用的是webview所以比较大。

项目本身支持ios8以上,原生加载替换wkwebview

6月26日,也不知道为啥同样方法进去导航栏控制器在视图出现时是有的,加载完也是有的,然后h5那边调用我这边的退出的时候就没了。不明原因。大家有知道吗?是hide以后会导致为nil?

总之没法解决,只是在首页加个通知中心调用viewwillapear 。还必须延时2秒。不然还是卡在首页。好吧,挺纠结的这块搞的。因为所以进去方法一样,其他三个模块没问题,不存在导航栏为nil。还有一句是sdk好像最新的那一个,会死循环。自己可以测试下。

最后,去更新了下sdk 发现里面有个iOS白皮书,以前还没这个东西,坑比较多,现在参考那边就好了。

 

1 .参考链接

http://ask.dcloud.net.cn/docs/#http://ask.dcloud.net.cn/article/83
http://ask.dcloud.net.cn/docs/#http://ask.dcloud.net.cn/article/84

 

2 .注意官方介绍的这句。

注意开发者在使用示例工程时建议不要把工程从SDK目录里挪出来,如果要移动工程可以通过修改library search path ,framework search path 和head search path来解决报错。
因为sdk太大,所以不建议拉进去的,因此放在目录中,根据需要添加库,git上传时忽略该文件夹,打开.gitignore 添加/SDK。
serach 下配置
Framework search paths
$(PROJECT_DIR)/SDK/libs/Release-iphoneos
$(PROJECT_DIR)/CloudStore/Share/Bundles
$(PROJECT_DIR)/SDK/libs/Release-iphonesimulator
Header search paths
$(SRCROOT)/SDK/inc recursive
library search paths
$(PROJECT_DIR)/SDK/libs/Release-iphoneos
$(PROJECT_DIR)/CloudStore/Share/Bundles

中间那个可以拉inc那个文件。我是拉进去编译的。你也可以拉进去不编译。

3.最重要的配置

根据这个文件Feature-iOS配置 other linker flags

同时需要注意下下面几个,可能不一样。
ui和个推sdk还有nativeui注意

 

4.返回按钮

oc代码
- (void)button3Click{
//启动h5工程
    NSString *pWWWPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Pandora/apps/H586661F4/www"];
    pAppHandle = nil;
    //这里自己创建一个view 代替官方代码里面的self.view
    view = [[UIView alloc] initWithFrame:self.view.bounds];
    view.backgroundColor = [UIColor whiteColor];
    view.tag = 22;
    [self.view addSubview:view];
    [[PDRCore Instance] setContainerView:view];
    pAppHandle = [[[PDRCore Instance] appManager] openAppAtLocation:pWWWPath withIndexPath:@"/html/goods/search.html" withArgs:nil withDelegate:nil];
    [[[PDRCore Instance] appManager] restart:pAppHandle];
    [[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector(textClose:) name:@"CloseWebAPP" object:nil];


}

- (void)textClose:(NSNotification *)not{
    //不要在消息触发的方法里关闭应用需要使用异步的方式关闭APP
    [self performSelectorOnMainThread:@selector(classWebApp) withObject:nil waitUntilDone:NO];
}

- (void)classWebApp{
    //调用AppManager的方法关闭应用
    [[PDRCore Instance].appManager end:pAppHandle];
    //需要把h5所在的页面从主View中移除   我这样直接把h5所在的页面的父view置为nil
    for (UIView *subviews in [self.view subviews]) {
        if (subviews.tag==22) {
            [subviews removeFromSuperview];
        }
    }


}
js代码
varnotiClass = plus.ios.importClass("NSNotificationCenter"); notiClass.defaultCenter().postNotificationNameobject("CloseWebAPP",null);

下面是我这部分的代码,主要是根据上面的参考和官方的参考,使用的是widget模式。webview和app模式试了下好像不太行。

[[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector(textClose:) name:@"CloseWebAPP" object:nil];
    //0为widget  1为webview  2为app模式,
    int jhb = 0;
    switch (jhb) {
        case 0:
        {
            //代理 基本是修改样式
            h5Engine.coreDeleagete = self;
            //设置runtime根视图的父亲View
            [h5Engine setContainerView:_containerView];
            //设置5+Runtime ViewContoller
            h5Engine.persentViewController = self;
            [h5Engine showLoadingPage];
            dispatch_async(dispatch_get_main_queue(), ^(void) {
                [h5Engine start];
            });
        }
            break;
        case 1:
        {

            if (h5Engine != nil)
            {
                [h5Engine startAsWebClient];
                NSString* pFilePath = @"http://www.baidu.com";
                NSString* pFilePath = @"http://192.168.60.109/cloudstore/html/index.html";
                CGRect StRect = CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20);
                PDRCoreAppFrame* appFrame = [[PDRCoreAppFrame alloc] initWithName:@"WebViewID1" loadURL:pFilePath frame:StRect];
                [h5Engine.appManager.activeApp.appWindow registerFrame:appFrame];
                [_containerView addSubview:appFrame];
                [self.view addSubview:_containerView];

            }

        }
            break;
        case 2:{

            //  webapp模式 本地应用
                PDRCoreApp* pAppHandle = nil;
            //    设置WebApp所在的目录,该目录下必须有mainfest.json
                NSString *pWWWPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Pandora/apps/com.baobeigou.b2b/www"];
            //    如果路径中包含中文,或Xcode工程的targets名为中文则需要对路径进行编码
                NSString* pWWWPath2 =  (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (CFStringRef)pWWWPath, NULL, NULL,  kCFStringEncodingUTF8 ));
            //    这里自己创建一个view 代替官方代码里面的self.view
                UIView* view = [[UIView alloc] initWithFrame:self.view.bounds];
                view.backgroundColor = [UIColor whiteColor];
                view.tag = 23;
                [self.view addSubview:view];
            //    设置5+SDK运行的View
                [[PDRCore Instance] setContainerView:view];
            //    传入参数可以在页面中通过plus.runtime.arguments参数获取.可不传
            //    NSString* pArgus = @"id=plus.runtime.arguments";
            //   创建app
                pAppHandle = [[[PDRCore Instance] appManager] openAppAtLocation:pWWWPath withIndexPath:@"index.html" withArgs:nil withDelegate:nil];
            //   如果应用可能会重复打开的话建议使用restart方法
                [[[PDRCore Instance] appManager] restart:pAppHandle];


        }
            break;
        default:{
            NSLog(@"输入h5运行模式");
        }
            break;
    }

可以参考

返回按钮http://www.jianshu.com/p/fff3f2ff99c9

其他http://www.jianshu.com/p/d9050a1b765e

上文可能有点乱。

下文runtime只是指h5那个环境下的runtime。
h5环境的runtime关闭时越狱机可能会奔溃,有点坑没有找到原因。
为了用户体验,点击h5这个模块不需要再等待几秒,app开启时直接跑起runtime了,记得单例下这个控制器,内存是增加了(不过好像退出界面关闭runtime的话,内存增加以后也没明显的减下来),一开始还担心审核过不了,毕竟配置项太多,大家注意上线前需要去官网搜下审核,manifest这边配置不要被坑了。没通知的话appdele那边那些通知需要隐藏掉,不然审核也过不了。还有由于h5那边账号同步的原因,所以账号登出的时候,我关闭runtime,登录成功的时候重启runtime。解决了账号不同步时,判断不加载,然后卡死在h5环境的情况下只能退出app。

关于优化(未实施):后台模式时关闭runtime 切换前台时开启。iOS系统自己优化内存好像也是有效的。

需求(未实施),根据传参判断进不同页面,所以记得控制器需要单例。还有返回页面判断下控制器类型。返回类型pop还是dismiss,这部分只是涉及到项目中一个广告页是模态化去h5模块的。

 

转载于:https://www.cnblogs.com/X-Bin/p/5554885.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30764883/article/details/96849969

智能推荐

开源操作系统的课程设计(RT-thread)_rt thread项目课程设计-程序员宅基地

小型操作系统rt thread的官网学习 、 vscode短周期 长周期1.应用(操作系统本身) 4周参考资料:原子哥 官网 B站基于rt thread的网络通信软件(登录 注册 聊天 文件)基于rt thread天气预报系统基于rt thread文件传输2.移植(硬件+ 系统功能) 就业 12周社区作品基于rt thread的无线温度监控系统(stmf103)基于rt thread的智能投食机(stm32)自选题目本学期两个课程设计:模拟面试..._rt thread项目课程设计

MT6737的lens HAL层分析_a_u4currsensordev_spacesave的博客-程序员宅基地

lens驱动和HAL分析一.6737的lens 搜索HAL层分析Mcu_drv.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\core\featureio\drv\lens) 根据摄像头搜索lensMCUDrv::lensSearch( unsigned int a_u4CurrSensorDev, unsigned int a_u4CurrSensorId) //Camera_custom_._a_u4currsensordev

JS中函数的返回值介绍_函数返回js_算法与编程之美的博客-程序员宅基地

​问题我们先来看一组代码function kunkun(aru){ console.log(aru)}kunkun('打篮球')这个看似能输出结果,实则是在逻辑上是不合理的,我们函数是做某件事或者实现某种功能,而在上面的代码中,函数提供了‘aru’,结果自己却把该参数给输出了。这好比是鸡生了蛋,自己却把蛋给吃了。那我们吃蛋壳吗?所以,接下来我会介绍一种逻辑更严谨的代码。方法return语句有的时候,我们希望函数将返回值返回给调用者,此时通过使用return语句就可以实现。_函数返回js

SQL2005数据库笔记_weixin_33824363的博客-程序员宅基地

SQL2005数据库数据库SQL Server2005设计与应用1.数据库:数据存放的仓库 DataBase DB层次模型网状模型关系模型:二维表格 sql2.应用:数据库设计原理***得到一个数据库原形(理论)(E-R图)3.数据库软件:数据库管理系统DataBase..._不能从数据库中删除主数据或主日志文件

vant部署_vue项目中安装和使用vant组件-程序员宅基地

最近使用vue在开发微信公众号内嵌H5页面,采用一些组件可快速提高开发效率。vant是一款基于Vue构建的移动UI组件(https://youzan.github.io/vant...),提供非常友好的API开发文档及可视化页面,接下来在vue-cli构建的项目中安装和使用1.进入项目目录运行安装命令npm i vant -S安装成功后,在package.json中可以看到依赖"dependenc..._vant 放在dependencies

洛谷[P3150]pb的游戏(1)_洛谷java题解 pb和zs玩游戏 你需要帮zs求出每局的胜败情况_SD_LTF的博客-程序员宅基地

题目传送门OvO题目描述游戏规则是这样的: 每次一个人可以对给出的数进行分割,将其割成两个非零自然数,之后由另一个人选择留下两个数中的其中一个;之后由另一个人进行分割这个剩下的数,重复步骤……当一个人无法对数进行分割的时候游戏结束,另一个人获胜现在要你求出N次游戏的胜败每局由pb先进行分割,如果pb赢输出"pb wins" 如果zs赢输出"zs wins"注:双方都是绝顶聪明的输入..._洛谷java题解 pb和zs玩游戏 你需要帮zs求出每局的胜败情况

随便推点

2019年上半年全国计算机二级(等级)考试报名网址_全国计算机上半年二级报名时间表_杨桃先生的博客-程序员宅基地

全国计算机等级考试,2019年上半年考试报名正式开始:http://www.ncre.cn/html1/report/18061/81-1.htm;北京市:http://ncre.bjeea.cn;天津市:http://202.113.127.170;河北省:http://sk.hebeea.edu.cn/NCRE_EMS/studentLogin.aspx;内蒙古:http://..._全国计算机上半年二级报名时间表

Maven_银河睡着了的博客-程序员宅基地

Maven-教程今日学习目标:一、Maven介绍1-1概念:1-2类似于maven项目管理工具1-3Maven概念模型:二.Maven概念模型:2-1、项目对象模型 (Project Object Model)2-2、依赖管理系统(Dependency Management System)2-3、maven定义一套项目生命周期(Project Lifecycle)2-4、一组标准集合2-5、mav...

浅谈程序员创业_weixin_30653023的博客-程序员宅基地

浅谈程序员创业——作者:邓学彬、Jiesoft1.什么是创业?  关于“创业”二字有必要重新学习一下,找了两个相对权威定义:  创业就是创业者对自己拥有的资源或通过努力能够拥有的资源进行优化整合,从而创造出更大经济或社会价值的过程。——百度百科  创业是一种思考、推理和行为方式,它为机会所驱动,需要在方法上全盘考虑并拥有和谐的领导能力。创业必须要贡献出时间、付出...

kubernetes的service的类型_tinysakurac的博客-程序员宅基地

转载自go4it的博客kubernetes的service的类型关系图四种类型ClusterIP使用集群内的私有ip —— 这是默认值。NodePort除了使用cluster ip外,也将service的port映射到每个node的一个指定内部port上,映射的每个node的内部port都一样。LoadBalancer使用一个ClusterIP & NodeP...

总结Spring框架扩展点(二)bean生命周期中的扩展点(持续更新中...)_「黑狐」的博客-程序员宅基地

面向业务开发的时候,程序员需要明白业务的逻辑,并设计代码结构。而在进行中间件开发的时候,则需要明白框架的逻辑,进行开发。所以要开发提供给spring的中间件,需要知道spring中有哪些扩展点,好在对应的地方插入我们的功能。1. Spring容器初始化bean大致过程1. 定义bean标签2. 将bean标签解析成BeanDefinition3. 调用构造方法实例化(IOC):...

iOS9+Swift开发经验不定期汇总(2): 企业账号应用不受信任,自定义Navigation Controller左上角返回按钮,CLLocationManager停止获取GPS等_u011156012的博客-程序员宅基地

好久没有更新blog了,最近一直在忙着写代码结项,所以很多总结都攒到一块了。一块说一下吧企业账号发布应用提示不信任更新了iOS9之后,很多用户反映我们的应用安装之后打不开,总是提示不受信任的开发者xxx。其实问题很简单,只需要在手机的设置里面信任一下开发者的profile就ok了。不得不说,iOS9之后对安全方面确实做了很多更新,比如默认使用HTTPs,现在又多了这么个事。具体步骤是:

推荐文章

热门文章

相关标签