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.
Поделиться с друзьями
-->

Комментарии (38)


  1. silvansky
    15.05.2016 13:19
    +5

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


    class MyClass {
        static let sharedInstance = MyClass()
    }


    1. s_suhanov
      15.05.2016 22:10

      Там private init() для потокобезопасноти нужно добавить(


      1. house2008
        15.05.2016 22:20

        private init() не спасет от рейс кондишн, тут приватный конструктор нужен чтобы запретить создание больше одного инстанса, у нас же всё таки синглтон)


        1. s_suhanov
          16.05.2016 10:32

          private init() — это и есть приватный конструктор в Swift. :)


          1. house2008
            16.05.2016 12:17

            а я про что говорил? :) Вы сказали, что приватный конструктор нужен для потокобезопастности, а я говорю, что он тут нужен для защиты от повторного создания инстанса)


            1. s_suhanov
              16.05.2016 12:18

              Точно. Я ж это под «потокобезопасностью» и имел ввиду. :)


              1. house2008
                16.05.2016 12:24

                Хорошо :) Просто для потокобезопасного решения я думал увидеть что-то из double-checked locking например :)


                1. eugeneego
                  16.05.2016 13:22

                  Статики в свифте ленивы и потокобезопасны.


                  1. house2008
                    16.05.2016 13:38

                    Разумеется, к тому же у нас let модификатор. Спасибо.


  1. alexac
    15.05.2016 13:41
    +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. Houston
      15.05.2016 13:59
      +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",
         ...
      }


      1. alexac
        15.05.2016 14:03

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


      1. house2008
        15.05.2016 14:03

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


        1. Houston
          15.05.2016 14:08

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


          1. house2008
            15.05.2016 14:21

            Жаль( А так я знаком с этими тулзами, думал может что-то новое есть. Спасибо за ключик '-derivedDataPath', мне кажется "-destination platform='iOS Simulator',name='iPhone 6 Plus'" можно заменить просто на "-arch x86_64".


  1. house2008
    15.05.2016 13:56
    +1

    Ваш Podfile не будет работать с cocoapods 1.0.0 без указания имени таргета.


    1. Demtriy
      16.05.2016 12:59

      Думаю, Вы ошибаетесь. Этот файл вполне благополучно сейчас работает с cocoapods 1.0.0


      1. house2008
        16.05.2016 13:10

        Хм, может у вас 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/


      1. s_suhanov
        16.05.2016 13:10

        Очень странно. У меня буквально пару дней назад затребовало указания таргета в podfile и без этого ну никак не хотел их подтягивать. :(


  1. loz
    15.05.2016 14:35
    +6

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


    А самому ему решать нельзя?


  1. SudoKarate
    15.05.2016 22:10

    По графике добавил бы Pixelmator как альтернативу Photoshop.


    1. silvansky
      16.05.2016 10:21

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


      1. house2008
        16.05.2016 12:47

        Еще есть модный PaintCode, сейчас активно пиарится ios сообществом. Интересно кто-нибудь использует/использовал?


    1. Leopotam
      16.05.2016 10:48

      Скорее AffinityPhoto как аналог PS, у них еще есть и Designer как замена CorelDraw и тп векторному софту.


  1. eugeneego
    16.05.2016 10:50

    Мой набор:
    Основная IDE: AppCode
    Вспомогательные редакторы: Sublime Text, VS Code
    Документация: Dash
    Гит: GitUp, P4Merge
    HTTP-клиент: Postman
    Графика: ImageMagick, Ghostscript, Pixelmator, GIMP, Zeplin
    Трекинг времени: Qbserve
    Общение: Slack, Skype
    Разное: Alfred


    1. eugeneego
      16.05.2016 11:44

      Также предпочитаю Carthage вместо CocoaPods, хотя и поды приходится использовать.


      1. s_suhanov
        16.05.2016 13:14

        А расскажите про Carthage поподробнее или дайте пару полезных ссылок на тему. Буду очень благодарен вам. :)


        1. eugeneego
          16.05.2016 13:28

          Никакого самоуправства с файлами проекта как у подов.
          Никакой пересборки зависимостей при сборке проекта.
          Выкачивает и собирает фреймворки, которые я сам куда нужно подключаю.
          https://realm.io/news/swift-dependency-management-with-carthage/


          1. s_suhanov
            16.05.2016 13:31

            О, спасибо большое.


    1. Mecid
      20.05.2016 10:03

      В качестве языка Obj-C используете?


      1. eugeneego
        20.05.2016 10:08

        Сейчас Swift в основном.
        Поддержка свифта в аппкоде далеко не супер, конечно, но жить можно.


        1. Mecid
          20.05.2016 11:01

          Она даже не доходит до уровня Xcode.


          1. eugeneego
            20.05.2016 11:21

            По части поддержки фич языка и вывода типов, да, не доходит.
            Но как редактор кода AppCode на голову выше, и даже некоторые рефакторинги уже работают.


        1. Mecid
          20.05.2016 11:07

          А с StoryBoard/Xib через Xcode работаете?


          1. eugeneego
            20.05.2016 11:19

            Тут IB в Xcode без вариантов. Также настройки проекта в Xcode делаю, у AppCode не все там гладко.


  1. AnthonyBY
    16.05.2016 19:01

    в другое я бы добавил ещё:
    SimPholders 2.2 — для просмотра данных в CoreData


    1. EmoCoder
      16.05.2016 22:01
      +3

      ИМХО, не стоит он тех денег, что за него просят. Реализовать такое — не великая проблема. К тому же недавно перестала работать App Store-версия, а разработчики перестали отвечать на письма. В итоге накидали собственный аналог за день:
      https://github.com/dsmelov/simsim


      1. Makaveli
        19.05.2016 13:12

        Я, может, занудствую, но было бы удобно, чтобы на гитхабе во вкладке Releases лежал DMG с бинарником ;)