iOS 应用的商店功能标志
Posted
技术标签:
【中文标题】iOS 应用的商店功能标志【英文标题】:Store feature flags for iOS app 【发布时间】:2018-05-05 16:52:19 【问题描述】:在我的应用程序中,我有一些过去只执行几次的功能。 例如,入门指南应该显示一次,一些解释应用功能的工具提示只需要在用户最终使用该功能一次或两次之前显示。
所以我需要将它存储在某个地方。现在我正在使用 UserDefaults。当您需要存储和更新许多功能标志时,这种方法相当简单但不那么优雅。
也许有一些很好的存储功能标志的解决方案?
附: Core Data 或 Realm 看起来很繁重。虽然 .plist 文件看起来更好
【问题讨论】:
我应该将此添加为评论。试试 KeychainSwift。它比 UserDefaults 更安全,但它非常易于使用。 cocoadocs.org/docsets/KeychainSwift/9.0.2 这正是 UserDefaults 的用途。 【参考方案1】:首先,正如 rmaddy 在 cmets 中指出的那样,这正是 UserDefaults
的设计目的。我感觉你正在以这样一种方式使用它,它已经成为一个非常不幸的负担。以下是您可以做的一些事情,以使使用它更加直接和可维护。
-
在单独的文件中创建
UserDefaults
的扩展名。
将计算值添加到扩展中,使用 #function
关键字,您可以将值的名称分配给 UserDefaults
作为键,而无需使用稍后可能在代码中输入错误的硬编码字符串。
使用enum
封装相关值,例如您的功能标志。
根据您的使用情况,您可以为计算值或便利函数添加自定义功能。
UserDefaults.swift
import Foundation
// MARK: - Features
/// Names of Features to be later accessed by raw value.
enum Features: String
case FeatureZ
case FeatureX
case FeatureW
extension UserDefaults
// MARK: - Onboarding
/// Indicates whether or not the user completed account setup.
/// - Returns: Bool
var finishedAcountSetup: Bool
get return bool(forKey: #function)
set set(newValue, forKey: #function)
/// Indicates whether or not the user completed the first part of onboarding
/// - Returns: Bool
var primaryOnboarding: Bool
get return bool(forKey: #function)
set set(newValue, forKey: #function)
// counter for displaying the tool tip
private var counterForToolTip: Int
get return integer(forKey: #function)
set set(newValue, forKey: #function)
// Indicates whether or not the tool tip be shown
var shouldShowToolTip: Bool
get
if (counterForToolTip > 2)
counterForToolTip = 0
return true
return false
var featureFlags: [String]
get
guard let array = stringArray(forKey: #function) else
return []
return array
set set(newValue, forKey: #function)
// Convience functions
/// Sets all onboarding values
func setAllOnboarding(to: Bool)
var onboardingValues = [finishedAcountSetup, primaryOnboarding]
for (index, _) in onboardingValues.enumerated()
onboardingValues[index] = to
/// Increment the tool tip counter by a integer
/// If the counter is > 2 then the tool tip can show.
func incrementToolTipCounter(by: Int = 1)
counterForToolTip += by
同时,其他地方...
UserDefaults.standard.featureFlags.append(Features.FeatureX.rawValue)
UserDefaults.standard.finishedAcountSetup = true
UserDefaults.standard.setAllOnboarding(to: false)
UserDefaults.standard.incrementToolTipCounter()
for (index, _ ) in UserDefaults.standard.featureFlags.enumerated()
print("\(UserDefaults.standard.featureFlags[index])")
if (UserDefaults.standard.featureFlags.contains(Features.FeatureX.rawValue))
// Do something
// etc.
【讨论】:
以上是关于iOS 应用的商店功能标志的主要内容,如果未能解决你的问题,请参考以下文章