我将我的应用更新为最新的swift 2.0语法。这样做,我的Watchkit应用程序已经破产。问题是watchkit app引用了一个引用框架AVFoundation的类。 WatchOS2显然现在不再支持某些标准框架:
对基于网络的操作的支持包括以下技术:
WatchKit扩展可以直接通过网络访问网络 NSURLSession对象。 WatchKit扩展可以完全访问 NSURLSession功能,包括下载文件的功能 的背景。有关如何使用此类的信息,请参阅URL 加载系统编程指南。 Watch Connectivity框架 支持Watch应用程序和iOS之间的双向通信 应用程序。使用此框架来协调两个应用程序之间的活动。 请参阅与您的Companion iOS应用程序通信。
Available System Technologies for 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,这是最好的解决方案。如果我不能这样做,我应该怎么做才能在通话时将这个图像从手机传递给手表。谢谢。
答案 0 :(得分:4)
这是一个关于如何将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))
}
}
答案 1 :(得分:1)
我认为使用WatchConnectivity是正确的做法。
对于以前的版本支持,如果唯一的经销商断路器是AVMetadataObjectTypeCode39Code
,您可以打印其值并直接将其传递给该功能吗?