Почему быстрый синтаксический анализ.getDataInBackgroundWithBlock заблокирован как HTTP-запрос в виде открытого текста?

Я пишу быстрое приложение для iOS, которое использует Parse, размещенный на Heroku. Насколько я знаю, весь транспорт данных выполняется по протоколу HTTPS, и у меня нет обходного пути безопасности транспорта приложений для info.plist (и я намерен сохранить его таким образом). До сих пор все запросы Parse выполнялись без ошибок как на симуляторе, так и на реальном iphone с 9.3.3 или 9.3.5.

Это было до сих пор, когда я добавил этот код, который работает безупречно на симуляторе, но вылетает на iphone из-за запроса открытого текста по HTTP. Но почему запрос будет сделан через HTTP?

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier(idInstagramFeedCell, forIndexPath: indexPath) as! InstagramFeedCell

        let imageFile = feed[indexPath.row].imageFile as PFFile
        imageFile.getDataInBackgroundWithBlock({ (data, error) in
            if let image = UIImage(data: data!) {
                cell.postImage.image = image
            } else {
                cell.postImage.image = UIImage(named: defaultImageFile)
            }
        })

        cell.postUsername.text = feed[indexPath.row].username
        cell.postCaption.text = feed[indexPath.row].caption
        return cell
    }

Оскорбительная линия изолирована от imageFile.getDataInBackgroundWithBlock({ ... }) так как, если это закомментировано, приложение не падает на iphone.

Ошибки в консоли:

2016-08-18 18:51:56.074 ParseStarterProject-Swift[3694:2189084] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
2016-08-18 18:51:56.081 ParseStarterProject-Swift[3694:2189342] [Error]: The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. (Code: 100, Version: 1.12.0)
2016-08-18 18:51:56.081 ParseStarterProject-Swift[3694:2189342] [Error]: Network connection failed. Making attempt 1 after sleeping for 1.373388 seconds.
2016-08-18 18:51:56.084 ParseStarterProject-Swift[3694:2189342] [Error]: The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. (Code: 100, Version: 1.12.0)

Как ни странно, у этого плаката есть своего рода противоположная проблема. Любая помощь приветствуется.

Дополнительные наблюдения: я на самом деле только что видел сбой даже на симуляторе. Первоначально все изображения, загруженные (т.е. размещенные) в Parse, являются фотографиями из самого симулятора. Когда приложение, запущенное на реальном устройстве, пытается загрузить эти образы, происходит сбой, как описано выше. С тех пор с помощью приложения выложил пару фотографий с реального устройства на Parse. Когда приложение, запущенное на симуляторе, пытается загрузить эти фотографии, симулятор вылетает с той же ошибкой, что и выше.

2 ответа

Решение

Предоставлено @luizmb на GitHub, решение простое. Видимо, есть эта малоизвестная (по крайней мере мне) переменная сервера Parse publicServerURL который должен содержать то же значение, что и serverURL, Если для управления экземпляром вы используете консоль Heroku Parse, вы можете установить ее, задав переменную окружения PARSE_PUBLIC_SERVER_URL, Если у вас есть экземпляр для настройки, вам нужно добавить эту строку в index.js когда вы создаете экземпляр Parse:

publicServerURL: process.env.PARSE_PUBLIC_SERVER_URL || process.env.PARSER_SERVER_URL || process.env.SERVER_URL,

Однако есть два предостережения: 1) Если у вас есть какие-либо файлы изображений, загруженные до реализации этого решения, как я, вы все равно можете столкнуться с ошибкой ATS. Чтобы решить эту проблему, вы должны удалить все такие изображения из вашего экземпляра, как я должен был сделать. 2) Я мог заставить его работать только на реальном устройстве (iOS 9.3.5), но при запуске точно такого же приложения на симуляторе (iOS 9.3), ошибка ATS не появляется, но они делают, что я не нашел способа байпас:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
[Error]: An SSL error has occurred and a secure connection to the server cannot be made. (Code: 100, Version: 1.14.2)
[Error]: Network connection failed. Making attempt 4 after sleeping for 15.848020 seconds.

Это решение позволяет вашему приложению загружать файлы изображений из Parse без необходимости выключать ATS через AllowArbitraryLoads в info.plist, Пожалуйста, смотрите здесь для деталей.

Кажется, вы используете старый Parse SDK, обновите его до последней версии (v1.14.2), и проблема может исчезнуть.

Другие вопросы по тегам