Как использовать MKLocationManager (частный API) в iOS - PullRequest
3 голосов
/ 19 июня 2011

Мне нужно позвонить

[[MKLocationManager sharedLocationManager] _applyChinaLocationShift:newLocation]

в моем приложении для iOS.

Я считаю, MKLocationManager - это закрытый класс, и, похоже, нет файла MapKit / MKLocationManager.h.

Я не нацеливаюсь на App Store. Можно ли как-нибудь использовать этот закрытый API?

Обновление в 2011-6-23

Мне действительно нужен ответ, или я могу деактивировать iOS SDK?

100 репутации - это почти все, что у меня есть. Пожалуйста, помогите мне.

Ответы [ 2 ]

10 голосов
/ 23 июня 2011

Если приведенный выше ответ не работает для вас, это может быть потому, что весь класс является закрытым (включая его заголовок).Вот альтернативный подход, использующий некоторые хитрости во время выполнения;Вы должны быть уверены, что подпись верна, но мы можем использовать некоторое защитное кодирование, чтобы избежать сбоя.

Во-первых, если вы не вызываете это только один раз, я бы завернул код в вспомогательный метод:1003 *

// in some header file, you may want to give the method a prefix too
CLLocation *ApplyLocationManagerChinaLocationShift(CLLocation *newLocation);

Теперь вы можете использовать NSClassFromString для получения ссылки на класс и performSelector для выполнения метода.Мы можем сначала попытаться убедиться, что метод существует, чтобы быть в безопасности:

CLLocation *ApplyLocationManagerChinaLocationShift(CLLocation *newLocation)
{
  id sharedLocationManager = [NSClassFromString(@"MKLocationManager") performSelector:@selector(sharedLocationManager)];

  SEL theSelector = @selector(_applyChinaLocationShift:);

  // this will ensure sharedLocationManager is non-nil and responds appropriately
  if (![sharedLocationManager respondsToSelector:theSelector]) {
    return nil; // fail silently - check this in the caller
  }
  return [sharedLocationManager performSelector:theSelector withObject:newLocation];
}

Я не запускал приведенный выше код, но он должен сработать.Если по какой-то причине вызовы @selector() не работают (я думаю, что они должны), то вы можете заменить их на вызовы NSSelectorFromString().

1 голос
/ 19 июня 2011

Вы можете просто создать описание метода самостоятельно, по сути, создав собственную категорию в MKLocationManager. Определяя, как выглядит приватный метод, вы делаете его вызываемым. Но вы должны быть уверены в его подписи, потому что если вы выключены, ваше приложение просто рухнет.

Эта категория может быть помещена в ее собственный файл .h или если вы используете его только в одном месте прямо над @ реализацией.

@interface MKLocationManager (china)
- (CLLocation *)_applyChinaLocationShift:(CLLocation *)newLocation;
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...