2

AppDelegate でクラス A からセレクターを実行しようとしています。

ユーザーがアプリを購入した直後に、すべてのコンテンツを一度にダウンロードし、それらをキャッシュして後で読むように求めるアラートを設定しました。

私はクラスAに正確なものを持っていますが、それは本当にうまくいっています。

今、私が最初の起動時にそれをしようとすると、到達可能性は私がオフラインであると言いますが、実際にはオンラインです.

コンテンツは WiFi 経由でのみダウンロードでき、3G (データ プランの節約) ではダウンロードできませんが、自分の WiFi ネットワークにいる場合でもオフラインと表示されます。

App Delegate で次のコードを使用しています。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{   
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if (![defaults objectForKey:@"mainLaunch"]){
    [self performSelector:@selector(askForDownloadContentsAtFirstStart) withObject:nil afterDelay:0.5];
    [defaults setObject:[NSDate date] forKey:@"mainLaunch"];


    //...
    }


-(void)askForDownloadContentsAtFirstStart{
    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Download contents" message:@"blahblahblah" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]autorelease];
    [alert show];
}


-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 0){
        [alertView dismissWithClickedButtonIndex:0 animated:YES];
    }else{
        aVc = [[AViewController alloc]init];
        [aVc performSelector:@selector(offlineDownload:)];
    }
}

そして、私のAVCの次のもの:

- (void)viewWillAppear:(BOOL)animated
{
    internetReachable = [[Reachability reachabilityForInternetConnection] retain];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(offlineDownload:)
                                                 name:kReachabilityChangedNotification object:nil];
}

    - (IBAction)offlineDownload:(id)sender{
        UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Warning!" message:@"Blahblahblah" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]autorelease];
        [alert show];
    }


    -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
        if (buttonIndex == 0){
            [alertView dismissWithClickedButtonIndex:0 animated:YES];
        }
        else{
            NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
            switch (internetStatus) {
                case NotReachable:
                {
                   NSLog(@"Offline");
                }
                case (ReachableViaWWAN):
                {
                    NSLog(@"3G");
                }
                case (ReachableViaWiFi):{
                    HUD = [[MBProgressHUD showHUDAddedTo:key_Window animated:YES]retain];
                    HUD.delegate = self;
                    HUD.dimBackground = YES;
                    HUD.labelText = NSLocalizedString(@"Connecting",@"Connecting...");
                    NSURL *URL = [NSURL URLWithString:NSLocalizedString(@"plistUrl",@"")];
                    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
                    [request addValue:@"" forHTTPHeaderField:@"Accept-Encoding"];
                    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
                    [connection start];
                    [connection release];
                    break;
                }

                default:
                    break;
            }

        }
    }

この問題は再び発生しましたが、internetReachable を保持することで解決しました。今、それはうまくいかないようです!

何か案が?

4

2 に答える 2

3

kReachabilityChangedNotification次のように、通知のオブザーバーを追加できます。

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];

そして通知機能を起動します:

[[Reachability reachabilityForLocalWiFi] startNotifier];

また、通知リスナーで、wifi が利用可能かどうかをテストできます。

- (void) reachabilityChanged: (NSNotification* )note
{
    Reachability* curReach = [note object];
    NetworkStatus netStatus = [curReach currentReachabilityStatus];
    if(netStatus == ReachableViaWiFi) {
        // wifi available
        [self askForDownloadContentsAtFirstStart];
    }
}
于 2012-10-25T01:34:03.223 に答える
1

アプリの起動直後は、到達可能性が正しいとは限りません。私たちの解決策は、通知を監視し、接続の成功が報告されるまで待ってから、そこから物事を処理することでした.

私たちのアプリはまた、 internetReachableでstartNotifierを呼び出し、-(void)reachabilityChanged:(NSNotification )theNotification* コールバックで到達可能性を記録します。これは、現在の到達可能性を確認できるマネージャー クラスで行います。また、到達可能性が変化したときに、(必要に応じて) アプリの残りの部分に通知を送信することもできます。

于 2012-10-24T15:29:06.093 に答える