Баг с наложением layout-ов в LinkedIn (iOS)

В iOS-версии приложения LinkedIn (v 8.3) для iPad обнаружил интересный баг, который может появится после возврата из встроенного браузера в приложение (к примеру, открыли ссылку из ленты коллег, почитали, а затем вернулись обратно в ленту). Баг заключается в том, что при скроллинге ленты двигается только как бы «верхний» слой, а нижний, по какой-то причине, остается закрепленным (на скриншоте это отчетливо видно).

А от куда взялся нижний и верхний слой? Я так понимаю, что нижний слой — это тот, который был до перехода во встроенный браузер, а «верхний» — тот, который срендерился уже после возврата из браузера.

Баг с наложением layout-ов в LinkedIn (iOS)

Про сторонние клавиатуры в iOS 8

С выходом новой операционной системы iOS 8 разработчикам было разрешено создавать собственные клавиатуры для системы.

Сейчас уже создано довольно большое количество сторонних клавиатур, на любой вкус и цвет. Я бы с радостью использовал клавиатуру SwiftKey, но она до сих пор не поддерживает русский язык (в отличии от версии для Android). Поэтому выбор остановился на не менее функциональной клавиатуре Swype.

Единственный момент, который добавляет ложку дегтя в использование сторонних клавиатур, это то, что для полей ввода, которые принимают пароль, все равно появляется стандартная клавиатура от Apple. Такое ограничение связано с безопасностью наиболее чувствительных пользовательских данных – вводимые пароли могут отправляться на сервера злоумышленников.

С одной стороны, Apple молодец, что наконец-то начал разрешать разработчикам интегрироваться в систему, однако такие ограничения, как в примере со сторонними клавиатурами, указывает на то, что такая интеграция не обошлась без использования костылей. Посмотрим, что нас ждет в новых версиях iOS 🙂

Проблемы с подключением к гостевому Wi-Fi на Android 5.0

После обновления своего телефона до Android 5.0, появилась проблема с подключением к гостевому Wi-Fi на работе.

Симптомы: выбираю гостевую Wi-Fi точку, ввожу пароль, жму подключиться. Идет подключение, потом сбрасывается и пишется «Сохранено».

Сначала грешил на проблемы на стороне сетевого оборудования, бегал по нашему Хелп-отделу, но максимум, что удалось выяснить, так это то, что подключение действительно не удается (по логам показывается статус Rejected).

Правда, сегодня смог выяснить, что проблема с невозможностью подключения к гостевому Wi-Fi лежит на стороне Android 5.0 (правда, возникает она не у всех пользователей, но я оказался в числе «счастливчиков»).

Баг-репорты на Google Code:

https://code.google.com/p/android/issues/detail?id=78702
https://code.google.com/p/android-developer-preview/issues/detail?id=1548

Лог с моего устройства, когда происходит попытка подключиться к гостевому Wi-Fi:

