दिलचस्प पोस्ट
जावेद और सैटर विधि जावा में महत्वपूर्ण क्यों हैं? डाक – बक्सा उप्लब्ध नहीं है। सर्वर प्रतिक्रिया थी: 5.7.1 abc@xyz.com के लिए रिले में असमर्थ चरित्र तारों की सरणी में विभाजित स्ट्रिंग दो इनलाइन-ब्लॉक, चौड़ाई 50% तत्व दूसरी पंक्ति में लपेटते हैं res.send पूर्ण पथ पथ तालिका में पंक्तियों और स्तंभों के बीच अवांछित अंतरिक्ष कैसे निकालें? सेलेनियम वेबड्रिवर का उपयोग करके ब्राउज़रों में <input type = file> पर कैसे क्लिक करें? मेरे पहचान कॉलम मूल्यों में अंतर क्यों है? फ़ाइलों को पढ़ने और लिखने का सबसे आसान तरीका जीआईटी में, क्या एक रिपॉजिटरी में कोई असंबंधित शाखा शुरू करने का एक आसान तरीका है? सबसे सफ़ेद पर्स उच्च चार्ज टूलटिप फसल सी में जटिल संख्याओं के साथ कैसे काम करें? जावा में अप्रयुक्त आयात को साफ़ करने के अलावा, अव्यवस्था को कम करने के अलावा? WPF: एक प्रतिशत मूल्य के रूप में चौड़ाई (और ऊँचाई) सेट करना

स्विफ्ट में SCNetworkReachability का उपयोग कैसे करें

मैं इस कोड स्निपेट को स्विफ्ट में परिवर्तित करने की कोशिश कर रहा हूं। कुछ कठिनाइयों के कारण मैं जमीन से उतरने पर संघर्ष कर रहा हूं

- (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; } 

पहला और मुख्य मुद्दा यह है कि मैं सी स्ट्रेंक्ट्स के साथ कैसे परिभाषित और काम कर सकता हूं। उपरोक्त कोड की पहली पंक्ति में ( struct sockaddr_in zeroAddress; ), मुझे लगता है कि वे एक उदाहरण को परिभाषित कर रहे हैं जिसे zeroAddress स्ट्रेट sockaddr_in (?) से, मुझे लगता है। मैंने इस तरह एक तरह से घोषित करने की कोशिश की

 var zeroAddress = sockaddr_in() 

लेकिन मुझे त्रुटि मिलती है कॉल में पैरामीटर 'sin_len' के लिए लापता तर्क जो समझ में आता है क्योंकि उस संरचना में कई तर्क हैं इसलिए मैंने फिर से कोशिश की

 var zeroAddress = sockaddr_in(sin_len: sizeof(zeroAddress), sin_family: AF_INET, sin_port: nil, sin_addr: nil, sin_zero: nil) 

अपेक्षित होने के कारण मुझे कुछ अन्य त्रुटि मिलती है, जो कि अपने प्रारंभिक मूल्य के भीतर प्रयुक्त होता है । मैं उस त्रुटि के कारण भी समझता हूं सी में, वे पहले उदाहरण को घोषित करते हैं और फिर पैरामीटर भरते हैं स्विफ्ट में यह संभव नहीं है जितना मैं जानता हूं। इसलिए मैं वास्तव में इस बिंदु पर खो गया हूं कि क्या करना है।

मैंने स्विफ्ट में सी एपीआई के साथ बातचीत करने पर ऐप्पल के आधिकारिक दस्तावेज पढ़ा, लेकिन स्ट्रैक्ट्स के साथ काम करने में इसके पास कोई उदाहरण नहीं है।

किसी को भी यहाँ मेरी मदद कर सकते हैं? मैं वास्तव में इसकी सराहना करता हूं।

धन्यवाद।


