সুইফটে ইন্টারনেট সংযোগের উপলভ্যতা পরীক্ষা করুন


107

সুইফট ব্যবহার করে ইন্টারনেট সংযোগ পাওয়া যায় কিনা তা পরীক্ষা করার কোনও উপায় আছে কি?

আমি জানি যে এটি করার জন্য অনেক তৃতীয় পক্ষের গ্রন্থাগার রয়েছে তবে সেগুলি সবগুলি উদ্দেশ্য-সিতে লিখিত। আমি একটি সুইফ্ট বিকল্প খুঁজছি।


5
সুইফ্টের বিশাল সুবিধাগুলির মধ্যে একটি হ'ল এটি উদ্দেশ্যমূলক-সি (এবং এরকমের গ্রন্থাগারগুলি) এর সাথে ভালভাবে সংহত করে।
ব্যবহারকারী 2864740

প্রকৃতপক্ষে. বিদ্যমান লাইব্রেরিগুলির মধ্যে একটি ব্যবহার করে আপনি কী সমস্যা করছেন? সুইফট থেকে একটি উদ্দেশ্য সি লাইব্রেরিটি ব্যবহার করা বেশ সহজ এবং আপনি যদি সুইফটিতে কোনও ধরণের অ্যাপ্লিকেশন না লিখতে পারেন তবে এটি আপনার পক্ষে অত্যন্ত কঠিন প্রমাণিত হবে prove
ম্যাট গিবসন

1
@ ম্যাটগিবসন ওবজেসি-তে প্রায় যা কিছু করতে পারেন তা আপেক্ষিক স্বাচ্ছন্দ্যে সুইফটে করা যেতে পারে। মঞ্জুর, এই ক্ষেত্রে কয়েকটি অতিরিক্ত লাইন থাকবে তবে এখনও "অত্যন্ত কঠিন" থেকে অনেক দূরে
বায়রন কোটসি

@ বায়রনকোটিসি আমি অ্যাপকিট ইত্যাদি লাইব্রেরি ব্যবহার করে যাচ্ছিলাম — আমার বক্তব্যটি হ'ল সুইফ্টে দরকারী কিছু লিখতে কীভাবে আপনাকে উদ্দেশ্যমূলক সি লাইব্রেরির সাথে ইন্টারেক্ট করতে হবে তা জানতে হবে।
ম্যাট গিবসন

- alamofire উত্তর দেখার stackoverflow.com/a/46562290/7576100
জ্যাক

উত্তর:


227

মন্তব্যে যেমন উল্লেখ করা হয়েছে, যদিও এটি সুইফটে অবজেক্টিভ-সি লাইব্রেরি ব্যবহার করা সম্ভব, তবুও আমি আরও বিশুদ্ধ সুইফট সমাধান চাইছিলাম। বিদ্যমান অ্যাপল রিচ্যাবিলিটি ক্লাস এবং অন্যান্য তৃতীয় পক্ষের লাইব্রেরিগুলি আমার কাছে সুইফটে অনুবাদ করার পক্ষে খুব জটিল বলে মনে হয়েছিল। আমি আরও কিছু গুগল করেছি এবং আমি এই নিবন্ধটি জুড়ে এসেছি যা নেটওয়ার্কের উপলব্ধতার জন্য যাচাই করার জন্য একটি সহজ পদ্ধতি দেখায়। আমি এটি সুইফটে অনুবাদ করতে বেরিয়েছি। আমি অনেকগুলি ছিনতাই করেছি কিন্তু স্ট্যাকওভারফ্লো থেকে মার্টিন আরকে ধন্যবাদ , আমি সেগুলি সমাধান করতে এবং শেষ পর্যন্ত সুইফটে একটি কার্যক্ষম সমাধান পেতে সক্ষম হয়েছি। কোডটি এখানে।

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
        let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0

        return isReachable && !needsConnection
    }

}

সুইফট> 3.0 এর জন্য

public class Reachability {
    public func isConnectedToNetwork() -> 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
        }
        if flags.isEmpty {
            return false
        }

        let isReachable = flags.contains(.reachable)
        let needsConnection = flags.contains(.connectionRequired)

        return (isReachable && !needsConnection)
    }
}

এটি 3 জি এবং ওয়াইফাই উভয় সংযোগের জন্য কাজ করে। আমি এটিকে কার্যকারী উদাহরণ সহ আমার গিটহাবে আপলোড করেছি ।


7
দ্রুত প্রতিক্রিয়ার জন্য ধন্যবাদ (কোনও পাং উদ্দেশ্যে নয়)। এমআইটি বা আপাচি আদর্শ হবে - ধন্যবাদ!
অ্যান্ড্রু এবলিং

