it-swarm.asia

كيفية التحقق من وجود اتصال إنترنت نشط على iOS أو macOS؟

أرغب في التحقق لمعرفة ما إذا كان لدي اتصال بالإنترنت على iOS باستخدام Cocoa Touch libraries أو على macOS باستخدام Cocoa libraries.

لقد توصلت إلى طريقة للقيام بذلك باستخدام NSURL. تبدو الطريقة التي قمت بها بها غير موثوق بها إلى حد ما (لأنه حتى Google قد تتراجع يومًا ما والاعتماد على جهة خارجية يبدو سيئًا) ، وبينما يمكنني التحقق لمعرفة استجابة من بعض مواقع الويب الأخرى إذا لم تستجب Google ، يبدو مضيعة وغير ضرورية الحمل على طلبي.

- (BOOL) connectedToInternet
{
    NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
    return ( URLString != NULL ) ? YES : NO;
}

هل ما فعلته سيئًا (ناهيك عن stringWithContentsOfURL تم إهماله في نظامي iOS 3.0 و macOS 10.4) وإذا كان الأمر كذلك ، فما هي أفضل طريقة لتحقيق ذلك؟

1291
Brock Woolf

مهم : يجب إجراء هذا التحقق دائمًا بشكل غير متزامن. غالبية الإجابات أدناه متزامنة ، لذا كن حذرًا وإلا فسوف تجمد تطبيقك.


سريع

1) تثبيت عبر CocoaPods أو قرطاج: https://github.com/ashleymills/Reachability.Swift

2) اختبار قابلية الوصول عن طريق الإغلاق

let reachability = Reachability()!

reachability.whenReachable = { reachability in
    if reachability.connection == .wifi {
        print("Reachable via WiFi")
    } else {
        print("Reachable via Cellular")
    }
}

reachability.whenUnreachable = { _ in
    print("Not reachable")
}

do {
    try reachability.startNotifier()
} catch {
    print("Unable to start notifier")
}

ج موضوعية

1) إضافة إطار عمل SystemConfiguration للمشروع ولكن لا تقلق بشأن تضمينه في أي مكان

2) أضف إصدار Tony Million من Reachability.h و Reachability.m إلى المشروع (موجود هنا: https://github.com/tonymillion/Reachability )

3) تحديث قسم الواجهة

#import "Reachability.h"

// Add this to the interface in the .m file of your view controller
@interface MyViewController ()
{
    Reachability *internetReachableFoo;
}
@end

4) ثم قم بتطبيق هذه الطريقة في ملف .m بوحدة التحكم في طريقة العرض الخاصة بك والتي يمكنك الاتصال بها

// Checks if we have an internet connection or not
- (void)testInternetConnection
{   
    internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];

    // Internet is reachable
    internetReachableFoo.reachableBlock = ^(Reachability*reach)
    {
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"Yayyy, we have the interwebs!");
        });
    };

    // Internet is not reachable
    internetReachableFoo.unreachableBlock = ^(Reachability*reach)
    {
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"Someone broke the internet :(");
        });
    };

    [internetReachableFoo startNotifier];
}

ملاحظة مهمة: فئة Reachability هي واحدة من الفئات الأكثر استخدامًا في المشاريع ، لذا قد تواجهك في تسمية تعارضات مع مشاريع أخرى. إذا حدث هذا ، فسيتعين عليك إعادة تسمية أحد أزواج Reachability.h و Reachability.m إلى شيء آخر لحل المشكلة.

ملاحظة: المجال الذي تستخدمه لا يهم. انها مجرد اختبار لبوابة إلى أي مجال.

1255
iwasrobbed

أحب إبقاء الأمور بسيطة. طريقة القيام بذلك هي:

//Class.h
#import "Reachability.h"
#import <SystemConfiguration/SystemConfiguration.h>

- (BOOL)connected;

//Class.m
- (BOOL)connected
{
    Reachability *reachability = [Reachability reachabilityForInternetConnection];
    NetworkStatus networkStatus = [reachability currentReachabilityStatus];
    return networkStatus != NotReachable;
}

