2015-10-08 15 views
10

'da desteklenmeyen çerçevelere nasıl başvurulur Uygulamamı en son hızlı 2.0 sözdizimine güncelledim. Bunu yaparken, watchkit uygulaması bozuldu. Sorun, watchkit uygulamasının AVFoundation çerçevesine referans veren bir sınıfa başvurmasıdır. WatchOS2 görünüşte artık standart çerçeveler bazı destekler: ağ tabanlı işlemler içinİzleme OS 2

Desteği şu teknolojileri içerir:

WatchKit uzantıları bir NSURLSession nesnesi aracılığıyla doğrudan ağa erişebilir. WatchKit uzantıları, arka planda dosyaları indirme olanağı da dahil olmak üzere NSURLSession özelliklerine tam erişime sahiptir. Bu dersin kullanımı hakkında bilgi için, bkz. URL Yükleme Sistemi Programlama Kılavuzu. Watch Connectivity çerçevesi , Watch uygulamanız ile iOS uygulamanız arasındaki çift yönlü iletişimi destekler. İki uygulama arasındaki etkinlikleri koordine etmek için bu çerçeveyi kullanın. Companion iOS App ile İletişim Kurma konusuna bakın. "Bulunan böyle modülü" AVFoundation çerçevesini kullanmaya çalışırken bir hata mesajı olduğu

Available System Technologies for WatchKit

Yani şimdi izle kiti kodunu derlemek olamaz. Bunu nasıl başarabilirim ve o dersi ve çerçeveyi elma izleme uygulamamda referans göstermeye devam edebilirim. Telefonla saat arasında veri iletişim kurmalı mıyım? Çerçeveyi uzantıya bağlamanın bir yolu var mı?

Ne yapmaya çalışıyorum benim InterfaceController içinde, şudur:

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

dizeleri gelen barkod görüntüler oluşturmak için AVFoundation kullanan bir sınıf olma. Ayrıca, jeneratörün aldığı tür bir AVObject: AVMetadataObjectTypeCode39Code'dur. Bu çözüm ilk WatchOS'ta iyi çalıştı, ancak artık OS 2'de bozuldu. WatchConnectivity'in bir çözüm olabileceğini ve telefonun kendisinden barkodu geçirdiğini ancak bunun iOS 8'i desteklemeyi durdurmasını gerektirdiğini gördüm. Varsa, WatchOS 2 ile AVFoundation'ı kullanmak için en iyi çözümdür. Bunu yapamazsam, bu görüntüyü arandığında telefondan izlemeye nasıl geçebilirim. Teşekkürler.

cevap

4

Bu, uygulamanız için WatchConnectivity özelliğini nasıl kullanabileceğinize bir örnektir.

Lütfen bu örneğin pürüzlü ve hata işlemez. Oturum yönetimi de istikrarlı bir ürün için biraz dikkat çekmelidir.

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

İzle 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 özelliğini kullanmanın doğru şey olduğunu düşünüyorum. Önceki versiyon desteği için sadece satıcı dağıtıcısı AVMetadataObjectTypeCode39Code ise, belki de değerini yazdırabilir ve doğrudan işleve iletebilirsiniz.