![image](https://habrastorage.org/files/1a8/ef3/3c2/1a8ef33c2ff84b82b3115d49889eb064.png)
Каждый раз когда в команду приходит новый сотрудник, приходится решать вопрос с тем, какие приложения стоит установить на его компьютер. Даже опытная разработчики не помнят всего списка того, чем они попользуются. Часть приложений запускается ежедневно. Часть — время от времени. Но, когда такого приложения нет под рукой — это часто становится потерей драгоценного времени. Как правило, первые дни отводятся на развертывание окружения и ознакомление со списком задач. Хорошо когда есть возможность пройтись по списку и отметить то, что было сделано перед погружением в проект. Из этих соображений был сформирован «портфель» с которым работает наша команда.
Подавляющее большинство приложений — бесплатные.
Софт обязательный к установке:
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 девайсами и снятия статистики
- iBackupBot: www.icopybot.com/download.htm
- iFunBox
IBeacons
- Поиск Beacon и снятие идентификаторов: Beacon Scan itunes.apple.com/ru/app/beacon-scan/id995724474?mt=12
FTP / SSH клиенты
VNC \ RDP клиенты:
- Remote Desktop — VNC: itunes.apple.com/ru/app/remote-desktop-vnc/id472995993?mt=12
- Microsoft RDP: itunes.apple.com/ru/app/microsoft-remote-desktop/id715768417?mt=12
Графические редакторы:
-
Adobe Photoshop: идеальный вариант - Acorn: альтернатива Adobe Photoshop: flyingmeat.com/acorn
- GIMP: жестокая альтернатива: www.gimp.org/downloads
- Векторный online-редактор, для рисования схем: draw.io
XCode plugins: Alcatraz
- Сайт: alcatraz.io
Чтоб установить его, следует выполнить в консоли команду
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](https://habrastorage.org/files/19f/8b0/e1d/19f8b0e1db6148b2801a4d54b3069513.gif)
Для создания сниппета необходимо перейти во вкладку Show the Snippet Library (1), нажать кнопку Edit (не показана на скриншоте), ввести соотвествующие поля (2) и не забыть, выбрать платформу.
![image](https://habrastorage.org/files/f48/f6d/db0/f48f6ddb0f22407db6faebc5508ada56.jpg)
Вставка кода осуществляется по мере ввода имени сниппета в поле редактирования кода.
Ниже приводятся примеры из индивидуального списка сниппетов
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
private var _<#property#>:<#Type#>?
var <#property#>:<#Type#> {
get
{
if _<#property#> == nil
{
_<#property#> = <#Type#>()
}
return _<#property#>!
}
set (value)
{
_<#property#> = value
}
}
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_get_main_queue()) {
}
dispatch_async(dispatch_get_main_queue()) {
print(self)
}
// MARK: -
// 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!
}
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
Основной ресурс:
Статьи:
use_frameworks!
pod 'Alamofire'
pod 'SwiftyJSON'
pod 'RESideMenu'
pod 'MBProgressHUD', '~> 0.9.1'
pod 'MagicalRecord'
pod 'SevenSwitch', '~> 2.0'
pod 'SMIconLabel'
Libraries
Огромный набор всевозможных библиотек (используется в зависимости от предметной области текущей разработки).
Поделитесь, пожалуйста, в комментариях, какие бесплатные приложения полезны лично вам для разработки в iOS.
Комментарии (38)
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
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", ... }
house2008
15.05.2016 14:03по wifi ипашку на девайс зальет что-то из этого?
Houston
15.05.2016 14:08Нет. Эти скрипты, будучи выполнены последовательно, запустят проект на эмуляторе iPhone 5s.
house2008
15.05.2016 14:21Жаль( А так я знаком с этими тулзами, думал может что-то новое есть. Спасибо за ключик '-derivedDataPath', мне кажется "-destination platform='iOS Simulator',name='iPhone 6 Plus'" можно заменить просто на "-arch x86_64".
house2008
15.05.2016 13:56+1Ваш Podfile не будет работать с cocoapods 1.0.0 без указания имени таргета.
Demtriy
16.05.2016 12:59Думаю, Вы ошибаетесь. Этот файл вполне благополучно сейчас работает с cocoapods 1.0.0
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/
s_suhanov
16.05.2016 13:10Очень странно. У меня буквально пару дней назад затребовало указания таргета в podfile и без этого ну никак не хотел их подтягивать. :(
loz
15.05.2016 14:35+6Каждый раз когда в команду приходит новый сотрудник, приходится решать вопрос с тем, какие приложения стоит установить на его компьютер
А самому ему решать нельзя?
SudoKarate
15.05.2016 22:10По графике добавил бы Pixelmator как альтернативу Photoshop.
Leopotam
16.05.2016 10:48Скорее AffinityPhoto как аналог PS, у них еще есть и Designer как замена CorelDraw и тп векторному софту.
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
Разное: Alfredeugeneego
16.05.2016 11:44Также предпочитаю Carthage вместо CocoaPods, хотя и поды приходится использовать.
s_suhanov
16.05.2016 13:14А расскажите про Carthage поподробнее или дайте пару полезных ссылок на тему. Буду очень благодарен вам. :)
eugeneego
16.05.2016 13:28Никакого самоуправства с файлами проекта как у подов.
Никакой пересборки зависимостей при сборке проекта.
Выкачивает и собирает фреймворки, которые я сам куда нужно подключаю.
https://realm.io/news/swift-dependency-management-with-carthage/
AnthonyBY
16.05.2016 19:01в другое я бы добавил ещё:
SimPholders 2.2 — для просмотра данных в CoreDataEmoCoder
16.05.2016 22:01+3ИМХО, не стоит он тех денег, что за него просят. Реализовать такое — не великая проблема. К тому же недавно перестала работать App Store-версия, а разработчики перестали отвечать на письма. В итоге накидали собственный аналог за день:
https://github.com/dsmelov/simsimMakaveli
19.05.2016 13:12Я, может, занудствую, но было бы удобно, чтобы на гитхабе во вкладке Releases лежал DMG с бинарником ;)
silvansky
Хм, синглтоны в Swift уже давно не так делаются:
s_suhanov
Там private init() для потокобезопасноти нужно добавить(
house2008
private init() не спасет от рейс кондишн, тут приватный конструктор нужен чтобы запретить создание больше одного инстанса, у нас же всё таки синглтон)
s_suhanov
private init() — это и есть приватный конструктор в Swift. :)
house2008
а я про что говорил? :) Вы сказали, что приватный конструктор нужен для потокобезопастности, а я говорю, что он тут нужен для защиты от повторного создания инстанса)
s_suhanov
Точно. Я ж это под «потокобезопасностью» и имел ввиду. :)
house2008
Хорошо :) Просто для потокобезопасного решения я думал увидеть что-то из double-checked locking например :)
eugeneego
Статики в свифте ленивы и потокобезопасны.
house2008
Разумеется, к тому же у нас let модификатор. Спасибо.