3

ウォッチキット拡張機能からメッセージを送信して、iOS 親アプリを起動しようとしています。

これは、以下の sendMessage 関数が watchApp / ViewController から呼び出された場合にのみ機能します。ComplicationController から呼び出されるとメッセージが送信されますが、iOS の親アプリが起動するようになりました。

アドバイスをいただければ幸いです。(Swiftのコード参照をお願いします)

ここに簡略化されたコード:

AppDelegate と ExtensionDelegate では:

override init() {
    super.init()
    setupWatchConnectivity()
}

private func setupWatchConnectivity() {
    if WCSession.isSupported() {
        let session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }
}

ExtensionDelegate の場合: (ここでは問題ありません。メッセージは正常に送信されます)

func sendMessage(){
        let session = WCSession.defaultSession()
        let applicationData:[String:AnyObject] = ["text":"test", "badgeValue": 100 ]

        session.sendMessage(applicationData, replyHandler: {replyMessage in
            print("reply received from iphone")
            }, errorHandler: {(error ) -> Void in
                // catch any errors here
                print("no reply message from phone")
        })
    }
    print("watch sent message")

}

AppDelegate の場合: (iOS アプリが実行されていない/フォアグラウンドでない場合は受信されません)

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
    let text = message["text"] as! String
    let badgeValue = message["badgeValue"] as! Int

    dispatch_async(dispatch_get_main_queue()) { () -> Void in

        print("iphone received message from watch App")
        self.sendNotification(text, badgeValue: badgeValue)
        let applicationDict = ["wake": "nowAwake"]
        replyHandler(applicationDict as [String : String])

    }

}

これは、Complication Controller から関数が呼び出される方法です (メッセージは送信されますが、親アプリは起動されません)。

  func requestedUpdateDidBegin(){

        dispatch_async(dispatch_get_main_queue()) { () -> Void in

            let extensionDelegate = ExtensionDelegate()
            extensionDelegate.loadData()

        }
    }
4

1 に答える 1

1

主な問題は、複雑なデータ ソース内に (ネストされた) 非同期呼び出しを含めようとしていることです。ただし、要求された更新はそのメソッドの最後に到達し、タイムラインの更新は実際には行われません (タイムラインをリロードまたは延長しなかったため、たとえあったとしても、時間内に新しいデータを受信して​​いないため)現在の更新)。

スケジュールされた更新に使用できる新しいデータがないため、受信した新しいデータを使用するには、2回の更新を実行する必要があります。2 回連続して更新を行うのは不必要であるだけでなく、毎日の合併症の予算を無駄にします。

Appleは、アップデートのにデータを取得してキャッシュすることをお勧めします。これにより、コンプリケーション データ ソースは要求されたデータをコンプリケーション サーバーに直接返すことができます。

データ ソース クラスの役割は、要求されたデータを可能な限り迅速に ClockKit に提供することです。データ ソース メソッドの実装は最小限にする必要があります。データ ソース メソッドを使用して、ネットワークからデータを取得したり、値を計算したり、そのデータの配信を遅らせる可能性のあることを行ったりしないでください。コンプリケーションのデータを取得または計算する必要がある場合は、iOS アプリまたは WatchKit 拡張機能の他の部分で行い、コンプリケーション データ ソースがアクセスできる場所にデータをキャッシュします。データ ソース メソッドが行う必要がある唯一のことは、キャッシュされたデータを取得して、ClockKit が必要とする形式に変換することです。

コンプリケーションをどのように更新できますか?

  • 携帯電話からのバックグラウンド アップデートを使用してデータを転送し、コンプリケーションの次のスケジュールされたアップデートに備えることができます。 transferUserInfoこのタイプの更新にupdateApplicationContext適しています。

  • transferCurrentComplicationUserInfoコンプリケーション データをすぐに転送し、タイムラインを更新するために使用します。

どちらのアプローチにも、1 回の更新で済むという利点があります。

于 2016-05-01T01:00:19.327 に答える