Как ссылаться на не поддерживаемые рамки в 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
, возможно, вы можете распечатать его значение и передать его непосредственно функции?