V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
wingkwanli888
V2EX  ›  iDev

App 內置本地服务器

  •  
  •   wingkwanli888 · 2023-01-26 14:24:19 +08:00 · 5610 次点击
    这是一个创建于 667 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有个页面是用 webview 远程加载 h5 展示出来的,客户投诉太慢了,大概要 2s 完成全部加载,我上司說想把 h5 打包成离线包本地加载。

    因为 h5 是 webpack 构建,不是单纯一个 html 页面,有好几个 js 文件,没办法直接用 wkwebview 本地加载, 这种情况大概要在 app 里边嵌入一个 web server ,搜了下 github 只有这两个,但好长时间有维护了

    https://github.com/swisspol/GCDWebServer https://github.com/robbiehanson/CocoaHTTPServer

    Caddy 好像可以用 gomobile 编译,有大哥试过把 caddy 打包在 app 里吗, 或者现在开源社区有没其他方案呢

    23 条回复    2023-02-10 13:05:14 +08:00
    justin2018
        1
    justin2018  
       2023-01-26 15:00:50 +08:00   ❤️ 1
    Building42/Telegraph: Secure Web Server for iOS, tvOS and macOS
    https://github.com/Building42/Telegraph
    lwkiii
        2
    lwkiii  
       2023-01-26 15:48:15 +08:00 via Android
    lwkiii
        3
    lwkiii  
       2023-01-26 15:49:28 +08:00 via Android
    原来是 iOS 开发,打扰了......
    Kinnice
        4
    Kinnice  
       2023-01-26 15:51:40 +08:00 via Android
    可以把 js 插到单一 html 里面
    qwq11
        5
    qwq11  
       2023-01-26 15:57:04 +08:00
    oh, no 这就是为什么 app 越来越大的原因,微信支付宝 qq 之类的打开全是 lib*.so ,其他 app 不仅全是 libwebview.so ,还有 bundle*.js, chunk*.js ,xxx.html
    xixiya
        6
    xixiya  
       2023-01-26 16:13:15 +08:00
    这玩意不需要维护,APP 嵌入 Http 服务器不是常规需求。
    能用就可以了。
    xiangyuecn
        7
    xiangyuecn  
       2023-01-26 16:15:16 +08:00
    “没办法直接用 wkwebview 本地加载”???

    一步错,步步错
    xiangyuecn
        8
    xiangyuecn  
       2023-01-26 16:19:15 +08:00
    如果有加载不了的文件,直接用原生代码暴力拦截,直接读本地文件返回响应,什么请求都可以给你搞的服服帖帖
    wingkwanli888
        9
    wingkwanli888  
    OP
       2023-01-26 16:25:55 +08:00 via iPhone
    @qwq11 没法,h5 页面 UI 太复杂,不可能用原生重写唉
    wingkwanli888
        10
    wingkwanli888  
    OP
       2023-01-26 16:30:43 +08:00 via iPhone
    @Kinnice 我问了前端的同事,他说测试了几天都构建不了单个 js ,至少两个,一个 app.js (业务代码),另外一个是依赖。我在想可能只能在我这边改
    okakuyang
        11
    okakuyang  
       2023-01-26 16:32:20 +08:00   ❤️ 1
    偷懒的话可以用一楼的 Telegraph 这个库,是在 iOS 上运行服务器的,我以前用来做局域网文件传输,还挺好用的。
    caddy 就算了,没有意义的折腾。
    但是因为本地的话,可能涉及到 https 的问题,需要注意一下,可能会遇到的坑。
    wingkwanli888
        12
    wingkwanli888  
    OP
       2023-01-26 16:32:58 +08:00 via iPhone
    @xiangyuecn 我知道以前用 UIWebView 是可以这样做的,以为 wkwebview 不行了,我研究看看
    wingkwanli888
        13
    wingkwanli888  
    OP
       2023-01-26 16:33:50 +08:00 via iPhone
    @okakuyang 感谢,我试试 telegraph
    LifStge
        14
    LifStge  
       2023-01-26 16:47:29 +08:00
    其实没必要大动 本地起服务器的 还是容易出问题的 毕竟逻辑变了 涉及 https 跨域啥的 都要考虑.
    毕竟是内置 webview 直接在 js 层面做请求拦截 或者更底层点 webview hook 然后加套缓存层就行了 可以把不经常变动的 影响速度的文件直接打包缓存就行 然后更新了 再动态更新缓存
    这样保持正常开发流程不变 只是提速 优化
    不过话说回来 如果不是在线的服务 就是单纯用 webview 做 ui 那就另说..
    beilo
        15
    beilo  
       2023-01-26 16:49:59 +08:00
    回复第 10 楼。
    多个 js 也是从 html 上引入的。而你只需要引入单个 html ,根据相对路径就可以自动加载对应的 js 。
    为什么会有多个 js 这个问题呢?
    okakuyang
        16
    okakuyang  
       2023-01-26 16:54:06 +08:00
    @beilo 它是用 webpack 打包的。
    应该是 webpack 的代码用 http 请求把 js 下载下来运行的,所以遇到 webview 本地加载这种情况自然就挂壁了。
    只要把 webpack 的那部分代码拆解成 html 标准的 js 引入方式就可以用本地顺利加载了。
    z13zvxc
        17
    z13zvxc  
       2023-01-26 17:04:11 +08:00 via iPhone   ❤️ 1
    @wingkwanli888 你同事菜 怎么可能不能输出到一个 js 自己不愿意研究 we pack 配置而已。
    hzxxx
        18
    hzxxx  
       2023-01-26 21:07:10 +08:00
    拦截请求,把请求 web 内容的 http 拦下来解析路径返回自己的不就行了吗
    whileFalse
        19
    whileFalse  
       2023-01-27 02:05:29 +08:00
    擦,多大点事。
    既然是“某个功能”,就进入 app 的时候自动预加载,等要显示的时候不久秒出了吗。
    systemcall
        20
    systemcall  
       2023-01-27 10:09:48 +08:00
    可以在本地放上预置的开屏广告,网页用上 Service Worker
    打开应用就把 WebView 打开,上面再叠上开屏广告
    这样子就解决了加载的问题了
    wobuhuicode
        21
    wobuhuicode  
       2023-01-27 17:43:57 +08:00
    其实你只需要把 JS 放在项目里面就可以了。现在的前端基本都是 JS ,让前端把 CSS 也打包进去 JS 就好了。
    然后 native 端拦截请求,把 web 页面请求的 JS 都解析到本地的就好了。
    beilo
        22
    beilo  
       2023-01-29 12:30:50 +08:00
    @okakuyang
    webpack 的代码用 http 请求把 js 下载下来运行的
    我基本上没听过这种说法。
    实在不行就预加载吧。你拿个后台挂个 webview 直接加载对应域名。走缓存。
    gargar
        23
    gargar  
       2023-02-10 13:05:14 +08:00
    没必要开服务器,wkwebview 可以加载本地文件的,单 html 或加上多个 js 、图片都行。
    先把东西塞文件夹比如 www ,然后拖进 xcode 你的 project 里,检查 target > build phases > copy bundle resources 确保文件夹也会拷进 bundle 。然后在你的代码里类似这样:
    NSBundle *mainBundle = [NSBundle mainBundle];
    NSURL *fileURL = [NSURL fileURLWithPath:[mainBundle pathForResource:@"index" ofType:@"html" inDirectory:@"www"]];
    [_webView loadFileURL:fileURL allowingReadAccessToURL:fileURL];
    swift 同理。
    我捣腾了两个菜鸡 app 就是用 webview ,其中一个还套上 WebAssembly 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2874 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:55 · PVG 15:55 · LAX 23:55 · JFK 02:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.