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 · 122 天前 · 4638 次点击
    这是一个创建于 122 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有个页面是用 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  
       122 天前   ❤️ 1
    Building42/Telegraph: Secure Web Server for iOS, tvOS and macOS
    https://github.com/Building42/Telegraph
    lwkiii
        2
    lwkiii  
       122 天前 via Android
    lwkiii
        3
    lwkiii  
       122 天前 via Android
    原来是 iOS 开发,打扰了......
    Kinnice
        4
    Kinnice  
       122 天前 via Android
    可以把 js 插到单一 html 里面
    qwq11
        5
    qwq11  
       122 天前
    oh, no 这就是为什么 app 越来越大的原因,微信支付宝 qq 之类的打开全是 lib*.so ,其他 app 不仅全是 libwebview.so ,还有 bundle*.js, chunk*.js ,xxx.html
    xixiya
        6
    xixiya  
       122 天前
    这玩意不需要维护,APP 嵌入 Http 服务器不是常规需求。
    能用就可以了。
    xiangyuecn
        7
    xiangyuecn  
       122 天前
    “没办法直接用 wkwebview 本地加载”???

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