2015-10-08 2 views
10

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

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

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

ответ

4

Это пример того, как вы можете использовать WatchConnectivity для своего приложения.

Пожалуйста, не то, чтобы этот пример был грубым и не обрабатывал ошибку. Управление сеансом также должно быть уделено внимание стабильному продукту.

enter image description here

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

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