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 应用的商店功能标志的主要内容,如果未能解决你的问题,请参考以下文章

css 移动商店标志

在 Azure 应用配置中设置/添加功能标志

设置中的推送通知标志

Apollo 客户端的全局加载标志

在我的 iOS 应用程序中,是不是有任何理由为会话 cookie 设置 HttpOnly 和 Secure 标志?

在黄瓜测试中切换功能标志值