我正在尝试获取JSON响应并将结果存储在变量中.我已经在Swift的早期版本中使用了此代码的版本,直到GM版本的Xcode 8发布.我看了一下StackOverflow上的一些类似的帖子:Swift 2解析JSON - 无法下标Swift 3中的'AnyObject'和JSON解析类型的值.
但是,似乎那里传达的想法并不适用于这种情况.
如何在Swift 3中正确解析JSON响应?在Swift 3中读取JSON的方式有什么变化吗?
以下是有问题的代码(可以在游乐场中运行):
import Cocoa
let url = "https://api.forecast.io/forecast/apiKey/37.5673776,122.048951"
if let url = NSURL(string: url) {
if let data = try? Data(contentsOf: url as URL) {
do {
let parsedData = try JSONSerialization.jsonObject(with: data as Data, options: .allowFragments)
//Store response in NSDictionary for easy access
let dict = parsedData as? NSDictionary
let currentConditions = "\(dict!["currently"]!)"
//This produces an error, Type 'Any' has no subscript members …Run Code Online (Sandbox Code Playgroud) 有没有办法检查使用Swift的互联网连接是否可用?
我知道有很多第三方库可以做到这一点,但它们都是用Objective-C编写的.我正在寻找一个Swift替代品.
我正在尝试将此代码段转换为Swift.由于一些困难,我正在努力开始起飞.
- (BOOL) connectedToNetwork
{
// Create zero addy
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
return NO;
}
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
return (isReachable && !needsConnection) ? YES : NO;
}
Run Code Online (Sandbox Code Playgroud)
我遇到的第一个和主要问题是如何定义和使用C结构.在struct sockaddr_in zeroAddress;上面代码的第一行()中,我认为他们正在定义一个zeroAddress从struct sockaddr_in(?)调用的实例,我假设.我试着宣布var这样的话.
var zeroAddress …Run Code Online (Sandbox Code Playgroud) 对于iOS 9,我使用Reachability公共类来检查设备是否连接到互联网.我将Swift 2代码转换为Swift 3,而Reachability不再适用.有人能告诉我如何检查iOS 10上的互联网连接吗?谢谢!这是代码片段:
open class Reachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
var flags = SCNetworkReachabilityFlags()
if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
return false
}
let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
return (isReachable && !needsConnection)
}
}
Run Code Online (Sandbox Code Playgroud) 我使用下面的代码在服务器中发出HTTP请求.现在我想知道它是否连接到互联网.以下是我的代码
let request = Alamofire.request(completeURL(domainName: path), method: method, parameters: parameters, encoding: encoding.value, headers: headers)
.responseJSON {
let resstr = NSString(data: $0.data!, encoding: String.Encoding.utf8.rawValue)
print("error is \(resstr)")
if $0.result.isFailure {
self.failure("Network")
print("API FAILED 4")
return
}
guard let result = $0.result.value else {
self.unKnownError()
self.failure("")
print("API FAILED 3")
return
}
self.handleSuccess(JSON(result))
}
Run Code Online (Sandbox Code Playgroud) 我正在通过WkWebView导航到的本地HTML页面上有一个远程Javscript资产标签,它永远不会完成下载(在iOS设备未连接到互联网或设备的互联网速度太慢的情况下).
不幸的是,WKWebView永远不会中止尝试下载这个资产,也不会转移到我的WKNavigationDelegate(即既-webView:didFailNavigation:withError:不会也不会-webView:didFinishNavigation: neither被调用),因此用户会遇到一个空白的HTML页面,该页面永远无法完全解析并且永远不会出错.
值得庆幸的是,在某些情况下,我通过Safari远程iOS Javascript调试器进行了调试,我注意到我们将错误Failed to load resource: The Internet connection appears to be offline记录到控制台,但在其他情况下(如飞机模式中的某些设备),WKWebView似乎永远不会因此错误或放弃,所以没有WKNavigationDelegate回调被解雇.
您可以通过将iOS 8.2模拟器与任何WKWebView iOS应用程序一起使用来重现此场景,导航到任何本地提供的HTML文件,然后使用任何远程URL添加脚本标记,然后使用任何远程URL将您的Internet连接限制为"100%丢失" Apple的网络链接调节器.
什么是强制WkWebView通过错误或成功回调到其WKNavigationDelegate超时/返回的最佳方法?
是否有Apple框架捆绑包来检测是否存在互联网连接?目前我的应用程序在尝试在没有互联网连接的情况下对用户的位置进行地理定位时崩溃.
/*inside locationManager didUpdateLocations method*/
var currentLocation:CLLocation? = locations[0] as? CLLocation
geocoder = CLGeocoder()
//Crashes on line below when there isn't an internet connection
//Need to add function to check if internet connection is live
//Before running reverseGeocodeLocation
geocoder.reverseGeocodeLocation (currentLocation,handleGeocode)
Run Code Online (Sandbox Code Playgroud)
我对swift和ios编程有点新鲜 - 我的道歉.
我只需要在开始与我的iphone应用程序中的服务通信之前检查互联网连接可用性.我使用Swift 1.2和Xcode 6作为我的开发环境......
我刚做了一些研究,发现这个stackoverflow LINK 在目标C中.
因此,我只是试图在SWIFT中找到类似的解决方案,并找到以下链接
https://coderwall.com/p/mhxbpq/checking-for-internet-connection-availability
只是为了让事情变得简单,该链接中的内容如下......
import Foundation
import SystemConfiguration
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(nil, UnsafePointer($0)).takeRetainedValue()
}
var flags: SCNetworkReachabilityFlags = 0
if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
return false
}
let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0 …Run Code Online (Sandbox Code Playgroud) 我在iOS-Swift项目中使用firebase,我必须启用离线支持上传帖子,在帖子中有一张图片和标题就像Instagram一样,所以我想要的是当用户离线并且他/她想要上传帖子,他/她的照片保存在缓存中,当用户上线时,照片上传并返回我们可用于保存帖子的下载URL - 详细说明数据库.
示例代码是:
let photoIDString = UUID().uuidString
let storageRef = Storage.storage().reference(forURL: "storage ref URL").child("posts").child(photoIDString)
storageRef.putData(imageData, metadata: nil, completion: { (metadata, error) in
guard let metadata = metadata else {
return
}
if error != nil {
return
}
storageRef.downloadURL(completion: { ( url, error ) in
guard let downloadURL = url else {
return
}
let photoUrl = downloadURL.absoluteString
self.sendDataToDatabase(photoUrl: photoUrl)
})
}
)
Run Code Online (Sandbox Code Playgroud)
我想知道我应该在代码中进行哪些更改以提供脱机功能.任何代码段都会有所帮助.
firebase swift firebase-realtime-database google-cloud-functions firebase-storage
我正在尝试创建一个 VPN 应用程序,当在“设置”应用程序中手动关闭 VPN 时,该应用程序会通知用户。更一般地说,我希望能够在网络设置更改时做出反应。我在 StackOverflow 上看到了很多关于可达性、网络等的评论,但我不知道是否可以在后台检查这些东西。有没有办法通过使用“获取”或“远程通知”来做到这一点。我的手机上有一个应用程序,如果我关闭 VPN,它会向我发出通知,所以我知道有办法做到这一点,但我不知道如何做。