如何在.NET MAUI iOS中阻止SecureStorage同步至iCloud?
配置.NET MAUI SecureStorage实现iOS端数据仅本地留存
可以实现这个需求。.NET MAUI默认的SecureStorage在iOS端使用钥匙串存储,默认可访问性设置允许数据同步至iCloud,只需修改钥匙串的可访问性属性,就能让数据仅留存于本地设备。
实现步骤
- 定义共享接口
在共享项目中创建自定义存储接口,用于跨平台调用:
public interface ILocalSecureStorage { Task SetAsync(string key, string value); Task<string> GetAsync(string key); Task RemoveAsync(string key); }
- iOS平台实现
在iOS项目中实现上述接口,使用原生钥匙串API并设置本地专属的可访问性属性:
using Foundation; using Security; [assembly: Dependency(typeof(LocalSecureStorage))] namespace YourAppNamespace.iOS { public class LocalSecureStorage : ILocalSecureStorage { private readonly string _serviceId = NSBundle.MainBundle.BundleIdentifier; public Task SetAsync(string key, string value) { var record = new SecRecord(SecKind.GenericPassword) { Service = _serviceId, Account = key, ValueData = NSData.FromString(value), Accessible = SecAccessible.WhenUnlockedThisDeviceOnly }; var status = SecKeyChain.Add(record); if (status != SecStatusCode.Success) { // 若记录已存在则更新 var existingRecord = new SecRecord(SecKind.GenericPassword) { Service = _serviceId, Account = key }; status = SecKeyChain.Update(existingRecord, record); if (status != SecStatusCode.Success) { throw new InvalidOperationException($"存储失败:{status}"); } } return Task.CompletedTask; } public Task<string> GetAsync(string key) { var record = new SecRecord(SecKind.GenericPassword) { Service = _serviceId, Account = key, ReturnData = true }; var status = SecKeyChain.QueryAsRecord(record, out var result); if (status == SecStatusCode.Success && result?.ValueData != null) { return Task.FromResult(result.ValueData.ToString()); } return Task.FromResult<string>(null); } public Task RemoveAsync(string key) { var record = new SecRecord(SecKind.GenericPassword) { Service = _serviceId, Account = key }; _ = SecKeyChain.Remove(record); return Task.CompletedTask; } } }
- 在共享项目中使用
通过依赖服务获取自定义存储实例,替代默认的SecureStorage:
var localStorage = DependencyService.Get<ILocalSecureStorage>(); // 存储敏感数据 await localStorage.SetAsync("user_token", "your_sensitive_value"); // 获取数据 var token = await localStorage.GetAsync("user_token"); // 删除数据 await localStorage.RemoveAsync("user_token");
关键说明
SecAccessible.WhenUnlockedThisDeviceOnly是核心设置:该属性指定数据仅在设备解锁时可访问,且不会同步至iCloud或其他关联设备,完全留存于本地。- 默认的
SecureStorage使用SecAccessible.WhenUnlocked,此设置允许iCloud同步,因此需要替换为上述属性来满足安全需求。
内容的提问来源于stack exchange,提问作者Pietro
相关产品推荐
相关产品推荐

