weixin_47114461 2021-03-22 09:13 采纳率: 0%
浏览 300

wkwebview 怎么下载网页中的blob形式的文件

self.script = @"";

    self.script = @"var xhr = new XMLHttpRequest();";

    NSString* open = [NSString stringWithFormat:@"xhr.open('GET', '\%@', true);",[url absoluteString]];

    self.script = [self.script stringByAppendingString:open];

    self.script = [self.script stringByAppendingString:@"xhr.responseType = 'blob';"];

    self.script = [self.script stringByAppendingString:@"window.webkit.messageHandlers.readBlob.postMessage('making sure script called');"];

    self.script = [self.script stringByAppendingString:@"xhr.onload = function(e) { if (this.status == 200) { var blob = this.response; var reader = new window.FileReader(); reader.readAsBinaryString(blob); reader.onloadend = function() { window.webkit.messageHandlers.readBlob.postMessage(reader.result); }}};"];

    self.script = [self.script stringByAppendingString:@"xhr.send();"];

 

reader.onloadend  这个方法不执行,有知道怎么回事的吗,请教大神门

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-23 23:35
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题是由于 reader.onloadend 方法在Objective-C中没有直接对应到JavaScript的处理方式。你可以尝试使用以下的方法来实现:

    1. 使用一个自定义的消息处理器(messageHandler)来监听发送到浏览器的消息。
    2. 在你的messageHandler中,你可以在onmessage事件中调用你的JavaScript函数。

    以下是修改后的代码示例:

    #import <WebKit/WebKit.h>
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    - (IBAction)downloadBLOB:(id)sender {
        NSURL *url = [[NSURL alloc] initWithString:[NSString stringWithFormat:@"http://your-url.com/path/to/file.blob"]];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
        webView.loadRequest(request);
        
        // 添加一个自定义的消息处理器
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(messageHandlerReceived:) name:WKScriptMessageName type:WKScriptMessageTypeDefault];
    }
    
    - (void)messageHandlerReceived:(NSNotification *)notification {
        WKScriptMessage *message = [[notification userInfo] objectForKey:@"message"];
        NSLog(@"Received message: %@", message);
        
        // 转换为Blob对象
        NSURL *blobURL = [message urlForData:message.data];
        NSData *data = [NSData dataWithContentsOfURL:blobURL];
        
        // 创建一个新的Blob对象
        Blob *blob = [[Blob alloc] initWithData:data];
        
        // 将Blob对象转换为base64编码字符串
        NSString *encodedBase64 = [blob base64EncodedStringWithOptions:NSDataBase64EncodingOptionsStrictMode];
        
        // 打印或存储base64编码字符串
        NSLog(@"Encoded Base64 String: %@", encodedBase64);
    }
    @end
    

    在这个例子中,我们创建了一个新的消息处理器,它将在接收到发送到Webview的消息时被触发。然后我们在这个消息处理器中创建和打印出Blob对象,并将其转换为base64编码字符串。你可以根据你的需求调整这个过程。

    评论

报告相同问题?

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据