Портфель iOS TEAM разработчика

  • Tutorial
image

Каждый раз когда в команду приходит новый сотрудник, приходится решать вопрос с тем, какие приложения стоит установить на его компьютер. Даже опытные разработчики не помнят всего списка того, чем они попользуются. Часть приложений запускается ежедневно. Часть — время от времени. Но, когда такого приложения нет под рукой — это часто становится потерей драгоценного времени. Как правило, первые дни отводятся на развертывание окружения и ознакомление со списком задач. Хорошо когда есть возможность пройтись по списку и отметить то, что было сделано перед погружением в проект. Из этих соображений был сформирован «портфель» с которым работает наша команда.

Подавляющее большинство приложений — бесплатные.

Софт обязательный к установке:
OSX — Apple OS последней версии устанавливается из AppStore (на момент написания — последняя версия OSX)

XCode: основное средство разработки в OSX и XCode
  • XCode 7.3: itunes.apple.com/ru/app/xcode/id497799835?mt=12
  • Command line tools for xcode: устаннавливается в обязательном порядке после установки XCode непосредственно из XCode. Содержит, в том числе, Git клиент, без которого доступ к Git из OSX будет невозможен.

SourceTree: Удобный клиент Git

Slack: Интрумент командной работы и общения в компании:

Текстовые редакторы:
  • TextWrangler — удобен для работы с файлами, используемыми при разработке (.json, .plist, xml) и пр., кроме того, используется для разруливания конфликтов Git: itunes.apple.com/ru/app/textwrangler/id404010395?mt=12

Опционально:
Wireshark: HTTP Sniffer — предназначен для перехвата пакетов сети, ушедших через сетевую карту компа разработчика

Postman: удобное приложение для проверки REST API

Joxy: «облачное» приложение для мгновенного обмена скриншотами и файлами по сети.

Программы для управления iOS девайсами и снятия статистики

IBeacons

FTP / SSH клиенты

VNC \ RDP клиенты:

Графические редакторы:
  • Adobe Photoshop: идеальный вариант
  • Acorn: альтернатива Adobe Photoshop: flyingmeat.com/acorn
  • GIMP: жестокая альтернатива: www.gimp.org/downloads
  • Векторный online-редактор, для рисования схем: draw.io

XCode plugins: Alcatraz

Чтоб установить его, следует выполнить в консоли команду
curl -fsSL raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
Ниже приводятся проверенные временем расширения.
  • KSHObjcUML — инструмент визуализации зависимостей классов в Obj-C / Swift коде.
  • ObjectGraph-Xcode — построение диаграмм по коду ( предварительно следует установить www.graphviz.org/Download_macos.php). Плагин работает только с Obj-C кодом.
  • XAlign — вертикальное форматирование кода, по знаку =
  • XToDo -панель с перечнем ToDo в коде

Другие рекомендуемые плагины:
  • PreciseCoveration
  • PrettyPrintISON
  • RSImageOptimePlugin
  • SuggestedColors
  • SwiftJsonToObject
  • XCodeRefactoringPlus
  • ZMDocItemInspector

P.S. Учтите, что некоторые плагины могут приводить к нестабильности XCode.

Сниппеты
К сожалению, многие разработчики не знают или не умеют пользоваться сниппетами. Сниппеты — это выдержки («цитаты») часто используемых выражений.
Использование сниппетов очень сокращает ввод кода. Это лучше один раз увидеть, чтоб понять (см. gif)
image
Для создания сниппета необходимо перейти во вкладку Show the Snippet Library (1), нажать кнопку Edit (не показана на скриншоте), ввести соотвествующие поля (2) и не забыть, выбрать платформу.
image
Вставка кода осуществляется по мере ввода имени сниппета в поле редактирования кода.
Ниже приводятся примеры из индивидуального списка сниппетов
Custom class
import UIKit

class <#Class Name#> : NSObject {
    
    // MARK: - Variables

    // MARK: - Outlets
    
    // MARK: - Public Properties

    // MARK: - Private Properties

    // MARK: - Constructors
    override init() {
        super.init()
    }
    
    // MARK: - Methods of class
    class func start() {
        
    }
    
    // MARK: - Methods of instance
    
    // MARK: - Actions
    
    // MARK: - Overrided methods

    // MARK: - Private methods


Custom Property
private var _<#property#>:<#Type#>?
    var <#property#>:<#Type#> {
        get
        {
            if _<#property#> == nil
            {
                _<#property#> = <#Type#>()
            }
            
            return _<#property#>!
        }
        set (value)
        {
           _<#property#> = value
        }
    }


Dispatch After SWIFT
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
            dispatch_after(delayTime, dispatch_get_main_queue()) {
                println("test")
            }


Dispatch Async
dispatch_async(dispatch_get_main_queue()) {
        }


main queue
dispatch_async(dispatch_get_main_queue()) {
                        print(self)
                    }


