11

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

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

WatchKit 扩展可以通过 NSURLSession 对象直接访问网络。WatchKit 扩展可以完全访问 NSURLSession 功能,包括在后台下载文件的能力。有关如何使用此类的信息,请参阅 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。什么是最好的解决方案,如果有的话,将 AVFoundation 与 WatchOS 2 一起使用。如果我不能这样做,我应该如何在调用时将此图像从手机传递到手表。谢谢。

4

2 回答 2

4

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

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

在此处输入图像描述

苹果手机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))
  }
}
于 2015-10-16T12:57:36.297 回答
1

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

于 2015-10-14T13:25:44.153 回答