需求:在使用weex框架时,我们使用vue文件写页面,在native端加载服务器端的js页面时由于网络状态的不确定性,我们需要在第一次加载的时候对js页面进行本地存储。也就是说我们需要把js文件下载到本地,然后进行加载,这样可以避免出现网络环境不好的情况下卡顿白屏等问题。


解决办法:查了一些文档,发现直接在vue页面内添加下载逻辑不太方便,所以使用的是原生端扩展的方法进行文件的下载,关于原生端的扩展可以在这里进行查看http://weex-project.io/cn/references/advanced/extend-to-ios.html

逻辑:

注意:文件路径的规范,详情参考上一篇博客。

native端(ios)

原生类文件:

.h

  1. // JSDownloaderModule.h
  2. // weidaikuan
  3. //
  4. // Created by JianF.Sun on 17/7/31.
  5. // Copyright © 2017年 ever. All rights reserved.
  6. //
  7.  
  8. #import <Foundation/Foundation.h>
  9. #import <WeexSDK/WeexSDK.h>
  10.  
  11. @interface JSDownloaderModule : NSObject
  12.  
  13. -(void)jydownloadJSFile:(NSString *)urlStr callback:(void(^)(NSString* path))callback;
  14.  
  15. @end

.m

  1. //
  2. // JSDownloaderModule.m
  3. // weidaikuan
  4. //
  5. // Created by JianF.Sun on 17/7/31.
  6. // Copyright © 2017年 ever. All rights reserved.
  7. //
  8.  
  9. #import "JSDownloaderModule.h"
  10. #import "AppDelegate.h"
  11. #import "JYLoadingView.h"
  12. #import "NSString+Utils.h"
  13. @implementation JSDownloaderModule
  14.  
  15. WX_EXPORT_METHOD(@selector(jydownloadJSFile:callback:))
  16. //file:///var/mobile/Containers/Bundle/Application/{id}/WeexDemo.app/
  17. ///var/mobile/Containers/Data/Application/D99A000B-5E21-451C-B701-3350098EBFA3/Documents/infomation.js
  18. -(void)jydownloadJSFile:(NSString *)urlStr callback:(void(^)(NSString* path))callback{
  19. JYLoadingView *loading = [JYLoadingView new];
  20. [loading jyShowLoadingview:@"正在加载"];
  21. NSLog(@"download----url----%@",urlStr);
  22.  
  23. if ([urlStr hasPrefix:@"file:///"]) {//本地路径直接返回
  24. [loading jyRemoveLoadingview:@""];
  25. callback(urlStr);
  26. }
  27.  
  28. //http类型
  29. NSString *fileName = [self getFileName:urlStr];//待加密
  30. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  31. NSString *docDir = [paths objectAtIndex:];
  32.  
  33. NSString *dirpath = [NSString stringWithFormat:@"%@/JS",docDir];
  34.  
  35. NSString *filepath = [NSString stringWithFormat:@"%@/%@",dirpath,fileName];
  36.  
  37. if (![[NSFileManager defaultManager]fileExistsAtPath:dirpath]) {
  38.  
  39. [[NSFileManager defaultManager] createDirectoryAtPath:dirpath withIntermediateDirectories:YES attributes:nil error:nil];
  40.  
  41. }else{
  42. NSLog(@"有这个文件了");
  43. }
  44.  
  45. if ([[NSFileManager defaultManager] fileExistsAtPath:filepath]) {
  46. NSString *pathNew = [NSString stringWithFormat:@"file://%@",filepath];
  47.  
  48. dispatch_async(dispatch_get_main_queue(), ^{
  49. [loading jyRemoveLoadingview:@""];
  50. callback(pathNew);
  51. });
  52. }else{
  53.  
  54. //1.网址
  55. NSURL *url=[NSURL URLWithString:urlStr];
  56. //2.请求
  57. NSURLRequest *request=[NSURLRequest requestWithURL:url];
  58. //3.队列
  59. NSOperationQueue *queue=[[NSOperationQueue alloc]init];
  60. //4.发送异步请求
  61. [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * response, NSData * data, NSError * connectionError) {
  62.  
  63. if (![data writeToFile:filepath atomically:YES]) {
  64. NSLog(@"文件写入错误");
  65. dispatch_async(dispatch_get_main_queue(), ^{
  66. [loading jyRemoveLoadingview:@""];
  67.  
  68. });
  69. }else{
  70.  
  71. NSString *pathNew = [NSString stringWithFormat:@"file://%@",filepath];
  72.  
  73. dispatch_async(dispatch_get_main_queue(), ^{
  74.  
  75. [loading jyRemoveLoadingview:@""];
  76. callback(pathNew);
  77. });
  78.  
  79. }
  80.  
  81. }];
  82.  
  83. }
  84.  
  85. }
  86. //去掉http前缀,获取存储文件的名称
  87. -(NSString*)getFileName:(NSString*)urlStr{
  88. int length=(int)urlStr.length;
  89. // NSLog(@"length===%d",length);
  90. NSString *result=@"";
  91. for (int i=length-; i>-; i--) {
  92. if ([[urlStr substringWithRange:NSMakeRange(i, )] isEqualToString:@"/"]) {
  93. NSString *tem=[urlStr substringWithRange:NSMakeRange(i+, length-i-)];
  94. result=tem;
  95.  
  96. return [result md5];
  97. }
  98. }
  99. return result;
  100. }
  101.  
  102. @end