Mark
// MARK: -


Singleton - Swift
// MARK: - Singletone Implementation
    
    private override init() {
        super.init()
    }

    class var sharedInstance: <#ClassName#> {
        struct Static {
            static var instance: <#ClassName#>?
            static var token: dispatch_once_t = 0
        }
        
        dispatch_once(&Static.token) {
            Static.instance = <#ClassName#>()
        }
        
        return Static.instance!
    }


ViewController
import UIKit

class <#Class Name#> : UIViewController {
    
    // MARK: - Variables
    
    // MARK: - Outlets
    
    // MARK: - Public Properties
    
    // MARK: - Private Properties
    
    // MARK: - Constructors
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // MARK: - Methods of class
    class func start() {
        
    }
    
    // MARK: - Methods of instance
    
    // MARK: - Actions
    @IBAction func backButton(sender: AnyObject) {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    
    // MARK: - Private methods
    
}


Cocoapods
Как же обойтись без упоминания Cocoapods, который, кстати, на днях дорос до версии 1.0.0
Основной ресурс:

Статьи:

Пример Podfile
platform :ios, '8.0'
use_frameworks!

pod 'Alamofire'
pod 'SwiftyJSON'
pod 'RESideMenu'
pod 'MBProgressHUD', '~> 0.9.1'
pod 'MagicalRecord'
pod 'SevenSwitch', '~> 2.0'
pod 'SMIconLabel'

Libraries
Огромный набор всевозможных библиотек (используется в зависимости от предметной области текущей разработки).

