2014-10-14 7 views
8

Obwohl meine App ohne Internetverbindung verwendet werden kann, kann sie Daten mit einem Webserver austauschen (um einige Benutzerstatistiken anzuzeigen). Also mache ich Werbung für die App als "benötigt keine Internetverbindung". Einige Benutzer haben daraufhin Mobilfunkdaten für meine App deaktiviert, was völlig in Ordnung sein sollte. Wenn meine App versucht, Daten auszutauschen, werden diese Benutzer jedoch mit dem Hinweis "Mobilfunkdaten sind deaktiviert für [Anwendungsname]" abgehört. Dialog.Wie kann ich feststellen, ob der Nutzer die Mobilfunkdaten für meine App deaktiviert hat?

Das ist ein Ärgernis für sie, und ich möchte diese Dialoge verhindern und einfach die gesamte Datenaustausch Sache überspringen.

Es gibt Apple's Reachability Sample Code.

Aber obwohl ich WiFi für das gesamte Gerät und Mobilfunkdaten für die App ausgeschaltet habe, bestätigt Erreichbarkeit eine positive Internetverbindung. Um genauer zu sein, es berichtet

Reachability Flag Status: WR t------ networkStatusForFlags 

egal, ob ich Mobilfunkdaten aktiviert oder nicht. Wenn Mobilfunkdaten deaktiviert sind, ist natürlich keine Internetverbindung verfügbar, so dass der Datenaustausch fehlschlägt. Aber dem Benutzer wird sowieso der Mobilfunkdaten-Dialog angezeigt.

Gibt es eine Möglichkeit festzustellen, ob eine Internetverbindung unter iOS 7 und iOS 8 verfügbar ist, unter Berücksichtigung der Mobilfunkdaten für eine bestimmte App - ohne den Benutzer jedes Mal erneut mit dem Mobilfunkdaten-Dialog zu belästigen?

Meine App wird derzeit ohne Einstellungsfenster ausgeliefert. Daher möchte ich die Einrichtung eines (zweiten, In-App-) Schalters "keine Mobilfunkdaten verwenden" vermeiden. Außerdem möchte ich den Datenaustausch nicht auf eine WiFi-Verbindung beschränken, da es nur 2 KB Daten pro Sitzung gibt, was für die meisten Benutzer keine große Sache ist.

Antwort

2

Ich denke, der einzige unterstützte Weg in iOS8 ist es, einen Ping an einen bekannten Server zu senden und den Benutzer mit dem Alarmpanel ein paar Mal zu stören. Auf iOS8 zeigt Apple das Panel nur zweimal an und überspringt es dann, selbst wenn die App neu gestartet wird, vielleicht wird es einen Tag später wieder erscheinen. (Dies ist wirklich eine schlechte Nachricht für Ad-gestützte Anwendungen.)

Apple sagt (https://devforums.apple.com/message/1059332#1059332):

Ein anderer Entwickler in DTS schrieb und so hatte ich eine Chance, dies in der Tiefe untersuchen. Leider sind die Nachrichten so, wie ich es erwartet habe: Es gibt keinen unterstützten Weg, um zu erkennen, dass sich deine App in diesem Zustand befindet. Noch gibt es eine Möglichkeit, eine Netzwerkverbindung "keine Benutzerinteraktion" zu machen, das heißt, fordern Sie an, dass die Verbindung statt UI wie dies als Fehler schlägt.

Die folgenden Artikel vorschlagen, wie ping zu verwenden:

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

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

0

Versuchen Sie, diese git project.

mit Wie Sie auf git in der Readme-Datei sehen installieren. Ich habe auch dispatch_once verwendet, um sicherzustellen, dass die Erreichbarkeit nur einmal initialisiert wird. Dieser dispatch Typ ist manchmal sehr nützlich!

definieren Variable in Klasse

BOOL _online = NO; 

initialisieren die Variable

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

Erreichbarkeits nicht, es meldet falsch "erreichbar" funktioniert. – cat