ثم ، استخدم هذا كلما أردت معرفة ما إذا كان لدي اتصال:

if (![self connected]) {
    // Not connected
} else {
    // Connected. Do some Internet stuff
}

لا تنتظر هذه الطريقة حالات الشبكة التي تم تغييرها من أجل القيام بالأشياء. إنه يختبر الحالة فقط عندما تطلب ذلك.

307
cannyboy

باستخدام رمز Reachability من Apple ، قمت بإنشاء وظيفة ستقوم بالتحقق من ذلك بشكل صحيح دون الحاجة إلى تضمين أي فئات.

قم بتضمين SystemConfiguration.framework في مشروعك.

جعل بعض الواردات:

#import <sys/socket.h>
#import <netinet/in.h>
#import <SystemConfiguration/SystemConfiguration.h>

الآن فقط اتصل بهذه الوظيفة:

/*
Connectivity testing code pulled from Apple's Reachability Example: https://developer.Apple.com/library/content/samplecode/Reachability
 */
+(BOOL)hasConnectivity {
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);
    if (reachability != NULL) {
        //NetworkStatus retVal = NotReachable;
        SCNetworkReachabilityFlags flags;
        if (SCNetworkReachabilityGetFlags(reachability, &flags)) {
            if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
            {
                // If target Host is not reachable
                return NO;
            }

            if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
            {
                // If target Host is reachable and no connection is required
                //  then we'll assume (for now) that your on Wi-Fi
                return YES;
            }


            if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
                 (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
            {
                // ... and the connection is on-demand (or on-traffic) if the
                //     calling application is using the CFSocketStream or higher APIs.

                if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
                {
                    // ... and no [user] intervention is needed
                    return YES;
                }
            }

            if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
            {
                // ... but WWAN connections are OK if the calling application
                //     is using the CFNetwork (CFSocketStream?) APIs.
                return YES;
            }
        }
    }

    return NO;
}

و دائرة الرقابة الداخلية 5 اختبار لك.

144
Andrew Zimmer

كان هذا هو الإجابة الصحيحة ، لكنه الآن قديم ، حيث يجب عليك الاشتراك في الإشعارات الخاصة بالوصول بدلاً من ذلك. يتحقق هذا الأسلوب بشكل متزامن:


يمكنك استخدام فئة إمكانية الوصول إلى Apple. سيسمح لك أيضًا بالتحقق من تمكين Wi-Fi:

Reachability* reachability = [Reachability sharedReachability];
[reachability setHostName:@"www.example.com"];    // Set your Host name here
NetworkStatus remoteHostStatus = [reachability remoteHostStatus];

if (remoteHostStatus == NotReachable) { }
else if (remoteHostStatus == ReachableViaWiFiNetwork) { }
else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { }

لا يتم شحن فئة Reachability مع SDK ، بل جزء من تطبيق نموذج Apple هذا . كل ما عليك هو تنزيله ونسخ Reachability.h/m إلى مشروعك. أيضًا ، يجب عليك إضافة إطار عمل SystemConfiguration إلى مشروعك.

120
Daniel Rinser

إليك إجابة بسيطة للغاية:

NSURL *scriptUrl = [NSURL URLWithString:@"http://www.google.com/m"];
NSData *data = [NSData dataWithContentsOfURL:scriptUrl];
if (data)
    NSLog(@"Device is connected to the Internet");
else
    NSLog(@"Device is not connected to the Internet");

يجب أن يشير عنوان URL إلى موقع ويب صغير للغاية. أستخدم موقع الويب للجوال من Google هنا ، لكن إذا كان لدي خادم ويب موثوق به ، فسأقوم بتحميل ملف صغير به حرف واحد فقط لأقصى سرعة.

