先把补充放在最前面html
2016年10月25号更新。正如老大所说,愿望是美好的,现阶段h5融合技术难点,咱们还无法解决,h5界面相比原生交互性能问题,管理类app操做设置太多。总结下Dcloud,可能不该该是下面这种方法,不能本地一个h5应用,而是应该直接把他当前webview使用就行了。下面能够参考,也能够不参考,可能有错的地方,阶段性弃用了,应该有段时间不去更新修改下面的啦。ios
2016年6月19号更新补充,因为tabbar上须要这个模块,而且发现runtime一直跑起的话,手机太热,耗电严重。引擎本就是单例,因此控制器单例不适用和不使用了。git
感受因为使用的是webview因此比较大。web
项目自己支持ios8以上,原生加载替换wkwebviewjson
6月26日,也不知道为啥一样方法进去导航栏控制器在视图出现时是有的,加载完也是有的,而后h5那边调用我这边的退出的时候就没了。不明缘由。你们有知道吗?是hide之后会致使为nil?app
总之无法解决,只是在首页加个通知中心调用viewwillapear 。还必须延时2秒。否则仍是卡在首页。好吧,挺纠结的这块搞的。由于因此进去方法同样,其余三个模块没问题,不存在导航栏为nil。还有一句是sdk好像最新的那一个,会死循环。本身能够测试下。webapp
最后,去更新了下sdk 发现里面有个iOS白皮书,之前还没这个东西,坑比较多,如今参考那边就行了。iphone
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异步
注意开发者在使用示例工程时建议不要把工程从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/Bundlesasync
中间那个能够拉inc那个文件。我是拉进去编译的。你也能够拉进去不编译。
根据这个文件Feature-iOS配置 other linker flags
同时须要注意下下面几个,可能不同。
ui和个推sdk还有nativeui注意
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模块的。