Flutter替换Cordova应用读取native-storage数据保留用户登录态问询
旧Cordova应用存储数据迁移至Flutter应用可行方案
完全有可落地的实现方案,核心前提是新版Flutter应用的包名(Android)、Bundle ID(iOS)必须和旧Cordova应用完全一致,Android端还要保证签名证书和旧版完全相同,否则系统会判定为两个独立应用,无法读取旧应用的存储数据。
底层存储逻辑说明
Cordova的native-storage插件本质上是调用原生系统的标准存储API,和Flutter的shared_preferences插件底层依赖的存储容器是同一套,只需要做简单的适配就能实现数据读取和迁移:
Android端处理
Cordova native-storage在Android端默认把数据存在名为NativeStorage的SharedPreferences文件中,而Flutter shared_preferences默认使用的存储文件名为FlutterSharedPreferences,两种处理方案可选:
- 方案1:首次启动做数据一次性迁移
应用升级后首次启动时,读取旧NativeStorage文件中需要的核心数据(比如登录态token、用户配置),写入Flutter默认的SharedPreferences文件即可,示例代码:import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences_android/shared_preferences_android.dart'; import 'dart:io'; Future<void> migrateOldCordovaData() async { if (Platform.isAndroid) { // 注册Android平台的SP实现,指定读取旧的NativeStorage文件 SharedPreferencesAndroid.registerWith(); final oldPref = SharedPreferencesAndroid.instance; await oldPref.setName('NativeStorage'); // 读取需要的旧数据,比如登录token final String? userToken = await oldPref.getString('user_token'); final String? userId = await oldPref.getString('user_id'); // 写入Flutter默认的SP文件 final newPref = await SharedPreferences.getInstance(); if (userToken != null) { await newPref.setString('user_token', userToken); } if (userId != null) { await newPref.setString('user_id', userId); } // 写入迁移完成标记,下次启动不再执行迁移逻辑 await newPref.setBool('is_migrate_done', true); } } - 方案2:直接指定Flutter
shared_preferences使用旧的存储文件名,不需要做数据拷贝,直接读取即可。
iOS端处理
Cordova native-storage在iOS端默认把数据存在系统的NSUserDefaults容器中,和Flutter shared_preferences依赖的存储容器完全相同,唯一区别是Flutter shared_preferences默认会给所有存储key加flutter.前缀,旧Cordova存储的key没有前缀,适配逻辑非常简单:
import 'package:shared_preferences/shared_preferences.dart'; import 'dart:io'; Future<void> migrateOldCordovaData() async { if (Platform.isIOS) { final prefs = await SharedPreferences.getInstance(); // 直接用旧Cordova的存储key读取数据,不需要加flutter前缀 final String? userToken = prefs.getString('user_token'); final String? userId = prefs.getString('user_id'); // 写入Flutter默认SP,之后用标准shared_preferences API就能正常读取 if (userToken != null) { await prefs.setString('user_token', userToken); } if (userId != null) { await prefs.setString('user_id', userId); } await prefs.setBool('is_migrate_done', true); } }
特殊情况处理
如果旧Cordova应用的native-storage开启了加密存储,需要先拿到旧应用加密使用的密钥和加密算法,在Flutter端用相同的规则解密读取到的密文,就能拿到明文数据。
内容的提问来源于stack exchange,提问作者Ziv Vidas
相关产品推荐
相关产品推荐