11-20 11:12:25.971: E/WiFiServiceImpl(748): CONNECT nid=-1 uid=1000
11-20 11:12:25.971: D/WifiService(748): Connect with config* ID: -1 SSID: "WiFi-guest" BSSID: null FQDN: null REALM: null PRIO: 0
11-20 11:12:25.971: D/WifiService(748): KeyMgmt: WPA_PSK Protocols:
11-20 11:12:25.971: D/WifiService(748): AuthAlgorithms:
11-20 11:12:25.971: D/WifiService(748): PairwiseCiphers:
11-20 11:12:25.971: D/WifiService(748): GroupCiphers:
11-20 11:12:25.971: D/WifiService(748): PSK: *
11-20 11:12:25.971: D/WifiService(748): Enterprise config:
11-20 11:12:25.971: D/WifiService(748): IP config:
11-20 11:12:25.971: D/WifiService(748): IP assignment: DHCP
11-20 11:12:25.971: D/WifiService(748): Proxy settings: NONE
11-20 11:12:25.971: D/WifiService(748): uid=1000
11-20 11:12:25.971: D/WifiService(748): triggeredLow: 0 triggeredBad: 0 triggeredNotHigh: 0
11-20 11:12:25.971: D/WifiService(748): ticksLow: 0 ticksBad: 0 ticksNotHigh: 0
11-20 11:12:25.971: D/WifiService(748): triggeredJoin: 0
11-20 11:12:25.971: D/WifiService(748): autoJoinBailedDueToLowRssi: false
11-20 11:12:25.971: D/WifiService(748): autoJoinUseAggressiveJoinAttemptThreshold: 0
11-20 11:12:26.024: I/PseudonymousIdIntentService(1249): getToken invoked
11-20 11:12:26.030: E/WifiConfigStore(748): remove deleted status netId=2 "WiFi-guest"WPA_PSK
11-20 11:12:26.030: E/WifiConfigStore(748): will read network variables netId=2
11-20 11:12:26.042: I/wpa_supplicant(14831): wlan0: Trying to associate with 48:bf:aa:60:7d:7e (SSID='WiFi-guest' freq=5785 MHz)
11-20 11:12:26.098: E/WifiStateMachine(748): CONNECT_NETWORK id=2 config="WiFi-guest" cnid=2 supstate=ScanState my state DisconnectedState uid = 1000
11-20 11:12:26.098: E/WifiConfigStore(748): saveWifiConfigBSSID Setting BSSID for "WiFi-guest"WPA_PSK to any
11-20 11:12:26.099: E/WifiConfigStore(748): saveWifiConfigBSSID Setting BSSID for "WiFi-guest"WPA_PSK to any
11-20 11:12:26.100: E/WifiAutoJoinController(748): updateConfigurationHistory found 0 networks
11-20 11:12:26.102: E/WifiConfigStore(748): setLastSelectedConfiguration 2
11-20 11:12:26.102: E/WifiConfigStore(748): will read network variables netId=2
11-20 11:12:26.145: I/wpa_supplicant(14831): wlan0: Associated with 48:bf:aa:60:7d:7e
11-20 11:12:26.145: I/wpa_supplicant(14831): wlan0: WPA: CCMP is used, but EAPOL-Key descriptor version (3) is not 2
11-20 11:12:27.330: I/wpa_supplicant(14831): wlan0: WPA: CCMP is used, but EAPOL-Key descriptor version (3) is not 2
11-20 11:12:28.330: I/wpa_supplicant(14831): wlan0: WPA: CCMP is used, but EAPOL-Key descriptor version (3) is not 2
11-20 11:12:29.333: I/wpa_supplicant(14831): wlan0: CTRL-EVENT-DISCONNECTED bssid=48:bf:aa:60:7d:7e reason=15

Осталось дождаться выхода исправления 🙁

UPD: исправлено в Android 5.0.1

Обновление до Android 5.0 (Lollipop)

Только что обновил Android на своем Nexus 5 — с 4.4.4 (KitKat) до 5.0 Developer Preview.

К большому сожалению, сегодня релизный Lollipop так и не вышел в качестве OTA-обновления для Nexus 5, и скорее всего, до конечных пользователей новая версия Android’а будет идти несколько недель.

Измучившись ждать, решил накатить последнюю dev-версию (LPX13D). Изначально установка была невозможна из-за следующей ошибки:

FAILED (remote: not supported in locked device)

Пришлось делать:

> fastboot oem unlock

И тут похоже я совершил большую ошибку — все данные на телефоне были удалены, но окончательно в этом я убедился после установки Android 5.0 🙁

> ./flash-all.sh