Поделитесь, пожалуйста, в комментариях, какие бесплатные приложения полезны лично вам для разработки в iOS.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 42

    +5

    Хм, синглтоны в Swift уже давно не так делаются:


    class MyClass {
        static let sharedInstance = MyClass()
    }
      0
      Там private init() для потокобезопасноти нужно добавить(
        0
        private init() не спасет от рейс кондишн, тут приватный конструктор нужен чтобы запретить создание больше одного инстанса, у нас же всё таки синглтон)
          0
          private init() — это и есть приватный конструктор в Swift. :)
            0
            а я про что говорил? :) Вы сказали, что приватный конструктор нужен для потокобезопастности, а я говорю, что он тут нужен для защиты от повторного создания инстанса)
              0
              Точно. Я ж это под «потокобезопасностью» и имел ввиду. :)
                0
                Хорошо :) Просто для потокобезопасного решения я думал увидеть что-то из double-checked locking например :)
                  0
                  Статики в свифте ленивы и потокобезопасны.
                    0
                    Разумеется, к тому же у нас let модификатор. Спасибо.
      +3

      Кучу всякой ненужной гуйни перечислили, а iterm и homebrew забыли.


      И еще в копилку: скрипты ios-deploy и ios-sim из phonegap весьма полезны, с ними можно писать код в нормальном текстовом редакторе (а не в убогом xcode), собирать проект с помощью xcodebuild и потом деплоить на устройство/в симулятор, не открывая xcode.


      brew install node
      npm install -g ios-deploy
      npm install -g ios-sim
        +1

        Можно, кстати, своими силами обойтись, но будет не так красиво.
        package.json:


        "scripts: {
            "ios-build": "xcodebuild  -project ios/YourAppName.xcodeproj -scheme YourAppName -sdk iphonesimulator -destination platform='iOS Simulator',name='iPhone 6 Plus' -derivedDataPath ios/build",
            "ios-launch-sim": "xcrun instruments -w 'iPhone 5s (9.2)'",
            "ios-install-app": "xcrun simctl install booted ios/build/Build/Products/Debug-iphonesimulator/YourAppName.app",
            "ios-launch-installed": "xcrun simctl launch booted org.yourcompany.YourAppName",
           ...
        }
          0

          Спасибо, унес в заметки.

            0
            по wifi ипашку на девайс зальет что-то из этого?
              0

              Нет. Эти скрипты, будучи выполнены последовательно, запустят проект на эмуляторе iPhone 5s.

                0
                Жаль( А так я знаком с этими тулзами, думал может что-то новое есть. Спасибо за ключик '-derivedDataPath', мне кажется "-destination platform='iOS Simulator',name='iPhone 6 Plus'" можно заменить просто на "-arch x86_64".
          +1
          Ваш Podfile не будет работать с cocoapods 1.0.0 без указания имени таргета.
            0
            Думаю, Вы ошибаетесь. Этот файл вполне благополучно сейчас работает с cocoapods 1.0.0
              0
              Хм, может у вас rc еще стоит?

              pod init
              pod install
              

              Analyzing dependencies
              [!] The dependency `Alamofire` is not used in any concrete target.
              The dependency `SwiftyJSON` is not used in any concrete target.
              The dependency `RESideMenu` is not used in any concrete target.
              The dependency `MBProgressHUD (~> 0.9.1)` is not used in any concrete target.
              The dependency `MagicalRecord` is not used in any concrete target.
              The dependency `SevenSwitch (~> 2.0)` is not used in any concrete target.
              The dependency `SMIconLabel` is not used in any concrete target.
              


              Тут они писали об этом http://blog.cocoapods.org/CocoaPods-1.0/
                0
                Очень странно. У меня буквально пару дней назад затребовало указания таргета в podfile и без этого ну никак не хотел их подтягивать. :(
              +6
              Каждый раз когда в команду приходит новый сотрудник, приходится решать вопрос с тем, какие приложения стоит установить на его компьютер


              А самому ему решать нельзя?
                0
                По графике добавил бы Pixelmator как альтернативу Photoshop.
                  0

                  И ещё модный Sketch. ;)

                    0
                    Еще есть модный PaintCode, сейчас активно пиарится ios сообществом. Интересно кто-нибудь использует/использовал?
                    0
                    Скорее AffinityPhoto как аналог PS, у них еще есть и Designer как замена CorelDraw и тп векторному софту.
                    0
                    Мой набор:
                    Основная IDE: AppCode
                    Вспомогательные редакторы: Sublime Text, VS Code
                    Документация: Dash
                    Гит: GitUp, P4Merge
                    HTTP-клиент: Postman
                    Графика: ImageMagick, Ghostscript, Pixelmator, GIMP, Zeplin
                    Трекинг времени: Qbserve
                    Общение: Slack, Skype
                    Разное: Alfred
                      0
                      Также предпочитаю Carthage вместо CocoaPods, хотя и поды приходится использовать.
                        0
                        А расскажите про Carthage поподробнее или дайте пару полезных ссылок на тему. Буду очень благодарен вам. :)
                          0
                          Никакого самоуправства с файлами проекта как у подов.
                          Никакой пересборки зависимостей при сборке проекта.
                          Выкачивает и собирает фреймворки, которые я сам куда нужно подключаю.
                          https://realm.io/news/swift-dependency-management-with-carthage/
                            0
                            О, спасибо большое.
                              0
                              минусы рассказать забыли :-)
                              1) долгое выкачивание и сборка фреймворков когда нужно добавить/удалить что то
                              2) нужно руками прописывать путь к каждому фреймворку и добавлять фреймворк в проект
                              2.1) это нужно сделать для каждого таргета
                                0
                                1.
                                Долгое, это если всё под все платформы собирать, но обычно нужна только одна, например, только iOS.
                                Также при удалении не нужно ничего пересобирать, а при обновлении/добавлении можно отдельно указать, какой обновить.

                                2.
                                Только в один скрипт для сабмита в стор надо дописывать фреймворки.
                                  0
                                  Только в один скрипт для сабмита в стор надо дописывать фреймворки.

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

                                  Также при удалении не нужно ничего пересобирать

                                  ну да, на удаление не надо пересобирать. Но надо убрать из картежфайла запись, из таргета удалить фреймворк, потом найти его в скрипте и убрать путь до него.
                                  Конечно ситуация добавления/удаления не такая и частая, но как то смущает. Особенно когда больше 1 таргета на проекте
                                    +1
                                    > В проекте ибо в таргет прикладывается скрипт с путями и какие нужны фреймворки.
                                    Да, я про этот скрипт и говорю, но пути там однотипные и относительные.
                                    И этот скрипт нужен для подготовки фреймворков приложения для загрузки в айтюнс.
                                    Между таргетами — копипастом :), но таргетов же обычно минимум.

                                    По-моему, это минимальная плата за то, что ничего не ломается с каждой новой версией подов.
                          0
                          В качестве языка Obj-C используете?
                            0
                            Сейчас Swift в основном.
                            Поддержка свифта в аппкоде далеко не супер, конечно, но жить можно.
                              0
                              Она даже не доходит до уровня Xcode.
                                0
                                По части поддержки фич языка и вывода типов, да, не доходит.
                                Но как редактор кода AppCode на голову выше, и даже некоторые рефакторинги уже работают.
                                0
                                А с StoryBoard/Xib через Xcode работаете?
                                  0
                                  Тут IB в Xcode без вариантов. Также настройки проекта в Xcode делаю, у AppCode не все там гладко.
                            0
                            в другое я бы добавил ещё:
                            SimPholders 2.2 — для просмотра данных в CoreData
                              +3
                              ИМХО, не стоит он тех денег, что за него просят. Реализовать такое — не великая проблема. К тому же недавно перестала работать App Store-версия, а разработчики перестали отвечать на письма. В итоге накидали собственный аналог за день:
                              https://github.com/dsmelov/simsim
                                0
                                Я, может, занудствую, но было бы удобно, чтобы на гитхабе во вкладке Releases лежал DMG с бинарником ;)

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

                            Самое читаемое