+1

Сделать АДЕКВАТНЫЙ API для задания пользовательских атрибутов в iOS

Андрей Гордеев 4 недели назад • обновлен Волосатов Николай 3 недели назад 3

Ребята, серьезно. Вы же яндекс, вы не маленькая инди-компания из трех человек. Ну разве можно было сделать кривой 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)


В разы лучше, не правда ли. Даже в документацию заглядывать не требуется.

В нашем 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 настолько, насколько это возможно.

Сервис поддержки клиентов работает на платформе UserEcho