2

WatchOS で奇妙な問題が発生しています (ただし、この問題は iOS と OSX で似ていると思います)。

デリゲートを処理するためにシングルトンを使用していWCSessionます (完全なコードは NatashaTheRobot によるものです。彼女のコードの一部のみをここに貼り付けます。完全なコードはここにあります)。このクラスにはstartSession、シングルトンがセッションのデリゲートとして関連付けられる関数があります。

func startSession() {
    session?.delegate = self
    session?.activateSession()
}

すべてのデリゲート関数は、同じクラス内で定義されています。session:didReceiveMessage:replyHandler:

Watch アプリが現在の InterfaceController によって個別にメッセージを受信するたびに、デリゲートを呼び出せるようにしたいと考えています。

ExtensionDelegateこの目標を達成するのに適した場所はクラスかもしれないと思いました:

class ExtensionDelegate: NSObject, WKExtensionDelegate {

    let session = WatchSessionManager.sharedManager // THE SINGLETON INSTANCE

    func applicationDidFinishLaunching() {
        session.startSession()
    }

このコードは機能していないようで、デリゲート関数は呼び出されません。

次に、一般的ではない方法を選択することにし、すべての InterfaceController 内のシングルトン インスタンスへの参照を追加し始めましたが、やはり機能せず、デリゲート メソッドが呼び出されません。次に、前回の試みで、セッション デリゲート プロトコルを InterfaceController コード内に直接実装しました。その場合、iOS アプリからメッセージを受け取ります...正しく動作していました (明らかに、時計アプリがその特定の InterfaceController を提示している場合のみ)。

私の質問は、なぜ一般的なシングルトン オブジェクトの実装が機能しないのですか? デリゲートを動作させるために InterfaceController に直接実装する必要があるのはなぜですか?

4

1 に答える 1

1

startSession呼び出しを からExtensionControllerそのapplicationDidFinishLaunchingメソッドにinit移動してみてください。はinit、拡張機能がロードされているコンテキスト (コンプリケーション、アプリ、グランス、通知など) に関係なく呼び出されます。

于 2015-11-08T08:13:23.760 に答える