2015-10-08 10 views
10

Ho aggiornato la mia app alla più recente sintassi swift 2.0. In tal modo, l'app My watchkit si è rotta. Il problema è che l'app watchkit fa riferimento a una classe che fa riferimento al framework AVFoundation. WatchOS2 a quanto pare ora non supporta più alcuni dei framework standard:Come fare riferimento a framework non supportati in Watch OS 2

supporto per le attività basate sulla rete comprende le seguenti tecnologie:

estensioni WatchKit possono accedere alla rete direttamente attraverso un oggetto NSURLSession . Le estensioni WatchKit hanno pieno accesso alle funzionalità di NSURLSession , inclusa la possibilità di scaricare i file nello lo sfondo. Per informazioni su come utilizzare questa classe, consultare l'URL Caricamento della guida alla programmazione del sistema. Il framework Watch Connectivity supporta la comunicazione bidirezionale tra l'app Watch e l'app iOS . Utilizza questa struttura per coordinare le attività tra le due app. Vedere Comunicazione con l'app iOS Companion.

Available System Technologies for WatchKit

Così ora non posso compilare il codice kit di orologio come "tale modulo trovato" è un messaggio di errore quando si cerca di utilizzare il framework AVFoundation. Come posso aggirare questo e continuare a fare riferimento a quella classe e quadro nella mia app di apple watch. Devo comunicare i dati tra il telefono e l'orologio? C'è un modo per collegare il framework all'estensione?

Quello che sto cercando di fare è la seguente, a mio 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) 

    } 
} 

Il RSUnifiedCodeGenerator essere una classe che utilizza AVFoundation per generare immagini di codici a barre da stringhe. Inoltre, il tipo che genera il generatore è un AVObject: AVMetadataObjectTypeCode39Code. Questa soluzione ha funzionato bene nel primo WatchOS, ma ora rimane interrotta nel sistema operativo 2. Vedo che WatchConnectivity potrebbe essere una soluzione, e basta passarmi il codice a barre dal telefono stesso, ma ciò richiederebbe il blocco del supporto per iOS 8. Cosa è la soluzione migliore, se esiste, per l'utilizzo di AVFoundation con WatchOS 2. Se non riesco a farlo, in che altro modo dovrei passare per passare questa immagine all'orologio dal telefono quando chiamato. Grazie.

risposta

4

Questo è un esempio di come è possibile utilizzare WatchConnectivity per la propria app.

Si prega di notare che questo esempio è approssimativo e non gestisce l'errore. La gestione delle sessioni dovrebbe anche attirare l'attenzione su un prodotto stabile.

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

Guarda 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

Penso che usare WatchConnectivity sia la cosa giusta da fare. Per il supporto della versione precedente se l'unico interruttore del concessionario è AVMetadataObjectTypeCode39Code, è possibile stampare il suo valore e passarlo direttamente alla funzione?