Возможно данный материал опытным разработчикам покажется не очень полезным и я по итогу получу в комментариях много хейта, но вне всякого сомнения мне в период моих начинаний в Android такая статья очень бы помогла, ввиду отсутствия внятных обсуждений и пруфов на сей счет.
Все мы давно привыкли, что 99.9% процентов мобильных приложений так или иначе связаны с сетью. Большинство из нас дергает API через Retrofit и об этом уже миллион статей. Для работы с изображениями чаще всего можно встретить не менее популярные библиотеки врод Glide или Picasso, все вроде-бы в их использовании понятно, лаконично и удобно, но вот есть один маленький нюанс - Word Press. Да, эта CMS все еще в ходу, желающие обзавестись собственным сайтом сильно экономят разрабатывая сайт не с 0, а на какой-то уже существующей платформе, вроде вышеобозначенной. Позже такие люди принимают решение о том, что им потребуются и мобильные приложения. Они могут обзавестись каким-либо бэком и им в 2 счета сделают маломальски-рабочее API, iOS с которым легко подружится и все будет хорошо, сложности могут вас встретить при разработке приложения под Android, о своем опыте и найденном решении я расскажу ниже.
При работе с API никаких сложностей возникнуть не может, проблемы начнутся тогда, когда нам потребуется выводить изображения товаров. Я перепробовал множество библиотек для работы с графикой, но ни одна из коробки не помогла мне решить проблему, ну не выводятся картинки хоть убей. Для "самых внимательных отмечу", что дело не в том, что сайт на http и нам требуется сертификат, дело не в том, что я забыл про networkSecurityConfig или cleartextTrafficPermitted="true", проблема оказалась совсем в ином, а конкретнее в том, что непосредственно Word Press не хотел отдавать изображения сомнительному приложению.
P.S. возможно проблема была и в совокупности факторов вроде небезопасного соединения + wp, но тем не менее.
В то время как через браузер или PostMan картинки открывались отлично получить их в приложении не удавалось. Дело в том, что по умолчанию Glide, Picasso и иже с ними используют для получения изображений OkHttpClient, который судя по всему не очень нравится WP, поэтому решение было найдено соответствующее. Покажу на примере Picasso + Kotlin, вместо привычного нам:
Picasso.load(url).into.(imageView)Нам потребуется, собственная реализация OkHttpClient, например:
fun ourWpOkHttpClient(): OkHttpClient {
// Create our trust manager
val tm = arrayOf<TrustManager>(object : X509TrustManager {
override fun checkClientTrusted(trustChanin: Array<out X509Certificate>?, type: String?)
{
}
override fun checkServerTrusted(trustChanin: Array<out X509Certificate>?, type: String?)
{
}
override fun getAcceptedIssuers() = arrayOf<X509Certificate>()
})
// all trust for our trust manager
val contextSsl = contextSsl.getInstance("SSL")
contextSsl.init(null, tm, java.security.SecureRandom())
// socket ssl factory for trust our manager
val factory = contextSsl.socketFactory
return OkHttpClient.Builder()
.factory(factory, tm[0] as X509TrustManager)
.hostnameVerifier(HostnameVerifier { _, _ -> true })
.addInterceptor(HttpLoggingInterceptor().apply {level = HttpLoggingInterceptor.Level.BODY})
.build()
}Потребуется нам и метод, который будет использовать Picasso в связке с нашим клиентом:
fun getPicassoWP(context: Context): Picasso {
val client = ourWpOkHttpClient()
val picasso = Picasso.Builder(context).downloader(OkHttp3Downloader(client)).build()
picasso.isLoggingEnabled = true
return picasso
}Ну, а далее будем использовать там, где нам нужны изображения с WordPress следующим образом:
getPicassoWP(context).load(url).into(imageView)Не забываем про импорты:
import com.squareup.picasso.OkHttp3Downloader
import com.squareup.picasso.Picasso
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptorХочется верить, что мое решение поможет многим нуждающимся!