私のプロジェクトでは、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()
}
}
'WCSession' APIは、プロパティリストタイプの辞書しか取りませんが、あなたは' Items'を送信しています。これらのオブジェクトは何ですか?WCSession APIによってサポートされていますか? – ccjensen
@ccjensen Itemsは実際には 'NSManagedObject'ですが、私はそれらをフェッチし、時計に送る前に配列を作成する文字列値のタイトルプロパティを使用します。ただし、時計の各フェッチについて、電話機はデータを更新して再フェッチすることになっています。これは起こっていないし、しばしばエラーを取得します。 – JUSDEV
また、データを表示するときに時計は実際にうまくいきますが、オブジェクトを削除しようとすると応答しません。 – JUSDEV