2013-12-03 1 views
0

У меня есть jailbroken устройство с 6.1.3 iOS. Также у меня есть инструмент командной строки, который должен давать мне координаты. Код, который касается местоположения, отлично работает с обычным приложением, но не в командной строке.CLLocationmanager setAuthorizationStatus не работает (джейлбрейк)

Я нашел подобный вопрос, но это не похоже на работу: Get GPS without alert view with ROOT permission(jailbreak)

- (void) start 
{ 
NSLog(@"Started"); 
if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorized) 
{ 
    NSLog(@"%i", [CLLocationManager authorizationStatus]); 
} 

//[locationManager setAuthorizationStatus:YES forBundleIdentifier:[[NSBundle mainBundle] bundleIdentifier]]; 
[CLLocationManager setAuthorizationStatus:YES forBundleIdentifier:[[NSBundle mainBundle] bundleIdentifier]]; 
NSLog(@"%@", [[NSBundle mainBundle] bundleIdentifier]); 
NSLog(@"%@", [[NSBundle mainBundle] bundlePath]); 
if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorized) 
{ 
    NSLog(@"%i", [CLLocationManager authorizationStatus]); 
} 

[locationManager startUpdatingLocation]; 

}

поэтому всегда необходимо войти 0 в состояние авторизации = kCLAuthorizationStatusNotDetermined.

Я также добавил пособия приложения с ldid после строительства с

com.apple.locationd.authorizeapplications 

ключа установлен верно. также были некоторые эксперименты с Info.plist, но все же

didUpdatedLocation 

никогда не запускается.

Заранее благодарен!

вот мой главный, если это необходимо:

#import <Foundation/Foundation.h> 
#import "locateClass.h" 

int main (int argc, const char * argv[]) 
{ 

    @autoreleasepool 
    { 
     // insert code here... 
     NSLog(@"Hello, World!"); 
     locateClass *loc = [[locateClass alloc] init]; 
     [loc start]; 
    } 
    return 0; 
} 

Также я использую iOSOpenDev

UPDATE:

Если я не использую info.plist, С помощью этого кода у меня есть это в консоли:

iPhone-AppServer Saimon[841] <Warning>: Hello, World! 
iPhone-AppServer Saimon[841] <Warning>: Started 
iPhone-AppServer Saimon[841] <Warning>: 1 
iPhone-AppServer Saimon[841] <Warning>: (null) 
iPhone-AppServer Saimon[841] <Warning>: /private/var/mobile/docs/fromMac/Debug-iphoneos 
iPhone-AppServer Saimon[841] <Warning>: 1 
iPhone-AppServer awdd[842] <Error>: libMobileGestalt copySystemVersionDictionaryValue: Could not lookup ReleaseType from system version dictionary 
iPhone-AppServer awdd[842] <Error>: CoreLocation: CLClient is deprecated. Will be obsolete soon. 

Если я - такой вывод:

iPhone-AppServer Saimon[854] <Warning>: Hello, World! 
iPhone-AppServer Saimon[854] <Warning>: Started 
iPhone-AppServer locationd[362] <Warning>: Launch Services: Registering unknown app identifier com.apple.xcode.dsym.Saimon failed 
iPhone-AppServer locationd[362] <Warning>: Launch Services: Unable to find app identifier com.apple.xcode.dsym.Saimon 
iPhone-AppServer Saimon[854] <Warning>: 0 
iPhone-AppServer Saimon[854] <Warning>: com.apple.xcode.dsym.Saimon 
iPhone-AppServer Saimon[854] <Warning>: /private/var/mobile/docs/fromMac/Debug-iphoneos 
iPhone-AppServer Saimon[854] <Warning>: 0 
iPhone-AppServer awdd[855] <Error>: libMobileGestalt copySystemVersionDictionaryValue: Could not lookup ReleaseType from system version dictionary 
iPhone-AppServer awdd[855] <Error>: CoreLocation: CLClient is deprecated. Will be obsolete soon. 
+0

Вы уверены, что '[[NSBundle mainBundle] bundleIdentifier]' возвращает вам идентификатор пакета? Как я правильно помню, он не работает с бинарными приложениями, потому что нет пакета, поэтому нет идентификатора пакета. Он работает с обычными приложениями, потому что они установлены как комплект. Попробуйте передать только некоторую строку, например '@" com.company.myapp ", как идентификатор пакета. Это то, что я делаю, когда хочу получить место в демоне. – creker

+0

Я установил файл Info.plist рядом с двоичным кодом, поэтому, когда я запускаю двоичный файл, у меня есть bundleId и состояние 0. Если я удалю Info.plist, то у меня нет пакета и идентификатора 1. Знаете ли вы, это компилятор предупреждение о setAuthorizationStatus: Метод класса '+ setAuthorizationStatus: forBundleIdentifier:' not found (тип возврата по умолчанию - 'id') в порядке? Я ничего не объявлял. – Dimson

+0

