Каждый раз когда в команду приходит новый сотрудник, приходится решать вопрос с тем, какие приложения стоит установить на его компьютер. Даже опытная разработчики не помнят всего списка того, чем они попользуются. Часть приложений запускается ежедневно. Часть — время от времени. Но, когда такого приложения нет под рукой — это часто становится потерей драгоценного времени. Как правило, первые дни отводятся на развертывание окружения и ознакомление со списком задач. Хорошо когда есть возможность пройтись по списку и отметить то, что было сделано перед погружением в проект. Из этих соображений был сформирован «портфель» с которым работает наша команда.
Подавляющее большинство приложений — бесплатные.
Софт обязательный к установке:
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)
Для создания сниппета необходимо перейти во вкладку Show the Snippet Library (1), нажать кнопку Edit (не показана на скриншоте), ввести соотвествующие поля (2) и не забыть, выбрать платформу.
Вставка кода осуществляется по мере ввода имени сниппета в поле редактирования кода.
Ниже приводятся примеры из индивидуального списка сниппетов
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 модификатор. Спасибо.