Weex 实现文件的下载
需求:在使用weex框架时,我们使用vue文件写页面,在native端加载服务器端的js页面时由于网络状态的不确定性,我们需要在第一次加载的时候对js页面进行本地存储。也就是说我们需要把js文件下载到本地,然后进行加载,这样可以避免出现网络环境不好的情况下卡顿白屏等问题。
解决办法:查了一些文档,发现直接在vue页面内添加下载逻辑不太方便,所以使用的是原生端扩展的方法进行文件的下载,关于原生端的扩展可以在这里进行查看http://weex-project.io/cn/references/advanced/extend-to-ios.html
逻辑:
注意:文件路径的规范,详情参考上一篇博客。
native端(ios)
原生类文件:
.h
- // JSDownloaderModule.h
- // weidaikuan
- //
- // Created by JianF.Sun on 17/7/31.
- // Copyright © 2017年 ever. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import <WeexSDK/WeexSDK.h>
- @interface JSDownloaderModule : NSObject
- -(void)jydownloadJSFile:(NSString *)urlStr callback:(void(^)(NSString* path))callback;
- @end
.m
- //
- // JSDownloaderModule.m
- // weidaikuan
- //
- // Created by JianF.Sun on 17/7/31.
- // Copyright © 2017年 ever. All rights reserved.
- //
- #import "JSDownloaderModule.h"
- #import "AppDelegate.h"
- #import "JYLoadingView.h"
- #import "NSString+Utils.h"
- @implementation JSDownloaderModule
- WX_EXPORT_METHOD(@selector(jydownloadJSFile:callback:))
- //file:///var/mobile/Containers/Bundle/Application/{id}/WeexDemo.app/
- ///var/mobile/Containers/Data/Application/D99A000B-5E21-451C-B701-3350098EBFA3/Documents/infomation.js
- -(void)jydownloadJSFile:(NSString *)urlStr callback:(void(^)(NSString* path))callback{
- JYLoadingView *loading = [JYLoadingView new];
- [loading jyShowLoadingview:@"正在加载"];
- NSLog(@"download----url----%@",urlStr);
- if ([urlStr hasPrefix:@"file:///"]) {//本地路径直接返回
- [loading jyRemoveLoadingview:@""];
- callback(urlStr);
- }
- //http类型
- NSString *fileName = [self getFileName:urlStr];//待加密
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *docDir = [paths objectAtIndex:];
- NSString *dirpath = [NSString stringWithFormat:@"%@/JS",docDir];
- NSString *filepath = [NSString stringWithFormat:@"%@/%@",dirpath,fileName];
- if (![[NSFileManager defaultManager]fileExistsAtPath:dirpath]) {
- [[NSFileManager defaultManager] createDirectoryAtPath:dirpath withIntermediateDirectories:YES attributes:nil error:nil];
- }else{
- NSLog(@"有这个文件了");
- }
- if ([[NSFileManager defaultManager] fileExistsAtPath:filepath]) {
- NSString *pathNew = [NSString stringWithFormat:@"file://%@",filepath];
- dispatch_async(dispatch_get_main_queue(), ^{
- [loading jyRemoveLoadingview:@""];
- callback(pathNew);
- });
- }else{
- //1.网址
- NSURL *url=[NSURL URLWithString:urlStr];
- //2.请求
- NSURLRequest *request=[NSURLRequest requestWithURL:url];
- //3.队列
- NSOperationQueue *queue=[[NSOperationQueue alloc]init];
- //4.发送异步请求
- [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * response, NSData * data, NSError * connectionError) {
- if (![data writeToFile:filepath atomically:YES]) {
- NSLog(@"文件写入错误");
- dispatch_async(dispatch_get_main_queue(), ^{
- [loading jyRemoveLoadingview:@""];
- });
- }else{
- NSString *pathNew = [NSString stringWithFormat:@"file://%@",filepath];
- dispatch_async(dispatch_get_main_queue(), ^{
- [loading jyRemoveLoadingview:@""];
- callback(pathNew);
- });
- }
- }];
- }
- }
- //去掉http前缀,获取存储文件的名称
- -(NSString*)getFileName:(NSString*)urlStr{
- int length=(int)urlStr.length;
- // NSLog(@"length===%d",length);
- NSString *result=@"";
- for (int i=length-; i>-; i--) {
- if ([[urlStr substringWithRange:NSMakeRange(i, )] isEqualToString:@"/"]) {
- NSString *tem=[urlStr substringWithRange:NSMakeRange(i+, length-i-)];
- result=tem;
- return [result md5];
- }
- }
- return result;
- }
- @end
注册自定义module:
- [WXSDKEngine registerModule:@"jsdownloader" withClass:[JSDownloaderModule class]];
weex(js端)
- 获取module
- const jsdownloader = weex.requireModule('jsdownloader')
调用native端口
- jsdownloader.jydownloadJSFile(config.jsURL('face.js'),function (e) {
- console.log('callback'+e);
- var url = e;
- var params = {
- 'url': url,
- 'animated' : 'true',
- }
- navigator.push(params, function () {});
- // modal.toast({message: this.platform, duration:2})
- });
大功告成!!!
Weex 实现文件的下载的更多相关文章
- PHP 文件限速下载代码
php 文件限速下载代码 <?php include("DBDA.class.php"); $db = new DBDA(); $bs = $_SERVER["QU ...
- IOS下载查看PDF文件(有下载进度)
IOS(object-c) 下载查看 PDF 其实还是蛮容易操作的.在下载前,首先要把 IOS 可以保存文件的目录给过一遍: IOS 文件保存目录 IOS 可以自定义写入的文件目录,是很有限的,只能是 ...
- [No00006B]方便的网络下载工具wget 可下载网站目录下的所有文件(可下载整个网站)
wget是linux下命令行的下载工具,功能很强大,它能完成某些下载软件所不能做的,比如如果你想下载一个网页目录下的所有文件,如何做呢?网络用户有时候会遇到需要下载一批文件的情况,有时甚至需要把整个网 ...
- ArcGIS10.2.1精简版、ArcGIS_Desktop10_Tutorial、破解文件等下载地址
原版ArcGIS for Desktop的ISO文件一般都在4.5G以上,一般人用不上里面很多工具,下载回来又浪费时间,现推出ArcGIS10.2.1精简版(里面只包含主程序.Data Interop ...
- 伪静态重写模块rewrite.dll及httpd.ini文件参考下载
伪静态重写模块rewrite.dll及httpd.ini文件参考下载 http://www.ledaokj.com/download/rewrite.rar 服务器端开启伪静态,可以查看以下文章< ...
- 如何设置让iis服务器支持.apk文件的下载
随着智能手机的普及,越来越多的人使用手机上网,很多网站也应手机上网的需要推出了网站客户端,.apk文件就是安卓(Android)的应用程序后缀名,默认情况下,使用IIS作为Web服务器的无法下载此文件 ...
- iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件断点下载
官方建议AFN的使用方法 0.导入框架准备工作 •1. 将AFNetworking3.0+框架程序拖拽进项目 •2. 或使用Cocopod 导入AFNetworking3.0+ •3. ...
- iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄
前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传. 在实际开发中,输入输出流用的比较少,但 ...
- servlet设置缓存时间以及文件的下载
缓存时间的设置: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletE ...
随机推荐
- WPF学习笔记(1):DataGrid单元格实现逐键过滤功能
最近,开始学习WPF,其UI设计完全颠覆了传统的设计理念,为程序员提供了极大的自由发挥空间,让我为之惊叹,且为之着迷.然而,WPF在国内的热度却并不高,大部分贴子都是2012年以前的,出版的图书也很少 ...
- .NET MVC中如何使用手机验证码注册登陆
#region 手机验证码 /// <summary> /// /// </summary> /// <param name="Yonghushouji&quo ...
- Python文件读写及网站显示
一.关于文件读写的笔记 (一) 文件概述 文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容 文件都是按照2进制进行存储的,但在表现形式上有2种:文本文件和二进制文件. 1. 文本文件 文本 ...
- CentOS 7修改yum源为阿里源
1.备份本地源 1 # mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak 2.获取阿里yum源配置 ...
- python学习笔记16-装饰器
装饰器(函数) 1.函数作用域 2.高阶函数 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式. 3.闭包 闭包就是能够读取其他函数内部变量的函数. 在本质上,闭包 ...
- vue教程2-08 自定义键盘信息、监听数据变化vm.$watch
vue教程2-08 自定义键盘信息 @keydown.up @keydown.enter @keydown.a/b/c.... 自定义键盘信息: Vue.directive('on').keyCode ...
- oracle RAC 跨网段客户端访问 报ORA-12170
场景描述: 服务器所在网段为20,在同一网段的机器客户端远程连接SCAN IP 可以正常访问,当时更换了网段之后,15网段的机器通过oracle客户端连接服务器SCAN ip 无法正常访问,telne ...
- android studio 一直卡在Gradle:Build Running的解决办法
转:android studio 一直卡在Gradle:Build Running的解决办法 在使用AS开发安卓应用程序的时候经常会遇到Gradle build running一直在运行甚至卡死的 ...
- Python获取二维数组的行列数
import numpy as np x = np.array([[1,2,5],[2,3,5],[3,4,5],[2,3,6]]) # 输出数组的行和列数 print x.shape # (4, 3 ...
- (转)学会数据库读写分离、分表分库——用Mycat,这一篇就够了!
原文:https://www.cnblogs.com/joylee/p/7513038.html 系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理 ...