Category: iOS

20
Сен
2022

📰 Weekly #18: новости, подкасты, отборные статьи и обучающие материалы по Python, Data Science, Go, C#, C/C++ и мобильной разработке

В этом выпуске: ИИ-самоучка демонстрирует сходство с тем, как работает мозг; почему размер вашего веб-сайта не должен превышать 14 Кб; почему команда Google Cloud любит Go; руководство по тестированию безопасности iOS-приложений.

06
Сен
2022

📰 Weekly #16: новости, подкасты, отборные статьи и обучающие материалы по Python, Data Science, Go, C#, C/C++ и мобильной разработке

В этом выпуске: мифы и легенды современного Python; как построить GPT-3 для науки; собеседование Go-разработчика глазами нанимателя; простой гайд по разработке VR-проекта на Unity; что будет с iOS-разработкой в России?

06
Сен
2022

📰 Weekly #16: новости, подкасты, отборные статьи и обучающие материалы по Python, Data Science, Go, C#, C/C++ и мобильной разработке

В этом выпуске: мифы и легенды современного Python; как построить GPT-3 для науки; собеседование Go-разработчика глазами нанимателя; простой гайд по разработке VR-проекта на Unity; что будет с iOS-разработкой в России?

06
Сен
2022

📰 Weekly #16: новости, подкасты, отборные статьи и обучающие материалы по Python, Data Science, Go, C#, C/C++ и мобильной разработке

В этом выпуске: мифы и легенды современного Python; как построить GPT-3 для науки; собеседование Go-разработчика глазами нанимателя; простой гайд по разработке VR-проекта на Unity; что будет с iOS-разработкой в России?

06
Сен
2022

📱 Обновить UI за час: опенсорс фреймворк для быстрой разработки мобильных приложений Divkit

Как обновить интерфейс мобильного приложения сразу у всех пользователей без одобрения Apple и Google? На помощь приходит фреймворк Divkit.

После нескольких лет тестирования новый фреймворк от Яндекс наконец увидел свет. Специалисты компании пророчат ему большое будущее, ведь он дает возможность мастерам мобильного дела менять и добавлять компоненты интерфейсов приложений без их обновления. В основе Divkit лежит подход server driven UI, позволяющий вносить изменения в программу и управлять ею со стороны сервера. Вместе разберемся, какие преимущества может предоставить этот фреймворк и стоит ли его применять в современной мобильной разработке.

Скриншоты песочницы DivKit
Скриншоты песочницы DivKit

Что такое server driven UI?

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

Использование server driven UI решает эту проблему, поскольку каждая бизнес-функция реализуется только один раз на серверной части. Это дает нам согласованность версий по умолчанию и сокращает время, необходимое для внедрения той или иной фичи. Кроме того, разработчикам больше не нужно знать принцип работы мобильных платформ.

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

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека мобильного разработчика»

Как было до этого?

Традиционное изменение мобильной программы выглядит так: новая функция интерфейса, упакованная в приложение, отправляется в App/Play Store, где ее проверяют специалисты Apple или Google, и при удачном раскладе она становится доступным для установки пользователями.

Динамика таким интерфейсам придается в результате отделения UI-визуала от отображаемых им данных, извлекаемых с сервера. Цикл выпуска обновления, как правило, выполняется дважды по разу для каждой платформы при участии, как минимум, двух разных разработчиков (Android и iOS).

Время ожидания утверждения изменений на обеих платформах может составить недели или даже месяцы из-за огромного количества приложений в мобильном маркете — их просто не успевают проверять. Нередко возникает ситуация, что ко времени проверки обновления разработчики вносят очередную фичу, и процесс превращается в бесконечный цикл. Кроме того, после появления нововведений в магазине все равно придется ждать, пока юзеры обновятся до последней версии.

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

  1. Цикл выката обновлений занимает довольно длительный период, а ведь разработчикам важно быстро оценить реакцию пользователей на каждое вносимое изменение. Из-за этого многие компании прибегают к тестированию прототипов вместо того, чтобы учиться у реальных пользователей.
  2. При выпуске новой версии приложения приходится ждать, пока пользователи скачают изменения. Это способствует появлению фрагментированного пользовательского опыта, поскольку некоторые из них обновляются сразу, другие по прошествии некоторого времени, третьи — вообще не обновляются.
  3. Сложно поддерживать согласованность поведения приложения на разных платформах, имеющих разные UI-парадигмы. Кроме того, по статистике приверженцы iOS-устройств обычно обновляют свои приложения чаще, чем адепты Android-движения, что приводит к еще большей фрагментации.

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

Преимущества Divkit

Так что же на самом деле нам дает, созданный Яндексом, фреймворк? Его преимущества проявляются, когда мы хотим внести изменения. Вспомните про занимающий немалое время цикл, проходящий приложением до его выпуска:

  1. Разработчики пишут код для внесения желаемых изменений пользовательского интерфейса.
  2. Изменения пользовательского интерфейса проверяются тестировщиками.
  3. Новая версия приложения отправлена ​​в App/Play Store.
  4. Apple/Google рассматривает и одобряет его.
  5. Пользователи обновляются до новой версии.
Источник: divkit.tech/ru
Источник: divkit.tech/ru

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

Теперь обновления, на которые раньше уходили недели или месяцы, можно делать за дни или часы. Изменения вносятся в приложения для iOS и Android последовательно, и все пользователи одновременно видят одну и ту же версию.

Apple и Google не разрешают изменять код приложения после того, как оно было проверено и выпущено. На первый взгляд кажется, что реализация такого интерфейса, управляемая сервером, нарушает это правило, но это не так. Фреймворк настраивает пользовательский внешний вид вашего приложения на основе ответа сервера, но не изменяет код. Все больше современных приложений уже сегодня используют этот подход.

***

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

А для экспериментов есть песочница, к которой подключён веб-движок фреймворка, также можно скачать из Google Play и подключить к песочнице демоприложение .

Материалы по теме

06
Сен
2022

📱 Обновить UI за час: опенсорс фреймворк для быстрой разработки мобильных приложений Divkit

Как обновить интерфейс мобильного приложения сразу у всех пользователей без одобрения Apple и Google? На помощь приходит фреймворк Divkit.

После нескольких лет тестирования новый фреймворк от Яндекс наконец увидел свет. Специалисты компании пророчат ему большое будущее, ведь он дает возможность мастерам мобильного дела менять и добавлять компоненты интерфейсов приложений без их обновления. В основе Divkit лежит подход server driven UI, позволяющий вносить изменения в программу и управлять ею со стороны сервера. Вместе разберемся, какие преимущества может предоставить этот фреймворк и стоит ли его применять в современной мобильной разработке.

Скриншоты песочницы DivKit
Скриншоты песочницы DivKit

Что такое server driven UI?

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

