Вы не учли что результаты сборки могут находиться в системной папке «Derived Data». Это поведение по умолчанию для xCode >= 4.0. Поэтому для таких проектов ваш script не будет работать.
Посмотрите в сторону переменной $BUILT_PRODUCTS_DIR (доступна только в «Run script» фазе. Для script-ов, запущенных из shell отсутствует)
2. вместо «iphoneos5.0» можно указать «iphoneos». Тогда подхватит default SDK для текущего xCode.
3. При использовании /usr/bin/xcrun «sign», «embed» в настройках *.xcodeproj должно быть указано «don't codesign». Иначе script выдаст ошибку на этом этапе. Справедливо для xCode >= 4.0
4. в TestFlight upload API не работает флаг «notify=True». То есть, нужно все равно заходить и руками оповещать свою команду.
Пример добавления библиотеки методом «drag-and-drop исходников» неверен и антипедагогичен.
Правильней было бы создать static library project, сделать «drag-and-drop исходников» в него. А потом включать в проект и линковать уже эту библиотеку.
Кроме того, приведенный фрагмент на ассемблере по сути вызывает ту же запрещенную ptrace/syscall. Следовательно, за такое все-таки могут изгнать.
Или здесь расчет на то что если не найдут злоумышленники, то уж цензоры и подавно?
Пользуюсь такой вот реализацией этого паттерна: MulticastDelegate.
Из преимуществ по сравнению с NSNotificationCenter —
1. автоматическая отписка observer-а при его удалении из памяти ( если забыли отписатся от оповещений в методе dealloc — не беда, отписка произойдет автоматически )
2. Поддержка произвольной сигнатуры метода оповещения, то есть можно нотифицировать так —
Обещали рассмотреть. Однако у меня до сих пор команды не оповещаются.
>>> tempBuildDir=$projectDir/build
Вы не учли что результаты сборки могут находиться в системной папке «Derived Data». Это поведение по умолчанию для xCode >= 4.0. Поэтому для таких проектов ваш script не будет работать.
Посмотрите в сторону переменной $BUILT_PRODUCTS_DIR (доступна только в «Run script» фазе. Для script-ов, запущенных из shell отсутствует)
В общем, полностью согласен с lymes.
1. Для автоматизации средствами hudsn/jenkins есть
* TestFlight plug-in — wiki.jenkins-ci.org/display/JENKINS/Testflight+Plugin
* xCode plug-in — wiki.jenkins-ci.org/display/JENKINS/Xcode+Plugin
2. вместо «iphoneos5.0» можно указать «iphoneos». Тогда подхватит default SDK для текущего xCode.
3. При использовании /usr/bin/xcrun «sign», «embed» в настройках *.xcodeproj должно быть указано «don't codesign». Иначе script выдаст ошибку на этом этапе. Справедливо для xCode >= 4.0
4. в TestFlight upload API не работает флаг «notify=True». То есть, нужно все равно заходить и руками оповещать свою команду.
P.S. Я еще смог прикрутить автоматический запуск GHUnit тестов и выбор версии xCode (beta vs stable). Если интересно — смотрите по ссылкам ниже.
1. Пример CI, работы с библиотеками и создания своих framework-ов — github.com/dodikk/iContiniousIntegration
2. Презентация об iPhone CI — github.com/EmbeddedSources/iOS-articles/blob/master/3-iContiniousIntegration/ciPresentation.pdf?raw=true
Да. И импорты для сторонних библиотек желательно писать вот в таком стиле:
#import <ActiveRecordLibrary/CoreData+ActiveRecordFetching.h>
Правильней было бы создать static library project, сделать «drag-and-drop исходников» в него. А потом включать в проект и линковать уже эту библиотеку.
Или здесь расчет на то что если не найдут злоумышленники, то уж цензоры и подавно?
1. Есть ли proof того что код iPref использует подобные техники?
(Для варианта «открой и посмотри в IDA я слишком ленив» ).
2. Известны ли вам открытые или коммерческие средства защиты ( вроде WinLicense ), поддерживающие iOS? (я пока что о таковых не слыхал).
Поделитесь, пожалуйста, своим опытом ежели таковой имеется.
Из преимуществ по сравнению с NSNotificationCenter —
1. автоматическая отписка observer-а при его удалении из памяти ( если забыли отписатся от оповещений в методе dealloc — не беда, отписка произойдет автоматически )
2. Поддержка произвольной сигнатуры метода оповещения, то есть можно нотифицировать так —
[ self.observers gameState: self didUpdateScore: self.score ];
//ассинхронная подгрузка данных по URL
JFFAsyncOperation loader_ = dataURLResponseLoader( url_ );
//ассинхронная подгрузка и кеширование в проперти NSMutableDictionary с именем images
JFFPropertyPath* property_path_ = [ JFFPropertyPath propertyPathWithName: @"images" key: url_ ]
loader_ = [ self asyncOperationForPropertyWithPath: property_path_ asyncOperation: loader_ ];
//пример использования
[ self.activityIndicatorView startAnimating ];
loader_( nil, nil, ^( id result_, NSError* error_ )
{
self.imageView.image = result_;
[ self.activityIndicatorView stopAnimating ];
} );