अद्यतन: मार्टिन के लिए धन्यवाद मैं प्रारंभिक समस्या पिछले पाने के लिए सक्षम था। लेकिन अभी भी स्विफ्ट मेरे लिए आसान नहीं बना रहा है मुझे कई नई त्रुटियां मिल रही हैं

 func connectedToNetwork() -> 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) var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(UnsafePointer<Void>, UnsafePointer<zeroAddress>) // 'zeroAddress' is not a type var flags = SCNetworkReachabilityFlags() let didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, UnsafeMutablePointer<flags>) // 'flags' is not a type defaultRouteReachability.dealloc(1) // 'SCNetworkReachabilityRef' does not have a member named 'dealloc' if didRetrieveFlags == false { return false } let isReachable: Bool = flags & kSCNetworkFlagsReachable // Cannot invoke '&' with an argument list of type '(@lvalue UInt32, Int)' let needsConnection: Bool = flags & kSCNetworkFlagsConnectionRequired // Cannot invoke '&' with an argument list of type '(@lvalue UInt32, Int)' return (isReachable && !needsConnection) ? true : false } 

1 संपादित करें: ठीक है मैंने इस रेखा को इस पर बदल दिया है,

 var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(UnsafePointer<Void>(), &zeroAddress) 

इस लाइन पर मुझे जो नई त्रुटि मिल रही है वह है 'असुरक्षित पॉइंटर' को 'सीएफएएलओकेटर' के लिए परिवर्तनीय नहीं है I स्विफ्ट में NULL कैसे निकाले?

इसके अलावा मैंने यह रेखा बदल दी है और त्रुटि अब चली गई है।

 let didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) 

2 संपादित करें: इस प्रश्न को देखने के बाद मैं इस रेखा से nil पार कर गया लेकिन यह जवाब यहां उत्तर के साथ उलट है । यह कहते हैं कि स्विफ्ट में NULL बराबर नहीं है।

 var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(nil, &zeroAddress) 

वैसे भी मुझे 'सोकैड्र_इन' कहने पर एक नई त्रुटि मिलती है, ऊपर की पंक्ति में 'सोकैड्रर' के समान नहीं है

वेब के समाधान से एकत्रित समाधान "स्विफ्ट में SCNetworkReachability का उपयोग कैसे करें"

(स्विफ्ट भाषा में हुए परिवर्तनों के कारण यह उत्तर बार-बार बढ़ाया गया था, जिसने इसे थोड़ा भ्रमित किया था। अब मैंने इसे फिर से लिखा है और सबकुछ हटा दिया है जो स्विफ्ट 1. एक्स को संदर्भित करता है। पुराने कोड संपादन इतिहास में पाया जा सकता है अगर किसी की जरूरत है यह।)

यह आप स्विफ्ट 2.0 (एक्सकोड 7) में कैसे करेंगे:

 import SystemConfiguration func connectedToNetwork() -> Bool { var zeroAddress = sockaddr_in() zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress)) zeroAddress.sin_family = sa_family_t(AF_INET) guard let defaultRouteReachability = withUnsafePointer(&zeroAddress, { SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)) }) else { return false } var flags : SCNetworkReachabilityFlags = [] if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) { return false } let isReachable = flags.contains(.Reachable) let needsConnection = flags.contains(.ConnectionRequired) return (isReachable && !needsConnection) } 

