12 заметок с тегом ios

Ctrl + ↑ Позднее
19 декабря 2014, 10:43

WeekDefiner 2.0

Наконец-то я обновил WeekDefiner — своё первое и самое любимое аппсторное приложение.

Я хотел это сделать ещё больше года назад, но так как сам уже не учился в университете, то всё никак не доходили руки. Недавно я понял, что такое приложение — это отличный способ попробовать новые айосные фишки. И вот версия 2.0 дождалась релиза, попутно став полем для экспериментов с анимацией, блюром и виджетами.

У новой версии нет ничего общего со старой, кроме главной функции: показывать, какая сейчас идёт неделя. Только теперь WeekDefiner делает это гораздо лучше:

  • Знает все недели семестра. Можно листать в прошлое и будущее, чтобы посмотреть, например, на какие числа выпадет отчётная 17-я неделя.
  • Подсказывает даты при настройке. WeekDefiner научился угадывать начало и конец семестра. За основу я взял даты Аэрокоса.
  • Показывает неделю в центре уведомлений. На iOS 8 приложение даже необязательно запускать — в любой момент можно свайпнуть сверху вниз и посмотреть в виджете, какая идёт неделя. Для тех, кто пользуется iOS 7 или не хочет засорять центр уведомлений, остался кружочек с номером недели на иконке.

Я полностью обновил дизайн приложения. Оно было скеоморфное, а теперь — минималистичное с приятными эффектами. Мне особенно нравятся клёвое перетекание фона и анимация верхней кнопки. Большущее спасибо Жене Демьяненко за советы по интерфейсу и помощь с картинками.

Приложение будет полезно студентам и преподавателям. Остальным, я надеюсь, будет просто приятно скачать и посмотреть.

Скачать в App Store

Давно я не писал о кодерском...

На прошлой неделе тестировщик показал мне баг в нашем iOS-приложении: после ввода текста интерфейс должен был переходить в другой режим, но ничего не происходило. Повторялось это стабильно. «Ок, посмотрю», — сказал я и пошёл фиксить на своём устройстве.

Попытался воспроизвести — никак. Пошёл за девайсом, на котором баг воспроизвёлся, но после перезапуска на нём всё заработало правильно. Странно. Попробовал ещё несколько раз — без толку. Полез смотреть код, перепроверил несколько раз всю логику — вроде всё верно. Потратил больше часа и не смог найти проблему. «Как же так, я же только что видел, что он воспроизводится!» Вспомнив про фазу луны, решил запустить в последний раз, и — ура! — проблема повторилась. Начал дебажить. Смотрю — в коде есть метод:

- (BOOL)isEnabled {
    return (_text);
}

Здесь _text — это строка, и она содержит правильный текст. Адрес у неё 0x15f11800, а метод возвращает NO.

Конечно, я знал, что так неявно возвращать BOOL не нужно, и сам так никогда не пишу. Но в чужом коде глаз за такое не зацепился. Написал тест:

BOOL BOOLCast() {
    long long address = 0x15f11800;
    return address;
}

int main(int argc, const char * argv[]) {
    NSLog(@"\%@\n", BOOLCast() ? @"YES" : @"NO");
    return 0;
}

Выводит:

NO

Xcode не выдаёт никаких ворнингов, анализатор — тоже. Забавно, что такая конструкция сработает правильно:

if (_text)

Дело в том, что в Objective-C тип BOOL объявлен как signed char, поэтому адрес 0x15f11800 обрезается и приводится к нулю. Другими словами, 0x15f11800 делится нацело на размер BOOL. То есть баг воспроизводится каждый раз, когда последний байт адреса оказывается нулевым.

368 121 856 / 256 = 1 437 976

Коллега сказал, что в C++ такая штука будет работать правильно с типом bool, так как инициализация происходит по-другому. Проверяем:

#include <iostream>

typedef signed char BOOL;

bool boolCast(void) {
    long long i = 0x15f11800;
    return i;
}

BOOL BOOLCast(void) {
    long long i = 0x15f11800;
    return i;
}