4
সম্পন্ন. এটি এমআইটিতে পরিবর্তন করা হয়েছে।
ইসুরু

11
আমি অন্য একটি সমস্যা পেয়েছি, যদি 3 জি চালু হয় তবে আমার কাছে আরও ডেটা ক্ষমতা নেই তবে isConnectedToNetworkসত্যটি ফিরে আসে, তবে আমি আমার ওয়েব পরিষেবা কল করতে পারি না
জ্যানোস

11
হিসাবে @Isuru বলেন, এই উপর ভিত্তি করে তৈরি stackoverflow.com/a/25623647/1187415 , এখন সুইফট 2. জন্য আপডেট করা হয়েছে যা
মার্টিন আর

2
@ জিনোস: সুইফট ২-এর মাধ্যমে একটি বিজ্ঞপ্তি কলব্যাক সেট করা এখন সম্ভাব্য উত্তর স্ট্যাকওভারফ্লো . com/ a/ 27142665/1187415 দেখুন
মার্টিন আর

16

আমি আপনাকে আরও ভাল উপায় দিচ্ছি ...

আপনাকে অবশ্যই এই কোড সহ একটি শ্রেণি তৈরি করতে হবে

 import Foundation
 public class Reachability {

class func isConnectedToNetwork()->Bool{

    var Status:Bool = false
    let url = NSURL(string: "http://google.com/")
    let request = NSMutableURLRequest(URL: url!)
    request.HTTPMethod = "HEAD"
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
    request.timeoutInterval = 10.0

    var response: NSURLResponse?

    var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: nil) as NSData?

    if let httpResponse = response as? NSHTTPURLResponse {
        if httpResponse.statusCode == 200 {
            Status = true
        }
    }

    return Status
  }
}

এবং তারপরে আপনি এই কোডটি ব্যবহার করে আপনার প্রকল্পের যে কোনও জায়গায় ইন্টারনেট সংযোগ পরীক্ষা করতে পারেন:

if Reachability.isConnectedToNetwork() == true {
     println("Internet connection OK")
} else {
     println("Internet connection FAILED")
}

খুব সহজ!

* এই পথে বিক্রম পোট উত্তরের ভিত্তিতে!


15
দয়া করে সচেতন হন যে আপনার উপরের ব্যবহারের চেয়ে এই পদ্ধতিটি ব্যবহার করা উচিত নয় । যে অ্যাপ্লিকেশনগুলিতে অবিচ্ছিন্ন সংযোগ প্রয়োজন, সেখানে এই পদ্ধতির মতো একটি প্রতিক্রিয়া যাচাইয়ের ফলে অ্যাপ্লিকেশনটি এমন পরিস্থিতিতে ঝুলতে পারে যেখানে আপনার ইন্টারনেট সংযোগ খুব কম (যেমন এজ / জিপিআরএসে) রয়েছে। দয়া করে এই সমাধানটি ব্যবহার করবেন না !!
ইমরান আহমেদ

7
খারাপ ভাবে 1) সার্ভার Evry সময় অতিরিক্ত হিট দরকার 2) google.com এছাড়াও নিচে হতে পারে
বিজয় সিং রানা

2
১. হ্যাঁ, এইভাবে সার্ভারে প্রতিটি সময় অতিরিক্ত আঘাতের প্রয়োজন হয় তবে এটি ইন্টারনেটের জন্য 100% গ্যারান্টি দেয় ... এমন সময় আসে যখন ডিভাইসটি একটি ওয়াইফাই নেটওয়ার্কের সাথে সংযুক্ত থাকে তবে ইন্টারনেট অ্যাক্সেস সরবরাহ করে না! এই পরিস্থিতিতে, এই উপায়ে ইন্টারনেটে অ্যাক্সেসের অভাব নির্ধারণ করে ... অন্যান্য উপায়ে - না! ২. আপনি google.com এর পরিবর্তে নিজের সার্ভার ব্যবহার করতে পারেন ... এটি মূলত বোঝানো হয়েছিল ...
দিমিত্রি

1
দুর্বল সমাধান, সংযোগ ঘাতক।
gokhanakkurt

2
গোখনাক্কুর্ট, দয়া করে, আরও একটি সমাধান প্রস্তাব করুন যা নিশ্চিত করে যে ইন্টারনেট 100% এ কাজ করে
দিমিত্রি

15

সুইফট ৩.১ এর জন্য (আইওএস 10.1)

