Приветствую друзья на связи автор телеграм канала ReactNative - info, недавно столкнулся с одной интересной проблемой, сборка архива для iOS приложения постоянно завершалась такой ошибкой:
error: Abort trap: 6 (in target 'iOSPhotoEditor' from project 'Pods')
В то время как локальные сборки на эмуляторы и устройства собирались корректно.
Проблема оказалась в файле CropView.swift который лежал в директории Pods, нужно было подкорректировать один блок if(), заменив в нем вызов функции UI_USER_INTERFACE_IDIOM()
на UIDevice.current.userInterfaceIdiom
.
После этих правок архив собрался успешно, но эти изменения нужно было как-то сохранить, иначе после повторной установки подов их там уже не будет.
На GitHub давно висит issue с этой ошибкой и фиксом на нее, делать новый pull request смысла нет. Создавать свой форк и заливать его на GitHub/CocoaPods показалось бессмысленно ради одной строчки кода. Пришел к выводу что нужно сделать локальный патч который бы применялся после каждой установки подов.
Итак, приступим. Полазив на просторах Google нашел утилиту которая выполняет всю рутину за вас, но у меня ее запустить так и не удалось, но на всякий случай оставлю ссылку (cocoapods-patch).
Также есть второй минус у этого инструмента, его нужно будет установить всем разработчикам в вашем проекте, способ ниже позволит избежать этого.
Для начала необходимо сгенерировать diff изменений в проблемном файле. Чтобы это сделать необходимо дублировать наш файл и сделать в нем необходимые правки. Новый файл я назвал CropViewPatched.swift.
Далее из папки iOS проекта в терминале я выполнил следущую команду:
git diff -u ./Pods/iOSPhotoEditor/Photo\ Editor/Photo\ Editor/CropView.swift ./Pods/iOSPhotoEditor/Photo\ Editor/Photo\ Editor/CropViewPatched.swift > iOSPhotoEditor.patch
Давайте разберемся что тут происходит:
параметр
-u
генерирует diff патч;вторым аргументом идет путь к оригинальному файлу
CropView.swift
;третьим аргументом идет путь к измененному файлу
CropViewPatched.swift
;далее идет такая конструкция
> iOSPhotoEditor.patch
она позволяет сохранить полученный diff изменений в файл iOSPhotoEditor.patch в той директории откуда вы запустили данную команду;
Полученный файл (iOSPhotoEditor.patch) будет выглядеть примерно так:
Далее в папке iOS я создал папку patches чтобы в дальнейшем хранить там все патчи если это потребуется и поместил туда полученный iOSPhotoEditor.patch.
Остался финальный шаг, необходимо найти в вашем Podfile секцию post_install
post_install do |installer|
...
end
Если таковой нет то создайте ее в конце вашего файла. Обратите внимание на то что данная секция может быть только одна в вашем Podfile.
Теперь в конце этой секции необходимо вставить следующую инструкцию:
post_install do |installer|
...
puts '???? Патчим iOSPhotoEditor'
%x(patch './Pods/iOSPhotoEditor/Photo\ Editor/Photo\ Editor/CropView.swift' < './patches/iOSPhotoEditor.patch')
end
Давайте разберемся что тут происходит:
puts
– позволяет нам вывести лог при выполнении команды pod installс помощью
%x(...)
можно выполнить какую-либо shell команду вашем Podfile.patch
– применяет полученный патч файл к проблемому файлувторым аргументом для patch идет путь к проблемному файлу относительно вашего Podfile (обратите внимание на то что путь взят в одинарные кавычки и перед пробельным символом стоит
\
)третьим аргументом после
<
идет путь к вашему патч файлу относительно вашего Podfile
Вот и все, теперь после выполнения команды pod install
к вашему проблемному файлу будет применятся ваш патч.
Желаю всем удачных патчей.