博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WEEX + HTTPDNS iOS解决方案
阅读量:6280 次
发布时间:2019-06-22

本文共 4629 字,大约阅读时间需要 15 分钟。

WEEX + HTTPDNS iOS解决方案

由于WebView并未暴露处设置DNS的接口,因而在WebView场景下使用HttpDns存在很多无法限制,但如果接入WEEX,则可以较好地植入HTTPDNS,本文主要介绍在WEEX场景下接入HTTPDNS的方案细节。

WEEX运行时环境下,所有的逻辑最终都会转换到Native Runtime中执行,网络请求也不例外。同时WEEX也提供了自定义相应实现的接口,通过重写网络请求适配器,我们可以较为简单地接入HTTPDNS。在WEEX运行环境中,主要有两种网络请求:

  • 通过进行的网络请求
  • 标签指定的加载图片的网络请求

下面以 weex iOS 0.7.0 版本为例:

Stream网络请求 + HTTPDNS

Stream网络请求在 iOS 端最终会通过WXNetworkDefaultImpl完成,同时WEEX也提供了相应的接口自定义网络请求适配器。具体的逻辑如下:

第一步:创建自定义网络请求适配器,实现 WXNetworkHttpDnsImpl 接口

#import 
#import "WXNetworkDefaultImpl.h"@interface WXNetworkHttpDnsImpl : NSObject
@end

第二步:在WEEX初始化时注册自定义网络适配器,替换默认适配器:

[WXSDKEngine registerHandler:[WXNetworkHttpDnsImpl new] withProtocol:@protocol(WXNetworkProtocol)];

之后的网络请求都会通过WXNetworkHttpDnsImpl实现,所以只需要在WXNetworkHttpDnsImpl中植入 HTTPDNS 逻辑即可,具体逻辑可以参考如下代码:

#import "WXNetworkDefaultImpl.h"@interface WXNetworkCallbackInfo : NSObject@property (nonatomic, copy) void(^sendDataCallback)(int64_t, int64_t);@property (nonatomic, copy) void(^responseCallback)(NSURLResponse *);@property (nonatomic, copy) void(^receiveDataCallback)(NSData *);@property (nonatomic, strong) NSMutableData *data;@property (nonatomic, copy) void(^compeletionCallback)(NSData *, NSError *);@end@implementation WXNetworkCallbackInfo@end@implementation WXNetworkDefaultImpl{    NSMutableDictionary *_callbacks;    NSURLSession *_session;}- (id)sendRequest:(NSURLRequest *)request withSendingData:(void (^)(int64_t, int64_t))sendDataCallback                                             withResponse:(void (^)(NSURLResponse *))responseCallback                                          withReceiveData:(void (^)(NSData *))receiveDataCallback                                          withCompeletion:(void (^)(NSData *, NSError *))compeletionCallback{    WXNetworkCallbackInfo *info = [WXNetworkCallbackInfo new];    info.sendDataCallback = sendDataCallback;    info.responseCallback = responseCallback;    info.receiveDataCallback = receiveDataCallback;    info.compeletionCallback = compeletionCallback;        if (!_session) {        _session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]                                                 delegate:self                                            delegateQueue:[NSOperationQueue mainQueue]];    }        NSURLSessionDataTask *task = [_session dataTaskWithRequest:request];    if (!_callbacks) {        _callbacks = [NSMutableDictionary dictionary];    }    [_callbacks setObject:info forKey:task];    [task resume];        return task;}- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task                                didSendBodyData:(int64_t)bytesSent                                 totalBytesSent:(int64_t)totalBytesSent                       totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend{    WXNetworkCallbackInfo *info = [_callbacks objectForKey:task];    if (info.sendDataCallback) {        info.sendDataCallback(totalBytesSent, totalBytesExpectedToSend);    }}- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)task                                 didReceiveResponse:(NSURLResponse *)response                                  completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{    WXNetworkCallbackInfo *info = [_callbacks objectForKey:task];    if (info.responseCallback) {        info.responseCallback(response);    }    completionHandler(NSURLSessionResponseAllow);}- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)task didReceiveData:(NSData *)data{    WXNetworkCallbackInfo *info = [_callbacks objectForKey:task];    if (info.receiveDataCallback) {        info.receiveDataCallback(data);    }        NSMutableData *mutableData = info.data;    if (!mutableData) {        mutableData = [NSMutableData new];        info.data = mutableData;    }        [mutableData appendData:data];}- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{    WXNetworkCallbackInfo *info = [_callbacks objectForKey:task];    if (info.compeletionCallback) {        info.compeletionCallback(info.data, error);    }    [_callbacks removeObjectForKey:task];}@end

1.2 <image>网络请求 + HTTPDNS

WEEX并没有提供默认的图片适配器实现,所以用户必须自行实现才能完成图片请求逻辑,具体步骤分为以下几步:

第一步:自定义图片请求适配器,实现IWXImgLoaderAdapter接口

#import "WXImgLoaderProtocol.h"@interface WXImgLoaderDefaultImpl : NSObject
@end

第二步:在WEEX初始化时注册该图片适配器:

[WXSDKEngine registerHandler:[WXImgLoaderDefaultImpl new] withProtocol:@protocol(WXImgLoaderProtocol)];

所以同WXNetworkHttpDnsImpl一样,我们只需在WXNetworkHttpDnsImpl植入HTTPDNS逻辑即可。

转载地址:http://husva.baihongyu.com/

你可能感兴趣的文章
Mono for Android 优势与劣势
查看>>
将图片转成base64字符串并在JSP页面显示的Java代码
查看>>
js 面试题
查看>>
sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)
查看>>
腾讯云下安装 nodejs + 实现 Nginx 反向代理
查看>>
Javascript 中的 Array 操作
查看>>
java中包容易出现的错误及权限问题
查看>>
AngularJS之初级Route【一】(六)
查看>>
服务器硬件问题整理的一点总结
查看>>
SAP S/4HANA Cloud: Revolutionizing the Next Generation of Cloud ERP
查看>>
Mellanox公司计划利用系统芯片提升存储产品速度
查看>>
白帽子守护网络安全,高薪酬成大学生就业首选!
查看>>
ARM想将芯片装进人类大脑 降低能耗是一大挑战
查看>>
Oracle数据库的备份方法
查看>>
Selenium 自动登录考勤系统
查看>>
关于如何以编程的方式执行TestNG
查看>>
智能照明造福千家万户 家居智能不再是梦
查看>>
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>