欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

一个iOS开发者的Weex爬坑之路环境部署和Debug

程序员文章站 2022-04-30 09:46:28
一个ios开发者的weex爬坑之路环境部署和debug 不多说,直接开始weex,算是记录这段时间对新技术的学习积累。期间看了很多vue.js和node.js的基础,顺便捋了以下css的flex-b...

一个ios开发者的weex爬坑之路环境部署和debug

不多说,直接开始weex,算是记录这段时间对新技术的学习积累。期间看了很多vue.js和node.js的基础,顺便捋了以下css的flex-box布局等等前端的知识,太多了太杂了,还是用笔记记录下。直接从官方介绍,开始

介绍

启动环境,搭建第一个demo,按照官方的来

同为跨平台解决方案,咱们先看下和rn的对比,由于国内淘宝搞的轻量级,所以我们还是先爬爬weex坑

类型 react native weex
性能 较好 较弱
上手难度 稍高 容易
核心理念 react vue
框架程度 较重 较轻
特点 适合开发整体app 适合单页面
社区 丰富,facebook维护 残念,托管apache
支持 androidios android、ios、web
适应性 原生开学习成本低 web开发学习成本低
js引擎 v8 jscore
首先weex是支持vue.js框架,可以看一遍官方vue文档,就可以开始撸了vue.js由于是单页面应用,因此vue-router了解下vue-router
再看下js和html和css的基础,就可以搞一下简单的了

安装开发环境

1.安装node

可以用homebrew或者直接下载https://nodejs.org/en/download/很简单,安装好如下即可

mintoudemacbook-pro:~ mintou$ node -v
v8.11.1
mintoudemacbook-pro:~ mintou$ npm -v
4.6.1
mintoudemacbook-pro:~ mintou$ 

2.安装weex-toolkit

npm install weex-toolkit -g
mintoudemacbook-pro:~ mintou$ weex -v
   v1.3.5
 - weexpack : v1.2.3
 - weex-debugger : v1.0.12
 - weex-builder : v0.4.0
 - weex-previewer : v1.5.1

这条命令会向你命令行环境中注册一个weex命令。

3.创建项目

weex create awesome-app

这里会有很多提示,什么标题啊,作者啊,描述啊啥的,主要你如果简单的跑起来,可以都选择默认值,如果你要做点事,那就吧vue-router给安装了,后面的单元测试可以暂时不选。

网络好也就几分钟的事,然后就可以开发了

4.进入项目,安装依赖,预览

cd awesome-app
npm install
npm start

然后工具会启动一个本地的 web 服务,监听8081端口。你可以打开https://localhost:8081查看页面在 web 下的渲染效果。 源代码在src/目录中,你可以像一个普通的 vue.js 项目一样来开发.

这里按照官方的来,基本可以看到第一个网页的效果

5.运行到ios项目

weex platform add ios
weex run ios

这两句帮我们编译好了jsbundle,然后顺便把原生项目的cocoapods都给带起来了,直接选择模拟器就跑起来了,如果你是自己编译好而已,那么可以自己pod install也行,文件目录如下,cd到ios目录就好

一个iOS开发者的Weex爬坑之路环境部署和Debug

也就一杯茶的时间,项目就能跑起来了,如果看过vuejs的话入口和文件目录改改就知道如何操作了,这里就不多说这些了,很简单,下面隆重介绍一下如果debug方式来调试。为什么测试这个模块,是因为,网上有几个项目(本来用的人就少,所以要珍惜几个项目)都没配置web端,只是配置了移动端启动,因此,你启动web服务是看不到任何东西的,但是你直接跑起来你的app,你压根看不到你的js和页面是不是出问题了,哪里出问题了都不知道?因此,我们试着用一下debug模式

可以先看下官方介绍weektoolkit基本介绍,后面我会结合我遇到的场景分析

集成devtools到ios,通过app的服务来debug

根据上面的介绍,你的项目基本框架已经跑起来了,你在你的pod文件下加上,或者直接copy走我这个

source 'git@github.com/cocoapods/specs.git'
platform :ios, '8.0'
#inhibit_all_warnings!

def common
    pod  'wxdevtool', '0.15.3', :configurations => ['debug']
	pod 'weexsdk'
    pod 'weexpluginloader'
    pod 'sdwebimage', '3.7.5'
    pod 'socketrocket', '0.4.2'
end

target 'weexdemo' do
    common
end

target 'weexuitestdemo' do
    common
end

安装好之后,我们用终端到路径下,执行

weex debug

你就能看到一个带二维码的网页

一个iOS开发者的Weex爬坑之路环境部署和Debug

