• Как делать авторизацию в IOS приложении, с использованием биометрию?

    Loriens
    @Loriens
    iOS Developer
    Logging a User into Your App with Face ID or Touch ID

    Там же простой проект с реализацией.
    Ответ написан
    Комментировать
  • Как синхронизировать AirPods с ноутбуком?

    Loriens
    @Loriens
    iOS Developer
    Есть 3 варианта, которые работают лично для меня для макбука/айфона:
    1) Включить/выключить Bluetooth на маке/айфоне
    2) Отсоединить AirPods от устройства
    3) Сбросить настройки AirPods

    Выше пишут:
    все должно работать, если мы говорим о официальной продукции конечно
    Это не так. AirPods не без греха, у меня официальная продукция, и она далеко не без багов. Но в целом работает хорошо и стабильно.
    Ответ написан
    Комментировать
  • Как закрыть UIAlertController?

    Loriens
    @Loriens
    iOS Developer
    Перемести appDelegate.getApiService(...).getRequests(...) во viewDidAppear. Present view controller'a не должен вызываться во viewDidLoad.

    Нашёл здесь - ответ на StackOverflow
    Ответ написан
    1 комментарий
  • Имеют ли место реальные тенденции к вытеснению нативной мобильной разработки со стороны кроссплатформенных решений?

    Loriens
    @Loriens
    iOS Developer
    Основная проблема кроссплатформы - сложно поддерживать сразу всё. При этом всё должно работать также быстро, как на нативе. И код должен быть лёгким и понятным.

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

    Вот серия статей об опыте использования React Native в Airbnb - https://medium.com/airbnb-engineering/sunsetting-r... Они описали свой опыт работы с RN и почему в итоге вернулись к нативной разработке.

    Что использовать в разработке - тут всё зависит от задач. Где-то проще использовать кроссплатформу, где-то лучше натив. Пока что чаще выбирают натив, предпосылок к победе кроссплатформы в ближайшем будущем я не вижу.

    У меня есть знакомые, которые успешно пишут на Flutter или React Native, но среди мобильщиков их крайне мало (как и самих вакансий).
    Ответ написан
    Комментировать
  • Где моя ошибка при делегирование?

    Loriens
    @Loriens
    iOS Developer
    Ошибка, скорее всего, здесь:
    var mainController = MainViewController()

    Так как вы используете segue, подозреваю, что ваш контроллер создан в сториборде. А вызов MainViewController() создаёт новый контроллер, который нигде не отображается.

    Вы должны установить делегат в prepare for segue в классе MainViewController:
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destination = segue.destination as? SecondViewController {
            self.delegate = destination
        }
    }


    Также нужно использовать слабую ссылку на делегата, чтобы избежать retain cycle:
    weak var delegate: MainViewControllerDelegate?

    P. S. Лучше добавить больше кода, потому что непонятно, где конкретно вы вызываете функцию делегата. Эта фраза ни о чём не говорит:
    можно ли вызывать метод делегата из override

    Ключевое слово override может много где появляться.
    Ответ написан
    1 комментарий
  • Apple требует добавления "in app purchase"?

    Loriens
    @Loriens
    iOS Developer
    Так как у вас не физический товар или услуга, то вы должны использовать In-App Purchase.

    Это, скажем так, налог Apple :).

    Можно прочитать в App Store Review Guidelines:
    3.1.5 (a) Physical Goods and Services Outside of the App: If your app enables people to purchase goods or services that will be consumed outside of the app, you must use purchase methods other than in-app purchase to collect those payments, such as Apple Pay or traditional credit card entry.
    Ответ написан
    Комментировать
  • Как телеграм звонит при выключеном приложении на ios?

    Loriens
    @Loriens
    iOS Developer
    iOS представляет разработчикам такую возможность - CallKit, PushKit

    Примерно так же, как вы получаете push-уведомления при выключенном приложении.
    Ответ написан
    1 комментарий
  • Покупка "восстановленного" устройства на официальном сайте Apple?

    Loriens
    @Loriens
    iOS Developer
    В Россию они не доставят.

    Нужно использовать посредников (например, сервис Бандеролька, но у них хорошая комиссия за эту услугу) или знакомых в США, которые примут товар на свой адрес, а потом перешлют в Россию. Также там будет пошлина 15% свыше 500 евро.

    Советую ещё посмотреть варианты в B&H, Ebay и других магазинах электроники США. Там, скорее всего, будет ещё дешевле.

    Можно ещё у продавцов серой техники взять, которые также покупают за бугром, привозят к нам и дают свою наценку. Я так брал американский MBR 2018, так как не хотел ждать доставки из США. Выходит тоже сильно дешевле, чем РСТ вариант.
    Ответ написан
    Комментировать
  • Что учить в IT, куда пойти в будущем?

    Loriens
    @Loriens
    iOS Developer
    Как сказали выше, математике учат везде. Как таковой нормально специальности "програмист <чего-то>" ты не найдёшь. Поэтому нужно учить самому.

    Самообразование - главный навык программиста.

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

    Loriens
    @Loriens
    iOS Developer
    Вообще твой вариант должен работать. Когда ты вызываешь `cartCV.reloadData()`, collection view перерисовывается.

    Во-первых, задал ли ты data source и delegate для collection view? В коде этого нет, но может ты сделал это в сториборде. В коде это выглядело бы так:
    override func viewDidLoad() {
        super.viewDidLoad()
        cartCV.dataSource = self
        cartCV.delegate = self
        dataProcessing()
        print(imageArr.count)
    }


    Во-вторых, `cell.cartImageView.image = UIImage(data: try! Data(contentsOf: imageUrl!))` - очень плохо. Это будет выполняться в главном потоке, соответственно, приложение будет заморожено на момент загрузки картинок. Нужно делать это асинхронно. Желательно избегать force unwrapping. Например, так:
    DispatchQueue.global().async {
        if let imageUrl = imageUrl,
            let data = try? Data(contentsOf: imageUrl) {
            DispatchQueue.main.async {
                self.cell.cartImageView.image = UIImage(data: data)
            }
        }
    }

    Такое решение костыльное, но я просто как пример пишу. Подгрузка data должна быть не в главном потоке, а обновление изображения в главном.

    Также есть хорошая либа для асинхронной подгрузки картинок - Kingfisher. C ней подгрузка изображения выглядела бы так:
    cell.cartImageView.kf.setImage(with: imageUrl)
    Ответ написан
    1 комментарий
  • Какой факультет подойдет для мобильного разработчика?

    Loriens
    @Loriens
    iOS Developer
    Готов разбить твоё сердечко - нигде.

    Если нужен универ, то программная инженерия, наверное, поближе будет. Также прикладная математика/фундаментальная информатика (в СПбГУ и СПбПУ они также есть) или что-то подобное.

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

    Можешь поучиться активно пару лет, а потом совмещать работу или фриланс с учёбой, многие так и делают.
    Ответ написан
    Комментировать
  • Как перезагрузить UITableView после dismiss другого ViewController'a?

    Loriens
    @Loriens
    iOS Developer
    Есть много способов это сделать.

    Самый простой - обновлять таблицу при появлении CategoriesViewController:
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        tableView.reloadData()
    }


    Если нужно дополнительно добавлять какую-то информацию из AddCategoryVC, можешь держать CategoriesViewController в качестве делегата внутри AddCategoryVC. Для этого:
    1) Описываешь протокол для делегата:
    protocol AddCategoryVCDelegate: AnyObject {
        func addCategoryDismissed()
    }

    2) Хранить в AddCategoryVC делегата (его нужно будет задать при создании контроллера, это будет твой CategoriesViewController):
    weak var delegate: AddCategoryVCDelegate?
    3) И вызывать его в dismiss completion:
    dismiss(animated: true) {
        self.delegate?.addCategoryDismissed()
    }
    Ответ написан
    3 комментария