如何在Watch OS 2中引用不受支持的框架

我将我的应用更新为最新的swift 2.0语法。 这样做,我的Watchkit应用程序已经破碎。 问题是watchkit app引用了一个引用框架AVFoundation的类。 WatchOS2显然现在不再支持一些标准框架:

对基于网络的操作的支持包括以下技术:

WatchKit扩展可以通过NSURLSession对象直接访问网络。 WatchKit扩展可以完全访问NSURLSessionfunction,包括在后台下载文件的function。 有关如何使用此类的信息,请参阅URL加载系统编程指南。 Watch Connectivity框架支持Watch应用程序和iOS应用程序之间的双向通信。 使用此框架来协调两个应用程序之间的活动。 请参阅与您的Companion iOS应用程序通信。

适用于WatchKit的系统技术

因此,当我尝试使用AVFoundation框架时,我无法编译监视工具包代码,因为“找不到这样的模块”是一条错误消息。 我怎样才能解决这个问题,并在我的Apple Watch应用程序中继续引用该类和框架。 我应该在手机和手表之间传递数据吗? 有没有办法将框架链接到扩展?

我想要做的是以下,在我的InterfaceController中:

override func willActivate() { super.willActivate() let defaultsShared = NSUserDefaults(suiteName: "somesharedappgroup") let defaults = NSUserDefaults.standardUserDefaults() if let barcodeString = defaultsShared!.objectForKey("barcode") as? String { if let barcodeContent = RSUnifiedCodeGenerator.shared.generateCode(barcodeString, machineReadableCodeObjectType: AVMetadataObjectTypeCode39Code) { barcode.setImage(barcodeContent) label.setText("ID: \(barcodeString)") } else { label.setText("Please setup extensions in the settings of SHPID.") barcode.setImage(nil) } } else { label.setText("Please setup extensions in the settings of SHPID.") barcode.setImage(nil) } } 

RSUnifiedCodeGenerator是一个利用AVFoundation从字符串生成条形码图像的类。 此外,生成器采用的类型是AVObject:AVMetadataObjectTypeCode39Code。 这个解决方案在第一个WatchOS中运行良好,但现在在OS 2中仍然存在问题。我看到WatchConnectivity可能是一个解决方案,并且它只是从手机本身传递条形码,但这需要我停止支持iOS 8。对于在WatchOS 2中使用AVFoundation,是最好的解决方案。如果我不能这样做,我应该怎么做才能在通话时将这个图像从手机传递到手表。 谢谢。

这是一个关于如何为您的应用程序使用WatchConnectivity的示例。

请注意,这个例子很粗糙,不处理错误。 会话管理也应该关注稳定的产品。

在此处输入图像描述

iPhone AppDelegate

 import UIKit import WatchConnectivity import AVFoundation import RSBarcodes @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. if WCSession.isSupported() { let session = WCSession.defaultSession() session.delegate = self session.activateSession() } return true } // On Watch sends the message. // Will not reply as we will push a data message with image. func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { if "generateBarcode" == message["id"] as! String { let code = message["code"] as! String let barcodeImage = RSUnifiedCodeGenerator.shared.generateCode(code, machineReadableCodeObjectType: AVMetadataObjectTypeCode39Code)! if WCSession.isSupported() { let session = WCSession.defaultSession() session.delegate = self session.activateSession() session.sendMessageData(UIImagePNGRepresentation(barcodeImage)!, replyHandler: nil, errorHandler: nil) } } } } 

观看InterfaceController

 import WatchKit import Foundation import WatchConnectivity class InterfaceController: WKInterfaceController, WCSessionDelegate { @IBOutlet var barcodeImage: WKInterfaceImage! override func willActivate() { super.willActivate() if WCSession.isSupported() { let session = WCSession.defaultSession() session.delegate = self session.activateSession() // Send a message requesting a barcode image session.sendMessage( ["id": "generateBarcode", "code": "2166529V"], replyHandler: nil, // Do not handle response, iPhone will push a data message errorHandler: nil) } } // On iPhone pushes a data message func session(session: WCSession, didReceiveMessageData messageData: NSData) { barcodeImage.setImage(UIImage(data: messageData)) } } 

我认为使用WatchConnectivity是正确的做法。 对于以前的版本支持,如果唯一的经销商断路器是AVMetadataObjectTypeCode39Code ,也许您可​​以打印其值并直接将其传递给该function?