إذا كان فحص ما إذا كان الجهاز بطريقة أو بأخرى متصلاً بالإنترنت هو كل ما تريد القيام به ، فمن المؤكد أنني أوصي باستخدام هذا الحل البسيط. إذا كنت بحاجة إلى معرفة كيفية اتصال المستخدم ، فإن استخدام Reachability هو السبيل للذهاب.

دقيق: سيؤدي هذا إلى حظر سلسلة الرسائل لفترة وجيزة أثناء تحميل الموقع. في حالتي ، لم تكن هذه مشكلة ، ولكن يجب عليك التفكير في ذلك (ائتمانات لبراد لتوضيح ذلك).

80
Erik

إليك كيفية القيام بذلك في تطبيقاتي: بينما لا يضمن رمز الاستجابة لحالة 200 أي شيء ، إلا أنه مستقر بدرجة كافية بالنسبة لي. هذا لا يتطلب تحميل الكثير مثل إجابات NSData المنشورة هنا ، لأن لي فقط يتحقق من HEAD الاستجابة.

رمز السرعة

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" aka Google URL reachable
        }
        else
        {
            // No "Internet" aka Google URL un-reachable
        }
    })
}

رمز الهدف جيم

typedef void(^connection)(BOOL);

- (void)checkInternet:(connection)block
{
    NSURL *url = [NSURL URLWithString:@"http://www.google.com/"];
    NSMutableURLRequest *headRequest = [NSMutableURLRequest requestWithURL:url];
    headRequest.HTTPMethod = @"HEAD";

    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    defaultConfigObject.timeoutIntervalForResource = 10.0;
    defaultConfigObject.requestCachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;

    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue: [NSOperationQueue mainQueue]];

    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:headRequest
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
        if (!error && response)
        {
            block([(NSHTTPURLResponse *)response statusCode] == 200);
        }
    }];
    [dataTask resume];
}

- (void)yourMethod
{
    [self checkInternet:^(BOOL internet)
    {
         if (internet)
         {
             // "Internet" aka Google URL reachable
         }
         else
         {
             // No "Internet" aka Google URL un-reachable
         }
    }];
}
71
klcjr89

تزود Apple نموذج التعليمات البرمجية للتحقق من أنواع مختلفة من توفر الشبكة. بدلاً من ذلك ، يوجد مثال في كتاب الطبخ لمطوري iPhone.

ملاحظة: يرجى الاطلاع على تعليق @ KHG على هذه الإجابة فيما يتعلق باستخدام كود قابلية الوصول إلى Apple.

56
teabot

يمكنك استخدام Reachability بواسطة  ( متوفر هنا ).

#import "Reachability.h"

- (BOOL)networkConnection {
    return [[Reachability reachabilityWithHostName:@"www.google.com"] currentReachabilityStatus];
}

if ([self networkConnection] == NotReachable) { /* No Network */ } else { /* Network */ } //Use ReachableViaWiFi / ReachableViaWWAN to get the type of connection.
45
Aleksander Azizi

توفر Apple نموذجًا للتطبيق يعمل هذا بالضبط:

قابلية الوصول

39
user133319

تم تحديث فئة Reachability فقط. يمكنك الآن استخدام:

Reachability* reachability = [Reachability reachabilityWithHostName:@"www.Apple.com"];
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

if (remoteHostStatus == NotReachable) { NSLog(@"not reachable");}
else if (remoteHostStatus == ReachableViaWWAN) { NSLog(@"reachable via wwan");}
else if (remoteHostStatus == ReachableViaWiFi) { NSLog(@"reachable via wifi");}
33
Ben Groot

إصدار على Reachability لـ iOS 5 هوdarkseed/Reachability.h. أنها ليست لي! =)

27
Alex

يوجد تحديث لطيف المظهر و ARC و GCD يستخدم قابلية الوصول إلى هنا:

قابلية الوصول

25
JK Laiho

إذا كنت تستخدم AFNetworking يمكنك استخدام التطبيق الخاص به لحالة إمكانية الوصول إلى الإنترنت.

