Skip to main content

Практическое задание

Нужно разработать iOS приложение для просмотра GitHub репозиториев.

Во время работы над практическим заданием настоятельно рекомендуем обращаться к разделу Памятки для разработчика

Кликабельный прототип

Функциональные требования

  1. Авторизация пользователя (personal access token)
  2. Просмотр списка репозиториев пользователя (первые 10)
  3. Просмотр детальной информации выбранного репозитория
    1. статистика (forks, stars, watchers)
    2. ссылка на web страницу репозитория
    3. лицензия
    4. readme

Технические требования

  1. Реализация на Swift
  2. Использовать Interface Builder (xib, не storyboard)
  3. Использовать Alamofire для работы с REST API
  4. Использовать UITableView для отображения списка
  5. Использовать Constraints для экрана детальной информации
  6. Использовать переходы между ViewController'ами через push, а не через seque
  7. Использовать Codable для парсинга json
  8. Сохранять токен авторизации в хранилище устройства - NSUserDefaults
  9. Корректно обрабатывать ситуации "загрузка данных", "ошибка загрузки", "пустой список"
  10. Корректно обрабатывать смену ориентации экрана
  11. При перезапуске приложения авторизация должна сохраняться
  12. Использовать локализацию для всех строк, показываемых пользователю
  13. Использовать векторную графику везде, где это возможно
  14. Обеспечить поддержку iOS 13.0

Классы iOS приложения


class RepositoriesListViewController: UIViewController {
// TODO:
}

class RepositoryDetailInfoViewController: UIViewController {
// TODO:
}

class AuthViewController: UIViewController {
// TODO:
}

class AppRepository {
func getRepositories(completion: @escaping (Array<Repo>?, Error?) -> Void) {
// TODO:
}

func getRepository(repoId: String, completion: @escaping (RepoDetails?, Error?) -> Void) {
// TODO:
}

func getRepositoryReadme(ownerName: String, repositoryName: String, branchName: String, completion: @escaping (String?, Error?) -> Void) {
// TODO:
}

func signIn(token: String, completion: @escaping (UserInfo?, Error?) -> Void) {
// TODO:
}

// TODO:
}

class KeyValueStorage {
var authToken: String?
}

Диаграмма классов

classDiagram class RepositoriesListViewController:::ios class RepositoryDetailInfoViewController:::ios class AuthViewController:::ios class AppRepository:::ios class KeyValueStorage:::ios RepositoriesListViewController --> AppRepository RepositoryDetailInfoViewController --> AppRepository AuthViewController --> AppRepository AppRepository --> KeyValueStorage

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

Сделаем 3 экрана. С авторизации на список репозиториев переход делаем после успешного выполнения запроса авторизации (обращением к репозиторию), а с списка репозиториев на детальный вид репозитория переходить будем передавая сущность репозитория.

Все 3 экрана будут напрямую работать с репозиторием и обновлять свое внутреннее состояние при получении ответов от репозитория.

Материалы

  1. GitHub REST API
  2. GitHub Basic Authorization
  3. GitHub user repositories
  4. Интеграция Alamofire
  5. Дизайн