说明:很久以前的文章,理论上没有多少参考价值(不确定),后期官方sdk添加了白皮书集成方式,最后项目也弃用了这个sdk,纪念一下。 2017.10.10
以上为新增:
以下为历史:
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 .特别注意这点。如果是新建项目可以根据那个demo来,但是如果是现有项目再添加这个环境的话就有点坑了。
注意开发者在使用示例工程时建议不要把工程从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.返回按钮
http://www.jianshu.com/p/fff3f2ff99c9
按照MUI官方文档操作,还要配合下面的代码完成需求
js按钮点击事件里关闭h5页面,返回iOS原生框架
varnotiClass = plus.ios.importClass("NSNotificationCenter");
notiClass.defaultCenter().postNotificationNameobject("CloseWebAPP",null);
oc代码- (void)button3Click
{//启动h5工程
NSString*pWWWPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Pandora/apps/H586661F4/www"];
pAppHandle =nil;
//这里自己创建一个view 代替官方代码里面的self.viewview = [[UIView alloc]initWithFrame:self.view.bounds];
view.backgroundColor= [UIColorwhiteColor];
view.tag=22;
[self.viewaddSubview:view];
[[PDRCore Instance] setContainerView:view];
pAppHandle = [[[PDRCore Instance] appManager] openAppAtLocation:pWWWPath withIndexPath:@"/html/goods/search.html"withArgs:nilwithDelegate:nil];
[[[PDRCore Instance] appManager] restart:pAppHandle];
[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(textClose:) name:@"CloseWebAPP"object:nil];
}
- (void)textClose:(NSNotification*)not{
//不要在消息触发的方法里关闭应用需要使用异步的方式关闭
APP[selfperformSelectorOnMainThread:@selector(classWebApp) withObject:nilwaitUntilDone:NO];
}
- (void)classWebApp{
//调用AppManager的方法关闭应用[[PDRCore Instance].appManagerend:pAppHandle];//需要把h5所在的页面从主View中移除 我这样直接把h5所在的页面的父view置为nil
for(UIView*subviewsin[self.viewsubviews]){
{if(subviews.tag==22) {
[subviews removeFromSuperview];
}
}
}
下面是我的控制器代码。模式为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/d9050a1b765e
上文可能有点乱。
h5环境的runtime关闭时越狱机可能会奔溃,有点坑没有找到原因。
为了用户体验,点击h5这个模块不需要再等待几秒,app开启时直接跑起runtime了,记得单例下这个控制器,内存是增加了,一开始还担心审核过不了,毕竟配置项太多,大家注意上线前需要去官网搜下审核,manifest这边配置不要被坑了。没通知的话appdele那边那些通知需要隐藏掉,不然审核也过不了。还有由于h5那边账号同步的原因,所以账号登出的时候,我关闭runtime,登录成功的时候重启runtime。解决了首页登录账号卡死在h5环境的情况。优化这边未尝试,可能我们可以后台时关闭runtime。前台切回