11

アプリを最新の Swift 2.0 構文に更新しました。そうするうちに、ウォッチキット アプリが壊れてしまいました。問題は、ウォッチキット アプリが、フレームワーク AVFoundation を参照するクラスを参照していることです。WatchOS2 は、標準フレームワークの一部をサポートしなくなったようです。

ネットワークベースの操作のサポートには、次のテクノロジが含まれます。

WatchKit 拡張機能は、NSURLSession オブジェクトを介してネットワークに直接アクセスできます。WatchKit 拡張機能は、バックグラウンドでファイルをダウンロードする機能など、NSURLSession 機能に完全にアクセスできます。このクラスの使用方法については、URL Loading System Programming Guide を参照してください。Watch Connectivity フレームワークは、Watch アプリと iOS アプリ間の双方向通信をサポートします。このフレームワークを使用して、2 つのアプリ間のアクティビティを調整します。コンパニオン 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)

    }
}

RSUnifiedCodeGeneratorAVFoundation を利用して文字列からバーコード イメージを生成するクラスです。さらに、ジェネレーターが取る型は AVObject: AVMetadataObjectTypeCode39Code です。この解決策は、最初の WatchOS ではうまく機能しましたが、OS 2 では壊れたままです。WatchConnectivity が解決策になる可能性があることがわかりました。電話自体からバーコードを渡すだけですが、iOS 8 のサポートを停止する必要があります。 WatchOS 2 で AVFoundation を使用するための最善の解決策があるとすれば、. ありがとう。

4

2 に答える 2

4

これは、アプリで 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))
  }
}
于 2015-10-16T12:57:36.297 に答える