sending 'bootloader' (2579 KB)...
OKAY [ 0.309s]
writing 'bootloader'...
OKAY [ 0.479s]
finished. total time: 0.787s
rebooting into bootloader...
OKAY [ 0.001s]
finished. total time: 0.001s
target reported max download size of 1073741824 bytes
sending 'radio' (45521 KB)...
OKAY [ 1.811s]
writing 'radio'...
OKAY [ 3.132s]
finished. total time: 4.943s
rebooting into bootloader...
OKAY [ 0.001s]
finished. total time: 0.001s
target reported max download size of 1073741824 bytes
archive does not contain 'boot.sig'
archive does not contain 'recovery.sig'
archive does not contain 'system.sig'
archive does not contain 'vendor.img'
--------------------------------------------
Bootloader Version...: HHZ12d
Baseband Version.....: M8974A-2.0.50.2.21
Serial Number........: 0680177b2115b696
--------------------------------------------
checking product...
OKAY [ 0.100s]
checking version-bootloader...
OKAY [ 0.100s]
checking version-baseband...
OKAY [ 0.100s]
sending 'boot' (8888 KB)...
OKAY [ 0.610s]
writing 'boot'...
OKAY [ 0.756s]
sending 'recovery' (9588 KB)...
OKAY [ 0.674s]
writing 'recovery'...
OKAY [ 0.804s]
erasing 'system'...
OKAY [ 1.497s]
sending 'system' (679407 KB)...
OKAY [ 26.614s]
writing 'system'...
OKAY [ 46.306s]
rebooting...
finished. total time: 78.094s

Потерял СМС, фотографии и прочую важную информацию. Жаль, что в Google до сих пор нет функции ПОЛНОГО бэкапа информации, как это сделано у Apple.

[Решение] To open “Android Studio” you need to install the legacy Java SE 6 runtime

Если в Mac OS вы установили более новую версию Java (скажем, 1.7), чем стоит по умолчанию (1.6), то возможно, что при запуске Android Studio появится следующее сообщение:

To open “Android Studio” you need to install the legacy Java SE 6 runtime.
Click “More Info…” to visit the legacy Java SE 6 download website.

Решение:

В директории /Applications/Android Studio/Contents открываем файл Info.plist, находим строчку <key>JVMVersion</key> и меняем версию <string>1.6*</string> на <string>1.7*</string>.

To open Android Studio you need to install the legacy Java SE 6 runtime

Данный трюк подходит для всех продуктов JetBrains, основанных на IntelliJ IDEA.

[Android] Обновление SDK через командную строку

Android SDK можно обновлять не только через UI-оболочку, но и через командную строку.

android update sdk --no-ui — собственно, вызывает процесс обновления:

Refresh Sources:
Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml
Validate XML
Parse XML
...
Installing Archives:
Preparing to install archives
Downloading Android SDK Tools, revision 23.0.5
Installing Android SDK Tools, revision 23.0.5
Installed Android SDK Tools, revision 23.0.599%)
Downloading Documentation for Android 'L' Preview SDK, revision 1
...

Есть еще команда:

android list sdk — загружает и показывает весь список доступных пакетов (по индексам):

Packages available for installation or update: 47
1- Documentation for Android 'L' Preview SDK, revision 1
2- SDK Platform Android L Preview, revision 4
3- SDK Platform Android 4.4.2, API 19, revision 4
4- SDK Platform Android 4.3.1, API 18, revision 3
5- SDK Platform Android 4.2.2, API 17, revision 3
...

Благодаря индексам через параметр —filter можно указать, какие пакеты следует установить:

android update sdk --no-ui --filter 2,5

iOS 8 GM -> iOS 7 -> iOS 8 GM

Пришлось сегодня в срочном порядке делать даунгрейд с iOS 8 GM на iOS 7, лишь для того, чтобы проверить воспроизводимость одного бага в тестируемом приложение.

В общем, сложного в этом ничего не было:

  1. В iTunes на всякий случай (и как оказалось не зря) создал резервную копию устройства (без бэкапа программ)
  2. Сделал дауегрейд на iOS 7 -> после этих действий все программы слетели, но настройки системы сохранились
  3. После всех необходимых работ по воспроизведению бага, вновь накатил iOS 8 GM -> все программы вернулись на свои места, правда настройки расположения иконок полностью сбились
  4. Сделал восстановление из ранее созданной резервной копии -> все пришло на свои места, как и было ранее до выполнения пункта 2!