أفضل طريقة لاستخدام AFNetworking هي فئة فرعية للفئة AFHTTPClient واستخدام هذه الفئة لإجراء اتصالات الشبكة الخاصة بك.

تتمثل إحدى مزايا استخدام هذا الأسلوب في أنه يمكنك استخدام blocks لتعيين السلوك المرغوب عندما تتغير حالة قابلية الوصول. لنفترض أنني قمت بإنشاء فئة فرعية مفردة من AFHTTPClient (كما قيل في "ملاحظات Subclassing" في مستندات AFNetworking ) المسماة BKHTTPClient ، كنت أفعل شيئًا مثل:

BKHTTPClient *httpClient = [BKHTTPClient sharedClient];
[httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
{
    if (status == AFNetworkReachabilityStatusNotReachable) 
    {
    // Not reachable
    }
    else
    {
        // Reachable
    }
}];

يمكنك أيضًا التحقق من اتصالات Wi-Fi أو WLAN على وجه التحديد باستخدام التعدادين AFNetworkReachabilityStatusReachableViaWWAN و AFNetworkReachabilityStatusReachableViaWiFi ( المزيد هنا ).

22
Bruno Koga

لقد استخدمت الكود في هذه المناقشة ، ويبدو أنها تعمل بشكل جيد (اقرأ كله الموضوع!).

لم أختبرها بشكل شامل مع كل أنواع الاتصالات التي يمكن تصورها (مثل شبكة Wi-hoc المخصصة).

18
Felixyz

بسيط جدا .... جرب هذه الخطوات:

الخطوة 1: إضافة إطار SystemConfiguration إلى مشروعك.


الخطوة 2: / استيراد الكود التالي إلى ملف header الخاص بك.

#import <SystemConfiguration/SystemConfiguration.h>

الخطوة 3: استخدم الطريقة التالية

  • النوع 1:

    - (BOOL) currentNetworkStatus {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        BOOL connected;
        BOOL isConnected;
        const char *Host = "www.Apple.com";
        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, Host);
        SCNetworkReachabilityFlags flags;
        connected = SCNetworkReachabilityGetFlags(reachability, &flags);
        isConnected = NO;
        isConnected = connected && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
        CFRelease(reachability);
        return isConnected;
    }
    

  • النوع 2:

    استيراد رأس : #import "Reachability.h"

    - (BOOL)currentNetworkStatus
    {
        Reachability *reachability = [Reachability reachabilityForInternetConnection];
        NetworkStatus networkStatus = [reachability currentReachabilityStatus];
        return networkStatus != NotReachable;
    }
    

الخطوة 4: كيفية استخدام:

- (void)CheckInternet
{
    BOOL network = [self currentNetworkStatus];
    if (network)
    {
        NSLog(@"Network Available");
    }
    else
    {
        NSLog(@"No Network Available");
    }
}
14
svmrajesh
-(void)newtworkType {

 NSArray *subviews = [[[[UIApplication sharedApplication] valueForKey:@"statusBar"] valueForKey:@"foregroundView"]subviews];
NSNumber *dataNetworkItemView = nil;

for (id subview in subviews) {
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
        dataNetworkItemView = subview;
        break;
    }
}


switch ([[dataNetworkItemView valueForKey:@"dataNetworkType"]integerValue]) {
    case 0:
        NSLog(@"No wifi or cellular");
        break;

    case 1:
        NSLog(@"2G");
        break;

    case 2:
        NSLog(@"3G");
        break;

    case 3:
        NSLog(@"4G");
        break;

    case 4:
        NSLog(@"LTE");
        break;

    case 5:
        NSLog(@"Wifi");
        break;


    default:
        break;
}
}
12
Mutawe
- (void)viewWillAppear:(BOOL)animated
{
    NSString *URL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];

    return (URL != NULL ) ? YES : NO;
}

أو استخدم فئة قابلية الوصول .

هناك طريقتان للتحقق من توفر الإنترنت باستخدام iPhone SDK:

1. تحقق من فتح صفحة جوجل أم لا.

2. فئة قابلية الوصول

