2

時計と iOS 親アプリの間で通信するアプリを開発しています。それを開くことによって、WatchKit 拡張機能から親アプリケーションにデータを送信します。openParentApplication:replyが呼び出されると、Apple Watch から iPhone アプリケーションが開くことを理解しています。その後application:handleWatchKitExtension:reply、アプリのデリゲートで呼び出されます。

そこから、View Controller への通知を開くことができます。

NSNotificationCenter.defaultCenter().postNotificationName(aName: String, object anObject: AnyObject?)

「aName」は、ビューコントローラーで次のように開くことができるものです。

NSNotificationCenter.defaultCenter().addObserver(self,
        selector: Selector("handleWatchKitNotification:"),
        name: "WatchKitSaysHello",
        object: nil)

私の WatchKit 拡張機能のインターフェイス コントローラーのコードは次のとおりです。

//
//  InterfaceController.swift
//  SendColors WatchKit Extension
//
//  Created by Tommy on 12/30/14.
//  Copyright (c) 2014 Tommy. All rights reserved.
//

import WatchKit
import Foundation


class InterfaceController: WKInterfaceController {

var ypo = false

override func awakeWithContext(context: AnyObject?) {
    super.awakeWithContext(context)

    // Configure interface objects here.
}

@IBOutlet weak var redButton: WKInterfaceButton!

@IBOutlet weak var greenButton: WKInterfaceButton!

@IBOutlet weak var blueButton: WKInterfaceButton!

@IBAction func onRedButtonClick() {
    if ypo {
        openParentAppWithColor("Yellow")
    }
    else {
        openParentAppWithColor("Red")
    }
}

@IBOutlet weak var moreButton: WKInterfaceButton!

@IBAction func moreButtonClick() {
    if !ypo {
        ypo = true
        redButton.setTitle("Yellow")
        redButton.setColor(UIColor.yellowColor())
        greenButton.setTitle("Purple")
        greenButton.setColor(UIColor.purpleColor())
        blueButton.setTitle("Orange")
        blueButton.setColor(UIColor.orangeColor())
        moreButton.setTitle("Back")
    }
    else {
        ypo = false
        redButton.setTitle("Red")
        redButton.setColor(UIColor.redColor())
        greenButton.setTitle("Green")
        greenButton.setColor(UIColor.greenColor())
        blueButton.setTitle("Blue")
        blueButton.setColor(UIColor.blueColor())
        moreButton.setTitle("More...")
    }
}

@IBAction func onGreenButtonClick() {
    if ypo {
        openParentAppWithColor("Purple")
    }
    else {
        openParentAppWithColor("Green")
    }
}

@IBAction func onBlueButtonClick() {
    if ypo {
        openParentAppWithColor("Orange")
    }
    else {
        openParentAppWithColor("Blue")
    }
}

override func willActivate() {
    // This method is called when watch view controller is about to be visible to user
    super.willActivate()
}

override func didDeactivate() {
    // This method is called when watch view controller is no longer visible
    super.didDeactivate()
}

private func openParentAppWithColor(color: String) {
    if ["color": color] != nil {
     if   !WKInterfaceController.openParentApplication(["color": color], reply: { (reply, error) -> Void in
            println(reply)
     }) {
            println("ERROR")
        }
    }
}
}

私の問題は、たとえば、時計シミュレーターの赤いボタンをクリックしたことです。アクションが呼び出され、そのアクションで呼び出される呼び出しopenParentApplicationWithColor("Red")が呼び出されます。WKInterfaceController.openParentApplication(["color": color], reply: { (reply, error) -> Void in })これが行うことになっているのは、シミュレーターで親アプリを開くことです。バックグラウンドで開きます。したがって、手動で開きます。アプリを手動で開くと、背景が完全に黒くなります。
問題は、[機能] タブでアプリ グループを有効にしなかったことにあると思われます。そのためには、開発者プログラムに参加する必要があります。これを行うには参加する必要がありますか、それとも別の問題がありますか? Xcode 6.2 Beta 3 を使用しています。よろしくお願いします。

4

3 に答える 3

7

openParentApplication:reply: でアプリ グループを有効にする必要がないことをテストしたところ、確認できました。

openParentApplication:reply が呼び出されると、Apple Watch から iPhone アプリケーションが開くことを理解しています。

このメソッドは、iPhone アプリをバックグラウンドで開きます。Xcode 6.2 の以前のベータ版では、アプリはフォアグラウンドで開きましたが、これは意図した動作ではなく、WatchKit 拡張機能と iPhone アプリの通信が出荷バージョンでどのように機能するかではありません。

iPhone アプリをフォアグラウンドで手動で起動することもできますが、両方を同時に使用するユース ケースをテストする場合を除き、これは必要ありません。少なくとも現在利用可能な API では、iPhone アプリを時計アプリからプログラムでフォアグラウンドに起動することはできず、時計アプリを iPhone アプリからプログラムで起動することもできません。

アプリを起動すると、送信したメッセージに基づいて画面の色が変わると予想されるのに、画面がまだ黒いままであると報告されました。application:handleWatchKitExtension:reply:iPhoneアプリで呼び出されていますか?から何かを出力する必要がある WatchKit 拡張機能で実行するために返信ブロックを受け取っている場合、それが確実に呼び出されていることがわかりますprintln(reply)。もしそうなら、問題はあなたが渡したメッセージで何かをするiPhoneアプリのコードにあります。iPhone アプリの AppDelegate でそのメソッドの実装を確認すると便利です。(そのメソッドが返信ブロックの呼び出しに失敗した場合、まだメッセージを受信して​​いる可能性があり、返信が得られないことに注意してください。ただし、返信が受信されていないというエラー メッセージが表示されます。)

Watch 拡張機能を最初に実行するときは、Xcode で NSLog メッセージを表示したり、ブレークポイントを取得したりしないことに注意してください。ただし、[Debug] > [Attach to process] > [['Likely targets'] の下で iPhone アプリを選択] を選択すると、ログが取得され、 Watch シミュレーターで Watch アプリを引き続き使用できる一方で、Watch アプリではなく iPhone アプリのブレークポイント。デバッグに最も役立ちます。

于 2015-01-12T01:49:08.180 に答える
1

いいえ、以前の親アプリケーションを使用するためにグループを有効にする必要はありません。グループ アプリを設定せずに、親 IOS アプリケーションを開くように要求し、IOS アプリからの応答を待つことができます。NSUserDefauts とスイート名を使用して、watchkit アプリと IOS アプリの間でデータを共有する場合にのみ、グループ アプリを設定する必要があります。

于 2015-02-06T17:47:26.843 に答える
0

私は Xcode 6.2 Beta 5 を使用しています。[デバッグ] > [プロセスにアタッチ] > [iPhone アプリをターゲットの下で選択すると動作しない可能性があります。Watch 拡張機能の NSLogs は表示されますが、iPhone アプリのデリゲートおよび iPhone アプリのビュー コントローラーには表示されません。

于 2015-02-06T14:26:32.557 に答える