আপনি যদি নেটওয়ার্ক-টাইপের (যেমন ওয়াইফাই বা ডাব্লুডাব্লুএএন) মধ্যে পার্থক্য তৈরি করতে চান:

তুমি ব্যবহার করতে পার:

func checkWiFi() -> Bool {

    let networkStatus = Reachability().connectionStatus()
    switch networkStatus {
    case .Unknown, .Offline:
        return false
    case .Online(.WWAN):
        print("Connected via WWAN")
        return true
    case .Online(.WiFi):
        print("Connected via WiFi")
        return true
    }
}

নেটওয়ার্ক-প্রকারের মধ্যে পার্থক্যযুক্ত এখানে সম্পূর্ণ পুনঃব্যবস্থাপনা-শ্রেণি রয়েছে:

import Foundation
import SystemConfiguration

import UIKit
import SystemConfiguration.CaptiveNetwork

public let ReachabilityStatusChangedNotification = "ReachabilityStatusChangedNotification"

public enum ReachabilityType: CustomStringConvertible {
    case WWAN
    case WiFi

    public var description: String {
        switch self {
        case .WWAN: return "WWAN"
        case .WiFi: return "WiFi"
        }
    }
}

public enum ReachabilityStatus: CustomStringConvertible  {
    case Offline
    case Online(ReachabilityType)
    case Unknown

    public var description: String {
        switch self {
        case .Offline: return "Offline"
        case .Online(let type): return "Online (\(type))"
        case .Unknown: return "Unknown"
        }
    }
}

public class Reachability {

    func connectionStatus() -> ReachabilityStatus {
        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)

        guard let defaultRouteReachability = (withUnsafePointer(to: &zeroAddress) {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { zeroSockAddress in
                SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
            }
        }) else {
           return .Unknown
        }

        var flags : SCNetworkReachabilityFlags = []
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {
            return .Unknown
        }

        return ReachabilityStatus(reachabilityFlags: flags)
    }

    func monitorReachabilityChanges() {
        let host = "google.com"
        var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)
        let reachability = SCNetworkReachabilityCreateWithName(nil, host)!

        SCNetworkReachabilitySetCallback(reachability, { (_, flags, _) in
            let status = ReachabilityStatus(reachabilityFlags: flags)

            NotificationCenter.default.post(name: NSNotification.Name(rawValue: ReachabilityStatusChangedNotification), object: nil, userInfo: ["Status": status.description])}, &context)

        SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(), CFRunLoopMode.commonModes.rawValue)
    }
}

extension ReachabilityStatus {

    public init(reachabilityFlags flags: SCNetworkReachabilityFlags) {
        let connectionRequired = flags.contains(.connectionRequired)
        let isReachable = flags.contains(.reachable)
        let isWWAN = flags.contains(.isWWAN)

        if !connectionRequired && isReachable {
            if isWWAN {
                self = .Online(.WWAN)
            } else {
                self = .Online(.WiFi)
            }
        } else {
            self =  .Offline
        }
    }
}

3 ই ডিসেম্বর, ২০১,, আইওএস 10 এবং দ্রুত 3.1-তে ভাল কাজ করছে, ধন্যবাদ!
Joey

হ্যালো, আমরা কীভাবে সনাক্ত করতে পারি তার জন্য যদি আমরা ওয়াইফাই / 3 জি / মোবাইল-ডেটা / 4 জি সংযোগটি আলাদা করতে চাই।

6

যেহেতু সেন্ডক্রোনাস রিকুইয়েস্ট অবমূল্যায়ন করা হয়েছে, তাই আমি এটি চেষ্টা করেছিলাম কিন্তু প্রতিক্রিয়া শেষ হওয়ার আগেই 'রিটার্ন স্ট্যাটাস' ডাকা হয়েছিল।

এই উত্তরটি ভালভাবে কাজ করে যদিও, সুইফটের সাথে ইন্টারনেট সংযোগের জন্য পরীক্ষা করুন

যাইহোক আমি যা চেষ্টা করেছিলাম তা এখানে:

import Foundation

public class Reachability {

    class func isConnectedToNetwork()->Bool{

        var Status:Bool = false
        let url = NSURL(string: "http://google.com/")
        let request = NSMutableURLRequest(URL: url!)
        request.HTTPMethod = "HEAD"
        request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
        request.timeoutInterval = 10.0
        let session = NSURLSession.sharedSession()

        session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
            print("data \(data)")
            print("response \(response)")
            print("error \(error)")

