現在、iOSアプリケーションからwatchOS拡張機能にCoreDataデータを取得しようとしています。私はWatchConnectivity Frameworkを使用して、sendMessage(_ message: [String : Any], replyHandler: (([String : Any]) -> Void)?, errorHandler: ((Error) -> Void)? = nil)
関数で辞書を取得しています。基本的な接続は正常に動作しています。 iOSアプリにアクセス可能で、サンプル辞書に返信しようとするとすべてが機能しています。WatchConnectivityを使用したCore Data Fetchリクエスト
これまでのところとても良いですが、バックグラウンドでiOSアプリでフェッチリクエストを開始すると、ウォッチアプリはデータを受け取ることはありません。しばらくすると、私はちょうどこのエラーを受け取ります:Error while requesting data from iPhone: Error Domain=WCErrorDomain Code=7012 "Message reply took too long." UserInfo={NSLocalizedFailureReason=Reply timeout occurred., NSLocalizedDescription=Message reply took too long.}
私はiPhone上でiOSアプリケーションを開き、時計アプリケーションを再起動すると、応答ハンドラは結果を取得しています。しかし、ユーザーがiPhone上でiOSアプリを積極的に開くように強制することは役に立たない。
これはなぜ起こるのか誰かが説明できますか?それを行う正しい方法は何ですか? iPhoneで
import WatchConnectivity
class HomeInterfaceController: WKInterfaceController, WCSessionDelegate {
// (…)
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
session.sendMessage(["request": "persons"],
replyHandler: { (response) in
print("response: \(response)")
},
errorHandler: { (error) in
print("Error while requesting data from iPhone: \(error)")
})
}
:悲しいこと
import CoreData
import WatchConnectivity
class ConnectivityHandler: NSObject, WCSessionDelegate {
var personsArray:[Person] = []
// (…)
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
// only using the next line is working!
// replyHandler(["data": "test"])
if message["request"] as? String == "persons" {
fetchAllPersons()
var allPersons: [String] = []
for person in personsArray {
allPersons.append(person.name!)
}
replyHandler(["names": allPersons])
}
}
// this seems to be never executed (doesn't matter if it's in an extra function or right in the didReceiveMessage func)
func fetchAllPersons() {
do {
// Create fetch request.
let fetchRequest: NSFetchRequest<Person> = Person.fetchRequest()
// Edit the sort key as appropriate.
let sortDescriptor = NSSortDescriptor(key: #keyPath(Person.name), ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
personsArray = try DatabaseController.getContext().fetch(fetchRequest)
} catch {
fatalError("Failed to fetch: \(error)")
}
}
私が間違って読んでいない限り、時計から電話にメッセージを送信しようとしているようです(あなたはiPhoneコードでdidReceiveMessageを使用しています)。 –
@JohnPollard私は基本的に、CoreDataを時計に取り込もうとしています。これを行うために、私は電話にメッセージを送ります。それは、辞書の中のデータで_reply_するべきです。 – alexkaessner