स्पष्टीकरण:

  • स्विफ्ट 1.2 (एक्सकोड 6.3) के रूप में, आयातित सी स्ट्रैक्ट्स में स्विफ्ट में एक डिफॉल्ट आरंभक है, जो सभी स्ट्रक्चर के खेतों को शून्य तक आरंभीकृत करता है, इसलिए सॉकेट एड्रेस स्ट्रक्चर को आरंभ किया जा सकता है

     var zeroAddress = sockaddr_in() 
  • sizeofValue() इस संरचना का आकार देता है, इसे UInt8 लिए sin_len परिवर्तित किया UInt8 है:

     zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress)) 
  • AF_INET एक Int32 , इसे sin_family लिए सही प्रकार में कनवर्ट करना sin_family :

     zeroAddress.sin_family = sa_family_t(AF_INET) 
  • withUnsafePointer(&zeroAddress) { ... } बंद करने के लिए संरचना का पता गुजरता है जहां इसे SCNetworkReachabilityCreateWithAddress() लिए तर्क के रूप में उपयोग किया जाता है। UnsafePointer($0) रूपांतरण की आवश्यकता है क्योंकि उस फ़ंक्शन को एक संकेतक की अपेक्षा होती है, sockaddr_in नहीं।

  • withUnsafePointer() से लौटा गया मूल्य withUnsafePointer() से रिटर्न मान होता है और इसमें किस प्रकार SCNetworkReachability? , अर्थात यह एक वैकल्पिक है guard let बयान (स्विफ्ट 2.0 में एक नई सुविधा) को अनचाहे मूल्य को defaultRouteReachability वेरिएबल पर असाइन करते हैं यदि यह nil नहीं है। अन्यथा else ब्लॉक निष्पादित होता है और फ़ंक्शन देता है।

  • स्विफ्ट 2 के रूप में, SCNetworkReachabilityCreateWithAddress() एक प्रबंधित ऑब्जेक्ट देता है। आपको इसे स्पष्ट रूप से रिलीज करना नहीं है
  • स्विफ्ट 2 के रूप में, SCNetworkReachabilityFlags अनुरूप है, जिसमें सेट-समान इंटरफ़ेस है। आप के साथ एक खाली झंडे चर बनाते हैं

     var flags : SCNetworkReachabilityFlags = [] 

    और साथ झंडे की जांच करें

     let isReachable = flags.contains(.Reachable) let needsConnection = flags.contains(.ConnectionRequired) 
  • SCNetworkReachabilityGetFlags का दूसरा पैरामीटर में टाइप करें UnsafeMutablePointer<SCNetworkReachabilityFlags> , जिसका अर्थ है कि आपको फ्लैग चर का पता देना होगा

नोट भी कि एक स्विचर कॉलबैक को स्विफ्ट 2 के रूप में संभव है, तुलना स्विफ्ट और स्विफ्ट 2 से सी एपीआई के साथ कार्य करना – असुरक्षितपॉइंटर <Void> ऑब्जेक्ट के लिए


स्विफ्ट 3 (Xcode 8) के लिए अपडेट:

असुरक्षित संकेत केवल एक भिन्न प्रकार के सूचक में परिवर्तित नहीं किए जा सकते हैं (देखें – SE-0107 UnsafeRoinPointer API )। यहां अद्यतन कोड:

 import SystemConfiguration func connectedToNetwork() -> Bool { var zeroAddress = sockaddr_in() zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size) zeroAddress.sin_family = sa_family_t(AF_INET) guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { SCNetworkReachabilityCreateWithAddress(nil, $0) } }) else { return false } var flags: SCNetworkReachabilityFlags = [] if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) { return false } let isReachable = flags.contains(.reachable) let needsConnection = flags.contains(.connectionRequired) return (isReachable && !needsConnection) } 

स्विफ्ट 3, आईपीवी 4, आईपीवी 6

मार्टिन आर के जवाब के आधार पर:

 import SystemConfiguration func isConnectedToNetwork() -> Bool { guard let flags = getFlags() else { return false } let isReachable = flags.contains(.reachable) let needsConnection = flags.contains(.connectionRequired) return (isReachable && !needsConnection) } func getFlags() -> SCNetworkReachabilityFlags? { guard let reachability = ipv4Reachability() ?? ipv6Reachability() else { return nil } var flags = SCNetworkReachabilityFlags() if !SCNetworkReachabilityGetFlags(reachability, &flags) { return nil } return flags } func ipv6Reachability() -> SCNetworkReachability? { var zeroAddress = sockaddr_in6() zeroAddress.sin6_len = UInt8(MemoryLayout<sockaddr_in>.size) zeroAddress.sin6_family = sa_family_t(AF_INET6) return withUnsafePointer(to: &zeroAddress, { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { SCNetworkReachabilityCreateWithAddress(nil, $0) } }) } func ipv4Reachability() -> SCNetworkReachability? { var zeroAddress = sockaddr_in() zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size) zeroAddress.sin_family = sa_family_t(AF_INET) return withUnsafePointer(to: &zeroAddress, { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { SCNetworkReachabilityCreateWithAddress(nil, $0) } }) } 