1.方案一(官方demo可以扫一下即可debug)

第一个方式是和官方demo点击打开链接下载下来一样,弄一个扫二维码的页面,然后你在你的项目中扫描这个二维码,你的app和网页上都会出现同步,你可以看到所有的结构和debug信息

2.方案二,你不想弄一个页面,你可以按照我这个思路搞一下也行

第一,你看下官方介绍

[wxdevtool launchdevtooldebugwithurl:@"ws://30.30.31.7:8088/debugproxy/native"];

其中的 ws 地址正是weex debug控制台中出现的地址,直接 copy 到launchdevtooldebugwithurl接口中。

我是这么理解的,反正当时看这个得知道为什么写这个?

因此,看了下官方demo里面扫一扫的url拦截操作

#pragma mark remote debug
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-warc-performselector-leaks"
- (bool)remotedebug:(nsurl *)url
{
    if ([url.scheme isequaltostring:@"ws"]) {
        [wxsdkengine connectdebugserver:url.absolutestring];
        [wxsdkengine initsdkenvironment];
        
        return yes;
    }
    
    nsstring *query = url.query;
    for (nsstring *param in [query componentsseparatedbystring:@"&"]) {
        nsarray *elts = [param componentsseparatedbystring:@"="];
        if([elts count] < 2) continue;
        if ([[elts firstobject] isequaltostring:@"_wx_debug"]) {
            [wxdebugtool setdebug:yes];
            [wxsdkengine connectdebugserver:[[elts lastobject]  stringbyreplacingpercentescapesusingencoding:nsutf8stringencoding]];
            if ([[[self.navigationcontroller viewcontrollers] objectatindex:0] iskindofclass:nsclassfromstring(@"wxdemoviewcontroller")]) {
                wxdemoviewcontroller * vc = (wxdemoviewcontroller*)[[self.navigationcontroller viewcontrollers] objectatindex:0];
                [vc performselector:nsselectorfromstring(@"loadrefreshctl")];
                [self.navigationcontroller poptoviewcontroller:vc animated:no];
            }
            return yes;
        } else if ([[elts firstobject] isequaltostring:@"_wx_devtool"]) {
            nsstring *devtoolurl = [[elts lastobject]  stringbyreplacingpercentescapesusingencoding:nsutf8stringencoding];
            [wxdevtool launchdevtooldebugwithurl:devtoolurl];
            if ([[[self.navigationcontroller viewcontrollers] objectatindex:0] iskindofclass:nsclassfromstring(@"wxdemoviewcontroller")]) {
                wxdemoviewcontroller * vc = (wxdemoviewcontroller*)[[self.navigationcontroller viewcontrollers] objectatindex:0];
                [self.navigationcontroller poptoviewcontroller:vc animated:no];
            }
            
            return yes;
        }
    }
    
    return no;
}

可以通过断点得到,这里else if里面的url最后传进去的样式,这就不贴出来了,就是下面那张gif顶部的样式,经过操作,我们只需要拿到最后的channelld拼接到对应的url上

- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions
{
    self.window = [[uiwindow alloc] initwithframe:[uiscreen mainscreen].bounds];
    self.window.backgroundcolor = [uicolor whitecolor];
    
    [wxdevtool setdebug:yes];
    [wxdevtool launchdevtooldebugwithurl:@"ws://192.168.1.47:8088/debugproxy/native/d4b322b3-d97e-47f1-935e-b50084fbf4a6"];
    
    [weexsdkmanager setup];
    
    [self.window makekeyandvisible];
    
    // override point for customization after application launch.
    [self startsplashscreen];
    
    return yes;
}

方案二思路总结:

weex debug打开服务网页,出现二维码,我们点击二维码,可以在url上获取到channelld,然后在app初始化的方法里面调用链接上服务,注意这里的最后一串路径是变化的,每次同步的时候需要看一下是否是服务最新的id。

然后如果你热更新的话,最好用命令启动app

weex platform add ios
weex run ios

然后你更改你vue样式的代码,就可以不打开web服务的情况下进行app debug。

一个iOS开发者的Weex爬坑之路环境部署和Debug

注意:

这上面的左边视图是debug窗口的,而不是weex run web跑起来的web服务,我们这里是针对无法正常配置或者跑web服务的情况下,我们如何通过app的服务来网页debug,毕竟有些时候我也不知道为什么web服务为什么跑步起来,反正iframe就是显示不了。

中间的就是我们的app应用,右边就是代码了,我们可以进行实时更新预览了,环境部署和debug差不多了,就可以正常写点东西了。

网上针对weex的文章很少,这也算是自己遇到的问题自己总结记录下,免得以后找都找不到。