需求:在使用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 实现文件的下载的更多相关文章

  1. PHP 文件限速下载代码

    php 文件限速下载代码 <?php include("DBDA.class.php"); $db = new DBDA(); $bs = $_SERVER["QU ...

  2. IOS下载查看PDF文件(有下载进度)

    IOS(object-c) 下载查看 PDF 其实还是蛮容易操作的.在下载前,首先要把 IOS 可以保存文件的目录给过一遍: IOS 文件保存目录 IOS 可以自定义写入的文件目录,是很有限的,只能是 ...

  3. [No00006B]方便的网络下载工具wget 可下载网站目录下的所有文件(可下载整个网站)

    wget是linux下命令行的下载工具,功能很强大,它能完成某些下载软件所不能做的,比如如果你想下载一个网页目录下的所有文件,如何做呢?网络用户有时候会遇到需要下载一批文件的情况,有时甚至需要把整个网 ...

  4. ArcGIS10.2.1精简版、ArcGIS_Desktop10_Tutorial、破解文件等下载地址

    原版ArcGIS for Desktop的ISO文件一般都在4.5G以上,一般人用不上里面很多工具,下载回来又浪费时间,现推出ArcGIS10.2.1精简版(里面只包含主程序.Data Interop ...

  5. 伪静态重写模块rewrite.dll及httpd.ini文件参考下载

    伪静态重写模块rewrite.dll及httpd.ini文件参考下载 http://www.ledaokj.com/download/rewrite.rar 服务器端开启伪静态,可以查看以下文章< ...

  6. 如何设置让iis服务器支持.apk文件的下载

    随着智能手机的普及,越来越多的人使用手机上网,很多网站也应手机上网的需要推出了网站客户端,.apk文件就是安卓(Android)的应用程序后缀名,默认情况下,使用IIS作为Web服务器的无法下载此文件 ...

  7. iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件断点下载

    官方建议AFN的使用方法   0.导入框架准备工作 •1. 将AFNetworking3.0+框架程序拖拽进项目   •2. 或使用Cocopod 导入AFNetworking3.0+   •3.   ...

  8. iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

    前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但 ...

  9. servlet设置缓存时间以及文件的下载

    缓存时间的设置: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletE ...

随机推荐

  1. 工作随笔——Java网络代理(http,socks)

    简单说一下Java如何便捷的使用网络代理功能 此方法使用于大部分情况,一些特殊框架(如:mina)无效. // 代码设置http代理 System.setProperty("proxySet ...

  2. .Net Core Web应用发布至IIS后报“An error occurred while starting the application”错误

    An error occurred while starting the application. .NET Core X64 v4.1.1.0    |   Microsoft.AspNetCore ...

  3. 实现输入框不可输入、解决Enable,Disable等不能更新值问题

    当在前台JS中更新不可用输入框(TextBox.Enable ="false"  or Input box ReadOnly ="True")的值时, 后台可能 ...

  4. webpack安装整理

    早上有点时间大概安装一下webpack,操作一下顺便把步骤记一下,乱乱的,还是记录一下吧! webpack安装步骤:1. 2. 3.一直回车,出现如下图: 4.创建src和dist文件 5.需要在np ...

  5. Akka(20): Stream:异步运算,压力缓冲-Async, batching backpressure and buffering

    akka-stream原则上是一种推式(push-model)的数据流.push-model和pull-model的区别在于它们解决问题倾向性:push模式面向高效的数据流下游(fast-downst ...

  6. Smart/400开发上手5: Cobol开发标准

    ENVIRONMENT DIVISION. CONFIGURATION SECTION.SOURCE-COMPUTER. IBM-AS400.OBJECT-COMPUTER. IBM-AS400. 这 ...

  7. dubbo+zookeeper注册服务报错问题:No service registed on zookeeper

    2019-04-04 11:23:40,372 ERROR [tomcat-threads--1] (com.bill99.dolphin.controller.ExceptionController ...

  8. 强烈鄙视那些:自己完全不用android手机,却在做android开发的人

    前言: 最近参加android技术交流会,看到几个同时用mac和iphone的人,以为他们是全栈工程师(android和ios都会) , 谁知道交流下来,居然只是做android开发的,ios根本不会 ...

  9. Android返回系统Home桌面

    Intent intent = new Intent(); // 为Intent设置Action.Category属性 intent.setAction(Intent.ACTION_MAIN);// ...

  10. 怎么样imageview实现铺满全屏

    <ImageView android:layout_width="match_parent" android:layout_height="match_parent ...