HellyW_SVIP
HellyW_SVIP
  • 发布:2022-09-14 15:45
  • 更新:2024-01-14 12:39
  • 阅读:226

【报Bug】nativejs iOS下调用 removeDataOfTypes 清除缓存,部分系统崩溃

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: window11

HBuilderX类型: 正式

HBuilderX版本号: 3.5.3

手机系统: iOS

手机系统版本号: iOS 14

手机厂商: 苹果

手机机型: iPhone12

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:

执行上述代码就会出现崩溃问题; 模拟器也可以复现这个问题

预期结果:

正常清除缓存

实际结果:

app崩溃;

bug描述:

ios下使用native.js清除本地浏览器缓存,在iOS 14.5 、14.5.1、16.0版本上出现应用崩溃情况。其他系统正常。

var websiteDataTypes = plus.ios.invoke('WKWebsiteDataStore', 'allWebsiteDataTypes');  
var dateFrom = plus.ios.invoke('NSDate', 'dateWithTimeIntervalSince1970:', 0);  
var dateStore = plus.ios.invoke('WKWebsiteDataStore', 'defaultDataStore');  
plus.ios.invoke(dateStore, 'removeDataOfTypes:modifiedSince:completionHandler:', websiteDataTypes, dateFrom, function() {});

已经可以确认的是这部分代码导致的崩溃。

同时有配置mainfest.json

"kernel" : {  
            "ios" : "WKWebview",  
            "recovery" : "reload"  
        }  

请官方大大帮忙看下

2022-09-14 15:45 负责人:无 分享
已邀请:
FullStack

FullStack - 【插件开发】【专治疑难杂症】【ios上架、马甲包、白包、过审、已成功上架过几百个】【多款插件已上架:https://ext.dcloud.net.cn/publisher?id=22130】【非诚勿扰】QQ:543610866

加个 try 看看

  • HellyW_SVIP (作者)

    试了 不可以




    这是个必现问题,主要onload或者onshow内执行这个方法,再次跳转进入该页面就会崩溃。可以通过模拟器iOS14.5模拟

    2022-09-16 15:10

  • FullStack

    回复 w***@outlook.com: 用原生插件实现吧

    2022-09-16 15:14

  • FullStack

    回复 FullStack: 试试这个的clear:https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewObject.clear


    plus.cache.clear可以清除整个应用中的缓存数据

    2022-09-16 15:22

  • FullStack

    真机ios16,没有发现闪退

    2022-09-16 15:30

  • HellyW_SVIP (作者)

    回复 FullStack: plus.cache.clear不可以的。 我们之前试过了,plus.cache.clear只对安卓生效,对iOS的UIwebview也生效, 对WKwebview不生效。所以才用的这个方法。




    我在二楼贴一下我现在用的代码

    2022-09-16 16:08

  • HellyW_SVIP (作者)

    回复 FullStack: iOS16的问题是TF同步过来的, iOS14.5和14.5.1 是我们在模拟器和真机都复现了的

    2022-09-16 16:12

HellyW_SVIP

HellyW_SVIP (作者)

// 清除webview缓存   
            try {  
                // IOS 设备缓存清除  
                if (uni.getSystemInfoSync().platform == "ios") {  
                    var websiteDataTypes = plus.ios.invoke('WKWebsiteDataStore', 'allWebsiteDataTypes');  
                    var dateFrom = plus.ios.invoke('NSDate', 'dateWithTimeIntervalSince1970:', 0);  
                    var dateStore = plus.ios.invoke('WKWebsiteDataStore', 'defaultDataStore');  
                    plus.ios.invoke(dateStore, 'removeDataOfTypes:modifiedSince:completionHandler:', websiteDataTypes,  
                        dateFrom,  
                        function() {});  
                }else{  
                    // 安卓设备缓存清除  
                    plus.navigator.removeAllCookie()  
                    plus.navigator.removeSessionCookie()  
                    plus.cache.clear()  
                }  
            } catch (e) {  
                console.error(e)  
            }
1***@139.com

1***@139.com

清除 WKWebsiteDataTypeDiskCache 类型缓存会导致奔溃

以下是使用UTS插件的写法

// index.uts  

// 引用ios api  
import WKWebsiteDataStore from "WebKit.WKWebsiteDataStore";  

export function clearWebStorage(): void {  
    let allWebsiteDataTypes = WKWebsiteDataStore.allWebsiteDataTypes()  
    // 移除 WKWebsiteDataTypeDiskCache,导致奔溃  
    allWebsiteDataTypes.remove('WKWebsiteDataTypeDiskCache')  

    let ds = WKWebsiteDataStore.default()  
    ds.fetchDataRecords(ofTypes=allWebsiteDataTypes, completionHandler=records => {  
        ds.removeData(ofTypes=allWebsiteDataTypes, for=records, completionHandler=() => {  
            console.log("clear cache");  
        })  
    })  
}

要回复问题请先登录注册