            if let httpResponse = response as? NSHTTPURLResponse {
                print("httpResponse.statusCode \(httpResponse.statusCode)")
                if httpResponse.statusCode == 200 {
                    Status = true
                }
            }

        }).resume()


        return Status
    }
}

আমি আপনার সমাধানটি পছন্দ করেছি এবং ব্যবহার করেছি। তবে আমি এই উত্তরটির সাথে এটি যুক্ত করে যুক্ত করেছি: stackoverflow.com/a/34591379 ওরফে। আমি একটি সেমফোর যুক্ত করেছি .. সুতরাং আমি টাস্কটি শেষ হওয়ার জন্য অপেক্ষা করি।
বিজেকিএন

6

সুইফট 3: ওয়াইফাই এবং ইন্টারনেট সংযোগের জন্য চেক করুন :

import Foundation
import SystemConfiguration

public class Reachability {
    public func isConnectedToNetwork() -> 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)
    }
}

ব্যবহার:

if Reachability.isConnectedToNetwork() == true {
    print("Connected to the internet")
    //  Do something
} else {
    print("No internet connection")
    //  Do something
}

2
public func isConnectedToNetwork() {...}class func isConnectedToNetwork{...}আপনার ব্যবহারের ক্ষেত্রে পরিবর্তন করা উচিত ।
প্রবলভাবে

4

আপনি নীচের উত্তর ব্যবহার করতে পারেন।

    func checkInternet(flag:Bool, completionHandler:(internet:Bool) -> Void)
    {
      UIApplication.sharedApplication().networkActivityIndicatorVisible = true

      let url = NSURL(string: "http://www.google.com/")
      let request = NSMutableURLRequest(URL: url!)

      request.HTTPMethod = "HEAD"
      request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
      request.timeoutInterval = 10.0

      NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.mainQueue(), completionHandler:
      {(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in

        UIApplication.sharedApplication().networkActivityIndicatorVisible = false

        let rsp = response as NSHTTPURLResponse?

        completionHandler(internet:rsp?.statusCode == 200)
    })
    }

     func yourMethod()
    {
    self.checkInternet(false, completionHandler:
    {(internet:Bool) -> Void in

        if (internet)
        {
            // "Internet" mean Google
        }
        else
        {
            // No "Internet" no Google
        }
    })
   }

ধন্যবাদ! আমি NSHTTPURLResponse হিসাবে প্রতিক্রিয়া থেকে একটি স্বয়ংক্রিয় সঠিক পেয়েছি? হিসাবে প্রতিক্রিয়া! NSHTTPURLResponse? সুইফট 1.2।
ফ্রান্সিস জার্ভিস

1

সুইফট 3: 3 জি এবং ওয়াই-ফাই সংযোগটি পরীক্ষা করুন

DispatchQueue.main.async {
        let url = URL(string: "https://www.google.com")!
        let request = URLRequest(url: url)

        let task = URLSession.shared.dataTask(with: request) {data, response, error in

            if error != nil {
                // do something here...
                print("Internet Connection not Available!")
            }
            else if let httpResponse = response as? HTTPURLResponse {
                if httpResponse.statusCode == 200 {
                    // do something here...
                    print("Internet Connection OK")
                }
                print("statusCode: \(httpResponse.statusCode)")
            }

        }
        task.resume()
}

এটি পছন্দসই উপায় নয়। ভবিষ্যতের কোনও পর্যায়ে প্রদত্ত ওয়েব লিঙ্কটি প্রতিক্রিয়া জানাতে বা বন্ধ হয়ে গেলে কী হয়। আমি এটির জন্য অ্যাপল সিস্টেম কনফিগারেশন কাঠামোটি ব্যবহার করার পরামর্শ দেব। উপরের উত্তর দেখুন।
আব্দুল ইয়াসিন

1

সুইফ্ট 5 এর জন্য:

import Network
let monitor = NWPathMonitor()

func checkInterwebs() -> Bool {
    var status = false
    monitor.pathUpdateHandler = { path in
        if path.status == .satisfied {
            status = true  // online
        }
    }
    return status
}

1

সুইফট 4

if isInternetAvailable() {
    print("if called Internet Connectivity success \(isInternetAvailable())");
} else {
    print("else called Internet Connectivity success \(isInternetAvailable())");
}

func isInternetAvailable() -> 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) {
        $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
            SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
     }
    }

   var flags = SCNetworkReachabilityFlags()

   if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
      return false
   }
   let isReachable = flags.contains(.reachable)
   let needsConnection = flags.contains(.connectionRequired)
   //   print(isReachable && !needsConnection)
   return (isReachable && !needsConnection)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.