Да, это нормально. Был быстрый тест - он работает для меня. Используется тот же самый код, что и у вас, и получил статус «kCLAuthorizationStatusAuthorized» в качестве статуса. Не знаю, для 'didUpdateLocation', но свойство' location' содержит местоположение. – creker

ответ

0

Ну, я нашел не так просто обходным путем.

Шаг за шагом.

Чтобы авторизоваться, вы должны остановить процесс locationd, но killall -9 locationd вам не поможет. чтобы остановить его: launchctl unload /System/Library/LaunchDaemons/com.apple.locationd.plist

Затем отредактируйте /var/root/Library/Caches/locationd/clients.plist файл по этому пути:

Root 
    |__<your_bundleid> (Dictionary) 
     |__Whitelisted (Boolean) - NO 
     |__BundleId (String) - <yourBundleID> 
     |__Authorized (Boolean) - YES 
     |__Executable (String) - <path_to_your_binary> 
     |__Registered (String) - <path_to_your_binary> 

, а затем начать locationd:

launchctl load /System/Library/LaunchDaemons/com.apple.locationd.plist 

После это можно получить, но в инструменте линии comand didUpdatedLocations метод не запускается, и еще одна проблема: через минуту вы получите [CLLocationManager AuthenticationStatus], и вам нужно вручную отредактировать plist и удалить TimeMissing из вашего словаря bundleid.

Вот код работает для меня после самостоятельной регистрации:

while (1){ 
    CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [locationManager startUpdatingLocation]; 

    CLLocation *location = locationManager.location; 

    if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorized) 
    { 
     NSLog(@"%i", [CLLocationManager authorizationStatus]); 
     if([CLLocationManager authorizationStatus] == 2) 
     { 
      system("ps ax | grep locationd"); 
      system("launchctl unload /System/Library/LaunchDaemons/com.apple.locationd.plist"); 
      NSString* plistPath = [[NSString alloc] initWithString:@"/var/root/Library/Caches/locationd/clients.plist"]; 
      NSMutableDictionary* plist = [NSMutableDictionary dictionaryWithContentsOfFile: plistPath]; 
      NSMutableDictionary *myBundle = [plist objectForKey:[[NSBundle mainBundle] bundleIdentifier]]; 
      [myBundle removeObjectForKey:@"TimeMissing"]; 
      NSLog(@"Relaunching"); 
      [plist setObject:myBundle forKey:[[NSBundle mainBundle] bundleIdentifier]]; 
      [plist writeToFile:@"/var/root/Library/Caches/locationd/clients.plist" atomically:YES]; 
      system("launchctl load /System/Library/LaunchDaemons/com.apple.locationd.plist"); 
     } 

    } 

    NSLog(@"Coordinates are %f %f %f %f", 
      location.coordinate.latitude, 
      location.coordinate.longitude, 
      location.horizontalAccuracy, 
      location.verticalAccuracy); 

    if (location.coordinate.latitude == 0 && location.coordinate.longitude == 0) 
    { 
     NSLog(@"Nulss"); 
     system("launchctl unload /System/Library/LaunchDaemons/com.apple.locationd.plist"); 
     system("launchctl load /System/Library/LaunchDaemons/com.apple.locationd.plist"); 
    } 
    else 
    { 
     NSLog(@"Got IT"); 
     //[locationManager stopUpdatingLocation]; 
     //break; 
    } 
    sleep(10); 
} 

Проверено на iOS6 и iOS7.

+0

Это очень странно. Я использую 'setAuthorizationStatus: forBundleIdentifier:' у моих демонов, чтобы получить местоположение. Все работает на iOS 5-7. Для iOS4 я использую метод, аналогичный вашему. И я получаю события местоположения через метод 'didUpdatedLocations:'. Не имеет значения, это инструмент командной строки или нет. Я могу только думать об одном. У вас есть беговая панель в ваших приложениях? Очевидно, вы не получите никаких событий без него. И в случае инструмента командной строки вы должны запускать его самостоятельно. – creker

+0

Привет! Да у меня есть runLoop и я добавил таймер в него, что вызывает 'NSLog (@ "Координаты% F% F% F% F", location.coordinate.latitude, location.coordinate.longitude, location.horizontalAccuracy, место нахождения.verticalAccuracy); ' Он дает места, но didUpdateLocations не вызывает – Dimson

+0

Ознакомьтесь с моим обновлением здесь http://stackoverflow.com/questions/11086083/get-gps-without-alert-view-with-root-permissionjailbreak – creker

0

Как вы загружаете info.plist? потому что он не возвращается ...

Registering unknown app identifier com.apple.xcode.dsym.Saimon failed 
+0

я просто поместить его в каталог с двоичным – Dimson

+0

Это нормально, я вижу это в моих приложениях слишком – creker

+0

Попробуйте, если этого NSString * bundleIdentifier. = [[NSBundle mainBundle] bundleIdentifier] возвращает ваш идентификатор Bundle или null – user3025315