前提・実現したいこと
iPhoneの Realmデータを Apple Watchに送るプログラムを考えています.
各デバイスにアプリをインストールすることは出来ましたが、データの送受信が上手く行きません.
何が不足しているのでしょうか?
ご回答よろしくお願いします.
発生している問題・エラーメッセージ
watchOSのプログラムを実行した時に以下のエラーメッセージが出ます.
Terminating app due to uncaught exception 'RLMException', reason: 'Realm accessed from incorrect thread.'
追記 11/26
watchOS プログラムの
let realm = try! Realm()
をrealmデータを取得する関数の中に持って行ったところ、上記のエラーは解消されましたが、代わりに以下のエラーが発生します.
Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=2 "Unable to open a realm at path '/var/mobile/Containers/Data/PluginKitPlugin/E7F03F8B-86D4-42AF-AC8A-A1F2B2E27780/Documents/Inbox/com.apple.watchconnectivity/AFBC4FDB-28C3-4D55-A833-1E5F59DA0C4B/Files/F39F9FCD-AA0E-48B8-897D-E67AF8D2D043/default.realm.management': make_dir() failed: Operation not permitted Path:Exception backtrace:
該当のソースコード
iOSのプログラム
swift
1import UIKit 2import RealmSwift 3import WatchConnectivity 4 5class ViewController: UIViewController, WCSessionDelegate { 6 let realm = try! Realm() 7 let get = cData() 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view. 12 13 get.name = "abc" 14 get.memo = "def" 15 16 try! realm.write { 17 realm.add(get) 18 } 19 20 print("for iPhone") 21 print(get.name) 22 print(get.memo) 23 24 //データの追加 25 try! realm.write { 26 get.name = get.name + "ghi" 27 } 28 29 30 if WCSession.isSupported() { 31 let session = WCSession.default 32 session.delegate = self 33 session.activate() 34 } 35 36 } 37 38 //ボタン押したらデータ送信 39 @IBAction func sending(_ sender: UIButton) { 40 //realmデータを送る 41 if let path = Realm.Configuration().fileURL { 42 WCSession.default.transferFile(path, metadata: nil) 43 print("send data to Apple Watch") 44 } 45 } 46 47 48 @available(iOS 13.1, *) 49 func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { 50 print("activation did complete!\n") 51 } 52 53 func sessionDidBecomeInactive(_ session: WCSession) { 54 print("session did become inactive") 55 } 56 57 func sessionDidDeactivate(_ session: WCSession) { 58 print("session did deactivate") 59 } 60 61}
watchOSのプログラム
swift
1import WatchKit 2import Foundation 3import RealmSwift 4import WatchConnectivity 5 6class InterfaceController: WKInterfaceController, WCSessionDelegate { 7 override func awake(withContext context: Any?) { 8 super.awake(withContext: context) 9 10 // Configure interface objects here. 11 if WCSession.isSupported() { 12 let session = WCSession.default 13 session.delegate = self 14 session.activate() 15 } 16 } 17 18 19 @available(watchOS 6.0, *) 20 func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { 21 print("watch activation did completed") 22 } 23 24 //realmデータを取得する関数 25 func session(_ session: WCSession, didReceive file: WCSessionFile) { 26 var config = Realm.Configuration() 27 config.fileURL = file.fileURL 28 Realm.Configuration.defaultConfiguration = config 29 30 let realm = try! Realm() 31 let text = realm.objects(cData.self) 32 print("memo: (text[0].memo)") 33 print("name: (text[0].name)") 34 } 35 36 37 override func willActivate() { 38 // This method is called when watch view controller is about to be visible to user 39 super.willActivate() 40 41 } 42 43 override func didDeactivate() { 44 // This method is called when watch view controller is no longer visible 45 super.didDeactivate() 46 } 47 48}
試したこと
同様の事例がないか調べましたが、似た事例はあるものの今回のエラーの解決につながるようなものが未だ見つかりません.
補足情報(FW/ツールのバージョンなど)
バージョン
Xcode 11.1, Swift5.0.1
iPhoneX, Apple Watch Series4
・let realm = try! Realm()
をrealmデータを取得する関数内に書くようにしたところ、iOSのプログラムを実行すればボタンを押した時にコンソールに "send data to Apple Watch" は出力されるようになりました.
・watchOSのプログラムを実行した時は、"watch activation did completed" がコンソールに出力された後、エラーメッセージが表示されます.
・WatchConnectivityの使い方を知るために、Apple公式サイトを参考にしましたが、このサイトの Get Started の手順5.6がいまいちよく分からなかったため、正しい手順を踏めていないことが今回のエラーにつながっているのかもしれません.
手順5については、プロジェクトにSettings-Watch.bundleを追加し、Root.plistのApplicationGroupContainerIdentifierをApp groupsで作成したグループ名にしました.
手順6については、TestDataProvider classがどこにあるのか分からなかったため、何もしませんでした.
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/26 05:23
2019/11/26 05:29
2019/11/26 06:08
2019/11/26 07:31
2019/11/26 08:51
2019/11/26 09:27
2019/11/26 09:43