5

アプリに到達可能性を実装しようとしています。私はそれを持っていapplicationDidFinishLaunchingます。接続が非常に悪く、アプリを起動すると、到達可能性に永遠に時間がかかり、The application failed to launch in timeエラーメッセージが表示されてアプリがクラッシュすることがよくあります。

そこで、代わりに、Reachabilityの呼び出しをバックグラウンドスレッドに入れてみました。しかし、これを行うと、到達可能性の通知を受信しなくなります。

Reachabilityはどこに電話すればよいですか?

編集

以下の提案に従ってTonyMillionsの到達可能性コードを追加しましたが、application failed to load in timeネットワークの状態が非常に悪い場合でも同じエラーが発生します。私が見ているものを再現するには、Settings.app-> Developer-> Network Link Conditionerに移動し、オンにして100%の損失に設定します。

アプリはまだその状態で読み込まれますか?

4

3 に答える 3

2

GithubでTonyMillions到達可能性プロジェクトを使用します。

https://github.com/tonymillion/Reachability

次に、アプリのデリゲートで、applicationdidfinishlaunchingを入力しました。

self.reachability = [Reachability reachabilityForInternetConnection];

[self.reachability startNotifier];

その後、ステータスが変更されると、これが呼び出されます

#pragma mark - Reachability

- (void)reachabilityChanged:(NSNotification *)note {

    NetworkStatus ns = [(Reachability *)[note object] currentReachabilityStatus];

    if (ns == NotReachable) {

        if (![self.networkAlert isVisible]) {

            if ([self networkAlert] == nil) {

                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"\n\nNo Internet Connection" message:@"You require an internet connection to communicate with the server." delegate:nil cancelButtonTitle:nil otherButtonTitles:nil];
                [self setNetworkAlert:alert];
            }

            [self.networkAlert show];  
        }
    } else {

        if ([self networkAlert] != nil) {

            [self.networkAlert dismissWithClickedButtonIndex:0 animated:YES]; 
        }
    }
}
于 2012-11-07T15:14:16.407 に答える
0

その代わりに、Reachabilityの呼び出しをバックグラウンドスレッドに入れました。しかし、これを行うと、到達可能性の通知を受信しなくなります。

Reachabilityの呼び出しをバックグラウンドスレッドに配置する場合は、バックグラウンド実行ループでReachabilityをスケジュールし、バックグラウンドスレッドrunloopが実行されていることを確認する必要があります。

バックグラウンドスレッドで実行される:

  1. 到達可能性オブジェクトを作成し、

    到達可能性*到達可能性=[到達可能性reachabilityWithHostName:@ "www.google.com"];

  2. [到達可能性startNotifier];

  3. [[NSRunLoopcurrentRunLoop]実行];

これは機能する可能性がありますが、メインスレッドで通知機能をスケジュールすることをお勧めします。

于 2012-11-06T06:37:20.580 に答える
0

TonyMillionは、GitHubでこれを解決するのに役立ちました。

彼の到達可能性の置き換えを使用している場合、あなたがしなければならないのは、次のstartNotifierように呼び出しをラップすることだけです。

dispatch_async(dispatch_get_global_queue(0,0), ^{
    [self.internetReach startNotifier];
});

悪いネットワーク状態でもアプリの起動に失敗することはなく、メインスレッドで通知を受け取ることができます。

于 2012-11-16T05:49:55.270 に答える