Как создать проект xcode с несколькими целями для разных платформ (iPhone и Mac OS X)? - PullRequest
8 голосов
/ 29 января 2010

Я написал пару приложений Core Data для iPhone, и у меня возникла постоянная проблема, которая, как я ожидаю, станет общей моделью для разработки iPhone. А именно, у меня есть один или несколько загрузчиков данных командной строки для создания базы данных Core Data, а затем у меня есть приложение для iPhone. Поскольку файлы моделей являются общими и загрузчики являются неотъемлемой частью проекта, я хочу, чтобы это был один проект.

Каков правильный подход к созданию проекта с целью iPhone OS и целью командной строки? Все мои попытки не сработали - у меня проблемы с подписью кода, отладкой и настройкой.

Вот моя лучшая попытка:

  • Создание проекта iPhone
  • Добавить новую цель Cocoa Shell Tool
  • Измените базовый SDK на «Текущая Mac OS» в конфигурации сборки цели

На данный момент у меня нет исполняемого файла. (Напротив, если вы создаете новый проект служебной программы командной строки, исполняемый файл автоматически связывается с вашей целью.)

Если я создаю пользовательский исполняемый файл, у меня возникает несколько проблем: (1) изменение цели не приводит к изменению исполняемого файла, поскольку вы не можете связать пользовательский исполняемый файл с целью, (2) отладка программы командной строки проблематично, потому что точки останова, установленные в XCode, не регистрируются (шевроны в номерах строк становятся оранжевыми при отладке исполняемого файла), поэтому мне нужно взломать работающий код и затем вручную выполнить отладку с консоли, (3) наиболее разочаровывающе, если я создаю правильно подготовленную версию дистрибутива своего приложения для iPhone, то перенос приложения iPhone на устройство завершается неудачно с жалобой на то, что профиль обеспечения не совпадает с правом подписи кода. Это определенно не тот случай, потому что я установил профиль обеспечения и файл разрешений для только дистрибутивной версии цели iPhone, но независимо от того, насколько сложно, я не могу установить цель на устройствах. (Если я создаю новый проект с идентичным кодом и подписью кода с помощью инструмента командной строки, тогда я могу установить подготовленное приложение AdHoc.)

Итак ... есть какой-то другой шаблон, которому я должен следовать? Конфигурации XCode являются серьезным вуду.

Ответы [ 4 ]

2 голосов
/ 03 февраля 2012

ОК, я думаю, что ваша проблема должна быть пересмотрена.

Как вы упомянули:

А именно, у меня есть один или несколько загрузчиков данных командной строки для создания базы данных Core Data

Требуется предварительно заполнить базу данных для вашего основного приложения для iPhone , а также вы хотите, чтобы позволил инструменту соответствовать вашим последним моделям базовых данных . Я прав?

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

Мое решение

Вот что я делаю с моим iOS-приложением с основными данными.

  1. Создайте проект с поддержкой основных данных вместе с поддержкой логических тестов.
  2. Напишите простой тестовый сценарий для доступа к MOC и Model для заполнения файла базы данных.
  3. Тем временем, напишите еще один тестовый сценарий для чтения в файле данных, выполните тяжелую работу по импорту.

2 и 3 могут быть интегрированы в один тестовый набор, если у вас мало данных для импорта.

Несколько преимуществ

  1. Вы можете использовать ⌘ + k, чтобы удалить все ранее созданные.
  2. Вы можете использовать ⌘ + u для повторного запуска тестового набора и пополнения базы данных данными.
  3. Всегда обращайтесь к самой последней версии вашей базовой модели данных.
  4. Самое главное , все они предоставляются стандартным шаблоном проекта Xcode. Вам не нужно делать никакой дополнительной работы, чтобы убедиться, что обе цели работают хорошо.

Остерегайтесь нескольких вещей.

  1. Если вы используете Xcode 4.1, я рекомендую вам обновить до Xcode 4.2+ или даже Xcode 4.3, потому что Xcode 4.1, у вас будут некоторые проблемы с доступом к MOC и файлу модели напрямую. (По крайней мере, исходя из моего опыта) И Xcode 4.2 поддерживает приложение модульного тестирования для прямого доступа к файлу базы данных в папке с документами. Позже все, что вам нужно сделать, это найти файл sqlite и перезаписать его в вашем проекте.
  2. Если вы не можете перейти на Xcode 4.2+, не забудьте добавить файлы моделирования основных данных в свою цель логического теста и используйте [NSBundle bundleForClass:{Your testcase class name}], чтобы получить правильный путь к пакету, и, таким образом, вы можете загрузить Core Data Model и создать Экземпляр MOC.

