Сделать АДЕКВАТНЫЙ API для задания пользовательских атрибутов в iOS
Ребята, серьезно. Вы же яндекс, вы не маленькая инди-компания из трех человек. Ну разве можно было сделать кривой API на таком прекрасном языке как Objective C, чтобы его использовали вот так:
let profile = YMMMutableUserProfile()
profile.apply(from: [
YMMProfileAttribute.customBool("Push notifications enabled").withValue(true)
])
YMMYandexMetrica.report(profile, onFailure: nil)
Мне потребовалось полчаса, чтобы понять, что сначала нужно инициализировать атрибут вот так: YMMProfileAttribute.customBool("Push notifications enabled"). Потом я не мог понять, откуда взять YMMUserProfileUpdate, пытался инициализировать его как обычно, ничего не получалось, пришлось лезть в исходники SDK... Потому что документации нет, есть только API reference. Но и исходники не помогают, потому что архитектура API мягко говоря "нестандартная". Я не знаю, на других платформах может это и эталонный образец красивого API, но точно не для iOS.
Для сравнения, вот как подобное реализовано в Amplitude SDK:
let identify = AMPIdentify()
identify.set("Push notifications enabled", value: true)
Amplitude.instance().identify(identify)
В разы лучше, не правда ли. Даже в документацию заглядывать не требуется.
Сервис поддержки клиентов работает на платформе UserEcho
В нашем SDK гораздо больше возможных методов работы с профилями и мы решили помочь разработчикам не ошибиться в их формировании, разработав DSL. Вот пример профиля, который как раз соответствует принципам ObjC и читается как текст: https://pastebin.com/xD76Z79t
Документация по данному API конечно будет. Сейчас у метода reportUserProfile:onFailure: есть непосредственная ссылка на YMMUserProfile, в описании которого и рассказывается, что для создания атрибутов надо пользоваться YMMProfileAttribute. Метод инициализации YMMUserProfile с массивом обновлений и правда отсутствует и будет добавлен в следующем релизе.
ObjC уже все, на нем не начинают новые проекты.
>Сейчас у метода reportUserProfile:onFailure: есть непосредственная
ссылка на YMMUserProfile, в описании которого и рассказывается, что для
создания атрибутов надо пользоваться YMMProfileAttribute.
Эта ссылка работает только для ObjC раздела. В разделе Swift ссылки не работают.
Если интересно, вот guide как нужно проектировать API:
https://swift.org/documentation/api-design-guidelines/
К сожалению или к счастью SDK АппМетрики написан на ObjC и старается соблюдать его гайдлайны. При этом мы стараемся поддерживать удобство использования нашего SDK в Swift настолько, насколько это возможно.