【问题标题】:How to reference non-supported frameworks in Watch OS 2如何在 Watch OS 2 中引用不支持的框架
【发布时间】:2015-10-08 04:23:12
【问题描述】:

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

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

WatchKit 扩展可以通过 NSURLSession 对象。 WatchKit 扩展可以完全访问 NSURLSession 能力,包括下载文件的能力 的背景。有关如何使用此类的信息,请参阅 URL 加载系统编程指南。 Watch 连接框架 支持 Watch 应用和 iOS 之间的双向通信 应用程序。使用此框架来协调两个应用程序之间的活动。 请参阅与您的配套 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。什么是最好的解决方案,如果有的话,将 AVFoundation 与 WatchOS 2 一起使用。如果我不能这样做,我应该如何在调用时将此图像从手机传递到手表。谢谢。

【问题讨论】:

    标签: ios swift swift2 watchkit ios-app-group


    【解决方案1】:

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

    请注意这个例子是粗略的并且不处理错误。对于稳定的产品,会话管理也应该得到一些关注。

    iPhoneAppDelegate

    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))
      }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 2015-12-14
        • 1970-01-01
        • 1970-01-01
        • 2015-10-30
        • 2013-12-10
        相关资源
        最近更新 更多