我们正在使用 Firestore 构建一个实时聊天应用程序。我们需要处理没有 Internet 连接的情况。基本的消息发送代码如下所示
let newMsgRef = database.document(“/users/\(userId)/messages/\(docId)“)
newMsgRef.setData(payload) { err in
if let error = err {
// handle error
} else {
// handle OK
}
}
Run Code Online (Sandbox Code Playgroud)
连接设备后,一切正常。当设备未连接时,不会调用回调,也不会得到错误状态。
当设备重新上线时,记录会出现在数据库中并触发回调,但是这种解决方案对我们来说是不可接受的,因为在此期间应用程序可能已经被终止,然后我们将永远无法获得回调并能够设置状态发送的消息。
我们认为禁用离线持久性(默认情况下处于启用状态)会使其立即触发失败回调,但出乎意料的是 - 事实并非如此。
我们还尝试添加超时,在此之后发送操作将被视为失败,但是当设备重新联机时无法取消消息传递,因为 Firestore 使用其队列,这会导致更多混乱,因为消息是在接收者的方面,而我无法在发件人方面处理。
如果我们可以减少超时 - 这可能是一个很好的解决方案 - 我们将很快获得成功/失败状态,但 Firebase 不提供这样的设置。
内置离线缓存可能是另一种选择,我可以将所有写入视为成功并依赖 Firestore 同步机制,但如果应用程序在离线期间终止,则不会传递消息。
最终,我们需要一个一致的反馈机制来触发回调,或者提供一种方法来监视队列中的消息等 - 这样我们就可以确定消息已发送或尚未发送,以及何时发生。
我正在尝试创建一个 VPN 应用程序,当在“设置”应用程序中手动关闭 VPN 时,该应用程序会通知用户。更一般地说,我希望能够在网络设置更改时做出反应。我在 StackOverflow 上看到了很多关于可达性、网络等的评论,但我不知道是否可以在后台检查这些东西。有没有办法通过使用“获取”或“远程通知”来做到这一点。我的手机上有一个应用程序,如果我关闭 VPN,它会向我发出通知,所以我知道有办法做到这一点,但我不知道如何做。
我是swift和xcode的新手,因为IPV6我的应用被拒绝了:
表现 - 2.1
当我们执行以下操作时,您的应用程序在iPad和运行iOS 9.3.5的iPhone上崩溃连接到IPv6网络:
具体来说,当我们触摸应用程序右下角的"更多"按钮时,它会崩溃.
我花了很多时间在ipv6上阅读并得出结论,它可能是我正在使用的可达性类.
我有几个问题,如何修改代码以包含ipv6:
public class Reachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, UnsafePointer($0))
}
var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
return false
}
let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = …Run Code Online (Sandbox Code Playgroud) 我想检查wifi是否关闭,然后向用户显示警报以检查其连接。
我找到了这样的代码,但是它检查是否有互联网连接,而不是检查wifi是否打开:
func isConnectionAvailble()->Bool{
var rechability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, "www.apple.com").takeRetainedValue()
var flags : SCNetworkReachabilityFlags = 0
if SCNetworkReachabilityGetFlags(rechability, &flags) == 0
{
return false
}
let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
return (isReachable && !needsConnection)
}
Run Code Online (Sandbox Code Playgroud) 我是iOS编程的新手,没有面向对象的编程背景.
我有一个应用程序,它本质上是几个Web API的用户界面.
我有一个Reachability类,可以让我检查是否有有效的互联网连接.当用户在登录页面上并且没有其他操作时,这很有效.
但是,假设我有一个带有5个按钮的视图,所有这些都需要互联网连接才能工作.在实际进行API调用之前,我是否只需要每个按钮调用此Reachability.isConnected() - > Bool方法?
我担心这不是正确的逻辑.我是否应该有后台程序来定期检查连接?
由于缺乏OOP经验,我将这个功能分解为离散类,因此我遇到了问题.
有关处理此连接检查的最佳方法的任何建议都会很棒.