如何在 Watch OS 2 中引用不支持的框架

Posted

技术标签:

【中文标题】如何在 Watch OS 2 中引用不支持的框架【英文标题】:How to reference non-supported frameworks in Watch OS 2 【发布时间】:2015-10-08 04:23:12 【问题描述】:

我将我的应用程序更新为最新的 swift 2.0 语法。这样做时,我的 watchkit 应用程序已损坏。问题是 watchkit 应用程序引用了一个引用框架 AVFoundation 的类。 WatchOS2 显然现在不再支持某些标准框架:

对基于网络的操作的支持包括以下技术:

WatchKit 扩展可以通过 NSURLSession 对象。 WatchKit 扩展可以完全访问 NSURLSession 能力,包括下载文件的能力 的背景。有关如何使用此类的信息,请参阅 URL 加载系统编程指南。 Watch 连接框架 支持 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 中运行良好,但现在在 OS 2 中仍然存在问题。我看到 WatchConnectivity 可能是一个解决方案,它只是将手机本身的条形码传递给我,但这需要我停止支持 iOS 8。什么是最好的解决方案,如果有的话,将 AVFoundation 与 WatchOS 2 一起使用。如果我不能这样做,我应该如何在调用时将此图像从手机传递到手表。谢谢。

【问题讨论】:

【参考方案1】:

这是一个关于如何为您的应用使用 WatchConnectivity 的示例。

请注意这个例子是粗略的并且不处理错误。对于稳定的产品,会话管理也应该得到一些关注。

iPhoneAppDelegate

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,对于以前的版本支持,也许您可​​以打印它的值并将其直接传递给函数?

【讨论】:

以上是关于如何在 Watch OS 2 中引用不支持的框架的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Watch OS 2 模拟器构建 openssl 库?

Xcode 7 支持 watch OS1 和 OS2

使用 CoreData 时如何与 Watch OS 2 共享数据以显示在 WKInterfaceTable 中

结合 Watch OS 和 iOS 框架

如何使用 nsobject 类共享数据(在 watch OS 2 中)

如何从 Watch App(Watch OS 2)与非活动的 IOS 应用程序通信