iOS 8 Golden Master вышла в свет

Позавчера Apple провела очередную презентацию своих новых устройства — iPhone 6 в двух вариантах (большой и маленький), а также носимые часы Watch. Также был анонсирован новый платежный сервис — Apple Pay.

Сразу же после презентации вышла iOS 8 (Golden Master), которую можно ставить без привязки к аккаунту разработчика (в отличии от всех предыдущих бета-версий iOS 8).

Я не стал ожидать официального релиза iOS 8, который должен состояться через неделю, 17 сентября, и поставил Golden Master на свой iPad Air. Размер прошивки, конечно же, удивил — почти 2 ГБ, но установилось все довольно быстро и без каких-либо нештатных ситуаций.

Сразу же заметил пару косяков. К примеру, есть интересная проблема, связанная с разблокировкой экрана:

1) Повернуть iPad в ландшафтный режим и открыть приложение, которое также работает ТОЛЬКО в ландшафтном режиме (к примеру, GarageBand). Проверить, что центр уведомлений открывается путем свайпа сверху вниз.

2) Заблокировать устройство путем закрытия крышки чехла с магнитами.

3) Повернуть iPad в портретный режим.

4) Разблокировать устройство, открыв крышку чехла.

5) Повернуть iPad в ландшафтный режим. Попытаться вновь вызвать центр уведомлений путем свайпа сверху вниз -> не работает! А все потому, что устройство думает, что оно находится в портретной ориентации. Легко убедиться, если сделать свайп справа налево -> центр уведомлений открылся.

Возможно, проблема присутствовала и в предыдущих версиях iOS, правда я что-то такого не замечал.

[Android] Перехват HTTPS-трафика с помощью прокси-сервера

Эта заметка является продолжением той, в которой я расписал, как можно проанализировать незащищенный трафик, исходящий от мобильного приложения к серверу. Теперь настало время поговорить о защищенном трафике. Далее будем считать, что сетевой обмен происходит по протоколу HTTPS.

Как и раньше, помочь нам в этом деле могут такие известные и популярные прокси-серверы, как Charles, Fiddler, Burp Suite. Fiddler работает только под ОС Windows (ибо написан на .Net), а Charles и Burp Suite являются кроссплатформенными инструментами, работающими как под Windows, так и под Mac.

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

В моем случае я использовал Fiddler с его сертификатом, и трафик от части приложений был виден (Facebook, Fourquare…), но к сожалению не для тех приложений, которые мне действительно были нужны для анализа.

И тут на помощь пришел Burp Suite. Его сертификат был «скушен» недоверчивыми приложениями и таким образом я смог получить доступ к защищенному трафику и впоследствии проанализировать его. Возможно, сертификат от Charles тоже помог бы в этом, но, честно сказать, я еще не пробовал.

SSL-сертификат в Burp Suite

Немного визуальных проблем в iOS 7

На прошлой недели на конференции WWDC 2014 была анонсирована новая версия мобильной операционной системы iOS 8, которая доступна для ознакомления уже сейчас, а официальный релиз состоится, как обычно, осенью.

Недавно я тут порылся с своей фотоленте на iPad и обнаружил пару скриншотов с экрана iOS 7, на которых присутствуют баги в UI. А все потому что, когда вижу проблему, стараюсь ее всегда зафиксировать. Времени выложить обнаруженные проблемы ни как не хватало, но сегодня не тот случай 🙂

1. Ширина область нотификации сократилась в два раза:

Немного визуальных проблем в iOS 7

2. В App Store некорректно отображается иконки приложения «Ведомости», которая в свою очередь налезает на иконку другого приложения:

Немного визуальных проблем в iOS 7

3. Иногда в App Store на странице обновления не подгружаются иконки обновляемых приложений:

Немного визуальных проблем в iOS 7

P.S.: по время Сочинской Олимпиады загрузил приложение «Смотри+» от Мегафон. К сожалению, оно также не обошлось без существенных проблем в UI:

Смотри+ от Мегафон