Каков наилучший способ проверить подключение к Интернету с помощью SDK iOS?Проверьте подключение к Интернету с помощью SDK iOS
ответ
Лучший способ - использовать код для повышения эффективности. Проверьте here for apple sample code. То есть много удобных методов, чтобы проверить доступность Интернет, Wi-Fi/WAN проверка подключения и т.д ..
Для например: -
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChanged:) name:kReachabilityChangedNotification object:nil];
reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
- (void)networkChanged:(NSNotification *)notification
{
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];
if(remoteHostStatus == NotReachable) { NSLog(@"not reachable");}
else if (remoteHostStatus == ReachableViaWiFiNetwork) { NSLog(@"wifi"); }
else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { NSLog(@"carrier"); }
}
Попробуйте этот код:
- (BOOL)connectedToInternet
{
NSURL *url=[NSURL URLWithString:@"http://www.google.com"];
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"HEAD"];
NSHTTPURLResponse *response;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL];
return ([response statusCode]==200)?YES:NO;
}
достижимости имеет много к нему больше, чем нужно, плюс он еще не обновлен для ARC.
Вот мое решение в чистом C. Большая часть кода была взята непосредственно из Reachability, но переделана только до того, что необходимо. Я только хотел, чтобы он возвращал, было ли или нет соединение с Интернетом, но вы можете прочитать из комментариев, возвращает ли он ДА на основе поиска Wi-Fi или сотовой сети.
Прежде чем перейти к использованию кода, необходимо зайти в свою цель: выберите вкладку «Фазы сборки» и добавьте «SystemConfiguration.framework» в список «Link Binary With Libraries».
#import <CoreFoundation/CoreFoundation.h>
#import <SystemConfiguration/SystemConfiguration.h>
#import <netdb.h>
BOOL networkReachable()
{
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *) &zeroAddress);
SCNetworkReachabilityFlags flags;
if (SCNetworkReachabilityGetFlags(reachabilityRef, &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; // This is a wifi connection.
}
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; // This is a wifi connection.
}
}
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) {
// ... but WWAN connections are OK if the calling application
// is using the CFNetwork (CFSocketStream?) APIs.
return YES; // This is a cellular connection.
}
}
return NO;
}
Мне нравится ваше решение много, но лично я бы сделал небольшую модификацию. Я думаю, вместо того, чтобы возвращать BOOL, вы должны вернуть константу или элемент ENUM, чтобы мы могли определить, есть ли соединение и какой тип. К счастью эту модификацию не сложно сделать! –
Я считаю, что ошибся здесь и что этот код просачивается. SCNetworkReachabilityRef необходимо отправить в CFRelease() в какой-то момент ... лучший способ сделать это может состоять в том, чтобы разбить SCNetworkReachabilityGetFlags() и сохранить его значение, а затем освободить refability ref, затем перейти к if и проверить сохраненное значение. Таким образом освобождается память, занятая SCNetworkReachability, хранящаяся в куче, но все, что вам нужно в этой точке (флаги и возвращаемое значение SCNetworkReachabilityGetFlags()) по-прежнему доступны в стеке. – ArtOfWarfare
- 1. Проверьте подключение к Интернету или проверьте подключение к Интернету постоянно
- 2. Проверьте подключение к Интернету?
- 3. Проверьте подключение к Интернету
- 4. Проверьте подключение к Интернету
- 5. Проверьте подключение к Интернету с помощью offline.js
- 6. Проверьте подключение к Интернету в iOS 9?
- 7. Мгновенно проверьте подключение к Интернету
- 8. Android, проверьте подключение к интернету
- 9. Проверьте реальное подключение к Интернету
- 10. Проверьте подключение к Интернету INTENT
- 11. Проверьте фактическое подключение к Интернету
- 12. Проверьте подключение к Интернету OKHTTP
- 13. Проверьте подключение к Интернету C#
- 14. Проверьте подключение к Интернету от Unity
- 15. Проверьте подключение к Интернету с Swift
- 16. Проверьте подключение к Интернету с разъемами
- 17. Проверьте подключение к Интернету с jquery
- 18. Проверьте подключение к Интернету во Flash?
- 19. javascript/dashcode: проверьте подключение к Интернету
- 20. Проверьте подключение к Интернету в IOS приложении только один раз
- 21. Проверьте подключение к Интернету во время работы
- 22. Проверьте подключение к Интернету в Silverlight
- 23. Adobe Air - Проверьте подключение к Интернету
- 24. Проверьте подключение к Интернету на C++?
- 25. Проверьте, доступно ли подключение к Интернету
- 26. Windows Phone 8.1: Проверьте подключение к Интернету
- 27. Android: проверьте подключение к Интернету в webview
- 28. Проверьте подключение к Интернету в Swift
- 29. Проверьте подключение к Интернету из Excel VBA
- 30. Проверьте подключение к Интернету при нажатии кнопки
Как вы узнаете, кто остановился? Кстати .. +1 за ваш ответ :) – TonyMkenu
'ReachableViaCarrierDataNetwork' &' ReachableViaWiFiNetwork' недоступны, статус может быть 'ReachableViaWWAN' или' ReachableViaWiFi'. – Hemang
после уведомления только он показывает, но это необходимо, прежде чем сеть изменится. как получить доступную сеть при вызове метода viewdidload .. – Bala