Я работал над экспортом мультиплатформенного модуля Kotlin из проекта Android в выпуск Github как XCFramework, чтобы я мог использовать логику в проекте iOS в XCode. Я использовал это руководство из kotlinlang, и до сегодняшнего дня оно отлично работало. У меня все работало, и я мог добавить XCFramework в качестве зависимости к своему проекту в XCode. Однако сегодня, пока я над этим работал, что-то изменилось, поэтому теперь я не могу проверить zip-файл XCFramework локально или загрузить его в проекте XCode. У меня есть несколько разных XCFrameworks в разных репозиториях, как в моем личном Github, так и в Github моей компании, а некоторые из них как частные, так и общедоступные. В общем, я пытаюсь запустить команду из туториала для проверки манифестов:
swift package reset && swift package show-dependencies --format json
Каждый из них дает один и тот же ответ:
Downloading binary artifact https://github.com/{{accountNameHere}}/kmm/releases/download/v1.4.0/Shared.xcframework.zip
error: failed downloading 'https://github.com/{{accountNameHere}}/kmm/releases/download/v1.4.0/Shared.xcframework.zip' which is required by binary target 'Shared':
badResponseStatusCode(404)
error: fatalError
Когда я пытаюсь добавить зависимость пакета в XCode, он находит пакет в репозитории, но не может прочитать его содержимое. Он предупреждает меня: «Невозможно загрузить Read Me», а затем, когда я нажимаю «Добавить пакет», происходит сбой с ошибкой «Неверный архив возвращен из https://github.com/..........».
Я очистил кеши Swift PM и папку DerivedData, но безрезультатно. Я даже создал совершенно новый проект с общим модулем, создал артефакт XCFramework, заархивировал его и опубликовал в выпуске в новом репозитории Github. Даже несмотря на все совершенно новое и простое, я получал одни и те же сообщения об ошибках. Поскольку в сообщении об ошибке ничего не говорится о том, что в архиве недопустимо, я не знаю, что может быть не так. Я скачал zip-файл прямо из релиза, и он в правильном формате.
Я не понимаю, что может быть не так или что еще я могу попробовать. Я также разместил этот вопрос на JetBrains YouTrack. Любой совет будет очень признателен. Спасибо.
Этот документ не является полным. Там объясняется, как создать zip-архив XCFramework, но дальше вы можете действовать самостоятельно. Доступ к этим zip-файлам из Xcode на самом деле не сложен, но ошибки, которые вы видите, могут сбить с толку.
Ранее вы заявляли, что ваша библиотека «работает», но я не уверен, как это возможно.
В частности, независимо от того, есть ли у вас общедоступный или частный репозиторий, для загрузки двоичных файлов с GitHub вам необходимо настроить аутентификацию для доступа к ним. Кроме того, я не верю, что Xcode будет правильно следовать перенаправлениям, по крайней мере, с аутентификацией, поэтому вам понадобится разрешенный URL-адрес для артефакта выпуска. Не «простой» URL.
https://github.com/{{accountNameHere}}/kmm/releases/download/v1.4.0/Shared.xcframework.zip
Это URL-адрес, который вы получаете, когда смотрите выпуск и нажимаете «копировать URL-адрес», но если что-то в GitHub и/или Xcode не изменилось за последние несколько месяцев, вам нужно будет вызвать API GitHub, чтобы получить фактическую информацию. прямой URL.
Мы создали библиотеку для публикации XCFrameworks: https://kmmbridge.touchlab.co/. Новая версия должна выйти позднее на этой неделе или в начале следующей недели, что проще для SPM.
В любом случае, общедоступном или частном, вам потребуется настроить аутентификацию для доступа к двоичным файлам с GitHub. Это процесс (эти документы являются частью новой версии):
https://touchlab.co/kmmbridge/spmquickstart#spm-and-xcode
Для полноты картины: если кто-нибудь найдет этот ответ, вы также не сможете напрямую использовать Maven или Amazon S3. KMMBridge «использует» Maven, но не так, как вы думаете, а Amazon S3 можно использовать только в том случае, если вы сделаете URL-адрес общедоступным, что, вероятно, не будет в восторге от большинства компаний. (Amazon S3 не имеет базовой опции доступа к аутентификации, которая необходима для доступа к Xcode).
Если вы хотите понять, что связано с чем-то вроде Amazon S3, прочтите этот пост: https://engineering.premise.com/publishing-kotlin-multiplatform-swift-packages-to-google-cloud-storage-be5c6987e5d . Это с Google Cloud Run, но та же проблема (без базовой аутентификации).
Я также лично не стал бы публиковать SPM в отдельном репозитории, если только репозиторий, в котором находится ваш код KMP, не будет иметь конфликтующие версии. Публикация в репозиториях более сложна (развертывание ключей и т. д.) и сбивает с толку, когда код находится в одном месте, а библиотека — в другом (но, опять же, это личное предпочтение).
Глядя на URL, я вижу версию v1.4.0
. SPM очень требователен к строкам версий. Они хотят быть строгими семверами. "Работать" будет, но придется сбрасывать кеши (или что-то в этом роде, точные подробности забыл). Итак, я очень рекомендую 1.4.0
, без префикса v
.
(продолжение) - Мне нужно было убедиться, что мой токен частного доступа Github (устаревший) имел правильные области действия (репозиторий, пакет чтения). - Мне нужно было создать файл .netrc, чтобы объявить мои учетные данные Github для XCode. Я все еще не могу получить доступ к платформе. zip-файлы, если репо является частным. Я получаю ошибку 404 при первом запросе артефакта, а затем каждый последующий раз просто сообщение «неверный архив...». Как вы упомянули, я думаю, мне нужно использовать разрешенный URL-адрес вместо простого URL-адреса. Знаете ли вы, где я могу найти подробную информацию об этом шаге? Странно, что простой URL-адрес работает для публичных репозиториев, но не для частных.
Код находится в KMMBridge. После загрузки в релиз появляется ответ в формате json, который должен содержать реальный URL-адрес: github.com/touchlab/KMMBridge/blob/kpg/kmmbridge-1.0/kmmbridge/…
Нормально, понял. Я использовал Postman, чтобы загрузить ZIP-файл в релиз, и получил ответ. URL-адрес там выглядел так: «api.github.com/repos/username/reponame/releases/assets/…». Я попытался использовать Curl для загрузки с этого URL-адреса с помощью моего токена git и получил 201, но файл не удалось разархивировать. ОС выдала ошибку: «Невозможно развернуть «Shared.xcframework.zip». Формат не поддерживается». Приношу извинения за беспомощность, но нужно ли мне каким-то образом использовать URL-адрес из ответа на сообщение? Спасибо еще раз за помощь.
Привет, Кевин, спасибо за ответ. Я только что разговаривал с Тадеасом о KmmBridge, обязательно попробую. Я еще немного поигрался с этим и сделал несколько открытий.