لمزيد من المعلومات ، يرجى الرجوع إلى Reachability (Apple Developer).

11
IOS Rocks

أولاً : إضافة CFNetwork.framework في الإطار

Code : ViewController.m

#import "Reachability.h"

- (void)viewWillAppear:(BOOL)animated
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];

    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
    {
        /// Create an alert if connection doesn't work
        UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection"   message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [myAlert show];
        [myAlert release];
    }
    else
    {
         NSLog(@"INTERNET IS CONNECT");
    }
}
10
Paresh Hirpara

استخدم http://huytd.github.io/datatify/ . إنه أسهل من إضافة المكتبات وكتابة التعليمات البرمجية بنفسك.

10
Huy Tran

هناك أيضًا طريقة أخرى للتحقق من اتصال الإنترنت باستخدام iPhone SDK.

حاول تنفيذ التعليمات البرمجية التالية لاتصال الشبكة.

#import <SystemConfiguration/SystemConfiguration.h>
#include <netdb.h>

/**
     Checking for network availability. It returns
     YES if the network is available.
*/
+ (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)
    {
        printf("Error. Could not recover network reachability flags\n");
        return NO;
    }

    BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
    BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);

    return (isReachable && !needsConnection) ? YES : NO;
}
8
iProgrammer
  1. قم بتنزيل ملف Reachability ، https://Gist.github.com/darkseed/1182373

  2. وأضف CFNetwork.framework و "SystemConfiguration.framework" في الإطار

  3. هل # استيراد "Reachability.h"


أولاً : إضافة CFNetwork.framework في الإطار

الرمز : ViewController.m

- (void)viewWillAppear:(BOOL)animated
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];

    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
    {
        /// Create an alert if connection doesn't work
        UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection"   message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [myAlert show];
        [myAlert release];
    }
    else
    {
         NSLog(@"INTERNET IS CONNECT");
    }
}
8
Maulik Salvi

للقيام بذلك بنفسك بسيط للغاية. الطريقة التالية ستعمل. فقط تأكد من عدم السماح بتمرير بروتوكول اسم مضيف مثل HTTP و HTTPS وما إلى ذلك بالاسم.

-(BOOL)hasInternetConnection:(NSString*)urlAddress
{
    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [urlAddress UTF8String]);
    SCNetworkReachabilityFlags flags;
    if (!SCNetworkReachabilityGetFlags(ref, &flags))
    {
        return NO;
    }
    return flags & kSCNetworkReachabilityFlagsReachable;
}

إنه سريع بسيط وغير مؤلم.

8
Tony

لقد وجدت أنه بسيط وسهل الاستخدام SimplePingHelper .

رمز العينة: chrishulbert/SimplePingHelper ( GitHub )

8
Piyush Dubey

قم أولاً بتنزيل فئة reachability ووضع ملف reachability.h و reachabilty.m في Xcode .

أفضل طريقة هي إنشاء فئة وظائف شائعة (NSObject) بحيث يمكنك استخدامها في أي فئة. فيما يلي طريقتان لفحص إمكانية الوصول إلى اتصال الشبكة:

+(BOOL) reachabiltyCheck
{
    NSLog(@"reachabiltyCheck");
    BOOL status =YES;
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(reachabilityChanged:)
                                          name:kReachabilityChangedNotification
                                          object:nil];
    Reachability * reach = [Reachability reachabilityForInternetConnection];
    NSLog(@"status : %d",[reach currentReachabilityStatus]);
    if([reach currentReachabilityStatus]==0)
    {
        status = NO;
        NSLog(@"network not connected");
    }
    reach.reachableBlock = ^(Reachability * reachability)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    };
    reach.unreachableBlock = ^(Reachability * reachability)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    };
    [reach startNotifier];
    return status;
}

