在 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
不同:
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