Resources

Download files from web chat to iOS

For iOS 14.5 and onward, use delegate methods to handle download requests in the WKWebView.

Here is an example in Objective C.

// Permit download action
(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler
{
    //The download action only supports iOS 14.5+ version.
    if (@available(iOS 14.5, *)) {
        if (navigationAction.shouldPerformDownload) {
            decisionHandler(WKNavigationActionPolicyDownload);
            return;
        }
    }
}
// Set download delegate
- (void)webView:(WKWebView *)webView navigationAction:(WKNavigationAction *)navigationAction didBecomeDownload:(WKDownload *)download API_AVAILABLE(macos(11.3), ios(14.5))
{
    // Here need to set the download delete to the proper recieve, thus when download finished, we can receive the callbacks from the webvew.
    if (download) {
        download.delegate = self;
    }
}
// Process download delegate callbacks
- (void)download:(WKDownload *)download decideDestinationUsingResponse:(NSURLResponse *)response suggestedFilename:(NSString *)suggestedFilename completionHandler:(void (^)(NSURL * _Nullable destination))completionHandler API_AVAILABLE(ios(14.5));
{
    //Create a local file download directory,and the file path in that directory.
    NSString *tmpDir = NSTemporaryDirectory();
    NSString *uuidStr = [[NSUUID UUID] UUIDString];
    NSURL *tmpDirURL = [NSURL fileURLWithPath:tmpDir];
    NSURL *tmpUUIDURL = [tmpDirURL URLByAppendingPathComponent:uuidStr];
    NSError *error = nil;
    if (![[NSFileManager defaultManager] createDirectoryAtURL:tmpUUIDURL withIntermediateDirectories:NO attributes:nil error:&error]) {
        NSLog(@"creating directory failed: %@", error.localizedDescription);
        completionHandler(nil);
        return;
    }
    self.localFileDownloadURL = [tmpUUIDURL URLByAppendingPathComponent:suggestedFilename];
    completionHandler(self.localFileDownloadURL);
}
- (void)downloadDidFinish:(WKDownload *)download  API_AVAILABLE(ios(14.5)){
    dispatch_async(dispatch_get_main_queue(), ^{
        // When file downloaded, using the UIActivityViewController to open it for the next step usage.
        if (!self.localFileDownloadURL) {
            return;
        }
        UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[self.localFileDownloadURL] applicationActivities:nil];
        activityVC.popoverPresentationController.sourceView = self.view;
        activityVC.popoverPresentationController.sourceRect = self.view.frame;
        activityVC.popoverPresentationController.barButtonItem = self.navigationItem.rightBarButtonItem;
        [self presentViewController:activityVC animated:YES completion:nil];
    });
}
- (void)download:(WKDownload *)download didFailWithError:(NSError *)error resumeData:(nullable NSData *)resumeData
API_AVAILABLE(ios(14.5)){
    NSLog(@"wkwebview download failed");
}