注册自定义module:

  1. [WXSDKEngine registerModule:@"jsdownloader" withClass:[JSDownloaderModule class]];

weex(js端)

  1. 获取module
  1. const jsdownloader = weex.requireModule('jsdownloader')
  1.  

调用native端口

  1.  
  1. jsdownloader.jydownloadJSFile(config.jsURL('face.js'),function (e) {
  2.  
  3. console.log('callback'+e);
  4.  
  5. var url = e;
  6. var params = {
  7. 'url': url,
  8. 'animated' : 'true',
  9. }
  10.  
  11. navigator.push(params, function () {});
  12. // modal.toast({message: this.platform, duration:2})
  13.  
  14. });
  1.  

大功告成!!!

  1.  

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. WPF学习笔记(1):DataGrid单元格实现逐键过滤功能

    最近,开始学习WPF,其UI设计完全颠覆了传统的设计理念,为程序员提供了极大的自由发挥空间,让我为之惊叹,且为之着迷.然而,WPF在国内的热度却并不高,大部分贴子都是2012年以前的,出版的图书也很少 ...

  2. .NET MVC中如何使用手机验证码注册登陆

    #region 手机验证码 /// <summary> /// /// </summary> /// <param name="Yonghushouji&quo ...

  3. Python文件读写及网站显示

    一.关于文件读写的笔记 (一) 文件概述 文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容 文件都是按照2进制进行存储的,但在表现形式上有2种:文本文件和二进制文件. 1. 文本文件 文本 ...

  4. CentOS 7修改yum源为阿里源

    1.备份本地源 1 # mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak 2.获取阿里yum源配置 ...

  5. python学习笔记16-装饰器

    装饰器(函数) 1.函数作用域 2.高阶函数 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式. 3.闭包  闭包就是能够读取其他函数内部变量的函数. 在本质上,闭包 ...

  6. vue教程2-08 自定义键盘信息、监听数据变化vm.$watch

    vue教程2-08 自定义键盘信息 @keydown.up @keydown.enter @keydown.a/b/c.... 自定义键盘信息: Vue.directive('on').keyCode ...

  7. oracle RAC 跨网段客户端访问 报ORA-12170

    场景描述: 服务器所在网段为20,在同一网段的机器客户端远程连接SCAN IP 可以正常访问,当时更换了网段之后,15网段的机器通过oracle客户端连接服务器SCAN ip 无法正常访问,telne ...

  8. android studio 一直卡在Gradle:Build Running的解决办法

    转:android studio 一直卡在Gradle:Build Running的解决办法   在使用AS开发安卓应用程序的时候经常会遇到Gradle build running一直在运行甚至卡死的 ...

  9. 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 ...

  10. (转)学会数据库读写分离、分表分库——用Mycat,这一篇就够了!

    原文:https://www.cnblogs.com/joylee/p/7513038.html 系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理 ...