स्विफ्ट के साथ इसका कोई लेना देना नहीं है, लेकिन इसका सबसे अच्छा समाधान नेटवर्क ऑनलाइन है या नहीं यह निर्धारित करने के लिए रीचैबिलिटी का उपयोग नहीं करना है। बस अपना कनेक्शन बनाएं और त्रुटियों को संभाल लें यदि यह विफल हो जाता है कनेक्शन बनाना, कभी-कभी निष्क्रिय ऑफ़लाइन रेडियो को आग लगा सकता है

रिचाईबिलिटी का एक वैध उपयोग यह है कि जब आपको ऑफ़लाइन से एक नेटवर्क ऑनलाइन रूपांतरित हो जाए तो आपको सूचित करने के लिए इसका उपयोग करना होगा उस बिंदु पर आपको असफल कनेक्शन पुनः प्रयास करना चाहिए।

Swift 2 में लिखी गई SCNetworkReachabilityRef क्लास का उपयोग करना सबसे अच्छा समाधान है, और SCNetworkReachabilityRef का उपयोग करता है

सरल और आसान:

 let reachability = Reachability.reachabilityForInternetConnection() reachability?.whenReachable = { reachability in // keep in mind this is called on a background thread // and if you are updating the UI it needs to happen // on the main thread, like this: dispatch_async(dispatch_get_main_queue()) { if reachability.isReachableViaWiFi() { print("Reachable via WiFi") } else { print("Reachable via Cellular") } } } reachability?.whenUnreachable = { reachability in // keep in mind this is called on a background thread // and if you are updating the UI it needs to happen // on the main thread, like this: dispatch_async(dispatch_get_main_queue()) { print("Not reachable") } } reachability?.startNotifier() 

एक जादू की तरह कार्य करना

का आनंद लें

सिंगलटन इंस्टेंस बनाने के लिए जुआनजो के जवाब को अपडेट किया गया

 import Foundation import SystemConfiguration final class Reachability { private init () {} class var shared: Reachability { struct Static { static let instance: Reachability = Reachability() } return Static.instance } func isConnectedToNetwork() -> Bool { guard let flags = getFlags() else { return false } let isReachable = flags.contains(.reachable) let needsConnection = flags.contains(.connectionRequired) return (isReachable && !needsConnection) } private func getFlags() -> SCNetworkReachabilityFlags? { guard let reachability = ipv4Reachability() ?? ipv6Reachability() else { return nil } var flags = SCNetworkReachabilityFlags() if !SCNetworkReachabilityGetFlags(reachability, &flags) { return nil } return flags } private func ipv6Reachability() -> SCNetworkReachability? { var zeroAddress = sockaddr_in6() zeroAddress.sin6_len = UInt8(MemoryLayout<sockaddr_in>.size) zeroAddress.sin6_family = sa_family_t(AF_INET6) return withUnsafePointer(to: &zeroAddress, { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { SCNetworkReachabilityCreateWithAddress(nil, $0) } }) } private func ipv4Reachability() -> SCNetworkReachability? { var zeroAddress = sockaddr_in() zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size) zeroAddress.sin_family = sa_family_t(AF_INET) return withUnsafePointer(to: &zeroAddress, { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { SCNetworkReachabilityCreateWithAddress(nil, $0) } }) } } 

प्रयोग

 if Reachability.shared.isConnectedToNetwork(){ }