Использование server driven UI решает эту проблему, поскольку каждая бизнес-функция реализуется только один раз на серверной части. Это дает нам согласованность версий по умолчанию и сокращает время, необходимое для внедрения той или иной фичи. Кроме того, разработчикам больше не нужно знать принцип работы мобильных платформ.

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

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека мобильного разработчика»

Как было до этого?

Традиционное изменение мобильной программы выглядит так: новая функция интерфейса, упакованная в приложение, отправляется в App/Play Store, где ее проверяют специалисты Apple или Google, и при удачном раскладе она становится доступным для установки пользователями.

Динамика таким интерфейсам придается в результате отделения UI-визуала от отображаемых им данных, извлекаемых с сервера. Цикл выпуска обновления, как правило, выполняется дважды по разу для каждой платформы при участии, как минимум, двух разных разработчиков (Android и iOS).

Время ожидания утверждения изменений на обеих платформах может составить недели или даже месяцы из-за огромного количества приложений в мобильном маркете — их просто не успевают проверять. Нередко возникает ситуация, что ко времени проверки обновления разработчики вносят очередную фичу, и процесс превращается в бесконечный цикл. Кроме того, после появления нововведений в магазине все равно придется ждать, пока юзеры обновятся до последней версии.

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

  1. Цикл выката обновлений занимает довольно длительный период, а ведь разработчикам важно быстро оценить реакцию пользователей на каждое вносимое изменение. Из-за этого многие компании прибегают к тестированию прототипов вместо того, чтобы учиться у реальных пользователей.
  2. При выпуске новой версии приложения приходится ждать, пока пользователи скачают изменения. Это способствует появлению фрагментированного пользовательского опыта, поскольку некоторые из них обновляются сразу, другие по прошествии некоторого времени, третьи — вообще не обновляются.
  3. Сложно поддерживать согласованность поведения приложения на разных платформах, имеющих разные UI-парадигмы. Кроме того, по статистике приверженцы iOS-устройств обычно обновляют свои приложения чаще, чем адепты Android-движения, что приводит к еще большей фрагментации.

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

Преимущества Divkit

Так что же на самом деле нам дает, созданный Яндексом, фреймворк? Его преимущества проявляются, когда мы хотим внести изменения. Вспомните про занимающий немалое время цикл, проходящий приложением до его выпуска:

  1. Разработчики пишут код для внесения желаемых изменений пользовательского интерфейса.
  2. Изменения пользовательского интерфейса проверяются тестировщиками.
  3. Новая версия приложения отправлена ​​в App/Play Store.
  4. Apple/Google рассматривает и одобряет его.
  5. Пользователи обновляются до новой версии.
Источник: divkit.tech/ru
Источник: divkit.tech/ru

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

Теперь обновления, на которые раньше уходили недели или месяцы, можно делать за дни или часы. Изменения вносятся в приложения для iOS и Android последовательно, и все пользователи одновременно видят одну и ту же версию.

Apple и Google не разрешают изменять код приложения после того, как оно было проверено и выпущено. На первый взгляд кажется, что реализация такого интерфейса, управляемая сервером, нарушает это правило, но это не так. Фреймворк настраивает пользовательский внешний вид вашего приложения на основе ответа сервера, но не изменяет код. Все больше современных приложений уже сегодня используют этот подход.

***

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

А для экспериментов есть песочница, к которой подключён веб-движок фреймворка, также можно скачать из Google Play и подключить к песочнице демоприложение .

Материалы по теме

06
Сен
2022

📱 Обновить UI за час: опенсорс фреймворк для быстрой разработки мобильных приложений Divkit

Как обновить интерфейс мобильного приложения сразу у всех пользователей без одобрения Apple и Google? На помощь приходит фреймворк Divkit.

После нескольких лет тестирования новый фреймворк от Яндекс наконец увидел свет. Специалисты компании пророчат ему большое будущее, ведь он дает возможность мастерам мобильного дела менять и добавлять компоненты интерфейсов приложений без их обновления. В основе Divkit лежит подход server driven UI, позволяющий вносить изменения в программу и управлять ею со стороны сервера. Вместе разберемся, какие преимущества может предоставить этот фреймворк и стоит ли его применять в современной мобильной разработке.

Скриншоты песочницы DivKit
Скриншоты песочницы DivKit

Что такое server driven UI?

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

Использование server driven UI решает эту проблему, поскольку каждая бизнес-функция реализуется только один раз на серверной части. Это дает нам согласованность версий по умолчанию и сокращает время, необходимое для внедрения той или иной фичи. Кроме того, разработчикам больше не нужно знать принцип работы мобильных платформ.

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

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека мобильного разработчика»

Как было до этого?

Традиционное изменение мобильной программы выглядит так: новая функция интерфейса, упакованная в приложение, отправляется в App/Play Store, где ее проверяют специалисты Apple или Google, и при удачном раскладе она становится доступным для установки пользователями.

Динамика таким интерфейсам придается в результате отделения UI-визуала от отображаемых им данных, извлекаемых с сервера. Цикл выпуска обновления, как правило, выполняется дважды по разу для каждой платформы при участии, как минимум, двух разных разработчиков (Android и iOS).

Время ожидания утверждения изменений на обеих платформах может составить недели или даже месяцы из-за огромного количества приложений в мобильном маркете — их просто не успевают проверять. Нередко возникает ситуация, что ко времени проверки обновления разработчики вносят очередную фичу, и процесс превращается в бесконечный цикл. Кроме того, после появления нововведений в магазине все равно придется ждать, пока юзеры обновятся до последней версии.

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

  1. Цикл выката обновлений занимает довольно длительный период, а ведь разработчикам важно быстро оценить реакцию пользователей на каждое вносимое изменение. Из-за этого многие компании прибегают к тестированию прототипов вместо того, чтобы учиться у реальных пользователей.
  2. При выпуске новой версии приложения приходится ждать, пока пользователи скачают изменения. Это способствует появлению фрагментированного пользовательского опыта, поскольку некоторые из них обновляются сразу, другие по прошествии некоторого времени, третьи — вообще не обновляются.
  3. Сложно поддерживать согласованность поведения приложения на разных платформах, имеющих разные UI-парадигмы. Кроме того, по статистике приверженцы iOS-устройств обычно обновляют свои приложения чаще, чем адепты Android-движения, что приводит к еще большей фрагментации.

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

Преимущества Divkit

Так что же на самом деле нам дает, созданный Яндексом, фреймворк? Его преимущества проявляются, когда мы хотим внести изменения. Вспомните про занимающий немалое время цикл, проходящий приложением до его выпуска:

  1. Разработчики пишут код для внесения желаемых изменений пользовательского интерфейса.
  2. Изменения пользовательского интерфейса проверяются тестировщиками.
  3. Новая версия приложения отправлена ​​в App/Play Store.
  4. Apple/Google рассматривает и одобряет его.
  5. Пользователи обновляются до новой версии.