+(BOOL)reachabilityChanged:(NSNotification*)note
{
    BOOL status =YES;
    NSLog(@"reachabilityChanged");
    Reachability * reach = [note object];
    NetworkStatus netStatus = [reach currentReachabilityStatus];
    switch (netStatus)
    {
        case NotReachable:
            {
                status = NO;
                NSLog(@"Not Reachable");
            }
            break;

        default:
            {
                if (!isSyncingReportPulseFlag)
                {
                    status = YES;
                    isSyncingReportPulseFlag = TRUE;
                    [DatabaseHandler checkForFailedReportStatusAndReSync];
                }
            }
            break;
    }
    return status;
}

+ (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)
    {
        NSLog(@"Error. Could not recover network reachability flags");
        return NO;
    }
    BOOL isReachable = flags & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
    BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
    NSURL *testURL = [NSURL URLWithString:@"http://www.Apple.com/"];
    NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL  cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
    NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:self];
    return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO;
}

الآن يمكنك التحقق من اتصال الشبكة في أي فئة من خلال استدعاء هذه الطريقة الطبقة.

8
Latika Tiwari

بصرف النظر عن إمكانية الوصول ، يمكنك أيضًا استخدام مكتبة مساعد Simple Ping . انها تعمل حقا لطيف وبسيط للتكامل.

7
user2538944

فئة إمكانية الوصول على ما يرام لمعرفة ما إذا كان اتصال الإنترنت متاحًا لجهاز أم لا ...

ولكن في حالة الوصول إلى موارد إنترانت :

تنفيذ الأمر ping على خادم إنترانت مع فئة إمكانية الوصول دائمًا ما يكون صحيحًا.

لذلك سيكون الحل السريع في هذا السيناريو هو إنشاء طريقة ويب تسمى pingme مع أساليب ويب أخرى على الخدمة. يجب على pingme إرجاع شيء ما.

لذلك كتبت الطريقة التالية على الوظائف المشتركة

-(BOOL)PingServiceServer
{
    NSURL *url=[NSURL URLWithString:@"http://www.serveraddress/service.asmx/Ping"];

    NSMutableURLRequest *urlReq=[NSMutableURLRequest requestWithURL:url];

    [urlReq setTimeoutInterval:10];

    NSURLResponse *response;

    NSError *error = nil;

    NSData *receivedData = [NSURLConnection sendSynchronousRequest:urlReq
                                                 returningResponse:&response
                                                             error:&error];
    NSLog(@"receivedData:%@",receivedData);

    if (receivedData !=nil)
    {
        return YES;
    }
    else
    {
        NSLog(@"Data is null");
        return NO;
    }
}

كانت الطريقة المذكورة أعلاه مفيدة جدًا بالنسبة لي ، لذلك عندما أحاول إرسال بعض البيانات إلى الخادم ، أتحقق دائمًا من قابلية الوصول إلى مورد إنترانت الخاص بي باستخدام URLRequest ذي المهلة المنخفضة.

7
Durai Amuthan.H

أعتقد أن هذا هو أفضل إجابة.

"نعم" تعني الاتصال. "لا" يعني قطع الاتصال.

#import "Reachability.h"

 - (BOOL)canAccessInternet
{
    Reachability *IsReachable = [Reachability reachabilityForInternetConnection];
    NetworkStatus internetStats = [IsReachable currentReachabilityStatus];

    if (internetStats == NotReachable)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}
7
Mina Fawzy
  • الخطوة 1: إضافة فئة قابلية الوصول في مشروعك.
  • الخطوة 2: استيراد فئة قابلية الوصول
  • الخطوة 3: إنشاء وظيفة أدناه

    - (BOOL)checkNetConnection {
        self.internetReachability = [Reachability reachabilityForInternetConnection];
        [self.internetReachability startNotifier];
        NetworkStatus netStatus = [self.internetReachability currentReachabilityStatus];
        switch (netStatus) {
            case NotReachable:
            {
                return NO;
            }
    
            case ReachableViaWWAN:
            {
                 return YES;
            }
    
            case ReachableViaWiFi:
            {
                 return YES;
            }
        }
    }
    
  • الخطوة 4: استدعاء الوظيفة على النحو التالي:

    if (![self checkNetConnection]) {
        [GlobalFunctions showAlert:@""
                         message:@"Please connect to the Internet!"
                         canBtntitle:nil
                         otherBtnTitle:@"Ok"];
        return;
    }
    else
    {
        Log.v("internet is connected","ok");
    }
    
