كيفية التحقق من وجود اتصال إنترنت نشط على نظام التشغيل iOS أو ماكوس؟
-
23-08-2019 - |
سؤال
أرغب في التحقق لمعرفة ما إذا كان لدي اتصال إنترنت على 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. (جيثب)
قم بتنزيل ملف Reachability، https://gist.github.com/darkseed/1182373.
و أضف
CFNetwork.framework
و "SystemConfiguration.Framework" في الإطارهل #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")
}