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

StackOverflow https://stackoverflow.com/questions/1083701

سؤال

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

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

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

هل ما فعلته سيئا، (نذكر stringWithContentsOfURL تم إهمالها في IOS 3.0 وماوس 10.4) وإذا كان الأمر كذلك، فما هي طريقة أفضل لإنجاز هذا؟

هل كانت مفيدة؟

المحلول

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


سويفت

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) إضافة نسخة توني مليون من Reachability.h و Reachability.m إلى المشروع (وجدت هنا: https://github.com/tonymillion/reach)

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 Class هي واحدة من أكثر الفئات المستخدمة في المشاريع، لذا فقد تعمل في تسمية تعارضات مع مشاريع أخرى. إذا حدث هذا، فسيتعين عليك إعادة تسمية أحد أزواج 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
}

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

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

قم بتضمين 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;
}

وانها IOS 5. اختبار لك.

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


يمكنك استخدام فئة Reach Aleple. سيتيح لك أيضا التحقق مما إذا تم تمكين 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) { }

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

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

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 المحمول هنا، ولكن إذا كان لدي خادم ويب موثوق، فستحميل ملف صغير مع حرف واحد فقط فيه للحصول على أقصى سرعة.

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

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

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

رمز السرعة

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

رمز الهدف C

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

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

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

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

توفر Apple تطبيقا عينة يقوم بالضبط:

الروائي

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

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

إصدار على الوصول إلى IOS 5 هو darkseed / الوصول. وبعد أنها ليست لي! =)

هناك تحديث لطيفة، ARC- و GCD - استخدام الواجهة هنا:

الروائي

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

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

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

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

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

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

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

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

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

أو استخدام فئة الروائي.

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

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

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

قم أولا بتنزيل فئة Reachabilability ووضع الوصول إلى الوضوح و 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;
}

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

هناك أيضا طريقة أخرى للتحقق من اتصال الإنترنت باستخدام 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;
}

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

عينة من الرموز: chrishulbert / helppinghelper. (جيثب)

  1. قم بتنزيل ملف Reachability، https://gist.github.com/darkseed/1182373.

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

  3. هل #import "الوصول إلى"


أولا: يضيف 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");
    }
}

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

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

يعرض خطاب خادم إنترانت مع فئة الروازية دائما صحيحا.

لذلك سيكون الحل السريع في هذا السيناريو هو إنشاء طريقة ويب تسمى pingme جنبا إلى جنب مع WebMethods الأخرى في الخدمة. ال 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.

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

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

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

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

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

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

#import "Reachability.h"

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

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

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

     #define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
     if (hasInternetConnection){
           // To-do block
     }
  • الخطوة 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");
    }
    

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

هذه طريقة بسيطة للتحقق من توفر الشبكة مثل جهازنا متصل بأي شبكة أم لا. لقد تمكنت من ترجمة ذلك إلى SWIFT 3.0 وهنا الرمز النهائي. بدا أن فئة Apple Reach Aleple الحالية وغيرها من مكتبات الطرف الثالث معقدة للغاية للترجمة إلى 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")
  }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top