自分だけのクイズ作成 - Quipha公開中

【Realm】デバッグ時の分析情報送信をオフ・通信エラーを解決

Swift
スポンサーリンク

はじめに

今回は、SwiftでRealmを使用した際に発生するエラーについて、対応策をまとめました。

使用するバージョン
  • macOS Monterey (M1)
  • Xcode 13
  • Swift 5
  • SwiftUI
スポンサーリンク

【紹介】個人開発

Mac向けの、定型文の挿入も可能なクリップボード履歴管理アプリです。
Windows版は以前からありましたが、基本的な使い方はMac版も同じですので、もしよかったらダウンロードしてみてください。

  • Xcode
  • Swift 5
  • SwiftUI
  • Realm Database
  • Appleによる公証済み

準備

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がデバッグ時に、匿名の分析情報を送信しているためです。

ソースコードは以下です。

realm-swift/RLMAnalytics.mm at master · realm/realm-swift
Realm is a mobile database: a replacement for Core Data & SQLite - realm-swift/RLMAnalytics.mm at master · realm/realm-swift

ソースのコメントにも、デバッグ時のみでそれ以外は送信しない旨は記載されていました。

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を使用した際に発生するエラーについて、対応策を解説しました。

\オススメ/

コメント

タイトルとURLをコピーしました