6
Anny

التحقق من توافر اتصال الإنترنت في (iOS) Xcode 8 ، Swift 3.0

هذه طريقة بسيطة للتحقق من توفر الشبكة مثل أن الجهاز متصل بأي شبكة أو لا. لقد تمكنت من ترجمتها إلى Swift 3.0 وهنا الرمز النهائي. يبدو أن فئة Apple Reachability الموجودة وغيرها من مكتبات الأطراف الثالثة معقدة جدًا بحيث لا يمكن ترجمتها إلى Swift.

هذا يعمل مع اتصالات الجيل الثالث 3G و 4G و WiFi.

لا تنسَ إضافة "SystemConfiguration.framework" إلى منشئ مشروعك.

//Create new Swift class file Reachability in your project.
import SystemConfiguration
public class InternetReachability {

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

// Check network connectivity from anywhere in project by using this code.
 if InternetReachability.isConnectedToNetwork() == true {
         print("Internet connection OK")
  } else {
         print("Internet connection FAILED")
  }
6
ViJay Avhad

استيراد فئة Reachable.h في ViewController ، واستخدم الكود التالي للتحقق الاتصال :

     #define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
     if (hasInternetConnection){
           // To-do block
     }
6
Himanshu Mahajan

سويفت 3/سويفت 4

يجب عليك أولا الاستيراد

import SystemConfiguration

يمكنك التحقق من اتصال الإنترنت بالطريقة التالية

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

    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)

}
4
Dev_Tandel

قم بإنشاء كائن AFNetworkReachabilityManager واستخدم الكود التالي لتتبع اتصال الشبكة

self.reachabilityManager = [AFNetworkReachabilityManager managerForDomain:@"yourDomain"];
[self.reachabilityManager startMonitoring];
[self.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusReachableViaWWAN:
            case AFNetworkReachabilityStatusReachableViaWiFi:
                break;
            case AFNetworkReachabilityStatusNotReachable:
                break;
            default:
                break;
        }
    }];
3
RandomGuy

استيراد "Reachability.h"

-(BOOL)netStat
{
    Reachability *test = [Reachability reachabilityForInternetConnection];
    return [test isReachable];
}
3
neo D1

احصل على فئة Reachabilty من https://github.com/tonymillion/Reachability ، قم بإضافة إطار تكوين النظام في مشروعك ، وقم باستيراد Reachability.h في الفصل الدراسي الخاص بك وقم بتنفيذ الطرق المخصصة كما يلي:

- (BOOL)isConnectedToInternet
{
    //return NO; // Force for offline testing
    Reachability *hostReach = [Reachability reachabilityForInternetConnection];
    NetworkStatus netStatus = [hostReach currentReachabilityStatus];
    return !(netStatus == NotReachable);
}
3
K.D

التحقق من توافر اتصال الإنترنت في (iOS) باستخدام Xcode 9 & Swift 4.0

اتبع الخطوات أدناه

الخطوة 1: إنشاء ملف ملحق ومنحها الاسم: ReachabilityManager.Swift ثم قم بإضافة سطور التعليمات البرمجية أدناه.

import Foundation
import SystemConfiguration
public class ConnectionCheck 
{    
   class 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)
   }
  }

الخطوة 2: / اتصل بالملحق أعلاه باستخدام الكود أدناه.

if ConnectionCheck.isConnectedToNetwork()
{
     print("Connected")
     //Online related Business logic
}
else{
     print("disConnected")
     // offline related business logic
}
2
praful argiddi
Pod `Alamofire` has `NetworkReachabilityManager`, you just have to create one function 

func isConnectedToInternet() ->Bool {
        return NetworkReachabilityManager()!.isReachable
}
2
Shruti Thombre