Реальный образец

Вы можете увидеть, как я делаю это в моем проекте с открытым исходным кодом на github

Вот краткий код из моего теста.

- (void)setUp
{
  [super setUp];

  // Set-up CoreData
  yourMocObj = ...;
}

- (void)tearDown
{
  // Tear-down code here.
  [yourMocObj save];
  [super tearDown];
}

- (void)test_PopulateData{
  // Get the path for the data file.
  NSString *plistPath = [[NSBundle bundleForClass:[algorithms_iOSTests class]] pathForResource:@"AlgorithmsMasterViewData" ofType:@"plist"];
  NSArray *dataArray = [NSArray arrayWithContentsOfFile:plistPath];

  NSEntityDescription *yourEntity = [NSEntityDescription entityForName:.. inManagedObjectContext:yourMocObj];

  [dataArray enumerateObjectsUsingBlock:^(NSDictionary *aCategoryDict, NSUInteger idx, BOOL *stop) {
    // Category is a custom subclass of NSManagedObject.
    Category *aCategory = [[Category alloc] initWithEntity:yourEntity insertIntoManagedObjectContext:yourMocObj];
    [aCategory safelySetValuesForKeysWithDictionary:aCategoryDict];

  }];

}
1 голос
/ 10 марта 2011

Исходя из моего собственного опыта, если ваш проект начинается как iOS-проект, вы окажетесь в мире боли, как кажется, вы открыли. Конечно, вы можете добавить цели OS X в свой проект iPhone, но встроенный исполняемый файл не добавляется автоматически в Xcode. Затем вы можете добавить пользовательский исполняемый файл, но конфигурация хранится в пользовательских файлах проекта, которые могут нарушить правила, если вы используете контроль версий и сотрудничаете с другими людьми. Кроме того, как вы обнаружили, он не интегрируется должным образом с отладчиком и т. Д.

Если вы хотите более управляемый проект, я бы порекомендовал начать с проекта OS X и затем добавить ваши целевые объекты iOS. Это сработало для меня намного лучше.

Это может быть улучшено в Xcode 4, но в 3.2 эти проблемы были настоящим тормозом. По крайней мере, вы знаете, что вы не одиноки.

1 голос
/ 03 августа 2011

У меня была такая же проблема. И по той же самой причине: мой основной проект - приложение для iphone, основанное на coredata, и мне нужна утилита для загрузки данных в базу данных coredata.

После небольшой охоты я нашел этот сайт с ответом:

http://blog.vucica.net/2010/09/single-xcode-project-for-ios-and-mac-os-x.html

в основном все сводится к следующему: удерживайте нажатой клавишу выбора при выборе всплывающего окна «Обзор» (где вы выбираете Active Config, Active Target, Active Exec, Active Arch). Я выбрал «Use Base SDK», и мне это понравилось. К сожалению, вы должны делать это каждый раз, когда вы переключаетесь с цели на цель.

Это сработало для меня, когда я попытался скомпилировать целевой объект OSX. Теперь я просто должен исправить все ошибки в приложении ...

0 голосов
/ 06 сентября 2010

Обратите внимание на одну интересную вещь.

Если вы создаете проект приложения для Mac OS X и добавляете новое целевое приложение для iOS, вы можете переключать их оба! Вы даже можете скомпилировать обе цели Mac OS X / iOS.

НО !!!

Это только для платформы устройств iOS. Если вы выберете симулятор один раз, проект будет привязан к приложению iOS, никогда больше не компилируйте для Mac OS X. (вы все еще можете выбрать цель приложения Mac OS X, но она больше не компилируется)

Так что это непригодно.

Еще одна вещь ...

Закройте ваш Xcode. Если вы видите внутри папки .xcodeproj, вы можете увидеть несколько файлов. И вы можете найти файл .pbxuser. Откройте его в текстовом редакторе и найдите строку activeSDKPreference=... Если это так, удалите строку и сохраните файл. Заново откройте проект с помощью Xcode. К сожалению! это сбрасывается! Вы можете снова скомпилировать Mac OS X!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...