有没有办法为`UIApplication.shared`添加`if(iOSApplicationExtension)`条件

Posted

技术标签:

【中文标题】有没有办法为`UIApplication.shared`添加`if(iOSApplicationExtension)`条件【英文标题】:Is there a way to add `if (iOSApplicationExtension)` condition for `UIApplication.shared` 【发布时间】:2020-05-13 10:46:28 【问题描述】:

我正在尝试找到一种方法来添加条件以检查 是扩展目标 在框架中(不是主应用程序)。是否可以依靠#available(iosApplicationExtension, *)进行一些参数调整?

@objc public extension UIView 
    var isAccessibilityCategory: Bool 
        if #available(iOSApplicationExtension, *) 
            return self.traitCollection.preferredContentSizeCategory.isAccessibilityCategory
         else 
            return UIApplication.shared.preferredContentSizeCategory.isAccessibilityCategory
        
    

How to detect if code is running in Main App or App Extension Target? - 不起作用,因为框架不知道扩展目标

【问题讨论】:

#available 语句不能用于检测应用程序扩展等目标类型。这只能检测应用程序运行的操作系统和操作系统版本。 #available 的创建是为了让您可以使用仅在比您的最低目标依赖项更新的操作系统版本中可用的系统功能 - 例如在针对 iOS13 的项目中使用 Combine 或 SwiftUI 另外,在您的原件作为副本关闭后,您不应该问完全相同的问题。如果您不同意重复关闭,请编辑您的问题以解释为什么重复的答案不适用于您的问题,并在 cmets 中标记更接近的内容,以便他们在同意的情况下重新打开您的问题。为什么this 特定答案不适用于您的问题?它不需要来自框架的关于运行它的应用程序/扩展的知识。 @DávidPásztor 我需要一个在编译时而不是运行时正确处理 UIApplication.shared 的条件 你找到办法了吗? 【参考方案1】:

为了解决这个问题,我用我创建的所有应用程序创建了一个枚举器,当用户启动应用程序时,我检查我所在的应用程序的捆绑标识符并将其保存在 appManager 中,这样我就可以执行一些更改也基于框架中的应用类型。

这是我的枚举:

public enum MyApp: Int, CaseIterable 
    case sysReserved = 0
    case app1 = 1

   public var applicationId : [String] 
       switch self 
           case .sysReserved:
               return [""]
           case .parametersEditor:
               return ["com.team.app1"]
       
   

这是我的 AppManager

class AppManager: UIApplication 

   var CURRENT_APP: MyApp = .sysReserved

   override init() 
      super.init()
      getCurrentApplicationInfo()
   

   internal func getCurrentApplicationInfo() 
       CURRENT_VERSION_NUM = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
       CURRENT_BUILD_NUM = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
       let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleIdentifier") as! String
       CURRENT_APP = .sysReserved

       for app in Application.allCases 
           if app.applicationId.contains(appName) 
               CURRENT_APP = app
           
       
   

【讨论】:

以上是关于有没有办法为`UIApplication.shared`添加`if(iOSApplicationExtension)`条件的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法避免隐式转换为 void*?

有没有办法为故事书提供“主文件”?

有没有办法将数字单词转换为整数?

有没有办法检查变量是不是为整数? C++

有没有办法将 QTableView 模型转换为 QStandardItemModel

有没有办法为android生成用户ID?