Русский
Русский
English
Статистика
Реклама

Ios programming

Sign in with Apple дедлайн уже 30 июня

17.06.2020 10:12:43 | Автор: admin

Как мы уже писали в прошлой статье, к 30 июня 2020 все новые аппстор приложения и апдейты должны поддерживать функцию Sign in with Apple.



С апреля у нас появилось несколько мелких, но, возможно, важных деталей по данной теме.


Все надо делать по ГОСТу


Гайдлайны по дизайну кнопок от эппла нельзя нарушать ни в коем случае. Но не факт, что вы узнаете об этом сразу. Сначала мы отправили на ревью билд вот с такой кнопкой для Sign in with Apple.



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


Your app uses Sign in with Apple as a login option but does not use the appropriate Sign in with Apple button design, branding, and/or user interface elements as described in the Sign in With Apple Human Interface Guidelines. Specifically:
-The Sign in with Apple says Apple but should use the following version: Sign in with Apple.
-The custom Sign in with Apple button in your app does not follow Apple button design, branding and/or user interface elements.
Next Steps
To resolve this issue, revise the Sign in with Apple button design, branding and/or user interface elements in your app so that it follows all the Sign in With Apple Human Interface Guidelines.

Мы оперативно собрали штаб, прочитали гайдлайны, поменяли пару стилей и получилось примерно так:



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


Приватные имейл адреса


При логине с айфончика, пользователь может выбрать опцию Hide my email. В этом случае вы получите его прокси имейл, созданный эпплом вида random_chars@privaterelay.appleid.com. Документация утверждает, что по умолчанию на такие адреса нельзя ничего отправить, не сделав дополнительных телодвижений.


Вот гайд, описывающий принцип работы таких имейлов, а вот инструкции по настройке эппл аккаунта и сервисов рассылки, чтобы можно было отправлять письма на privaterelay ящики.


Но на деле все оказалось несколько иначе:


  • Мне удавалось отправить письмо с личного ящика на прокси имейл, хотя домен моей почты не был прописан в эппловской админке.
  • Некоторые прокси имейлы переставали получать нашу рассылку с ошибкой reason: 550 5.1.1 Relay not allowed; type: bounce. При отправке с личной почты, приходило уведомление Undeliverable. XXX was not found on privaterelay.appleid.com

Если кто-то сталкивался с подобными случаями, опишите, пожалуйста, ваши решения в комментариях.


Кстати, большинство пользователей скрывают свои имейлы с помощью этой функции.


Люди не хотят аутентифицироваться каждый раз


Сразу после релиза нам начал приходить фидбек от пользователей о том, что им влом каждый раз аутентифицироваться, хотя у многих сейчас нужно всего лишь пальчик приложить или лицом посветить. Эппл в своих доках пишет следующее:


User interaction is required any time a new identity token is requested. User sessions are long-lived on device, so calling for a new identity token on every launch, or more frequently than once a day, can result in your request failing due to throttling.

Поэтому есть смысл выдавать юзеру токен от своего сервера и хранить его на клиенте какое-то время, найти компромисс между удобством для юзера и безопасностью. Вот в этой статье описывается похожий кейс.


Вместо вывода


Sign in with Apple оказалась не такой простой в реализации фичей, как думалось вначале, но довольно удобной для конечных пользователей. Получить настоящий имейл пользователя теперь будет гораздо сложнее, что явно скажется на маркетинге и методах привлечения пользователей. А эппл, как всегда, хочет замкнуть все провода на себя)


Пока что мы добавили данную функцию только для устройств Apple, но далее планируем добавить ее для Android и веб приложения (док). Основная мотивация скорее унифицировать страницу логина для всех платформ, чем прирост DAU.


Если вы нашли еще какие-то интересные особенности Sign in with Apple добро пожаловать в комментарии!


Автор материала Александр Зинчук, продакт менеджер. Материал опубликован в блоге компании Alconost Inc. с разрешения автора.


Alconost занимается локализацией игр, приложений и сайтов на более 70 языков. Мы также делаем рекламные и обучающие видеоролики.
Подробнее

Подробнее..

Swift Best Practices которые не стыдно знать

31.08.2020 18:16:08 | Автор: admin

Предисловие


Всем, по традиции, 404! Я собрал коллекцию и частью Swift Best Practices ( которые не только упростят вам жизнь, но и покажут ваш профессионализм на код ревью) поделюсь с вами в этой статье. Хочу чтоб ваш код был чистым, красивым и вы сами ему радовались!

Стартуем от сюда


0. Начнём с UserDefaults, не буду говорить как много я штук видел с ними. Вот небольшая хитрость, которую я использую, чтобы добиться согласованности ключей UserDefault в Swift (#function заменяется именем свойства в геттерах / сеттерах). Просто не забудьте написать хороший набор тестов, которые защитят вас от ошибок при изменении имен свойств.

extension UserDefaults {    var onboardingCompleted: Bool {        get { return bool(forKey: #function) }        set { set(newValue, forKey: #function) }    }}


1. Все знают оператор === с js но почему-то мало кто им пользуется в Swift. (Напомню: Оператор === позволяет проверить, являются ли два объекта одним и тем же экземпляром.) Очень полезно при проверке того, что массив содержит экземпляр в тесте:

protocol InstanceEquatable: class, Equatable {}extension InstanceEquatable {    static func ==(lhs: Self, rhs: Self) -> Bool {        return lhs === rhs    }}extension Enemy: InstanceEquatable {}func testDestroyingEnemy() {    player.attack(enemy)    XCTAssertTrue(player.destroyedEnemies.contains(enemy))}

2. Используя DispatchWorkItem, вы можете легко отменить отложенную асинхронную задачу GCD, если она вам больше не нужна:

let workItem = DispatchWorkItem {    // Ваш асинхронный код здесь}// Вызовем его через 1 секундуDispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: workItem)// А теперь можем прекратить его работу(в любое удобное для нас время)workItem.cancel()

3. С map можно придумать много крутых штук, но эта одна из самых полезных. Используя map, вы можете преобразовать Optional значение в optional Result тип, просто передав его в enum.

enum Result<Value> {    case value(Value)    case error(Error)}class Promise<Value> {    private var result: Result<Value>?        init(value: Value? = nil) {        result = value.map(Result.value)    }}

4. Последний на сегодня большой пример. Когда у меня есть 3 свойства или локальные переменные с одним и тем же префиксом, я обычно пытаюсь извлечь их в их собственный метод или тип. Таким образом я могу избежать массовых типов и методов, а также повысить удобочитаемость, не попадая в ловушку преждевременной оптимизации.

До

public func generate() throws {    let contentFolder = try folder.subfolder(named: "content")    let articleFolder = try contentFolder.subfolder(named: "posts")    let articleProcessor = ContentProcessor(folder: articleFolder)    let articles = try articleProcessor.process()    ...}

После

public func generate() throws {    let contentFolder = try folder.subfolder(named: "content")    let articles = try processArticles(in: contentFolder)    ...}private func processArticles(in folder: Folder) throws -> [ContentItem] {    let folder = try folder.subfolder(named: "posts")    let processor = ContentProcessor(folder: folder)    return try processor.process()}


Ну красиво, удобно, элегантно же, да? Да. Надеюсь был полезен, всем спасибо за прочтение. Красивого UI и чистого кода!
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru