zoukankan      html  css  js  c++  java
  • iOS集成Dcloud

     

    先把补充放在最前面

    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模块的。

  • 相关阅读:
    Geoserver通过ajax跨域访问服务数据的方法(含用户名密码认证的配置方式)
    123
    递归____蛮好的例子 蓝桥
    博弈_____威佐夫博奕
    123123
    sort
    int ,long , long long类型的范围
    数学推导_循环小数转分数
    下一步:结构体 背包 库函数
    回溯____蓝桥 棋盘
  • 原文地址:https://www.cnblogs.com/X-Bin/p/5554885.html
Copyright © 2011-2022 走看看