هذا من أجل سويفت 3.0 ومتزامن. معظم الإجابات هي عبارة عن حل متزامن يعمل على حظر سلسلة الرسائل الرئيسية إذا كان لديك اتصال بطيء جدًا. هذا الحل أفضل ولكنه ليس مثاليًا لأنه يعتمد على Google للتحقق من الاتصال ، لذا لا تتردد في استخدام عنوان url آخر.

func checkInternetConnection(completionHandler:@escaping (Bool) -> Void)
{
    if let url = URL(string: "http://www.google.com/")
    {
        var request = URLRequest(url: url)
        request.httpMethod = "HEAD"
        request.cachePolicy = .reloadIgnoringLocalAndRemoteCacheData
        request.timeoutInterval = 5

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

            completionHandler(error == nil)
        })
        tast.resume()
    }
    else
    {
        completionHandler(true)
    }
}
2
pierre23

لمشاريع iOS الخاصة بي ، أوصي باستخدام

فئة قابلية الوصول

أعلن في سويفت. بالنسبة لي ، فإنه يعمل ببساطة جيدة مع

شبكة Wi-Fi والبيانات الخلوية

.

 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(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 = SCNetworkReachabilityFlags(rawValue: 0)
    if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
        return false
    }

    let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
    let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
    let ret = (isReachable && !needsConnection)
    return ret
} }

استخدام البيان الشرطي ،

if Reachability.isConnectedToNetwork(){
          * Enter Your Code Here*
        }
    }
    else{
        print("NO Internet connection")
    }

هذه الفئة مفيدة في كل حالة تقريبًا من تطبيقك يستخدم اتصال الإنترنت. مثل إذا كان الشرط صحيحًا ، يمكن استدعاء API أو يمكن تنفيذ المهمة.

1
Prakhar Prakash Bhardwaj

Alamofire

أعرف أن السؤال يطرحه حل Coca Touch ، لكنني أرغب في تقديم حل للأشخاص الذين قاموا بالبحث عن اتصال الإنترنت على iOS وسيكون لديهم خيار آخر هنا.

إذا كنت تستخدم بالفعل Alamofire ، إليك ما يمكنك الاستفادة منه.

يمكنك إضافة الفئة التالية إلى التطبيق الخاص بك ، والاتصال بـ MNNetworkUtils.main.isConnected() للحصول على منطقية سواء كانت متصلة أم لا.

#import Alamofire

class MNNetworkUtils {
  static let main = MNNetworkUtils()
  init() {
    manager = NetworkReachabilityManager(Host: "google.com")
    listenForReachability()
  }

  private let manager: NetworkReachabilityManager?
  private var reachable: Bool = false
  private func listenForReachability() {
    self.manager?.listener = { [unowned self] status in
      switch status {
      case .notReachable:
        self.reachable = false
      case .reachable(_), .unknown:
        self.reachable = true
      }
    }
    self.manager?.startListening()
  }

  func isConnected() -> Bool {
    return reachable
  }
}

هذه صف منفرد. في كل مرة ، عندما يقوم المستخدم بالاتصال بالشبكة أو قطع اتصالها ، سيتم تجاوز self.reachable إلى صواب/خطأ بشكل صحيح ، لأننا نبدأ في الاستماع إلى NetworkReachabilityManager عند التهيئة المفرد.

أيضًا ، من أجل مراقبة قابلية الوصول ، تحتاج إلى تقديم مضيف ، وأنا أستخدم google.com حاليًا تتردد في التغيير إلى أي مضيفين آخرين أو أحد مضيفيك إذا لزم الأمر. قم بتغيير اسم الفصل واسم الملف إلى أي شيء يطابق مشروعك.

0
nuynait

انظر Introducing Network.framework: A modern alternative to Socketshttps://developer.Apple.com/videos/play/wwdc2018/715/ يجب أن نتخلص من قابلية الوصول في مرحلة ما.

0
Zsolt