iOS MKMapItem — как получить доступ ко всем участникам?

Я использую MapKit для локального поиска, который возвращает один или несколько объектов MKMapItem. Но есть члены объекта, которые я вижу в отладчике, но не могу получить к ним доступ. Мне особенно нужен UID.

Я попробовал item.placemark, но он не позволяет мне получить доступ к UID. Кажется, это должно быть очень просто. Что мне здесь не хватает?

Это не работает: NSString *uid = item.placemark.UID

Это не работает:

NSDictionary *mapItemDictionary = (NSDictionary *)item;
NSString *uid = [mapItemDictionary objectForKey:@"UID"];

Но пункт po команды отладчика показывает мне все члены объекта:

Name: Shell CurrentLocation: 0 Place: <GEOPlace: 0x17014e650> 
{
address =     {

business =     (
            {
        **UID = 2478578482074921045**;
        URL = "www.shell.com";
        canBeCorrectedByBusinessOwner = 1;
        name = Shell;
        source =             (
                            {
                "source_id" = A3H0281540;
                "source_name" = "acxiom_us";
            },
                            {
                "source_id" = 2276257;
                "source_name" = localeze;
            }
        );
        telephone = "+14803968213";
    }
);

Любая помощь в этом будет оценена по достоинству. Вот код, который я использую:

MKLocalSearch *localSearch = [[MKLocalSearch alloc] initWithRequest:request];
[localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error)
 {

      [response.mapItems enumerateObjectsUsingBlock:^(MKMapItem *item, NSUInteger idx, BOOL *stop)
      {

          MKPlacemark *placemark = (MKPlacemark *)item.placemark;
          NSDictionary *addressDict = placemark.addressDictionary;
          NSArray *businessArray = addressDict[@"business"];// businessArray is NIL

          NSString *uid=nil;

          if (businessArray != nil && businessArray.count >0) {
              NSDictionary *businessDict=businessArray[0];
              uid=businessDict[@"UID"];
          }

          NSLog(@"UID is %@",uid);

 }];

person user2048907    schedule 19.06.2014    source источник


Ответы (1)


Итак, после долгих копаний кажется, что информация находится в паре частных объектов. Свойство «место» — это GEOPlace, и у него есть свойство business, представляющее собой массив, содержащий объект GEOBusiness. Поскольку это частные данные, вы не можете получить к ним доступ напрямую через свойства, но вы можете получить их с помощью кодировки ключ-значение. Следующий код извлекает UID:

[response.mapItems enumerateObjectsUsingBlock:^(MKMapItem *item, NSUInteger idx, BOOL *stop) {

    NSValue *place = [item valueForKey:@"place"];
    NSArray *businessArray = (NSArray *)[place valueForKey:@"business"];

    NSNumber *uid=nil;

    if (businessArray != nil && businessArray.count >0) {
         id geobusiness=businessArray[0];
         uid=[geobusiness valueForKey:@"uID"];
    }

    NSLog(@"UID is %@",[uid stringValue]);

 }];

Поскольку это частные структуры данных, нет гарантии, что они не изменятся. Я также не уверен, будет ли процесс проверки магазина приложений помечать это как частный доступ к API. Поскольку он использует valueForKey, я не думаю, что это произойдет, но нет никаких гарантий.

person Paulw11    schedule 19.06.2014
comment
К сожалению, это не работает. businessArray возвращает ноль. - person user2048907; 19.06.2014
comment
У кого-нибудь еще есть предложение? Я сделал небрежное предположение, что смогу получить доступ к UID результата бизнес-поиска, и основывал свою схему базы данных на этом предположении. Удивительно, что никто больше не пытался это сделать. - person user2048907; 19.06.2014
comment
Данные есть, вам просто нужно изучить их. Вы можете использовать отладчик. Если вы поделитесь дополнительным кодом, показывающим, как вы извлекаете метку, я могу запустить код самостоятельно и обновить ответ. - person Paulw11; 20.06.2014
comment
Я отредактировал свой ответ - мне пришлось копаться в структурах данных, используя среду выполнения objc. - person Paulw11; 20.06.2014