Источник: divkit.tech/ru
Источник: divkit.tech/ru

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

Теперь обновления, на которые раньше уходили недели или месяцы, можно делать за дни или часы. Изменения вносятся в приложения для iOS и Android последовательно, и все пользователи одновременно видят одну и ту же версию.

Apple и Google не разрешают изменять код приложения после того, как оно было проверено и выпущено. На первый взгляд кажется, что реализация такого интерфейса, управляемая сервером, нарушает это правило, но это не так. Фреймворк настраивает пользовательский внешний вид вашего приложения на основе ответа сервера, но не изменяет код. Все больше современных приложений уже сегодня используют этот подход.

***

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

А для экспериментов есть песочница, к которой подключён веб-движок фреймворка, также можно скачать из Google Play и подключить к песочнице демоприложение .

Материалы по теме

30
Авг
2022

Не работают content_scripts после импорта обычного расширения в xcode

Решил портировать своё расширение для safari, в xcode есть специальная функция импорта обычных расширений, из которых потом собирается проект.
Manifest.json:

{
“name”: “MSPAEssentials”,
“description”: “плагин первой необходимости д…

20
Июл
2022

Не отображаются изображения

Коллеги, помогите, пожалуйста может кто сталкивался. Проблема отображения изображений, которые загружаются из AWS S3 через (прокси) Backend на AWS EC2. Не отображаются изображения на IPhone IOS 15.4.1, 15.5
После очистки кэш Iphone на како…

21
Июн
2022

Не могу настроить Selenide и Appium для IOS

Образец взятый с репозитория Selenide работать не захотел

При инициализации AppiumDriver на эмуляторе запускается приложение, так что не получается только передать команды Selenide в Appium.
import org.junit.Before;
import org.openqa.sele…

21
Июн
2022

Не могу настроить Selenide и Appium для IOS

Образец взятый с репозитория Selenide работать не захотел

При инициализации AppiumDriver на эмуляторе запускается приложение, так что не получается только передать команды Selenide в Appium.
import org.junit.Before;
import org.openqa.sele…

11
Май
2022

Как повысить качество скриншота через appium webdriver на iOS?

использую element.screenshot_as_png(), где элемент взят по селектору
На iOS отрабатывает крайне плохо, много блюра, левых пикселей, цвет плывет, сглаживание какое-то присутствует

Если вручную заскринить, качество в разы лучше:
(Не плывет …

15
Апр
2022

Не работает API в React приложении на github pages в ios?

Залил я значит недавно react приложение на gh-pages. Все работало отлично до того момента, когда я открыл его на своём ios девайсе, не работают почти все API запросы на сервер. Пробовал открывать не в сафари, а в хроме, но все равно не раб…

14
Апр
2022

Баг видео и текста в safari ( swiper )

Суть бага в том, что когда мы свайпаем или переключаемся между слайдами в swiper slider, на 1 сек пропадает текст и потом появляется. Данный баг есть только на ios устройствах. Заметил один момент, все сайдеры разные и только 2, у которых …

12
Янв
2022

Перестали приходить push-уведомления на IPhone

Неделю назад пуши шли стабильно. На днях перестали
Вот простой код для отправки тестового пуш-уведомления (раньше работало)
На андроид идет нормально. При это на обоих платформах пишет success
{"multicast_id":********,"succe…

12
Янв
2022

Перестали приходить push-уведомления на IPhone

Неделю назад пуши шли стабильно. На днях перестали
Вот простой код для отправки тестового пуш-уведомления (раньше работало)
На андроид идет нормально. При это на обоих платформах пишет success
{"multicast_id":********,"succe…

09
Янв
2022

Возможно ли добавить базу данных Википедии в мобильное приложение?

хочу разработать мобильное приложение, которое будет брать информацию с Википедии, возможно ли это? Пишу на Swift. Если возможно, то напишите поподробнее как добавить данные и тд.

04
Дек
2021

🍏 Загрузите приложение в App Store за 6 шагов: практическое руководство для начинающих

Начинающие iOS-разработчики часто испытывают проблемы с размещением приложений в App Store. Рассказываем, как можно это исправить за 6 простых шагов.

App Store – одна из крупнейших платформ для распространения, продвижения и продажи приложений. Ее пользовательская база – около миллиарда человек по всему миру. Разместив программу в этом магазине, вы получите отличный шанс привлечь миллионы потенциальных клиентов.

Корпорация Apple довольно разборчива и неподготовленный разработчик может столкнуться с рядом сложностей при попытке это сделать. В небольшой пошаговой инструкции мы попытаемся обойти все подводные камни и рассмотреть наиболее важные при работе с платформой моменты. Поехали!

1. Прочтите рекомендации Apple

Разберем ситуацию, когда созданное вами приложение готово к запуску. Период разработки остался позади вместе с бессонными ночами и литрами выпитого кофе. Программа отлично работает, хорошо продумана и вы готовы представить ее человечеству, официально опубликовав на App Store. Сделать это с первого раза непросто, но, следуя нашим советам, вы сможете грамотно подготовиться к загрузке.

Перед началом процедуры заливки файлов на сервер тщательно изучите App Store Review Guidelines. Это официальные рекомендации по загрузке приложений от компании-разработчика: там вы узнаете основные причины отклонения подаваемых заявок модераторами.

Процесс размещения приложения в App Store выглядит так:

  • Получение лицензии разработчика.
  • Выполнение требований магазина и финальная доработка приложения.
  • Получение (создание) идентификатора приложения, сертификата распространения и профиля обеспечения.
  • Настройка приложения с загрузкой двоичного файла.
  • Ожидание.

Далее разберем каждый пункт списка более детально.

Больше полезной информации вы найдете на нашем телеграм-канале «Библиотека мобильного разработчика».

2. Создайте аккаунт разработчика

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

Учетная запись Apple-developer обязательна и стоит $99 в год. После ее оформления вы сможете использовать App Store Connect для управления своими приложениями.

Вам понадобится устройство Mac или виртуальная машина, чтобы загрузить приложение в App Store. Единственный способ это сделать – через XCode или Transporter, которые могут быть установлены только на MacOS.

Войдите в систему под своим Apple ID, если у вас его нет, создайте.


Заполните регистрационную форму.



В разделе Romanized Contact Information вас попросят продублировать уже введенную информацию.


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

Выберите тип лицензии (для индивидуального использования или корпоративный вариант).


Оплатите регистрационный взнос.


После завершения регистрации в программе для разработчиков вы получите доступ к необходимым ресурсам.

3. Проведите финальную доработку приложения

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

Apple в помощь разработчикам выпустила несколько обязательных к прочтению гайдов. Из наиболее важных можно отметить уже знакомый нам App Store Review Guidelines, а также Human Interface Guidelines (совету по грамотному дизайну программы).

Вот некоторые из обязательных к исполнению правил:

  • Приложение не должно использовать частные API.
  • Не должно сбоить.
  • Не должно копировать функциональность нативных приложений.
  • Не должно использовать микрофон или камеру без разрешения пользователя.
  • Не должно использовать картинки и музыку, защищенные авторскими правами.

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

4. Выполните предварительные требования

Прежде чем отправлять программу в App Store, необходимо сделать следующее:

  • Получить сертификат распространения (Distribution Certificate), позволяющий идентифицировать вас или вашу команду. Это профиль iOS, используемый для распространения продукции.

  • Создать профиль обеспечения (review provision profile). Чтобы приложение начало работать в экосистеме iOS, оно должно быть проверено и одобрено Apple. Как протестировать его на реальном устройстве перед отправкой на проверку? Профиль обеспечения позволяет загрузить приложение на физическое железо до одобрения модераторами.
  • Получить идентификатор приложения (App ID). После его создания в вашем арсенале появятся дополнительные возможности улучшения функциональности программы (например, push-уведомления и вход через Apple ID). Вам не обязательно настраивать их сразу, это можно сделать позже.


5. Настройте приложение

Когда вы разберетесь с описанными выше идентификаторами и сертификатами на портале разработчиков Apple, можно будет перейти к App Store Connect (бывший iTunes Connect) – платформе, на которую фактически загружаются бинарные пакеты приложений.


Нажмите на вкладку MyApps и оказавшись на новой странице создайте новое приложение, нажав кнопку +.


После создания приложение необходимо настроить, заполнив соответствующие поля.

Перечислим наиболее важные из них:

  • Иконки. Очевидно, что значок вашего приложения – это его лицо. Убедитесь, что вы легально используете изображение подходящего размера и качества.
  • Скриншоты. Улучшите свое приложение с помощью снимков экрана и превью. Вам необходимо будет отправить снимки экрана для устройств разного размера: iPhone 6,5 дюймов (1242 x 2688 пикселей или 1284 x 2778 пикселей), iPhone 5,5 дюймов (1242 x 2208 пикселей) и iPad (2048 x 2732 пикселей). Будьте внимательны при выборе скриншотов, поскольку иногда это единственный критерий, по которому потребитель решает – загружать приложение или нет.
  • Название приложения, категория, подробное описание и дополнительные ключевые слова. Не стоит недооценивать важность описания: первые 3 строки должны заинтересовать пользователя, ведь это та часть, которую он увидит не нажимая на вкладку прочитать больше. Будьте точны, ясны и кратки, дайте пользователям понять основную ценность приложения.
  • Возрастной рейтинг. Определите порог по возрасту, исходя из типа контента приложения.
  • Цена и доступность: Apple позволяет выставить цену приложения, выбрав один из уровней (от бесплатного до 1 000 $+). Вы также можете выбрать страны, в которых приложение будет доступно (по умолчанию оно доступно во всех странах мира).
  • Права на контент: здесь необходимо подтвердить, что вы не используете нелегальный контент.
  • Отзывы. Здесь добавляется возможность работать с отзывами от имени администратора приложения.
  • Контактная информация. Ее надо заполнить, чтобы модераторы App Store могли с вами связаться при необходимости.
  • Активация платных функций (покупки и подписки). Сюда нужно следующие сведения: информацию о физическом или юридическом лице, необходимые соглашения, банковские реквизиты, а также информацию о налоговой отчетности или налоговую декларацию.
Примечание
Этот раздел необходимо заполнить на английском языке максимально подробно. Здесь описывается назначение и функциональные возможности приложения, а также индивидуальные особенности проекта (разрешения, сертификаты и другие необходимые документы). Чем больше детальной информации вы добавите, тем меньше вероятность неудачной проверки.

  • Правила конфиденциальности. Если ваше приложение требует создания учетных записей пользователей, вы должны гарантировать их конфиденциальность.
В этом пункте отметим некоторые нововведения:
Вместе с выходом iOS 14 Apple объявила об изменении правил конфиденциальности приложений. Основным нововведением стало принятие принципа прямого согласия пользователя на доступ к уникальному идентификатору его устройства (IDFA), на отслеживание запросов и передачу данных третьим лицам. Теперь разработчик обязан предоставить в App Store Connect исчерпывающую информацию о процессе сбора данных в программе, а также добавить ссылку на политику конфиденциальности. Все эти сведения необходимо отразить на стартовой странице приложения, чтобы пользователь еще до скачивания мог с ними ознакомиться.

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

После того, как все флажки проставлены и внесены необходимые правки, ваше приложение можно отправлять на модерацию.

6. Ожидайте

Команде Apple Review Team потребуется некоторое время, чтобы рассмотреть приложение, а пока оно будет находится в статусе awaiting verification. Сам процесс занимает несколько дней, после чего вы получите сообщение с результатами проверки.

В случае отказа Apple отправит вам подробное сообщение с причинами, по которым заявка была отклонена. Хотя некоторые разработчики воспринимают процесс отклонения App Store как препятствие при публикации приложения, не воспринимайте все так категорично. Гораздо лучше исправить проблемные моменты на старте, прежде чем они будут отмечены пользователями в виде гневных отзывов и низких оценок.

***

Тим Кук как-то сказал: «Жить на земле стало лучше, потому что для решения любой проблемы уже создано свое приложение». Это действительно так. Используйте наше небольшое руководство для размещения программы в экосистеме Apple, а если вам нужна более подробная информация, ее можно найти на официальном сайте компании. Удачи!

15
Ноя
2021

После получения доступов открывается стандартный вид камера по вверх wkwebview swift

У меня есть сайт на js, который использует камеру для сканирования QR-кода. И веб-приложение на swift которое тянет мой сайт через wkwebview.
x-код http://joxi.ru/5md9aqpCadREo2
Проблема в том, что когда запрашиваю использование камеры из …

05
Ноя
2021

Как декодировать сжатую строку из PHP в Swift?

У меня есть текстовый файл сжатый с помощью функции zlib в php:
base64_encode(gzcompress(‘привет’)) // "eJy7sP9iw4UdFzZd2HqxCQA6EAjD"

Теперь мне нужно прочитать этот файл в iOS приложении.
Для этого я попытался использовать библ…

05
Ноя
2021

Как декодировать сжатую строку из PHP в Swift?

У меня есть текстовый файл сжатый с помощью функции zlib в php:
base64_encode(gzcompress(‘привет’)) // "eJy7sP9iw4UdFzZd2HqxCQA6EAjD"

Теперь мне нужно прочитать этот файл в iOS приложении.
Для этого я попытался использовать библ…

04
Ноя
2021

🍏 Самоучитель для начинающих: освойте основы Swift за 30 минут

Думаете, чтобы освоить Swift нужно много времени? И да, и нет. В изучении языков программирования важна практика, но что может сделать начинающий за 30 минут? Только познакомиться с базовым синтаксисом с помощью нашего самоучителя.

Создать Playground

Запустим Xcode и создадим Playground. Назовем его “BasicSwift”:

File → New → Playground…

⌥⇧⌘N

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

Переменные, константы, типы

Переменные обозначаются с помощью ключевого слова var

        var hello = "Hello Proglib"
    

Чтобы объявить константу используется ключевое слово let

        let brandName = "Proglib"
    
Swift – это статистический типизированный язык, а это значит, что мы должно явно задать тип каждой переменной во время компиляции.

Указывать тип переменной необязательно. Компилятор Swift автоматически его определит. Эта особенность называется интерференцией типов(type inference).

Swift предлагает следующие базовые типы: Int или UInt, Double, Float, String, Character, Bool, Tuples, Optional.

Множество типов фундаментально и чаще всего используется для объявления переменных. Забегая вперед скажу, что вы также можете создавать и свои собственные типы.

Мы не будет детально разбирать их все! Посвятим этой теме следующую 30-ти минутку.

Укажем тип нашей константы.

        let brandName: String = "Proglib"
    
Больше полезной информации вы можете найти на нашем телеграм-канале «Библиотека мобильного разработчика».

Интерполяция строк

Давайте теперь выведем имя бренда в консоль при помощи функции print().

        print(brandName)
    

Интерполяция – это способ объединить переменные и константы внутри строки.

Теперь присвоим переменной hello новое значение, и выведем в консоль.

        hello = "Hello \(brandName)"
print(hello)
    

Вот еще пример:

        let name = "Ivan" 
var age: UInt8 = 30
print("\(hello). My name is \(name). I am \(age)")

    

Базовые операторы

Здесь все интуитивно. Предлагаю вам поэкспериментировать с ними самостоятельно и посмотреть на результаты.

Арифметические операторы

+ сложение
вычитание
/ деление
% деление по модулю
        var a = 1, b = 2
var result = a + b
// etc

    

Операторы присвоения

= , +=, -=, /=, %=

        var h = 10
h += 1
h /= 2
h %= 2
// etc

    

Операторы сравнения

Операторы сравнения в качестве результата возвращают значения типа Bool

==, ≠, >, <, ≥, ≤

        let condition = 2 > 3
let condition2 = 1 != 0
let resultCondition = condition == condition2
// etc

    

Логические операторы

Логические операторы используют для комбинирования или инверсии булевых значений.

Рассмотрим на примере:

        // логическое И
print(true && true)      // true
print(true && false)     // false

// логическое ИЛИ
print(true || false)      // true

// логическое НЕ – инвертирует булево значение
print(!true)              // false

    

Это еще не все операторы, которые существуют в Swift. Остальные мы рассмотрим в контексте целей их предназначения.

Коллекции

Swift предлагает нам три основных типа коллекций: Array(Массивы), Dictionary(Словари) и Set(Множества). Сейчас мы рассмотрим первые два.

Array

Используйте квадратные скобки [], чтобы создавать массивы(Array) и словари(Dictionary).

Получить доступ к элементам массива можно написав индекс внутри скобок.

        let digits: [UInt8] = [0, 1, 2, 3, 4, 5, 6, 7, 8 ,9]
 print(digits[3])

    

Попробуйте изменить значение в массиве digits. Что произойдет?

        digits[0] = 1
    
🪲
Cannot assign through subscript: ‘digits’ is a ‘let’ constant

Поскольку мы объявили массив как константу, то и все его значения становится не изменчивыми (immutable), как и его размер. А если мы объявим массив как переменную, то он будет изменчивым (mutable). Такое свойство называют изменчивостью коллекций (mutability of collection).

Это утверждение справедливо и для Словарей.

        // mutable
var numbers = [50, 10, 20, 34, 45]
print(numbers[0])
numbers[0] = numbers[0] + 1

    

Dictionary<Key, Value>

Создадим словарь sunSystemData, в который добавим данные о солнечной системе.

Пусть ключами (key) данного словаря будут номера объектов солнечной системы, а значениями (value) названия объектов. Поскольку звезда рождается первой, то будем считать, что ключ со значением 0 всегда указывает на звезду. Остальные объекты следуют в порядке по отношению к звезде.

        var sunSystemData = [ 0: "Sun", 1:"Mercury", 2:"Venus", 
	3:"Earth", 4:"Mars", 5:"Jupiter", 6:"Saturn", 7:"Uranus", 8:"Neptune"]

    

Мы не указали типы для словаря явно. Вы можете проверить как их определил Swift, используя функцию стандартной библиотеки Swift (Swift Standard Library) type(of: T).

        type(of: sunSystemData) // Dictionary<Int, String>

    

Обратиться к элементу словаря можно, написав ключ внутри скобок. Результат будет содержать значение опционального типа (Optional), а если по заданному ключу (в скобках) нет соответствующего элемента, то получим nil.

nil в Swift означает отсутствие значения.

Получим нашу родную планету и выведем ее в консоль.

        var homePlanet = sunSystemData[3]
print("My home is \(homePlanet)")

    

Когда мы попытались вывести переменную в консоль, то получили предупреждение!

🪲
String interpolation produces a debug description for an optional value; did you mean to make this explicit?

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

        type(of: homePlanet) // Optional<String>

    

Чтобы избавиться от предупреждения в интерполяции строки, нам необходимо указать что именно мы выводим. Сделать это можно при помощи оператора as. В этом случаи мы увидим напечатанный nil , когда значение отсутствует. Попробуйте обратиться к элементу с ключом 0.

        print("My home is \(sunSystem[0] as String?)") // My home is nil
print("My home is \(homePlanet as String?)") // My home is Earth
    

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

Сделать это мы можем при помощи оператора объединения по nil??

        var homePlanet = sunSystem[3] ?? "Unknown planet"
print("My home is \(homePlanet)") // My home is Earth

    

Пока опустим темы об опциональных типах и приведении типов(type casting).

В следующих статьях я расскажу о них подробней.

Продолжим!

Кстати, если вы считаете, что Плутон это планета, то можете добавить её самостоятельно!

        sunSystem[9] = "Pluto"

    

Чем отличаются массивы от словарей?

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

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

Например:

        var HierarchyOfNumbers: [Character:String] = [
	"N":"Natural Numbers"
	"Z":"Integers"
	"Q":"Rational Numbers"
	"R":"Real Numbers"
	"C":"Complex Numbers"
]

    

Управление потоком

Часто необходимо выполнять различный код базирующийся на определенных условий (conditions).

  • Если вам необходимо написать различную логику, которая зависит от определенных условий, тогда используйте условные инструкцииif, switch. Инструкцияifхорошо подходит для простых сравнений, и нескольких вариантов исходов.
  • Инструкция switch подходит для более сложных условий. Лучше использовать ее, когда вам необходимо выбрать из множества вариантов альтернатив, основываясь на каком-либо значении, т.е. выполнить код соответствующий определенному шаблону.
  • Когда вам необходимо многократно повторить какие либо инструкции, используйте циклы: for-in,while.

If…else

Инструкция if бывает трех форм.

Традиционное ее представление выглядит так:

        var condition = true
if condition {
	// 
} else {
	//
}

    

В зависимости от условия, мы попадаем в определенные блоки кода. Когда условие истинно(true), выполняется блок следующий за if, а когда ложно(false), выполняется блок следующий за else.

Например, вы решили, что Плутон планета? Сейчас узнаем!

        var isPluto = sunSystemData[9] != nil

if isPluto {
	print("Pluto is planet")
} else {
	print("Pluto is not planet")
}

    

if…

Мы можем опустить блок else, когда нам необходимо выполнить только одно условие.

Рассмотрим такой случай. У нас есть данные, и мы не хотим перезаписать значение. Тогда необходимо проверить наличие данных, и только после добавить значение.

        var key = 0, value = "Sun"
var isExists = sunSystemData[key] != nil // false
if !isExists { // true
	sunSystemData[key] =  value
}

    

if…else if…else

Также мы можем добавить условия следующее за else.

        var value = 0
if value > 0 {
	print("\(value)")
} else if value == 0  {
	print(value)
} else {
	print(value)
}

    

Вы можете комбинировать if else.

Например:

        var a = 0, b = 3, c = 1
if a > b {
	print(a - b)
} else if b > a { 
	print(b - a)
} else if c < a {
	print(a - c)
} else {
	 print(a + b + c)
}

    

switch

В самой простой форме switch выглядит так:

        var value = "R2-D2"
switch value {
	case "R2-D2": print("Take him!")
	case "C-3PO": print("Take him!")
	default: 
		print("These aren't the droids you're looking for.")
}

    

Ключевое слово case определяет возможный случай (шаблон), с которым сравнивается значение value. Затем исполняется соответствующий блок кода на основе первого успешно совпавшего шаблона. В случаи если совпадений не найдено, исполняется блок default , который всегда следует после остальных случаев. Условие default гарантирует что наша конструкция полная и законченная.

Поменяйте значение value, и посмотрите, какой блок кода исполнился.

for-in

Цикл for-in упрощает перебор по последовательностям, т.к. массивы, словари, строки.

Синтаксис for-in выглядит так:

        for value in sequence{
  // 
}

    

Цикл for-in исполняет инструкции определенное количества раз, пока мы не достигнем конца последовательности.

valueэлемент последовательности на каждой итерации(iteration, повторении).

Рассмотрим пример перебора значений массива и словаря.

        for digit in digits  {
	print(digit)
}
for (key, value) in sunSystemData {
	print("Key:\(key) Value:\(value)")
}

    

while

while имеет две формы.

Первая из них начинается с вычисления условия. Такой цикл можно рассматривать как повторяющаяся инструкция if.

        var condition = true;
while (condition) {
	// тело цикла
}

    

Например, мы хотим пройти 10 000 шагов.

        var stepGoal = 10_000
var mySteps = 0
while mySteps < 10_000 {
	mySteps += 1
}

    

Цикл будет работать пока условие mySteps < 10_000 принимает булево значение true.

Внутри тела цикла мы увеличиваем переменную mySteps на один шаг.

Когда условие принимает значение false, то цикл останавливается.

Расчет факториала числа.

        var counter = 5                
var factorial = 1 // начальное значение             

while counter > 0 {            
    factorial *= counter       
    counter -= 1               
}

print(factorial)  

    

Здесь я вам предлагаю разобраться самостоятельно 😉

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

В остальном repeat-while ведет себя идентично while.

        var condition = true
repeat {
	// тело цикла 
} while (condition)

    

Также цикл while используется, когда нам заранее неизвестно число итераций последовательности. В отличии от цикла for-in.

Функции

В Swift есть два типа функций:

Пользовательские(User-defined Function) и функции стандартной библиотеки (Standard Library Functions).

Функции помогают организовывать код, разбив его на более мелкие части, что делает код более легким для понимания и переиспользования. Мы уже использовали функции стандартной библиотеки, такие как print() и type(). Рассмотрим, как создаются пользовательские функции.

Функция – блок кода, который выполняет конкретную задачу.

Каждая функция имеет уникальное имя, которое является ее идентификатором.

        func functionName(parameters) -> returnType {
  // тело функии 
}

    

Объявить функцию можно при помощи ключевого слова func.

За ним следует имя функцииfunctionName.

В скобках указываются параметры(parameters) функции.

Параметр – это значение определенного типа, принимаемое функцией.

returnType – указывает, какого типа значение возвращает функция

Чтобы исполнить функцию, ее необходимо вызвать (как мы уже делали это с print()).

        // вызов функции
functionName()

    

Функции без параметров

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

        func greetings() {
	 print("Hello Proglib!")
}
greetings()

print("Done!")

    

Мы объявили функцию с именем greetings() , которая просто печатает "Hello Proglib!" в консоли. Она не имеет параметров и возвращаемого значения. При вызове функции управление программой переходит к определению функции. Затем исполняется код, который содержится внутри тела функции:

        print("Hello Proglib!")
    

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

        print("Done!")
    

Функции с параметрами

Функции, в которым мы передаем аргументы, называются функциями с параметрами. Если мы хотим, чтобы функция возвращала значение, нужно использовать оператор return.

Например, разница между двумя значениями:

        func difference(a: Int, b: Int) -> Int {
	return a - b 
}
var result = difference(a: 3, b: 2)
print(result)

    

Мы объявили функцию с именем difference, которая принимает два параметра типа Int и возвращает значение типа → Int. При вызове функции, мы передаем параметры в круглых скобках (a: 3, b: 2).

Каждый параметр функции состоит из метки аргумента и имени параметра. Имена параметров используются при реализации функции.

        func difference(of a: Int, less b: Int) -> Int {
  return a - b
}

    

Метка аргумента используется при вызове функции.

        difference(of: 1, less: 2)
    

По умолчанию параметры используют свое имя параметра в качестве метки аргумента(как в первом примере).

Если вам не нужна метка для аргумента, то напишите _ вместо конкретного названия метки для аргумента.

        func difference(_ x: Int, _ y: Int) -> Int {
  return x - y
}

difference(3, 4)

    

Мы можем опустить оператор return , когда тело функции является одним выражением.

        func difference(a: Int, b: Int) -> Int {
	a - b 
}

    

Заключение

Мы познакомились с фундаментальным синтаксисом языка программирования Swift. Рассмотрели основные операторы, научились объявлять переменные и объединять код в функции. В следующие полчаса разберем каждую тему более глубоко. На сегодня все! Playground доступен на Github.

04
Ноя
2021

🍏 Самоучитель для начинающих: освойте основы Swift за 30 минут

Думаете, чтобы освоить Swift нужно много времени? И да, и нет. В изучении языков программирования важна практика, но что может сделать начинающий за 30 минут? Только познакомиться с базовым синтаксисом с помощью нашего самоучителя.

Создать Playground

Запустим Xcode и создадим Playground. Назовем его “BasicSwift”:

File → New → Playground…

⌥⇧⌘N

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

Переменные, константы, типы

Переменные обозначаются с помощью ключевого слова var

        var hello = "Hello Proglib"
    

Чтобы объявить константу используется ключевое слово let

        let brandName = "Proglib"
    
Swift – это статистический типизированный язык, а это значит, что мы должно явно задать тип каждой переменной во время компиляции.

Указывать тип переменной необязательно. Компилятор Swift автоматически его определит. Эта особенность называется интерференцией типов(type inference).

Swift предлагает следующие базовые типы: Int или UInt, Double, Float, String, Character, Bool, Tuples, Optional.

Множество типов фундаментально и чаще всего используется для объявления переменных. Забегая вперед скажу, что вы также можете создавать и свои собственные типы.

Мы не будет детально разбирать их все! Посвятим этой теме следующую 30-ти минутку.

Укажем тип нашей константы.

        let brandName: String = "Proglib"
    
Больше полезной информации вы можете найти на нашем телеграм-канале «Библиотека мобильного разработчика».

Интерполяция строк

Давайте теперь выведем имя бренда в консоль при помощи функции print().

        print(brandName)
    

Интерполяция – это способ объединить переменные и константы внутри строки.

Теперь присвоим переменной hello новое значение, и выведем в консоль.

        hello = "Hello \(brandName)"
print(hello)
    

Вот еще пример:

        let name = "Ivan" 
var age: UInt8 = 30
print("\(hello). My name is \(name). I am \(age)")

    

Базовые операторы

Здесь все интуитивно. Предлагаю вам поэкспериментировать с ними самостоятельно и посмотреть на результаты.

Арифметические операторы

+ сложение
вычитание
/ деление
% деление по модулю
        var a = 1, b = 2
var result = a + b
// etc

    

Операторы присвоения

= , +=, -=, /=, %=

        var h = 10
h += 1
h /= 2
h %= 2
// etc

    

Операторы сравнения

Операторы сравнения в качестве результата возвращают значения типа Bool

==, ≠, >, <, ≥, ≤

        let condition = 2 > 3
let condition2 = 1 != 0
let resultCondition = condition == condition2
// etc

    

Логические операторы

Логические операторы используют для комбинирования или инверсии булевых значений.

Рассмотрим на примере:

        // логическое И
print(true && true)      // true
print(true && false)     // false

// логическое ИЛИ
print(true || false)      // true

// логическое НЕ – инвертирует булево значение
print(!true)              // false

    

Это еще не все операторы, которые существуют в Swift. Остальные мы рассмотрим в контексте целей их предназначения.

Коллекции

Swift предлагает нам три основных типа коллекций: Array(Массивы), Dictionary(Словари) и Set(Множества). Сейчас мы рассмотрим первые два.

Array

Используйте квадратные скобки [], чтобы создавать массивы(Array) и словари(Dictionary).

Получить доступ к элементам массива можно написав индекс внутри скобок.

        let digits: [UInt8] = [0, 1, 2, 3, 4, 5, 6, 7, 8 ,9]
 print(digits[3])

    

Попробуйте изменить значение в массиве digits. Что произойдет?

        digits[0] = 1
    
🪲
Cannot assign through subscript: ‘digits’ is a ‘let’ constant

Поскольку мы объявили массив как константу, то и все его значения становится не изменчивыми (immutable), как и его размер. А если мы объявим массив как переменную, то он будет изменчивым (mutable). Такое свойство называют изменчивостью коллекций (mutability of collection).

Это утверждение справедливо и для Словарей.

        // mutable
var numbers = [50, 10, 20, 34, 45]
print(numbers[0])
numbers[0] = numbers[0] + 1

    

Dictionary<Key, Value>

Создадим словарь sunSystemData, в который добавим данные о солнечной системе.

Пусть ключами (key) данного словаря будут номера объектов солнечной системы, а значениями (value) названия объектов. Поскольку звезда рождается первой, то будем считать, что ключ со значением 0 всегда указывает на звезду. Остальные объекты следуют в порядке по отношению к звезде.

        var sunSystemData = [ 0: "Sun", 1:"Mercury", 2:"Venus", 
	3:"Earth", 4:"Mars", 5:"Jupiter", 6:"Saturn", 7:"Uranus", 8:"Neptune"]

    

Мы не указали типы для словаря явно. Вы можете проверить как их определил Swift, используя функцию стандартной библиотеки Swift (Swift Standard Library) type(of: T).

        type(of: sunSystemData) // Dictionary<Int, String>

    

Обратиться к элементу словаря можно, написав ключ внутри скобок. Результат будет содержать значение опционального типа (Optional), а если по заданному ключу (в скобках) нет соответствующего элемента, то получим nil.

nil в Swift означает отсутствие значения.

Получим нашу родную планету и выведем ее в консоль.

        var homePlanet = sunSystemData[3]
print("My home is \(homePlanet)")

    

Когда мы попытались вывести переменную в консоль, то получили предупреждение!

🪲
String interpolation produces a debug description for an optional value; did you mean to make this explicit?

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

        type(of: homePlanet) // Optional<String>

    

Чтобы избавиться от предупреждения в интерполяции строки, нам необходимо указать что именно мы выводим. Сделать это можно при помощи оператора as. В этом случаи мы увидим напечатанный nil , когда значение отсутствует. Попробуйте обратиться к элементу с ключом 0.

        print("My home is \(sunSystem[0] as String?)") // My home is nil
print("My home is \(homePlanet as String?)") // My home is Earth
    

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

Сделать это мы можем при помощи оператора объединения по nil??

        var homePlanet = sunSystem[3] ?? "Unknown planet"
print("My home is \(homePlanet)") // My home is Earth

    

Пока опустим темы об опциональных типах и приведении типов(type casting).

В следующих статьях я расскажу о них подробней.

Продолжим!

Кстати, если вы считаете, что Плутон это планета, то можете добавить её самостоятельно!

        sunSystem[9] = "Pluto"

    

Чем отличаются массивы от словарей?

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

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

Например:

        var HierarchyOfNumbers: [Character:String] = [
	"N":"Natural Numbers"
	"Z":"Integers"
	"Q":"Rational Numbers"
	"R":"Real Numbers"
	"C":"Complex Numbers"
]

    

Управление потоком

Часто необходимо выполнять различный код базирующийся на определенных условий (conditions).

  • Если вам необходимо написать различную логику, которая зависит от определенных условий, тогда используйте условные инструкцииif, switch. Инструкцияifхорошо подходит для простых сравнений, и нескольких вариантов исходов.
  • Инструкция switch подходит для более сложных условий. Лучше использовать ее, когда вам необходимо выбрать из множества вариантов альтернатив, основываясь на каком-либо значении, т.е. выполнить код соответствующий определенному шаблону.
  • Когда вам необходимо многократно повторить какие либо инструкции, используйте циклы: for-in,while.

If…else

Инструкция if бывает трех форм.

Традиционное ее представление выглядит так:

        var condition = true
if condition {
	// 
} else {
	//
}

    

В зависимости от условия, мы попадаем в определенные блоки кода. Когда условие истинно(true), выполняется блок следующий за if, а когда ложно(false), выполняется блок следующий за else.

Например, вы решили, что Плутон планета? Сейчас узнаем!

        var isPluto = sunSystemData[9] != nil

if isPluto {
	print("Pluto is planet")
} else {
	print("Pluto is not planet")
}

    

if…

Мы можем опустить блок else, когда нам необходимо выполнить только одно условие.

Рассмотрим такой случай. У нас есть данные, и мы не хотим перезаписать значение. Тогда необходимо проверить наличие данных, и только после добавить значение.

        var key = 0, value = "Sun"
var isExists = sunSystemData[key] != nil // false
if !isExists { // true
	sunSystemData[key] =  value
}

    

if…else if…else

Также мы можем добавить условия следующее за else.

        var value = 0
if value > 0 {
	print("\(value)")
} else if value == 0  {
	print(value)
} else {
	print(value)
}

    

Вы можете комбинировать if else.

Например:

        var a = 0, b = 3, c = 1
if a > b {
	print(a - b)
} else if b > a { 
	print(b - a)
} else if c < a {
	print(a - c)
} else {
	 print(a + b + c)
}

    

switch

В самой простой форме switch выглядит так:

        var value = "R2-D2"
switch value {
	case "R2-D2": print("Take him!")
	case "C-3PO": print("Take him!")
	default: 
		print("These aren't the droids you're looking for.")
}

    

Ключевое слово case определяет возможный случай (шаблон), с которым сравнивается значение value. Затем исполняется соответствующий блок кода на основе первого успешно совпавшего шаблона. В случаи если совпадений не найдено, исполняется блок default , который всегда следует после остальных случаев. Условие default гарантирует что наша конструкция полная и законченная.

Поменяйте значение value, и посмотрите, какой блок кода исполнился.

for-in

Цикл for-in упрощает перебор по последовательностям, т.к. массивы, словари, строки.

Синтаксис for-in выглядит так:

        for value in sequence{
  // 
}

    

Цикл for-in исполняет инструкции определенное количества раз, пока мы не достигнем конца последовательности.

valueэлемент последовательности на каждой итерации(iteration, повторении).

Рассмотрим пример перебора значений массива и словаря.

        for digit in digits  {
	print(digit)
}
for (key, value) in sunSystemData {
	print("Key:\(key) Value:\(value)")
}

    

while

while имеет две формы.

Первая из них начинается с вычисления условия. Такой цикл можно рассматривать как повторяющаяся инструкция if.

        var condition = true;
while (condition) {
	// тело цикла
}

    

Например, мы хотим пройти 10 000 шагов.

        var stepGoal = 10_000
var mySteps = 0
while mySteps < 10_000 {
	mySteps += 1
}

    

Цикл будет работать пока условие mySteps < 10_000 принимает булево значение true.

Внутри тела цикла мы увеличиваем переменную mySteps на один шаг.

Когда условие принимает значение false, то цикл останавливается.

Расчет факториала числа.

        var counter = 5                
var factorial = 1 // начальное значение             

while counter > 0 {            
    factorial *= counter       
    counter -= 1               
}

print(factorial)  

    

Здесь я вам предлагаю разобраться самостоятельно 😉

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

В остальном repeat-while ведет себя идентично while.

        var condition = true
repeat {
	// тело цикла 
} while (condition)

    

Также цикл while используется, когда нам заранее неизвестно число итераций последовательности. В отличии от цикла for-in.

Функции

В Swift есть два типа функций:

Пользовательские(User-defined Function) и функции стандартной библиотеки (Standard Library Functions).

Функции помогают организовывать код, разбив его на более мелкие части, что делает код более легким для понимания и переиспользования. Мы уже использовали функции стандартной библиотеки, такие как print() и type(). Рассмотрим, как создаются пользовательские функции.

Функция – блок кода, который выполняет конкретную задачу.

Каждая функция имеет уникальное имя, которое является ее идентификатором.

        func functionName(parameters) -> returnType {
  // тело функии 
}

    

Объявить функцию можно при помощи ключевого слова func.

За ним следует имя функцииfunctionName.

В скобках указываются параметры(parameters) функции.

Параметр – это значение определенного типа, принимаемое функцией.

returnType – указывает, какого типа значение возвращает функция

Чтобы исполнить функцию, ее необходимо вызвать (как мы уже делали это с print()).

        // вызов функции
functionName()

    

Функции без параметров

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

        func greetings() {
	 print("Hello Proglib!")
}
greetings()

print("Done!")

    

Мы объявили функцию с именем greetings() , которая просто печатает "Hello Proglib!" в консоли. Она не имеет параметров и возвращаемого значения. При вызове функции управление программой переходит к определению функции. Затем исполняется код, который содержится внутри тела функции:

        print("Hello Proglib!")
    

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

        print("Done!")
    

Функции с параметрами

Функции, в которым мы передаем аргументы, называются функциями с параметрами. Если мы хотим, чтобы функция возвращала значение, нужно использовать оператор return.

Например, разница между двумя значениями:

        func difference(a: Int, b: Int) -> Int {
	return a - b 
}
var result = difference(a: 3, b: 2)
print(result)

    

Мы объявили функцию с именем difference, которая принимает два параметра типа Int и возвращает значение типа → Int. При вызове функции, мы передаем параметры в круглых скобках (a: 3, b: 2).

Каждый параметр функции состоит из метки аргумента и имени параметра. Имена параметров используются при реализации функции.

        func difference(of a: Int, less b: Int) -> Int {
  return a - b
}

    

Метка аргумента используется при вызове функции.

        difference(of: 1, less: 2)
    

По умолчанию параметры используют свое имя параметра в качестве метки аргумента(как в первом примере).

Если вам не нужна метка для аргумента, то напишите _ вместо конкретного названия метки для аргумента.

        func difference(_ x: Int, _ y: Int) -> Int {
  return x - y
}

difference(3, 4)

    

Мы можем опустить оператор return , когда тело функции является одним выражением.

        func difference(a: Int, b: Int) -> Int {
	a - b 
}

    

Заключение

Мы познакомились с фундаментальным синтаксисом языка программирования Swift. Рассмотрели основные операторы, научились объявлять переменные и объединять код в функции. В следующие полчаса разберем каждую тему более глубоко. На сегодня все! Playground доступен на Github.