Swift 5.5: Async/Await URLSession.shared.data() выдает ошибку

Я попытался использовать новые функции Async/Await в Swift 5.5 и попробовал следующий код.

let url = URL(string: "http://itunes.apple.com/lookup?bundleId=\(id)&country=at")

let (data, _) = try await URLSession.shared.data(from: url!)

let resultStruct = try jsonDecoder.decode(ResponseStruct.self, from: data)

Каждый раз, когда я выполняю это, часть try await URLSession.shared.data(from: url!) выдает ошибку. Если я поймаю это и напечатаю error.localizedString, меня всегда отменят. Это происходит со всеми типами URL-адресов. Я пытался придерживаться учебных пособий, которые нашел в Интернете, но чего мне здесь не хватает?

РЕДАКТИРОВАТЬ: я принудительно включил приложение в исключение времени выполнения, чтобы получить более подробную информацию об ошибке:

Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=NSURLErrorDomain Code=-999 "cancelled"

Поскольку в этом сообщении объясняется код ошибки NSURLErrorDomain -999 в iOS, эта ошибка возникает, когда SSL-сертификат сервера имеет проблемы, которые я не думаю, что это так, поскольку я обращаюсь к серверу iTunes или когда запрос отменяется чем-либо еще в моем приложении, что похоже на случай для меня.


person Bumblebee18    schedule 08.07.2021    source источник
comment
Вы не проводите тесты на детской площадке, не так ли?   -  person matt    schedule 08.07.2021
comment
Нет, я кодирую в проекте приложения для iOS.   -  person Bumblebee18    schedule 08.07.2021
comment
Не могу воспроизвести. Я попробовал именно ваш код, и первые две строки преуспели очень хорошо. Вы что-то скрываете от нас. Голосование за закрытие как невоспроизводимое на основе предоставленной информации.   -  person matt    schedule 08.07.2021
comment
Также, судя по другим вашим замечаниям, вы, возможно, пытаетесь как-то совместить это с платформой Combine. Это было бы неправильно. Cancelled — это именно то, что я ожидал увидеть для конвейера Combine, которому никогда не давали команду .store.   -  person matt    schedule 08.07.2021
comment
Комбайн — это альтернатива, которую я написал первой. У меня есть две функции, которые делают то же самое. Они обращаются к URL-адресу, а затем в результирующей структуре есть некоторые данные, которые я сохраняю в словаре, но в этой функции эта точка никогда не достигается. Функция, использующая структуру объединения, работает должным образом. Там также нет ничего другого, что я мог бы показать. Приведенный выше код заключен в функцию, помеченную как async и throws.   -  person Bumblebee18    schedule 09.07.2021
comment
Факт остается фактом: ваш код, как показано, отлично работает для меня. Если вам нужна помощь, покажите код, который не работает нормально.   -  person matt    schedule 09.07.2021
comment
Я не могу изменить тот факт, что показанный выше код у меня не работает, и у меня нет другого неработающего кода. Как указано в моем EDIT, я предполагаю, что что-то асинхронное мешает моей сессии URL, но, поскольку я не знаю, где это искать, я, к сожалению, не могу опубликовать какой-либо другой код.   -  person Bumblebee18    schedule 09.07.2021
comment
Это совершенно нормально, я просто говорю, что на данный момент этого недостаточно.   -  person matt    schedule 10.07.2021


Ответы (1)


Измените http на https. Обычно вы не можете вызывать небезопасные вызовы, если не добавите исключение в свой Info.plist, чтобы отключить безопасность транспорта приложений.

В вашей консоли также должен быть журнал App Transport Security.

Поскольку ATS блокирует соединение, запрос отменяется.

Дополнительную информацию см. в NSAppTransportSecurity.

person Sulthan    schedule 08.07.2021
comment
К сожалению, это было не так. Также интересно, что если я использую .dataTaskPublisher() с приемником, он работает без https, и я не добавлял исключений в свой Info.plist. - person Bumblebee18; 08.07.2021