uni-app 打包APP端无法设置referer导致防盗链资源文件无法访问,有人遇到并知道怎么解决吗

发布于 1周前 作者 gougou168 来自 uni-app

uni-app 打包APP端无法设置referer导致防盗链资源文件无法访问,有人遇到并知道怎么解决吗

uniapp 打包app端无法设置referer问题

uniapp 打包app端,无法设置referer,导致加了防盗链的资源文件都无法访问,有人遇到怎么解决吗?

4 回复

请问有解决方案吗


请问有解决方案了吗

可以解决,有偿,红色起步,未解决不收费

在uni-app打包APP端时,如果遇到无法设置referer导致防盗链资源文件无法访问的问题,通常是因为在原生环境中,HTTP请求的referer信息不是由前端代码直接控制的,而是由底层原生环境(如iOS的WebView或Android的WebView)来管理的。以下是一个通过修改原生代码来设置referer的解决方案。

解决方案:修改原生代码设置Referer

1. iOS端解决方案

在iOS项目中,可以通过修改AppDelegate.m或者WKWebView的相关配置来设置Referer。以下是一个使用WKWebView设置自定义Referer的示例:

- (WKWebViewConfiguration *)webViewConfiguration {
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
    
    // 创建一个自定义的WKNavigationDelegate
    webView.navigationDelegate = self;
    
    // 设置自定义的referer信息
    NSString *customReferer = @"https://your-referer-url.com";
    NSDictionary *customHeaders = @{@"Referer": customReferer};
    configuration.userContentController = [[WKUserContentController alloc] init];
    WKWebViewConfiguration *newConfig = [[WKWebViewConfiguration alloc] init];
    [newConfig.userContentController add(^WKNavigationActionPolicy (WKWebView *webView, WKNavigationAction *navigationAction, WKFrameInfo *frameInfo, WKWebpagePreferences *webpagePreferencesDecisionHandler) {
        for (WKWebViewConfiguration *config in [webView configuration].userContentController.userScripts) {
            for (NSString *key in config.additionalHTTPHeaders.allKeys) {
                if ([key isEqualToString:@"Referer"]) {
                    navigationAction.request.allHTTPHeaderFields[@"Referer"] = customHeaders[@"Referer"];
                }
            }
        }
        decisionHandler(WKNavigationActionPolicyAllow);
        return WKNavigationActionPolicyAllow;
    }) forNavigationAction:WKNavigationActionPolicyDecidePolicy];
    
    return newConfig;
}

2. Android端解决方案

在Android项目中,可以通过拦截并修改HTTP请求来设置Referer。以下是一个使用OkHttp拦截器设置自定义Referer的示例:

OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request originalRequest = chain.request();
                Request.Builder requestBuilder = originalRequest.newBuilder()
                        .header("Referer", "https://your-referer-url.com");
                Request newRequest = requestBuilder.build();
                return chain.proceed(newRequest);
            }
        })
        .build();

// 使用修改后的OkHttpClient进行网络请求

注意

  • 上述代码需要根据具体的项目结构和需求进行调整。
  • 在修改原生代码时,请确保备份原始文件,以防出现不可预见的问题。
  • 对于uni-app项目,你可能需要导出原生工程并进行上述修改,然后再重新打包。

通过这种方法,你可以在uni-app打包的APP端中设置自定义的referer信息,从而解决防盗链资源文件无法访问的问题。

回到顶部