Как ссылаться на не поддерживаемые рамки в Watch OS 2

Я обновил свое приложение до последнего синтаксиса swift 2.0. При этом приложение My Watchkit стало сломанным. Проблема заключается в том, что приложение watchkit ссылается на класс, который ссылается на структуру AVFoundation. WatchOS2, видимо, теперь больше не поддерживает некоторые стандартные рамки:

Поддержка сетевых операций включает в себя следующие технологии:

Расширения WatchKit могут получить доступ к сети напрямую через Объект NSURLSession. Расширения WatchKit имеют полный доступ к Возможности NSURLSession, в том числе возможность загрузки файлов в фон. Сведения о том, как использовать этот класс, см. В URL-адресе Руководство по программированию системы загрузки. Механизм Watch Connectivity поддерживает двунаправленную связь между вашим приложением Watch и iOS приложение. Используйте эту структуру для координации действий между двумя приложениями. См. "Общение с вашим приложением 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, но теперь оно остается сломанным в ОС 2. Я вижу, что WatchConnectivity может быть решением, и просто передайте мне штрих-код с самого телефона, но это потребует прекращения поддержки iOS 8. Что это лучшее решение, если оно есть, для использования AVFoundation с WatchOS 2. Если я не могу этого сделать, как еще мне нужно передать это изображение на часы с телефона при вызове. Благодарю.

Ответ 1

Это пример того, как вы можете использовать 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))
  }
}

Ответ 2

Я думаю, что использование WatchConnectivity - это правильная вещь. Для поддержки предыдущей версии, если единственным выключателем для дилера является AVMetadataObjectTypeCode39Code, возможно, вы можете распечатать его значение и передать его непосредственно функции?