Приветствую друзья на связи автор телеграм канала 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) будет выглядеть примерно так:

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 к вашему проблемному файлу будет применятся ваш патч.

Желаю всем удачных патчей.

Комментарии (0)