RealmSwift官方示例代码运行报错:本地库尝试连接远程服务器
解决本地Realm数据库触发远程连接请求的错误问题
你按照官方快速入门流程,用Storyboard创建iOS示例App,通过Cocoapods集成RealmSwift,替换ViewController代码为如下内容:
import UIKit import RealmSwift class Todo: Object { @Persisted(primaryKey: true) var _id: ObjectId @Persisted var name: String = "" @Persisted var status: String = "" @Persisted var ownerId: String convenience init(name: String, ownerId: String) { self.init() self.name = name self.ownerId = ownerId } } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let realm = try! Realm() let todo = Todo(name: "Do laundry", ownerId: "user.id") try! realm.write { realm.add(todo) } } }
运行后控制台出现如下错误日志:
2023-03-13 11:09:14.269102+0300 TestRealm[56847:824997] Task <E9B2CB4F-27E1-44B6-8F20-9422342C1FDB>.<2> HTTP load failed, 1708/0 bytes (error code: -1017 [4:-1]) 2023-03-13 11:09:14.272633+0300 TestRealm[56847:824997] Task <E9B2CB4F-27E1-44B6-8F20-9422342C1FDB>.<2> finished with error [-1017] Error Domain=NSURLErrorDomain Code=-1017 "cannot parse response" UserInfo={_kCFStreamErrorCodeKey=-1, NSUnderlyingError=0x600001979560 {Error Domain=kCFErrorDomainCFNetwork Code=-1017 "(null)" UserInfo={_kCFStreamErrorCodeKey=-1, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <E9B2CB4F-27E1-44B6-8F20-9422342C1FDB>.<2>, _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask <E9B2CB4F-27E1-44B6-8F20-9422342C1FDB>.<2>" ), NSLocalizedDescription=cannot parse response, NSErrorFailingURLStringKey=https://data.mongodb-api.com/app/realmsdkmetrics-zmhtm/endpoint/metric_webhook/metric?data=eyJldmVudCI6IlJ1biIsInByb3BlcnRpZXMiOnsiZGlzdGluY3RfaWQiOiIwZDUxNDUzNDEyYzIxNjdhMGQwZjhiNzJlNzMwNmU0OWZiNTMyODg2OTA2MzE5NzViM2ExZjA4MzAwYWVkZWNlIiwiVGFyZ2V0IE9TIFZlcnNpb24iOiJWZXJzaW9uIDE2LjIgKEJ1aWxkIDIwQzUyKSIsIkNsYW5nIFZlcnNpb24iOiIxNC4wLjAgKGNsYW5nLTE0MDAuMC4yOS4yMDIpIiwiSG9zdCBPUyBWZXJzaW9uIjoiMjEuNi4wIiwiTGFuZ3VhZ2UiOiJzd2lmdCIsInRva2VuIjoiY2UwZmFjMTk1MDhmNmM4ZjIwMDY2ZDM0NWQzNjBmZDAiLCJBbm9ueW1pemVkIEJ1bmRsZSBJRCI6IjFiODhjMDMxYWNiYzQ2MzFkOGJjZTI1NjhiODhhMjBjZTA3N2U2NmQzYjFkNzU5N2JlMTA3OWFiYTUyMWUyMGYiLCJUYXJnZXQgT1MgVHlwZSI6ImlvcyIsIkJpbmRpbmciOiJjb2NvYSIsIlJlYWxtIFZlcnNpb24iOiIxMC4zNy4wIiwiQ2xhbmcgTWFqb3IgVmVyc2lvbiI6MTQsIkluc3RhbGxhdGlvbiBNZXRob2QiOiJDb2NvYVBvZHMiLCJUYXJnZXQgT1MgTWluaW11bSBWZXJzaW9uIjoiMTYuMiIsIkFub255bWl6ZWQgTUFDIEFkZHJlc3MiOiIwZDUxNDUzNDEyYzIxNjdhMGQwZjhiNzJlNzMwNmU0OWZiNTMyODg2OTA2MzE5NzViM2ExZjA4MzAwYWVkZWNlIiwiSG9zdCBPUyBUeXBlIjoib3N4In19, NSErrorFailingURLKey=https://data.mongodb-api.com/app/realmsdkmetrics-zmhtm/endpoint/metric_webhook/metric?data=eyJldmVudCI6IlJ1biIsInByb3BlcnRpZXMiOnsiZGlzdGluY3RfaWQiOiIwZDUxNDUzNDEyYzIxNjdhMGQwZjhiNzJlNzMwNmU0OWZiNTMyODg2OTA2MzE5NzViM2ExZjA4MzAwYWVkZWNlIiwiVGFyZ2V0IE9TIFZlcnNpb24iOiJWZXJzaW9uIDE2LjIgKEJ1aWxkIDIwQzUyKSIsIkNsYW5nIFZlcnNpb24iOiIxNC4wLjAgKGNsYW5nLTE0MDAuMC4yOS4yMDIpIiwiSG9zdCBPUyBWZXJzaW9uIjoiMjEuNi4wIiwiTGFuZ3VhZ2UiOiJzd2lmdCIsInRva2VuIjoiY2UwZmFjMTk1MDhmNmM4ZjIwMDY2ZDM0NWQzNjBmZDAiLCJBbm9ueW1pemVkIEJ1bmRsZSBJRCI6IjFiODhjMDMxYWNiYzQ2MzFkOGJjZTI1NjhiODhhMjBjZTA3N2U2NmQzYjFkNzU5N2JlMTA3OWFiYTUyMWUyMGYiLCJUYXJnZXQgT1MgVHlwZSI6ImlvcyIsIkJpbmRpbmciOiJjb2NvYSIsIlJlYWxtIFZlcnNpb24iOiIxMC4zNy4wIiwiQ2xhbmcgTWFqb3IgVmVyc2lvbiI6MTQsIkluc3RhbGxhdGlvbiBNZXRob2QiOiJDb2NvYVBvZHMiLCJUYXJnZXQgT1MgTWluaW11bSBWZXJzaW9uIjoiMTYuMiIsIkFub255bWl6ZWQgTUFDIEFkZHJlc3MiOiIwZDUxNDUzNDEyYzIxNjdhMGQwZjhiNzJlNzMwNmU0OWZiNTMyODg2OTA2MzE5NzViM2ExZjA4MzAwYWVkZWNlIiwiSG9zdCBPUyBUeXBlIjoib3N4In19, _kCFStreamErrorDomainKey=4}
问题原因
这个错误并非本地Realm功能异常导致,而是Realm SDK默认会发送匿名使用统计数据到MongoDB的远程服务器,即使你仅使用本地数据库。当网络环境或服务器响应异常时,就会触发这个解析错误。
解决方案
有两种方式可以禁用这个统计上报行为:
1. 通过Realm配置禁用
在App启动阶段(比如AppDelegate或SceneDelegate,SwiftUI则在App结构体的初始化方法中),修改Realm的默认配置,禁用分析统计:
UIKit项目(AppDelegate示例):
import UIKit import RealmSwift @main class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 禁用Realm匿名统计上报 let config = Realm.Configuration( analyticsConfiguration: .disabled ) Realm.Configuration.defaultConfiguration = config return true } // 其他生命周期方法... }
SwiftUI项目示例:
import SwiftUI import RealmSwift @main struct TestRealmApp: App { init() { let config = Realm.Configuration( analyticsConfiguration: .disabled ) Realm.Configuration.defaultConfiguration = config } var body: some Scene { WindowGroup { ContentView() } } }
2. 通过编译标记全局禁用
在Xcode中打开项目的Build Settings,找到Other Swift Flags,添加编译标记:
-D REALM_DISABLE_ANALYTICS
这个标记会全局禁用Realm的统计功能,无需修改代码配置。
两种方式任选其一,都能阻止Realm发起远程统计请求,从而解决该错误。
内容的提问来源于stack exchange,提问作者Gargo
相关产品推荐
相关产品推荐

