Pytanie Dokładne odczytywanie siły sygnału iPhone'a


Jest już kilka pytań na ten temat, ale nic w nich nie wydaje się dostarczać dokładnych wyników. Muszę ustalić, czy telefon jest w danej chwili podłączony do sieci komórkowej.

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Reference/CTCarrier/Reference/Reference.html

Ta klasa wydaje się być niepoprawnie udokumentowana, zwracając wartości dla mobileCountryCode, isoCountryCode i mobileNetworkCode, w przypadku gdy żadna karta SIM nie jest zainstalowana w telefonie. carrierName wskazuje sieć "macierzystą" lub poprzednią sieć domową, jeśli telefon został odblokowany.

Spojrzałem w górę i znalazłem kilka osób, które twierdzą, że następujące do pracy, które używają nieudokumentowanej metody z CoreTelephony, ale wyniki były dla mnie bezużyteczne, zgłaszając pozornie przypadkowe liczby, gdzie być może sama się nie aktualizuje.

-(int) getSignalStrength
{
    void *libHandle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);
    int (*CTGetSignalStrength)();
    CTGetSignalStrength = dlsym(libHandle, "CTGetSignalStrength");
    if( CTGetSignalStrength == NULL) NSLog(@"Could not find CTGetSignalStrength");
    int result CTGetSignalStrength();
    dlclose(libHandle);
    return result;
}

Dzięki.

Edytuj: aplikacja jest połączona z wewnętrzną siecią Wi-Fi i musi pozostać taka, utrudniając kontrolę zasięgu.


10
2018-01-30 12:41


pochodzenie


Nie działa IOS 8.3, pomóż mi - vualoaithu
Nie działa również w systemie iOS 8.4. Czy jest jakiś inny sposób? - iKT


Odpowiedzi:


Gram z tą funkcją i zauważyłem, że nazywasz to w ciekawy sposób. Nazywam to, dodając CoreTelephony.framework jako link do kompilacji. Dla samej funkcji, będziesz chciał zadeklarować gdzieś jej prototyp (być może tuż nad metodą, z której dzwonisz):

int CTGetSignalStrength();

To musi być zadeklarowane, ponieważ nie znajduje się w publicznym nagłówku dla CoreTelephony.

Teraz zbudowałem prostą aplikację, która co sekundę drukuje siłę sygnału.

int CTGetSignalStrength();

- (void)viewDidLoad
{
    [super viewDidLoad];

    while (true) {
        printf("signal strength: %d\n", CTGetSignalStrength());
        sleep(1);
    }
}

Uruchomiłem go na iPadzie mini i pokazuje stabilne wartości, dopóki nie podniosłem go, gdzie liczba wzrosła. Opakowanie mojego iPada w folię aluminiową (folia cynowa to narzędzie do debugowania, którego nigdy wcześniej nie używałem) spowodowało, że liczba ta spadła. Po umieszczeniu mojego iPada w trybie samolotowym powtarzała ostatnią wartość, więc nie będzie to dla ciebie dokładna miara.

Jeśli chcesz przetestować, czy urządzenie ma aktualnie komórkowe połączenie z siecią danych, możesz być bardziej zainteresowany Osiągalność, konkretnie kSCNetworkReachabilityFlagsIsWWAN.


9
2018-01-30 13:03



Dzięki, ta strona osiągalności może być krokiem naprzód, choć nie działa od razu. Problem polega na tym, że wdrażamy aplikację przez ograniczone wifi, które musi pozostać połączone, a więc stracić możliwość sprawdzenia łączności połączenia danych. iphonedevsdk.com/forum/iphone-sdk-development/...To może pomóc, jeśli mogę poprosić telefony, aby korzystać z wifi tylko dla pewnych rzeczy. - stevepkr84
@wjl, Dzięki za twój post, mam jedną wątpliwość, jak to jest tylko działa dla danych komórkowych lub jesteśmy w stanie zdobyć moc Wifi też? Muszę ograniczyć użycie, jeśli połączenie jest słabe. - iKT


Ok Myślę, że mam teraz poprawne rozwiązanie, które w końcu było nieco prostsze.

Problem z metodą CTGetSignalStrength () polega na tym, że działa normalnie, ale jeśli usuniesz sim, zgłasza ostatni sygnał przed usunięciem. Znalazłem inną metodę w tym samym frameworku o nazwie CTSIMSupportGetSIMStatus (), również nieudokumentowaną, która może powiedzieć, czy karta SIM jest aktualnie połączona. Używanie obu w następujący sposób powinno potwierdzać bieżący sygnał sieciowy.

Najpierw zadeklaruj metody:

NSString * CTSIMSupportGetSIMStatus();
int CTGetSignalStrength();

Następnie sprawdź łączność z siecią komórkową, jak na przykład:

NSString *status = CTSIMSupportGetSIMStatus();
int signalstrength = CTGetSignalStrength();
BOOL connected = ( [status isEqualToString: @"kCTSIMSupportSIMStatusReady"] && signalstrength > 0 );

5
2018-01-31 16:29



Czy to działa, aby wykryć tryb samolotowy? Prywatne interfejsy API są z jakiegoś powodu prywatne. - wjl
Nie można było przyjąć trybu samolotowego za pomocą tego, ponieważ nie można było rozróżnić między brakiem sygnału, w którym zainstalowana jest karta SIM, a ustawionym trybem, więc trzeba spojrzeć na coś innego. Pewne wartości klasy CTCarrier powinny zwracać zero, gdy telefon jest w trybie samolotowym, ale spodziewam się, że to nie zadziała, dopóki telefon nie zostanie ponownie uruchomiony. - stevepkr84
Próbowałem Twojego kodu, ale nie rozumiem jego wartości. Czy wiesz, co właściwie oznacza ta liczba? - brianestey
Masz na myśli signalstrength? To powinno dać ci siłę sygnału. Nie jestem pewien, jaki jest zasięg, jednak 0 z pewnością nie jest sygnałem. Jest to jednak niewiarygodne i trzeba sprawdzić, czy stan karty SIM jest już gotowy, dlatego też połączyłem ją z inną funkcją w funkcję bool, aby sprawdzić, czy mamy sygnał. - stevepkr84
nie działa z IOS 8.3, pomóż mi proszę - vualoaithu