1

私の目的は、次の手順でクロック キットの複雑さを更新することです。

  1. 合併症は、親 IOS アプリをウェイクアップするために、ExtensionDelegate を sendMessage から AppDelegate にトリガーします。

  2. iOS アプリがダウンロード / XML 解析データ

  3. AppDelegate は transferCurrentComplicationUserInfo を介して ExtensionDelegate にデータを転送します

  4. ExtensionDelegate は Complication Controller に渡されます

これはすべて、iOS アプリがフォアグラウンドで実行中またはアクティブな場合に機能します。アプリを起動していない場合は動作しません。

設定する必要がある設定はありますか? (バックグラウンド ダウンロード用に info.plist で既にセットアップされています) Swift でお願いします。

追加情報を追加しました:

上記のシナリオ (ExtensionDelegate を介した ComplicationControllor の定期的/スケジュールされた更新要求) では、WCSession sendMessage を介した IOS アプリの起動は機能しません。

Apple Watch でアプリを起動すると (InterfaceController が ViewDidLoad で ExtensionDelegate をトリガー)、親アプリを起動すると同じ問題が発生します。

どちらの場合も、メッセージは送信されていますが、フォアグラウンドでない場合、IOS アプリからの反応はありません。

上記の「自動化された」リクエスト シナリオで使用するものとまったく同じコードを使用して、ボタンも実装しました (テスト目的で手動でトリガーするため)。ウォッチでボタンを押すと、動作することがあります (ExtensionDelegate の同じ関数を介して ViewController が AppDelegate にメッセージを送信し、これが起動して応答します)。私はパターンを見つけることができません。

すべてのシナリオでメッセージが送信されているのとまったく同じ ExtenstionDelegate 関数を使用しているため、手動でトリガーされたときにのみ応答が受信され、親アプリのウェイクが成功する理由は理解できません。

ここでは、 ExtensionDelegateからのコード(ComplicationController、InterfaceController-ViewDidLoad、および上記のボタンによって呼び出されます。

func sendMessage(){
            let session = WCSession.defaultSession()
            let applicationData = ["wake":"wakeUp"]
            session.sendMessage(applicationData, replyHandler: {replyMessage in
                }, errorHandler: {(error ) -> Void in
                    print("no reply message from phone")
            })
        }

および AppDelegate:

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
    let receivedMessage = message["wake"] as! String
    if receivedMessage == "wakeUp" {
        let applicationDict = ["wake": "nowAwake"]
        replyHandler(applicationDict as [String : String])
    }
    self.loadData()
}

func loadData(){

    ... code to load data

    dispatch_async(dispatch_get_main_queue()) { () -> Void in
        let dictionaryComplication = [...]

        if WCSession.isSupported() {

            let session = WCSession.defaultSession()
            if session.watchAppInstalled {
                do {
                    session.transferCurrentComplicationUserInfo(dictionaryComplication)
                    try session.updateApplicationContext(dictionaryContext)


                } catch {
                    print("ERROR: \(error)")
                }
            }

        }
    }
}
4

1 に答える 1

0

initではなく、ExtensionDelegate のメソッドでWCSession を有効にしてくださいapplicationDidFinishLaunching

class ExtensionDelegate: NSObject, WKExtensionDelegate {

    override init() {
        super.init()
        if WCSession.isSupported() {
            let session = WCSession.defaultSession()
            session.delegate = self
            session.activateSession()
        }
    }
    ...
}

applicationDidFinishLaunchingユーザーが WatchApp を開始したときにのみ呼び出されますが、Complication が新しいデータを要求したときは呼び出されません。

于 2015-10-24T14:41:55.983 に答える