2016-09-15 22 views
26

私のプロジェクトでは、Watch Connectivityを使ってWatchとiPhoneとの間でメッセージをやり取りしています。私は、携帯電話にメッセージを送信し、アプリケーションを起動するときに文字列の配列を受け取ることができますが、私は次のエラーが表示されます。"メッセージ返信に時間がかかりすぎました。" - Watch OS 3の接続に関する問題を見る

エラードメイン= WCErrorDomainコード= 7012「メッセージ返信が長すぎます。」

ここでは設定方法を説明します。

最初に時計は電話にメッセージを送信し、電話機はWKInterfaceTableに表示する文字列の配列を送信します。これは、アプリを読み込むときに機能することがあります。 (私はItemsと呼ばれる、すべてのNSManagedObjectsをフェッチし、watchItemsと呼ばれるarrayに格納するために彼らのtitle文字列プロパティを使用します。

私は、アレイ内のすべての項目を削除し、新しいデータでテーブルを更新するには、時計への作用を持っているが。

sendMessage機能を使用してitemを電話機に送信して配列から削除すると、電話機は新しい更新された配列を時計に送信し、時計はテーブルを更新しますが、どちらも同じ配列を取得します間違いを発見された場合は、引き続きメールアドレスを入力してください。

Swift 3とWatch OS3/iOS 10の前に実際にうまくいきました。アプリ全体が動いていました

すべての設定は次のとおりです。

電話アプリの委任

import WatchConnectivity 

class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate { 

var session : WCSession! 

var items = [Items]() 

func loadData() { 
    let moc = (UIApplication.shared.delegate as! AppDelegate).managedObjectContext 
    let request = NSFetchRequest<Items>(entityName: "Items") 

    request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)] 
    request.predicate = NSPredicate(format: "remove == 0", "remove") 

    do { 
     try 
      self.items = moc!.fetch(request) 
     // success ... 
    } catch { 
     // failure 
     print("Fetch failed") 
    } 
} 

//WATCH EXTENSION FUNCTIONS 
//IOS 9.3 
/** Called when the session has completed activation. If session state is WCSessionActivationStateNotActivated there will be an error with more details. */ 


//HAVE TO INCLUDE 
@available(iOS 9.3, *) 
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?){ 
    print("iPhone WCSession activation did complete") 
} 


@available(iOS 9.3, *) 
func sessionDidDeactivate(_ session: WCSession) {} 

func sessionWatchStateDidChange(_ session: WCSession) {} 

func sessionDidBecomeInactive(_ session: WCSession) { 

} 

//APP DELEGATE FUNCTIONS 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { 

    //Check if session is supported and Activate 
    if (WCSession.isSupported()) { 
     session = WCSession.default() 
     session.delegate = self; 
     session.activate() 
    } 
    return true 
} 


} 

//DID RECIEVE MESSAGE 
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void) { 


    loadData() 

    func loadItems() { 
     watchItems.removeAll() 

     for a in self.items { 
      watchItems.append(a.title) 
     } 
    } 

    var watchItems = ["1","2","3","4","5"] 

    let value = message["Value"] as? String 

    //This is called when user loads app, and takes some time when using refresh action, sometimes times out 

    if value == "HELLOiPhone/[email protected]=" { 

     print("Hello Message Recieved") 

     loadItems() 

     //send a reply 
     replyHandler([ "Items" : Items ]) 

    } 

    //Not sure if receiving but does not delete array and send back to watch 
    if value == "[email protected]+=-/" {       
     for index in self.items { 
      index.remove = 1 
      //Saves MOC 
     } 

     loadData() 
     loadTasksData() 

     //send a reply 
     replyHandler([ "Items" : Items ]) 

    } 
    else { 
     for index in self.items { 
      if index.title == value { 
      index.remove = 1 
      //Saves MOC 
      } 
     } 

     loadData() 
     loadTasksData() 

     //send a reply 
     replyHandler([ "Items" : Items ]) 
    } 
} 

WATCH

import WatchConnectivity 

class SimplelistInterfaceController: WKInterfaceController, WCSessionDelegate { 


/** Called when the session has completed activation. If session state is WCSessionActivationStateNotActivated there will be an error with more details. */ 
@available(watchOS 2.2, *) 
public func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { 

    //Fetch data is a function which sends a "HELLOiPhone/[email protected]=" message to receive the array and displays in the table. This works 
    fetchData() 
} 


var session : WCSession! 
var items = ["Refresh Items"] 

override func didAppear() { 
    fetchData() 
} 

override func willActivate() { 
    // This method is called when watch view controller is about to be visible to user 
    super.willActivate() 
    //Check if session is supported and Activate 
    if (WCSession.isSupported()) { 
     session = WCSession.default() 
     session.delegate = self 
     session.activate() 
    } 
    fetchData() 
} 

override func awake(withContext context: Any?) { 
    super.awake(withContext: context) 
    fetchData() 
} 

@IBAction func refresh() { 
    print("Refresh") 
    //Works but sometimes message is delayed 
    fetchData() 
} 

@IBAction func removeAll() { 
    print("Remove All Items is called") 
    if WCSession.default().isReachable { 
     let messageToSend = ["Value":"[email protected]+=-/"] 
     print("\(messageToSend)") 
     session.sendMessage(messageToSend, replyHandler: { replyMessage in 
      if let value = replyMessage["Items"] { 
       self.items = value as! [String] 

       Not receiving message 
       print("Did Recieve Message, items = \(self.items)") 
      } 

      }, errorHandler: {error in 
       // catch any errors here 
       print(error) 
     }) 
    } 
    fetchData() 
} 

} 
+0

'WCSession' APIは、プロパティリストタイプの辞書しか取りませんが、あなたは' Items'を送信しています。これらのオブジェクトは何ですか?WCSession APIによってサポートされていますか? – ccjensen

+0

@ccjensen Itemsは実際には 'NSManagedObject'ですが、私はそれらをフェッチし、時計に送る前に配列を作成する文字列値のタイトルプロパティを使用します。ただし、時計の各フェッチについて、電話機はデータを更新して再フェッチすることになっています。これは起こっていないし、しばしばエラーを取得します。 – JUSDEV

+0

また、データを表示するときに時計は実際にうまくいきますが、オブジェクトを削除しようとすると応答しません。 – JUSDEV

答えて

0

私はちょうど私のWatchOSアプリを扱っています。そして、「メッセージ返信が長すぎた」と受け取った状況がありました。

次にiOSアプリケーションにバックグラウンドタスクハンドラを追加し、毎秒WatchOSアプリケーションにメッセージを送信し始めました。メッセージにはUIApplication.shared.backgroundTimeRemainingが含まれています。だから私は得る:45秒、44秒、...、6秒、5秒、...タイマが5秒未満で実行されない場合、メッセージはiOSアプリケーションとの間で配信されません。最も簡単な解決策は、タイマーが15秒以下になるたびに時計から電話に空白のメッセージを送信することでした。 backgroundTimeRemainingは再び45秒に更新されます:45、44、43、...、17、16、15、(空白のメッセージ)、45、44、43、...

は、それが誰か

を役に立てば幸い
関連する問題