在 iOS 和 watchOS 之间共享课程

Posted

技术标签:

【中文标题】在 iOS 和 watchOS 之间共享课程【英文标题】:Sharing classes between iOS and watchOS 【发布时间】:2018-03-09 14:53:31 【问题描述】:

我目前有一个 ios 应用程序。根据用户位置,它使用一个类或另一个类。我如何为我的 iOS 应用程序执行此操作?我有一个protocol

protocol ParseProtocol 

    var urlToParse: URL?  get 
    var parsedXMLData: [MyData]  get 

    func parseFeed()

    init()

然后在ViewController 上,当我检测到用户所在的城市时,会调用parser 函数并根据用户所在的String 生成一个类:

func parser(for city: String) -> ParseProtocol? 

        let bundlePath     = Bundle.main.bundlePath
        let bundleFullName = bundlePath.components(separatedBy: "/").last
        let bundleName     = bundleFullName?.components(separatedBy: ".").first
        let combinedName   = bundleName! + "." + cityIn + "Parser"
        let Class          = NSClassFromString(combinedName) as? ParseProtocol.Type

        print("CITY: \(city)  \(combinedName)")

        return Class?.init()
    

现在,我正在开发一个 watchOS 复杂功能,我想为 watchOS 和 iOS 使用与以前相同的类,因为它们是相同的。我的问题来了,因为它们是不同的捆绑包,combinedName 不同:

watchOS combinedName 是 MyApp-watchOS Extension.LondonParser iOS combinedName 是 MyApp.LondonParser

我很困在这里,不知道如何实现这一点。

【问题讨论】:

如何将LondonParser 和其他类似的类添加到 WatchKit 扩展目标中?一个类可以在多个目标中 【参考方案1】:

如果你需要基于当前bundle使用NSClassFromString,你可以这样做:

let targetName = Bundle.main.infoDictionary![kCFBundleNameKey as String] as! String
let Class = NSClassFromString("\(targetName).\(className)") as? ParseProtocol.Type

当然,每个目标的目标名称都会不同,但这没问题,如果您将所需的类添加到目标。从扩展目标,您无法访问仅添加到宿主应用目标的类。

澄清:您的应用程序包含一个或多个产品(目标)。每个目标都有三个名称:

    显示名称:主屏幕应用图标下方显示的名称 包标识符:目标的(全局)唯一标识符 目标名称:在编译时用于识别目标的名称

第三个名字是用于创建类的名字NSClassFromString。另请注意,目标名称不得包含"MyApp-watchOS Extension" 中的空格。然后编译器找不到该类。

【讨论】:

我的问题是是否可以访问项目中的类。它目前已添加到两个目标(iOS + watchOS 扩展),但我做不到。我不想为我的 iOS 应用程序和我的 watchOS 应用程序创建重复的类。 将同一个类添加到多个目标有什么问题?无论如何,没有“项目类”。该项目只是目标的容器。也许您可以使用import MyApp 将您的主机应用程序目标导入您的手表扩展程序。但我很确定这会引发比它解决的问题更多的问题。

以上是关于在 iOS 和 watchOS 之间共享课程的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 iOS 和 WatchOS 应用之间共享 Firebase Auth 登录?

如何在 iOS 和 watchOS 2 之间建立一个类似于 Lister App 的具有共享框架的项目?

watchOS 3 在设备和手表之间共享的类中使用 WCSession

如何在 watchOS 应用程序的共享框架中访问资产目录中的颜色?

结合 Watch OS 和 iOS 框架

如何从 watchOS App 中的 iOS 文件夹访问课程