Couchbase Lite iOS Replication在重新启动后停止复制

时间:2016-08-23 00:56:05

标签: session replication session-cookies couchbase couchbase-sync-gateway

我对Couchbase和iOS仍然有点新鲜,但是我遇到了一个问题,重新启动了我遇到问题的复制。以下是关于流程的一些注意事项。

后端正在使用自定义身份验证。

当用户登录时,会在同步网关中创建一个新会话,并将这些会话详细信息返回给iOS设备。然后,应用程序使用这些凭据来设置推送和拉取复制(我在尝试调试时暂时删除了推送复制)。复制的选项并不多,如下:

let pull = self.database.createPullReplication(self.remoteDBURL);
pull.continuous = true;
pull.headers["uuid"] = "device-1";
pull.setCookieNamed(sessionName, withValue: sessionId, path: "/", expirationDate: cookieExpirationDate, secure: false);
pull.start();
self._pull = pull;
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(DataService.replicationChanged(_:)), name: kCBLReplicationChangeNotification, object: self._pull);

这很有效,并且所有正确的文档都会同步到设备。目前我有后端创建的cookie只持续约5分钟,所以我可以测试刷新的cookie。因此,在最初的几分钟内,我添加到应用获得的频道的任何文档,应用程序都会收到文档,一切都很好。

在令牌生命的大约一半时,后端设置为返回401错误,告诉应用程序使用它的令牌获取新令牌。所以,我在复制更改侦听器中有这个:

@objc public func replicationChanged(n: NSNotification) {
        let replication = n.object as! CBLReplication;

        let error = replication.lastError;
        if (error != nil) {
            print("last error is NOT nil");
            print("last error = \(error)");

            switch error!.code {
            case 401:
                self.updateReplicationSession();
            default:
                break;
            }
      }
}

然后,updateReplication函数如下所示:

... make http call to getNewToken url using the 'old' or 'soon to be expired' token.  *The server is successfully returning this new session.

self._pull.setCookieNamed(newSessionName, withValue: newSessionId, path: "/", expirationDate: newExpirationDate, secure: false);

self._pull.restart();
...

此时同步停止工作。除了收到CFNetwork Internal错误之外,我没有看到任何错误。我可以在服务器日志上看到复制在新会话中发送一次......然后一切似乎都挂起了复制。任何新的文档到它获得的频道,它没有得到它们。我没有在Sync Gateway日志中看到任何指示问题的原因。但是,我对此仍然很陌生......所以可能会有一些东西。另外,我设置了一个每隔几秒运行一次的函数并打印复制的状态,并且它被卡在ACTIVE上。

我使用的是同步网关v 1.3和CBL ios 1.3。我使用的是1.2.1版本并且遇到了这个问题...希望升级到1.3会神奇地修复它。它没有,但我不确定我是否应该回到1.2.1。

我完全不知道这件事。我经常搜索高低,往往似乎找到了符合条件的答案......但它仍然无法运作。

我已经尝试延迟会话的更新,以便从复制到“失败”的所有呼叫都会失败。第一。我试过在复制时调用start(),认为401可能会杀死复制并且restart()不会做任何事情。我已经调用了stop()...然后等了一下并调用了start()。不知道下一步该怎么做。

任何帮助都是值得赞赏的人!手机上的本地数据库和同步网关是否有可能出现无法解决的转速问题?

编辑1 我目前能够让它工作的唯一方法是在复制更改函数中完全删除本地数据库并重新启动它...然后启动一个新的复制......这很有用......不幸的是,我必须播放一个通知,以便任何可能重新加载查询的表视图。这会导致桌面视图中的刷新动画并且不可持续......但至少我现在可以继续前进。

编辑2 我发现如何在iOS上更好地记录CBL,这是我在令牌刷新/复制重启后不断看到的错误:

CBLWebSocketChangeTracker[0x7ff9bb53b5e0 iphone]: Connection error #8, retrying in 256.0 sec: PSWebSocketError[3, "Output stream end encountered"]

思想?

编辑3 我改变了一些东西以摆脱令人耳目一新的令牌。我尝试这样做,当用户从iOS应用程序登录时,后端为该用户创建与同步网关的会话并返回它。然后,应用程序启动该会话的复制。然后,在5分钟(创建会话时使用的ttl)之后,下次应用尝试同步时,它将获得401并停止复制并显示登录屏幕。然后,当用户再次登录时,会创建一个新会话......

我发现了两件事:

