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


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

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

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

هو ما فعلته سيئة؟ (ناهيك عن stringWithContentsOfURL هو إهمال في دائرة الرقابة الداخلية 3.0 و أوسك 10.4) وإذا كان الأمر كذلك، ما هو أفضل وسيلة لتحقيق ذلك؟




Answers


الطريقة 1: استخدام بسيطة (أرك و غد متوافق) فئة للقيام بذلك

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

2) إضافة توني مليون نسخة من 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];
}

الطريقة 2: تفعل ذلك بنفسك بالطريقة القديمة باستخدام فئة الوصول القديمة أبل

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

2) إضافة نسخة أبل من Reachability.h و Reachability.m للمشروع ( يمكنك الحصول على تلك هنا )

3) إضافة @class Reachability; إلى ملف .h حيث تقوم بتنفيذ التعليمات البرمجية

4) إنشاء مثيلات زوجين للتحقق في قسم interface الملف. h:

Reachability* internetReachable;
Reachability* hostReachable;

5) إضافة طريقة في .h عندما تكون تحديثات حالة الشبكة:

-(void) checkNetworkStatus:(NSNotification *)notice;

6) إضافة #import "Reachability.h" إلى ملف #import "Reachability.h" حيث يتم تنفيذ الاختيار

7) في ملف .m حيث تقوم بتنفيذ الاختيار، يمكنك وضع هذا في واحدة من الطرق الأولى تسمى ( init أو viewWillAppear أو viewDidLoad الخ):

-(void) viewWillAppear:(BOOL)animated
{
    // check for internet connection
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

    internetReachable = [Reachability reachabilityForInternetConnection];
    [internetReachable startNotifier];

    // check if a pathway to a random host exists
    hostReachable = [Reachability reachabilityWithHostName:@"www.apple.com"];
    [hostReachable startNotifier];

    // now patiently wait for the notification
}

8) إعداد طريقة ل عندما يتم إرسال الإخطار وتعيين أي الشيكات أو استدعاء أي طرق قد قمت بإعداد (في حالتي، أنا مجرد مجموعة بول)

-(void) checkNetworkStatus:(NSNotification *)notice
{
    // called after network status changes
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)
    {
        case NotReachable:
        {
            NSLog(@"The internet is down.");
            self.internetActive = NO;

            break;
        }
        case ReachableViaWiFi:
        {
            NSLog(@"The internet is working via WIFI.");
            self.internetActive = YES;

            break;
        }
        case ReachableViaWWAN:
        {
            NSLog(@"The internet is working via WWAN.");
            self.internetActive = YES;

            break;
        }
    }

    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    switch (hostStatus)
    {
        case NotReachable:
        {
            NSLog(@"A gateway to the host server is down.");
            self.hostActive = NO;

            break;
        }
        case ReachableViaWiFi:
        {
            NSLog(@"A gateway to the host server is working via WIFI.");
            self.hostActive = YES;

            break;
        }
        case ReachableViaWWAN:
        {
            NSLog(@"A gateway to the host server is working via WWAN.");
            self.hostActive = YES;

            break;
        }
    }
}

9) في dealloc أو viewWillDisappear أو طريقة مماثلة، وإزالة نفسك كمراقب

-(void) viewWillDisappear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

ملاحظة: قد يكون هناك مثيل باستخدام viewWillDisappear حيث تتلقى تحذير الذاكرة والمراقب أبدا يحصل غير مسجلة لذلك يجب عليك حساب لذلك أيضا.

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

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




أحب أن تبقي الأمور بسيطة. الطريقة التي أفعلها هي:

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

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




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

تضمين 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 اختبار لك.




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

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

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.h / م لمشروعك. أيضا، لديك لإضافة إطار سيستمكونفيغوراتيون إلى المشروع الخاص بك.




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

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");

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

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

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




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

رمز السرعة

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

    let url = NSURL(string: "http://www.appleiphonecell.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 Apple's region universal URL reachable
        }
        else
        {
            // No "Internet" aka Apple's region universal URL un-reachable
        }
    })
}

الهدف- C

typedef void(^connection)(BOOL);

- (void)checkInternet:(connection)block
{
    NSURL *url = [NSURL URLWithString:@"http://www.appleiphonecell.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 Apple's region universal URL reachable
         }
         else
         {
             // No "Internet" aka Apple's region universal URL un-reachable
         }
    }];
}



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

ملاحظة: يرجى الاطلاع على تعليق @ خغ على هذه الإجابة بخصوص استخدام رمز الوصول إلى أبل.




يمكنك استخدام إمكانية 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.






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

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");}






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

وسائل الأتصال




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

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

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

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

يمكنك أيضا التحقق من وجود اتصالات واي-في أو ولان على وجه التحديد باستخدام AFNetworkReachabilityStatusReachableViaWWAN و AFNetworkReachabilityStatusReachableViaWiFi ( أكثر هنا ).




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

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




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

الخطوة 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");
    }
}



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



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

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

أو استخدم فئة إمكانية الوصول .

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

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

2. فئة الوصول

لمزيد من المعلومات، يرجى الرجوع إلى إمكانية الوصول (أبل المطور).




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




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

كود : 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");
    }
}



أولا تحميل فئة إمكانية الوصول ووضع accessability.h وملف reachabilty.m في كسكودي الخاص بك.

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

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

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




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

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

أنها سريعة بسيطة وغير مؤلم.







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

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

يؤدي ربط خادم إنترانت مع فئة إمكانية الوصول دائما إلى إعادة ترو.

لذلك سيكون الحل السريع في هذا السيناريو هو إنشاء أسلوب ويب يسمى 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;
    }
}

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




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

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

#import "Reachability.h"

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

    if (internetStats == NotReachable)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}



  1. نزل ملف إمكانية الوصول، https://gist.github.com/darkseed/1182373

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

  3. دو #import "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، سويفت 3.0

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

هذا يعمل على حد سواء الجيل الثالث 3G، 4G وواي فاي الاتصالات.

لا ننسى لإضافة "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")
  }



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

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



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

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

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






  • الخطوة 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");
    }