int main(int argc, const char * argv[]) {
    printf("bool: %d\nBOOL: %d\n", boolCast(), BOOLCast());
    return 0;
}

bool: 1
BOOL: 0

В Objective-C тоже есть тип bool, и результат аналогичен:

#import <Foundation/Foundation.h>

bool boolCast() {
    long long i = 0x15f11800;
    return i;
}

BOOL BOOLCast() {
    long long i = 0x15f11800;
    return i;
}

int main(int argc, const char * argv[]) {
    NSLog(@"\nbool: %d\nBOOL: %d\n", boolCast(), BOOLCast());
    return 0;
}

bool: 1
BOOL: 0

Однако Apple советует везде использовать BOOL. В любом случае, чтобы не зависеть от платформы, языка и архитектуры, лучше явно сравнивать с nil. Лишние символы спасут от непонятных багов:

return _text != nil;

Ну а как же Свифт? Свифт — молодец:

А теперь представьте, сколько подобного кода может быть у вас :-)

Прошло почти полгода с момента запуска WeekDefiner — моего первого приложения в App Store. Спасибо всем, кто качал сам и советовал качать друзьям!

За всё время существования WeekDefiner был скачан 148 раз с ожидаемыми всплесками в апреле (появление в App Store) и сентябре (начало учебного года). Вот график по неделям:

Теперь я начинаю делать версию 2.0, и вот почему:

  1. Меня радуют показатели скачиваний, особенно с учётом того, что WeekDefiner никак не продвигался, кроме двух ссылок на приложение в Twitter и ВК.
  2. Выход iOS 7, подразумевающий как полный редизайн, так и новые интересные технологии.
  3. За последние полгода я узнал много нового как в программировании, так и в дизайне, типографике, управлении проектами и других вещах. Теперь WeekDefiner 1.0 мне кажется плохо написанным, неудобным и некрасивым.
  4. Снова хочу сделать приложение по принципу «от и до»: буду сам проектировать экраны, рисовать иконку, писать код, тестировать, анализировать и продвигать.

Думаю, что на разработку уйдёт около трёх месяцев. После релиза обязательно выложу dev story.

P. S. Так как последнее время я занимался разработкой под Android, то, возможно, созрею и для Google Play версии. Естественно, если вы захотите :-)

11 сентября 2013, 17:17

Об iPhone 5c и iPhone 5s

Вчера ребята из Apple показали новые айфоны. На этот раз сбылись абсолютно все прогнозы и подтвердились многомесячные слухи — одним словом, ничего неожиданного мы и не увидели. Смотрел я презентацию с одним вопросом в голове: «А захочу ли я этот новый айфон?»

Но обо всём по порядку. Сначала — Colorful iPhone 5c.

По начинке почти ничем не отличается от обыкновенной пятёрки. Исполнен в ярких пластиковых корпусах. Выглядит весело и игриво. Стал толще и тяжелее. Предлагаются разноцветные чехлы в дырочку, позволяющие сделать внушительное количество цветовых сочетаний. Ребята из The Verge говорят, что пластик выглядит и ощущается на удивление хорошо. Цена — не сказать, что бюджетная — $549 за младшую модель без контракта.


Далее флагман — iPhone 5s.

Наконец-то LTE для России. Первый 64-битный ARM-процессор со специальным Motion-сопроцессором. Новая камера с улучшенной вспышкой. Гвоздь программы — сканер отпечатков пальцев (да, прощай, Passcode!). 128 GB не будет. Доступен в трёх цветах — добавился золотой. Цены стартуют с $649.

Отвечу на свой же вопрос: «Не захочу». Ни тот, ни другой. Не потому что они мне не понравились — потому что 4s до сих пор устраивает во всём, а новые модели не обладают какими-то must-have-фичами. Хотя я понимаю, кто и в каких странах захочет. Но в то же время не понимаю, кто захочет iPhone 5c, например, в России, если цена без контракта составляет $549, при том что цена флагмана — $649. Пока думаю, что единственная причина, по которой я захочу сменить 4s на новый телефон — это постепенно слабеющая батарейка.

Все картинки — с официального сайта Apple.

apple   ios   iphone
Ctrl + ↓ Ранее