-Anytime我将一个文档添加到与该应用程序同步的频道,当应用程序同步时,会话到期日期将增加大约20秒。这是正常的行为吗?如果我没有足够长时间添加任何文档,那么将用户注册到过期令牌的唯一方法就是。

- 重新启动的复制仍然卡住了。以下是同步网关和xcode的日志:

当会话过期时,这是同步网关的最后一部分......它会将404发送到应用程序。

2016-08-23T21:11:51.089-05:00 Changes+: Sending seq:163 from channel jmoore2
2016-08-23T21:11:51.089-05:00 Changes+: MultiChangesFeed sending &{Seq:163 ID:un:jmoore2_116 Deleted:false Removed:{} Doc:map[] Changes:[map[rev:1-e775ef6713dc39f6d52d35cefb396fe3]] Err:<nil> allRemoved:false branched:false}   (to jmoore2)
2016-08-23T21:11:51.089-05:00 Changes: MultiChangesFeed done   (to jmoore2)
2016-08-23T21:11:51.089-05:00 HTTP+: #212:     --> 200 OK  (0.0 ms)
2016-08-23T21:11:51.459-05:00 HTTP:  #216: GET /my_gateway/_session/3fa29222db286e8ec67a51e88b613ba4cd5cbf31  (ADMIN)
2016-08-23T21:11:51.459-05:00 HTTP: #216:     --> 404 missing  (0.2 ms)
2016-08-23T21:11:51.461-05:00 HTTP:  #217: GET /my_gateway/_session/3fa29222db286e8ec67a51e88b613ba4cd5cbf31  (ADMIN)
2016-08-23T21:11:51.461-05:00 HTTP: #217:     --> 404 missing  (0.2 ms)

然后,当用户重新登录时,这里有SG日志:

2016-08-23T21:15:41.200-05:00 HTTP:  #223: GET /my_gateway/_session/1a6105eaf2c91de320a47422041c655dd3d5c279  (ADMIN)
2016-08-23T21:15:41.201-05:00 HTTP+: #223:     --> 200   (0.5 ms)
2016-08-23T21:15:41.203-05:00 HTTP:  #224: GET /my_gateway/_local/78c229762074a95c864f7fecc03ce88f0ef6c499  (as jmoore2)
2016-08-23T21:15:41.203-05:00 HTTP+: #224:     --> 200   (0.5 ms)
2016-08-23T21:15:41.371-05:00 Cache: Received #164 after 455ms ("user-login-info:jmoore2" / "48-ea0b2d9771fa2be1d76838f9e4d55081")
2016-08-23T21:15:41.371-05:00 Cache:     #164 ==> channel "*"
2016-08-23T21:15:41.371-05:00 Changes+: Notifying that “mdatabase” changed (keys="{*}") count=31

重新启动复制时的xcode日志会立即显示:

21:15:41.195‖ Sync: CBLRestPuller[http://mycomp.local:8080/iphone/]: Reachability state = <mycomp.local>:reachable (30002), suspended=0
21:15:41.205‖ Sync: CBLRestPuller[http://mycomp.local:8080/iphone/]: Server is Couchbase Sync Gateway/1.3.0
21:15:41.205‖ Sync: CBLRestPuller[http://mycomp.local:8080/iphone/]: Replicating from lastSequence=162
21:15:41.205‖ Sync: CBLRestPuller[http://mycomp.local:8080/iphone/] starting ChangeTracker: mode=3, since=162
21:15:41.207‖ ChangeTracker: CBLWebSocketChangeTracker[0x7f97d8698190 iphone]: Starting...
21:15:41.207‖ Sync: CBLWebSocketChangeTracker[0x7f97d8698190 iphone]: GET //mycomp.local:8080/iphone/_changes?feed=websocket
21:15:41.208‖ ChangeTracker: CBLWebSocketChangeTracker[0x7f97d8698190 iphone]: Started... <http://mycomp.local:8080/iphone/_changes?feed=websocket>
21:15:41.211‖ CBLWebSocketChangeTracker[0x7f97d8698190 iphone]: Connection error #1, retrying in 2.0 sec: PSWebSocketError[3, "Output stream end encountered"]

有时也出现此错误:

2016-08-23 21:01:15.232 MyApp[52094:36001215] 52094: CFNetwork internal error (0xc01a:/BuildRoot/Library/Caches/com.apple.xbs/Sources/CFNetwork_Sim/CFNetwork-758.3.15/Loading/URLConnectionLoader.cpp:289)

0 个答案:

没有答案