ユーザーがWIFIまたはセルラーデータ3Gまたは4Gを介してインターネットに接続しているかどうかをどのように確認できるのでしょうか。
また、ウェブサイトが到達可能かどうか、デバイス上にインターネットがあるかどうかを確認したいことを確認したくありません。私はインターネットを調べてみましたが、ウェブサイトが到達可能かどうかを確認するのはRechability
クラスを使用しているかどうかだけです。
ユーザーがアプリケーションを開いたときにインターネットに接続しているかどうかを確認したい
Objective-CでXcode6を使用しています
このコードを使用してインポートReachability.h
ファイル
if ([[Reachability reachabilityForInternetConnection]currentReachabilityStatus]==NotReachable)
{
//connection unavailable
}
else
{
//connection available
}
このリンクから最初に到達可能性クラスをダウンロードします。
Githubからの交換可能性
AppDelegate.hに到達可能性のインスタンスを追加
@property (nonatomic) Reachability *hostReachability;
@property (nonatomic) Reachability *internetReachability;
@property (nonatomic) Reachability *wifiReachability;
AppDelegateに到達可能性をインポートし、Appdelegate.mにこのコードをコピーして貼り付けます。
- (id)init
{
self = [super init];
if (self != nil)
{
//[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
NSString *remoteHostName = @"www.google.com";
self.hostReachability = [Reachability reachabilityWithHostName:remoteHostName];
[self.hostReachability startNotifier];
self.internetReachability = [Reachability reachabilityForInternetConnection];
[self.internetReachability startNotifier];
self.wifiReachability = [Reachability reachabilityForLocalWiFi];
[self.wifiReachability startNotifier];
}
return self;
}
このメソッドを共通クラスに追加します。
/*================================================================================================
Check Internet Rechability
=================================================================================================*/
+(BOOL)checkIfInternetIsAvailable
{
BOOL reachable = NO;
NetworkStatus netStatus = [APP_DELEGATE1.internetReachability currentReachabilityStatus];
if(netStatus == ReachableViaWWAN || netStatus == ReachableViaWiFi)
{
reachable = YES;
}
else
{
reachable = NO;
}
return reachable;
}
APP_DELEGATE1はAppDelegateのインスタンスであることに注意してください
/* AppDelegate object */
#define APP_DELEGATE1 ((AppDelegate*)[[UIApplication sharedApplication] delegate])
この方法を使用すると、アプリ内のどこからでもインターネット接続を確認できます。
これがWifiモードでのみネットワークに役立つことを願っています:
tils.h
#import <Foundation/Foundation.h>
@interface Utils : NSObject
+(BOOL)isNetworkAvailable;
@end
tils.m
+ (BOOL)isNetworkAvailable
{
CFNetDiagnosticRef dReference;
dReference = CFNetDiagnosticCreateWithURL (NULL, (__bridge CFURLRef)[NSURL URLWithString:@"www.Apple.com"]);
CFNetDiagnosticStatus status;
status = CFNetDiagnosticCopyNetworkStatusPassively (dReference, NULL);
CFRelease (dReference);
if ( status == kCFNetDiagnosticConnectionUp )
{
NSLog (@"Connection is Available");
return YES;
}
else
{
NSLog (@"Connection is down");
return NO;
}
}
//必要なクラスでこれを使用する
- (IBAction)MemberSubmitAction:(id)sender {
if([Utils isNetworkAvailable] ==YES){
NSlog(@"Network Connection available");
}
}
簡単です。次の方法でインターネット接続を確認できます。
-(BOOL)IsConnectionAvailable
{
Reachability *reachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [reachability currentReachabilityStatus];
return !(networkStatus == NotReachable);
}
インターネットに接続しているかどうかを確認するには、これを試してください
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:nil delegateQueue: [NSOperationQueue mainQueue]];
NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:headRequest
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
if (!error && response)
{
block([(NSHTTPURLResponse *)response statusCode] == 200);
}else{
block(FALSE);
}
}];
[dataTask resume];
「Reachability」は、ホストからの応答があるかどうかを検出しないため機能しません。クライアントがホストにパケットを送信できるかどうかを確認するだけです。そのため、WiFiネットワークに接続していて、WiFiのインターネットがダウンしているか、サーバーがダウンしている場合でも、到達可能性について「YES」が返されます。
より良い方法は、HTTP要求を試行し、応答を確認することです。
以下の例:
NSURL *pageToLoadUrl = [[NSURL alloc] initWithString:@"https://www.google.com/"];
NSMutableURLRequest *pageRequest = [NSMutableURLRequest requestWithURL:pageToLoadUrl];
[pageRequest setTimeoutInterval:2.0];
AFHTTPRequestOperation *pageOperation = [[AFHTTPRequestOperation alloc] initWithRequest:pageRequest];
AFRememberingSecurityPolicy *policy = [AFRememberingSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
[policy setDelegate:self];
currentPageOperation.securityPolicy = policy;
if (self.ignoreSSLCertificate) {
NSLog(@"Warning - ignoring invalid certificates");
currentPageOperation.securityPolicy.allowInvalidCertificates = YES;
}
[pageOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
internetActive = YES;
} failure:^(AFHTTPRequestOperation *operation, NSError *error){
NSLog(@"Error:------>%@", [error description]);
internetActive = NO;
}];
[pageOperation start];
唯一の問題は、上記のコードで述べたタイムアウトまでの遅延で「internetActive」が更新されることです。ステータスに基づいて動作するようにコールバック内でコーディングできます。
Swift 4.0&AlamoFire:
9月18日に投稿した答えは間違っています。インターネットではなくネットワークに接続されているかどうかを検出するだけです。 AlamoFireを使用した正しいソリューションは次のとおりです。
1)カスタムReachability Observerクラスを作成します。
import Alamofire
class ReachabilityObserver {
fileprivate let reachabilityManager = NetworkReachabilityManager()
fileprivate var reachabilityStatus: NetworkReachabilityManager.NetworkReachabilityStatus = .unknown
var isOnline: Bool {
if (reachabilityStatus == .unknown || reachabilityStatus == .notReachable){
return false
}else{
return true
}
}
static let sharedInstance = ReachabilityObserver()
fileprivate init () {
reachabilityManager?.listener = {
[weak self] status in
self?.reachabilityStatus = status
NotificationCenter.default.post(
name: NSNotification.Name(rawValue: ClickUpConstants.ReachabilityStateChanged),
object: nil)
}
reachabilityManager?.startListening()
}
}
2)アプリの起動時に初期化する
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
_ = ReachabilityObserver.sharedInstance
return true
}
3)アプリ内の任意の場所でこれを使用して、ビュー内などのオンラインがロードされたかどうか、またはアクションがいつ発生したかを検出します
if (ReachabilityObserver.sharedInstance.isOnline){
//User is online
}else{
//User is not online
}
Reachability* reachability = [Reachability reachabilityWithHostName:@"www.google.com"];
NetworkStatus internetStatus = [reachability currentReachabilityStatus];
if(remoteHostStatus == ReachableViaWWAN || remoteHostStatus == ReachableViaWiFi)
{
//my web-dependent code
}
else {
//there-is-no-connection warning
}
Alamofireライブラリ を使用:
let reachabilityManager = NetworkReachabilityManager()
let isReachable = reachabilityManager.isReachable
if (isReachable) {
//Has internet
}else{
//No internet
}
これを試して
到達可能性ファイルについては、このリンクを確認してください
このファイルを.mにインポートして、コードを記述します
//これはインターネット接続を確認するためです
BOOL hasInternetConnection = [[Reachability reachabilityForInternetConnection] isReachable];
if (hasInternetConnection) {
// your code
}
それが役に立てば幸い。