2012-03-21 20 views
24

Tôi đang sử dụng Khả năng hiển thị thành công để xác định trạng thái của mạng và được thông báo về các thay đổi (ví dụ: Reachability Guide for iOS 4).Làm cách nào để nhận Thông báo khả năng hiển thị trong iOS trong nền khi xóa mạng Wi-Fi?

Câu hỏi của tôi không phải là cách đạt được Khả năng hiển thị và chạy, mà đúng hơn là như sau.

My AppDelegate xử lý nội dung Khả năng hiển thị. Ứng dụng nhận được thông báo (kReachabilityChangedNotification) trong khi ứng dụng đang chạy và khi ứng dụng ở trong nền (applicationDidEnterBackground:).

Ứng dụng được thiết kế để tải lại luồng âm thanh phát khi nhận thấy rằng nó bị mất kết nối Wi-Fi, ví dụ: Để kiểm tra, tôi bật và tắt Wi-Fi trong Cài đặt và mọi thứ hoạt động hoàn hảo. Trong thử nghiệm trong thế giới thực, tôi thường mất kết nối Wi-Fi khi tôi thoát khỏi phạm vi của điểm truy cập. Tôi đã thấy rằng Reachability không giúp tôi quá nhiều trong trường hợp này. Tôi không chắc liệu đó có phải là do thông báo khả năng hiển thị không đi qua khi màn hình bị khóa hoặc nếu khả năng hiển thị không xử lý tín hiệu giảm chậm từ điểm truy cập Wi-Fi ngày càng xa, nhưng bất kể tôi không thể hình tại sao thử nghiệm trong thế giới thực không phù hợp với trường hợp lý tưởng.

Đây là mã của tôi. đầu tiên tôi được thành lập để nhận thông báo, và bắt đầu nghe reachability:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    // check for internet connection 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(checkNetworkStatus:) 
               name:kReachabilityChangedNotification object:nil]; 

    // Set up Reachability 
    internetReachable = [[Reachability reachabilityForInternetConnection] retain]; 
    [internetReachable startNotifier];  

    .... 

    return YES; 
} 

và sau đó, đây là chức năng mà phản ứng với những thay đổi về khả năng kết nối:

- (void)checkNetworkStatus:(NSNotification *)notice { 
    // called after network status changes 

    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; 
    switch (internetStatus) 
    { 
     case NotReachable: 
     { 
      NSLog(@"The internet is down."); 
      break; 
     } 
     case ReachableViaWiFi: 
     { 
      NSLog(@"The internet is working via WIFI"); 
      break;    
     } 
     case ReachableViaWWAN: 
     { 
      NSLog(@"The internet is working via WWAN!"); 
      break;    
     } 
    }  
} 

Các thông báo đi qua ngay cả khi ứng dụng ở chế độ nền, nhưng chúng không có trong thử nghiệm trong thế giới thực được mô tả ở trên.

Cảm ơn bạn đã được trợ giúp.

+0

Bạn đã thử kết hợp 'reachabilityForInternetConnection' và' reachabilityForLocalWifi' chưa? –

+0

Bạn có tìm thấy giải pháp cho việc này không? Tôi đang gặp một vấn đề tương tự, và các giải pháp ở đây dường như không giúp đỡ hoặc không phải là những gì tôi đang tìm kiếm. – newenglander

+0

Tôi không biết rằng tôi đã từng giải quyết vấn đề cụ thể của mình, vì gần đây tôi không cần phải làm việc với dự án đó. Bạn đã chắc chắn rằng ứng dụng đang chạy trong nền với một tác vụ nền, theo khuyến nghị của @ Hurden? –

Trả lời

5

Theo mặc định trong ứng dụng trạng thái nền chỉ trong một thời gian ngắn, hầu hết các ứng dụng sẽ chuyển sang trạng thái bị tạm ngưng ngay sau đó. Điều đó có nghĩa là ứng dụng ở chế độ nền nhưng không thực thi mã. Vì vậy, thông báo triển khai tùy chỉnh của bạn không hoạt động. Phải requery NetworkReachability tại Wakeup Time in methodes đại biểu ứng dụng:

applicationWillEnterForeground: 
applicationDidBecomeActive 
1

Tôi đã làm việc trên một ứng dụng VoIP, mà được khởi động ở chế độ nền khi khởi động iPhone lên, lúc này có thể có không reachability mạng (ví dụ nếu điện thoại có cả mã khóa và/hoặc thẻ SIM có mã PIN). Nhưng kể từ khi ứng dụng được khởi chạy trực tiếp trong nền, phương thức ủy nhiệm applicationDidEnterBackground: không được gọi. Thay vào đó, những gì tôi đã làm là sử dụng ý tưởng của @ Hurden trực tiếp trong application:didFinishLaunchingWithOptions, kiểm tra applicationState để xem ứng dụng có thực sự bắt đầu ở chế độ nền hay không. Điều này cho phép ứng dụng của tôi nhận được thông báo kReachabilityChangedNotification sau khi điện thoại được mở khóa (cho phép WiFi kết nối bằng mật khẩu đã lưu trữ).

Các vấn đề liên quan