2014-10-14 15 views
8

Mimo że moja aplikacja może być używana bez żadnego połączenia z Internetem, może wymieniać dane z serwerem WWW (w celu wyświetlenia statystyk użytkownika). Dlatego reklamuję aplikację jako "nie wymaga połączenia z Internetem". Niektórzy użytkownicy wyłączyli komórkową transmisję danych dla mojej aplikacji, co powinno być całkiem w porządku. Ale kiedy moja aplikacja próbuje wymieniać dane, użytkownicy ci są podsłuchiwani przez "Dane komórkowe są wyłączone dla [Nazwa aplikacji]". dialog.Jak sprawdzić, czy użytkownik wyłączył komórkową transmisję danych dla mojej aplikacji?

Jest to uciążliwe dla nich i chcę zapobiec tym dialogom i po prostu pomijam całą wymianę danych.

Istnieje Apple's Reachability Sample Code.

Mimo że wyłączyłem Wi-Fi dla całego urządzenia i komórkowej transmisji danych dla aplikacji, osiągalność potwierdza pozytywne połączenie internetowe. Mówiąc dokładniej, niezależnie od tego, czy aktywowałem komórkową transmisję danych, czy też nie, generowana jest pod tym kątem informacja. Oczywiście, gdy dane komórkowe są wyłączone, żadne połączenie internetowe nie jest faktycznie dostępne, więc wymiana danych nie powiedzie się. Ale i tak użytkownik jest wyposażony w okno dialogowe danych komórkowych.

Czy istnieje sposób na sprawdzenie, czy połączenie internetowe jest dostępne na iOS 7 i iOS 8, biorąc pod uwagę ustawienia danych komórkowych dla konkretnej aplikacji - wszystko to bez ciągłego monitowania użytkownika za pomocą okna danych sieci komórkowej?

Moja aplikacja jest obecnie dostarczana bez panelu ustawień, dlatego chcę uniknąć przełączania się (drugi, w aplikacji) "Nie korzystaj z komórkowej transmisji danych". Ponadto nie chcę ograniczać wymiany danych do połączenia Wi-Fi, ponieważ jest to tylko 2 KB danych na sesję, co nie jest dużym problemem dla większości użytkowników.

Odpowiedz

2

Myślę, że jedyną obsługiwaną metodą w iOS8 jest wysłanie Ping'a na znany serwer i kilkakrotne bugowanie użytkownika za pomocą panelu alertów. W systemie iOS 8 program Apple wyświetla panel tylko dwa razy, a następnie pomija go nawet po ponownym uruchomieniu aplikacji. Może później pojawi się kolejny dzień. (Jest to bardzo zła wiadomość dla aplikacji ad-obsługiwane.)

Apple mówi (https://devforums.apple.com/message/1059332#1059332):

Kolejny deweloper napisał do DTS, a więc miałem szansę zbadać to dogłębnie. Niestety, wiadomości są takie, jak się spodziewałem: nie ma obsługiwanego sposobu wykrywania, że ​​Twoja aplikacja jest w tym stanie. Nie ma też sposobu na nawiązanie połączenia sieciowego "bez interakcji użytkownika", tzn. Zażądanie połączenia nieudostępnionego zamiast obecnego, takiego jak .

Poniższe artykuły sugerują sposoby wykorzystania Ping:

http://www.splinter.com.au/how-to-ping-a-server-in-objective-c-iphone/

http://elbsolutions.com/projects/reachability-with-simpleping-wrapper/

0

Spróbuj użyć tego git project.

Jak zainstalować można zobaczyć wewnątrz Readme na git. Użyłem także dispatch_once, aby upewnić się, że Zasięg będzie inicjowany tylko jeden raz. Ten typ dispatch jest czasem bardzo przydatny!

Definiowanie zmiennej w klasie

BOOL _online = NO; 

Inicjalizacja zmienna

static dispatch_once_t predicate; 
    dispatch_once(&predicate, ^{ 
     Reachability *reach = 
      [Reachability reachabilityWithHostname:gameApiHost]; 
     reach.reachableBlock = ^(Reachability*reach) { 
      NSLog(@"REACHABLE!"); _online = YES; 
     }; 
     reach.unreachableBlock = ^(Reachability*reach) { 
      NSLog(@"UNREACHABLE!"); _online = NO; 
     }; 
     [reach startNotifier]; 
    }); 
+2

osiągalności nie działa, zgłasza niepoprawnie "osiągalny". – cat

Powiązane problemy