首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏CoderStar

    UserDefaults 浅析及其使用管理

    我想每一个 iOSer 对UserDefaults都有所了解,但大家真的完全了解它吗?下面,我谈谈我对UserDefaults的看法。 同时,这也应该是 iOS 持久化方式系列的开篇文章了。 相关问题 UserDefaults的存储范围 因为UserDefaults底层使用的plist文件,所以plist文件支持的数据类型就是UserDefaults的存储范围,其中包括Array、Data 因为UserDefaults存储的数据都是明文,没有经过加密,所以尽量不要使用UserDefaults存储敏感数据,即使使用,也要使用加密算法对其进行加密后再存储进去。 示例,协议默认实现为 UserDefaults.standard /// 如果想存储在另外的plist文件中,便可以单独实现 var userDefaults: UserDefaults 当存储值不存在时返回的默认值 public init(_ key: String, defaultValue: T, userDefaults: UserDefaults = UserDefaults.standard

    1.6K10编辑于 2022-08-24
  • 来自专栏iOS Developer

    iOS开发之诱导用户为自己的App评论功能

    userDefaults objectForKey:@"theDays"] intValue]; //userDefaults里的版本号 float udAppVersion = [[userDefaults objectForKey:@"appVersion"] intValue]; //userDefaults里用户上次的选项 int udUserChoose = [[userDefaults 里版本号 float udAppVersion = [[userDefaults objectForKey:@"appVersion"] intValue]; //userDefaults 里用户天数 int udtheDays = [[userDefaults objectForKey:@"theDays"] intValue]; //当前版本比userDefaults 里用户天数 int udtheDays = [[userDefaults objectForKey:@"theDays"] intValue]; //当前版本比userDefaults

    1.2K40发布于 2018-07-04
  • 来自专栏学海无涯

    iOS14开发-数据存储

    // UserDefaults let userDefaults = UserDefaults.standard override func viewDidLoad() { userDefaults.set(swit.isOn, forKey: "isOn") // 最后进行同步 userDefaults.synchronize // UserDefaults let userDefaults = UserDefaults.standard func scene(_ scene: UIScene, willConnectTo 因此还有另外一种获取 UserDefaults 对象的方法:UserDefaults(suiteName: String?) let userDefaults = UserDefaults(suiteName: "abc") userDefaults?.

    1.5K20发布于 2021-03-30
  • 来自专栏iOS 备忘录

    开关组件对比

    大部分情况下开发的时候,是用UserDefaults存储一个bool值,用于判断。 比如: // 存储 UserDefaults.standard.setValue(value, forKey: keyStr) UserDefaults.standard.synchronize() // 判断 if let value = UserDefaults.standard.value(forKey: keyStr) as? : UserDefaults private init(userDefaults: UserDefaults) { self.userDefaults = userDefaults // 可以注意userDefaults.register方法的使用,赋默认值 self.userDefaults.register(defaults: [

    1.4K11发布于 2021-04-06
  • 来自专栏君赏技术博客

    启动图第二篇文章启动图名字生成第二篇

    = UserDefaults.standard userDefaults.set(list, forKey: SLaunchNameKey) userDefaults.synchronize { let userDefaults = UserDefaults.standard return userDefaults.object(forKey: SLaunchNameKey) [String] else { return false } UserDefaults.standard.set(list, forKey: "dragListImage ") UserDefaults.standard.synchronize() return true } class func readDragImageList() -> [String { return UserDefaults.standard.object(forKey: "dragListImage") as? [String] }

    50610发布于 2018-08-31
  • 来自专栏肘子的Swift记事本

    @AppStorage研究

    @AppStorage研究 前言 在苹果生态的应用中,开发者或多或少都会使用到UserDefaults。我个人习惯将可被用户自定义的配置信息(精度、单位、色彩等)保存在UserDefaults中。 默认情况下使用的是UserDefaults.standard,也可以指定其他的UserDefaults。 public extension UserDefaults { static let shared = UserDefaults(suiteName: "group.com.fatbobman.examples } @AppStorage("userName",store:UserDefaults.shared) var name = "fat" 对UserDefaults操作将直接影响对应的@AppStorage UserDefaults是一种高效且轻量的持久化方案,它有以下不足: 数据不安全 它的数据相对容易提取,所以不要保存和隐私有关的重要数据 持久化时机不确定 为了效率的考量,UserDefaults中的数据在发生变化时并不会立即持久化

    1.8K20编辑于 2022-07-28
  • 来自专栏肘子的Swift记事本

    在 SwiftUI 下使用 NSUbiquitousKeyValueStore 同步数据

    什么是 NSUbiquitousKeyValueStore NSUbiquitousKeyValueStore 可以理解为 UserDefaults 的网络同步版本。 NSUbiquitousKeyValueStore 在大多数场合下表现的同 UserDefaults 十分类似: •都是基于键值存储•只能使用字符串作为键•可以使用任意属性列表对象(Property list 同 UserDefaults 之间的不同 •NSUbiquitousKeyValueStore 不提供注册默认值的方法使用 UserDefaults 时,开发者可以使用 register(defaults 在多数情况下,我们可以将@AppStorage 看作是 UserDefaults 的 SwiftUI 包装,但在个别情况下,@AppStorage 并不完全与 UserDefaults 的行为保持一致( Zephyr 在处理 UserDefaults 同 NSUbiquitousKeyValueStore 之间的联动方面做的很不错,但由于@AppStorage 的独特性(并非真正意义上的 UserDefaults

    5.6K40编辑于 2022-07-28
  • 来自专栏Swift社区

    使用 Codable 归档 Swift 对象

    UserDefaults非常适合存储简单的设置,例如整数和布尔值,但是当涉及复杂数据时——例如自定义Swift类型——我们需要做更多的工作。 我们将在未来的项目中更多地研究Codable,但是目前我们的需求很简单:我们想要归档一个自定义类型,以便可以将其放入UserDefaults中,然后在从UserDefaults中返回时将其取消存档。 在这种情况下,我们实际上并不在乎使用哪种数据,因为它们只会存储在UserDefaults中。 要将用户数据转换为JSON数据,我们需要在JSONEncoder上调用encode()方法。 encoder.encode(self.user) { UserDefaults.standard.set(data, forKey: "UserData") } } 该数据常量是一种新的数据类型 不过,在这里,我们只关心它是可以直接写入UserDefaults中的数据类型之一。

    1.6K20发布于 2021-11-26
  • 来自专栏韦弦的偶尔分享

    使用Codable归档Swift对象

    UserDefaults非常适合存储简单的设置,例如整数和布尔值,但是当涉及复杂数据时——例如自定义Swift类型——我们需要做更多的工作。 我们将在未来的项目中更多地研究Codable,但是目前我们的需求很简单:我们想要归档一个自定义类型,以便可以将其放入UserDefaults中,然后在从UserDefaults中返回时将其取消存档。 在这种情况下,我们实际上并不在乎使用哪种数据,因为它们只会存储在UserDefaults中。 要将用户数据转换为JSON数据,我们需要在JSONEncoder上调用encode()方法。 encoder.encode(self.user) { UserDefaults.standard.set(data, forKey: "UserData") } } 该数据常量是一种新的数据类型 不过,在这里,我们只关心它是可以直接写入UserDefaults中的数据类型之一。

    2.5K30发布于 2020-04-24
  • 来自专栏青玉伏案

    IOS开发之记录用户登陆状态

    = [NSUserDefaults standardUserDefaults];                   //登陆成功后把用户名和密码存储到UserDefault         [userDefaults setObject:username forKey:@"name"];         [userDefaults setObject:password forKey:@"password"];           单例     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];           //移除UserDefaults 中存储的用户信息     [userDefaults removeObjectForKey:@"name"];     [userDefaults removeObjectForKey:@"password "];      [userDefaults synchronize];     //获取storyboard     UIStoryboard *storyboard = [UIStoryboard

    1.9K90发布于 2018-01-11
  • 来自专栏晨光的Code

    iOS Widget Extension开发拾遗

    数据传递在主App里写入数据到UserDefaults中,在widget中读取数据/// 在主App中写入数据到UserDefaults中 NSString *suiteName = [NSString stringWithFormat:@"group.%@", [[NSBundle mainBundle] bundleIdentifier]];NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:suiteName];[userDefaults setObject:data forKey:dataKey]; [userDefaults synchronize];/// 通知Widget刷新数据@available(iOS 14, *)@objc func receiveNotice(_ notification stringByReplacingOccurrencesOfString:@".anchorrec" withString:@""]];self.defaultPacketData = [self.userDefaults

    1.6K40编辑于 2022-12-01
  • 来自专栏KyXu

    【iOS开发】两个函数搞定本地存储

    // MARK: - Store enum StoreType { case userDefaults case plist } func setContentToDevice (content () defaults.setObject(content, forKey: key) print("Set - UserDefaults") }else if if type == .userDefaults { let defaults = NSUserDefaults.standardUserDefaults() let content = defaults.objectForKey(key) returnObject = content print("Get - UserDefaults") 下面给出使用这个函数的范例:(其中 Hero 是我自定义的类) let arr = [1,2,3,4,5] setContentToDevice(arr, key: "testArr", type: .userDefaults

    71420发布于 2019-04-11
  • 来自专栏Swift社区

    Swift 中 User Defaults 的读取和写入

    存储这些首选项的代码可以如下所示: UserDefaults.standard.set(true, forKey: "has-seen-onboarding") UserDefaults.standard.set (["AAPL", "TSLA"], forKey: "favorite-stocks") print(UserDefaults.standard.bool(forKey: "has-seen-onboarding ")) // 打印:true print(UserDefaults.standard.array(forKey: "favorite-stocks")) // 打印:["AAPL", "TSLA"] 配置后,你可以使用组标识符创建新实例: extension UserDefaults { static let group = UserDefaults(suiteName: "group.your.identifier uncaught exception ‘NSInvalidArgumentException’, reason: ‘Attempt to insert non-property list object UserDefaults.Stock

    1.1K20编辑于 2023-11-03
  • 来自专栏flutter开发精选

    flutter-如何实现类型微信分享的功能

    - 1 { let userDefaults = UserDefaults(suiteName: "group. - 1 { let userDefaults = UserDefaults(suiteName: "group. - 1 { let userDefaults = UserDefaults(suiteName: "group. - 1 { let userDefaults = UserDefaults(suiteName: "group. - 1 { let userDefaults = UserDefaults(suiteName: "group.

    3.5K40编辑于 2022-09-20
  • 来自专栏Alice

    ios 版本更新提示-硬更新/软更新

    NSString *nowday = [formatter stringFromDate:[NSDate date]]; NSString *saveDay = [UserDefaults 并且把isHadShowUpdate 设置成yes [self canChooseUpdate]; [UserDefaults setObject:@"1" forKey:@"isHadShowUpdate"]; [UserDefaults setObject:nowday forKey:@"versionUpdateKey IsHadShowUpdate isEqualToString:@"0"]){ // [self canChooseUpdate]; // [UserDefaults setObject:@"1" forKey:@"isHadShowUpdate"]; // [UserDefaults setObject:nowday forKey

    1.7K40发布于 2019-01-03
  • 来自专栏韦弦的偶尔分享

    Swift 单元测试入门

    一个可以生成用户默认实例以用于单元测试的示例: struct SearchQueryCache { var userDefaults: UserDefaults = .standard : UserDefaults! = UserDefaults(suiteName: userDefaultsSuiteName) } override func tearDownWithError() throws { try super.tearDownWithError() userDefaults.removeSuite(named: userDefaultsSuiteName let cache = SearchQueryCache(userDefaults: userDefaults) /// ... write the test } } 这样做可以确保您不会操纵在模拟器上测试期间使用的标准用户默认值

    3.4K40编辑于 2023-01-06
  • 来自专栏韦弦的偶尔分享

    Swift 中的属性包装器

    例如,假设我们正在开发一个消息应用程序,它使用 Foundation 的 UserDefaults API在磁盘上存储各种用户设置和其他轻量级数据。 这样做通常需要编写某种形式的映射代码,以便将每个值与其底层的UserDefaults存储进行同步——通常需要为我们要存储的每个数据段进行复制。 然而,通过在通用属性包装器中实现这种逻辑,我们可以使其易于重用——因为这样做可以让我们简单地将包装器附加到任何希望由UserDefaults支持的属性。 { static var shared: UserDefaults { let combined = UserDefaults.standard combined.addSuite 我们所要做的就是将defaultValue属性添加到包装器中,然后在底层UserDefaults存储不包含属性键的值时使用它。

    3.6K30发布于 2021-04-08
  • 来自专栏肘子的Swift记事本

    肘子的 Swift 周报 #054| 安全、便利与隐私

    谨防 UserDefaults:隐藏错误与数据丢失的故事 (Beware UserDefaults: a tale of hard to find bugs, and lost data)[17] Christian Selig[18] UserDefaults 提供了简单且线程安全的 API,支持数据的持久化和序列化,因此被广泛用于存储非敏感和非大量数据。 然而,Christian Selig 在本文中通过亲身经历警告开发者:尽管 UserDefaults 有诸多优势,但如使用不当可能引发严重的错误和数据丢失。 Selig 指出,随着 iOS 系统的不断演进(如预热机制和 Live Activities 的引入),UserDefaults 的行为变得越来越复杂且难以预测。 :隐藏错误与数据丢失的故事 (Beware UserDefaults: a tale of hard to find bugs, and lost data): https://t.ly/BfKsR [

    52410编辑于 2024-11-23
  • 来自专栏静之森

    从零开始的 Swift UI (二)

    本地存储可以使用 UserDefaults,响应式数据流使用 ObservableObject。 swift 1class Store { 2 private(set) static var userDefaults = UserDefaults() 3 4 public static PropertyListEncoder().encode(like.codable) { 9 userDefaults.set(data, forKey: storeKey) 10 因为 likes 不是普通的 Array,所以不能直接使用 Userdefaults.set() 的方法写入,否则会 runtime crash。 swift 1init() { 2 if let data = Store.userDefaults.data(forKey: Store.storeKey) { 3

    1.8K20编辑于 2021-12-28
  • 来自专栏韦弦的偶尔分享

    清空所有 NSUserDefaults 记录

    有时候我们需要清空所有使用 NSUserDefaults 的记录,但是我们常用的都是removeObject,即移除特定的值: UserDefaults.standard.removeObject(forKey 其实苹果是有提供清空所有记录的方法的,即removePersistantDomainForName: if let bundleID = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain

    2K10发布于 2020-09-01
领券