Пройдя еще один шаг, загрузите в iTunesConnect через командную строку с Xcode 7 ! (Предполагая, что вы начинаете с .ipa
, который был подписан с правильным профилем выпуска и подписью.)
Введите altool
, интерфейс CLI для загрузчика приложений ( docs
, стр. 38). Скрытая глубоко в структуре Xcode.app, это удобная функция, позволяющая загружать файлы непосредственно в ItunesConnect.
/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool
Просто запустите $ altool --upload-app -f file -u username [-p password]
, чтобы выгрузить своего новоиспеченного .ipa
прямо в Apple. Пароль не является обязательным, и он будет запрашивать его, если вы не указали его в команде.
Если на этапе проверки возникнут проблемы с приложением, консоль распечатает их.
Вам, вероятно, придется экспортировать путь в altool
, если вы не хотите сохранять его местоположение.
export PATH=$PATH:/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/
Вот и все! Просто войдите на iTunesConnect.com и выберите новую сборку для тестирования с помощью testflight.
Заключительное примечание: Если вы получаете сообщение «Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application
», вы можете следовать предложению этого ответа SO , чтобы запустить символическую ссылку на правильное местоположение:
ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms
Да, ось Y CGContexts направлена вверх, а в UIKit - вниз. См. Документы .
Редактировать после прочтения кода:
Вы также хотите установить режим наложения для замены перед рисованием изображения, так как вам нужно альфа-значение изображения, а не то, которое было в буфер контекста до:
CGContextSetBlendMode(context, kCGBlendModeCopy);
Отредактируйте, подумав:
Вы могли бы сделать поиск намного более эффективным, построив минимально возможный CGBitmapContext (1x1 пиксель? Может быть, 8x8? попробуйте) и переведя контекст в ваше желаемое положение перед рисованием:
CGContextTranslateCTM(context, xOffset, yOffset);
Нужно ли мне переводить координаты между UIKit и Core Graphics - то есть: инвертирована ли ось Y?
Это возможно. В CGImage, данные пикселей находятся в порядке чтения на английском языке: слева направо, сверху вниз. Итак, первый пиксель в массиве находится в верхнем левом углу; второй пиксель - один слева в верхнем ряду; и т. д.
Если у вас есть такое право, вы также должны убедиться, что смотрите на правильный компонент в пикселе. Возможно, вы ожидаете RGBA, но просите ARGB, или наоборот. Или, может быть, у вас неправильный порядок байтов (я не знаю, каков порядок байтов в iPhone).
Или я неправильно понял предварительно умноженные альфа-значения?
Это не похоже.
Для тех, кто не знаю: Предварительное умножение означает, что компоненты цвета предварительно умножаются на альфа; альфа-компонент остается неизменным вне зависимости от того, умножены на него компоненты цвета или нет. Вы можете отменить это (без предварительного умножения), разделив компоненты цвета на альфа.
Я нашел этот вопрос / ответ во время исследования того, как выполнять обнаружение столкновений между спрайтами, используя альфа-значение данных изображения, а не прямоугольную ограничивающую рамку. Контекст - это приложение для iPhone ... Я пытаюсь выполнить предложенное выше рисование в 1 пиксель, и у меня все еще возникают проблемы с получением этого работают, но я нашел более простой способ создания CGContextRef, используя данные из самого изображения и вспомогательные функции здесь:
CGContextRef context = CGBitmapContextCreate(
rawData,
CGImageGetWidth(cgiRef),
CGImageGetHeight(cgiRef),
CGImageGetBitsPerComponent(cgiRef),
CGImageGetBytesPerRow(cgiRef),
CGImageGetColorSpace(cgiRef),
kCGImageAlphaPremultipliedLast
);
Это обходит все уродливое жесткое кодирование в приведенном выше примере. Последнее значение можно получить, вызвав CGImageGetBitmapInfo () но в моем случае он возвращает значение из изображения, которое вызвало ошибку в функции ContextCreate. Действительны только определенные комбинации, как описано здесь: http://developer.apple.com/qa/qa2001/qa1037.html
Надеюсь, это будет полезно!