はじめに
今回は、SwiftでRealmを使用した際に発生するエラーについて、対応策をまとめました。
【紹介】個人開発
Mac向けの、定型文の挿入も可能なクリップボード履歴管理アプリです。
Windows版は以前からありましたが、基本的な使い方はMac版も同じですので、もしよかったらダウンロードしてみてください。
準備
CocoaPodsを利用してRealmを導入しますので、以下の記事を参考にしてください。
今回、Mac上で動く簡単なサンプルアプリを作成します。
SwiftUIで実装しますので、以下を参考にプロジェクトを作成してください。
Realmの導入は以下の記事をご覧ください。
本記事は、以下の記事の続きになります。
事象確認
Xcodeでサンプルアプリを実行してみます。
確定ボタンをクリックしRealmにデータを登録する際、以下のようなエラーメッセージが表示されます。
networkd_settings_read_from_file Sandbox is preventing this process from reading networkd settings file at “/Library/Preferences/com.apple.networkd.plist”, please add an exception.
nw_resolver_can_use_dns_xpc_block_invoke Sandbox does not allow access to com.apple.dnssd.service
dnssd_clientstub ConnectToServer: connect() failed path:/var/run/mDNSResponder Socket:9 Err:-1 Errno:1 Operation not permitted
[connection] nw_resolver_create_dns_service_locked [C1] DNSServiceCreateDelegateConnection failed: ServiceNotRunning(-65563)
…
finished with error [-1003] Error Domain=NSURLErrorDomain Code=-1003 “A server with the specified hostname could not be found.”
…
原因
Realmがデバッグ時に、匿名の分析情報を送信しているためです。
ソースコードは以下です。
ソースのコメントにも、デバッグ時のみでそれ以外は送信しない旨は記載されていました。
To be clear: this does not run when your app is in production or on your end-user’s devices;
it will only run in the simulator or when a debugger is attached.
解析処理の送信は以下のようです。
void RLMSendAnalytics() {
if (getenv("REALM_DISABLE_ANALYTICS") || !RLMIsDebuggerAttached() || RLMIsRunningInPlayground()) {
return;
}
NSArray *urlStrings = @[@"https://data.mongodb-api.com/app/realmsdkmetrics-zmhtm/endpoint/metric_webhook/metric?data=%@"];
NSData *payload = [NSJSONSerialization dataWithJSONObject:RLMAnalyticsPayload() options:0 error:nil];
for (NSString *urlString in urlStrings) {
NSString *formatted = [NSString stringWithFormat:urlString, [payload base64EncodedStringWithOptions:0]];
// No error handling or anything because logging errors annoyed people for no
// real benefit, and it's not clear what else we could do
[[NSURLSession.sharedSession dataTaskWithURL:[NSURL URLWithString:formatted]] resume];
}
}
また、Macアプリを作成する際、デフォルトでサンドボックスに対応したアプリになっているため、外部への通信が制限されている状態です。
この二つの理由により、エラーが発生します。
対応
デバッグ時の匿名情報送信であり、そもそも通信できていない状態のエラーですので、実害は無いので無視しても構いませんが、送信しないように(エラーが発生しないように)対応します。
Xcodeのメニューバーの、Product -> Scheme -> Edit Schemeを開きます。
「Run Debug」を開きます。
「Environment Variables」のプラスボタンをクリックします。
Nameに「REALM_DISABLE_ANALYTICS」、Valueに「1」を入力します。
以上で対応は完了です。
再度アプリを実行して、エラーが発生しなくなることを確認してください。
さいごに
SwiftでRealmを使用した際に発生するエラーについて、対応策を解説しました。
他にも私のブログで、Swiftについて解説している記事がありますのでご覧ください。
コメント