Appium tries to launch app on simulator instead of real device

appium : 1.4.13
xcode : 7.1
ios: 9.1

 desired_caps = dict()
            desired_caps['platformName'] = 'iOS'
            desired_caps['platformVersion'] = '9.1'
            desired_caps['deviceName'] = 'iPhone 6'
            desired_caps['app'] = os.path.abspath('/Users/Test.app')
            self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

It always lauches simulator even though real device is attached.
I am trying to run on device.
And simulator keeps lauching and shutting down.

info: Welcome to Appium v1.4.13 (REV c75d8adcb66a75818a542fe1891a34260c21f76a)
info: Appium REST http interface listener started on 0.0.0.0:4723
info: Console LogLevel: debug
info: --> POST /wd/hub/session {"desiredCapabilities":{"platformVersion":"9.1","deviceName":"iPhone 6","app":"/Users/Test.app","platformName":"iOS"}}
info: Client User-Agent string: Python-urllib/2.7
info: [debug] Using local app from desired caps: /Users/Test.app
info: [debug] Creating new appium session 9662a830-8902-4943-be2d-8281c5fcaef9
info: [debug] Removing any remaining instruments sockets
info: [debug] Cleaned up instruments socket /tmp/instruments_sock
info: [debug] Setting Xcode version
info: [debug] Xcode version set to 7.1
info: [debug] Setting iOS SDK Version
info: [debug] iOS SDK Version set to 9.1
info: [debug] Checking whether instruments supports our device string
info: [debug] Getting list of devices instruments supports
info: [debug] Instruments is at: /Applications/Xcode.app/Contents/Developer/usr/bin/instruments
info: [debug] Getting device string from opts: {"forceIphone":false,"forceIpad":false,"xcodeVersion":"7.1","iOSSDKVersion":"9.1","deviceName":"iPhone 6","platformVersion":"9.1"}
info: [debug] fixDevice is on
info: [debug] Fixing device. Changed from: "iPhone 6 (9.1)" to: "iPhone 6 (9.1) ["
info: [debug] Final device string is: 'iPhone 6 (9.1) ['
info: [debug] iOS sim UDID is A50BFCE3-39A6-4CDA-9D7A-01BBAFC06CA0
info: [debug] Auto-detecting iOS udid...
info: [debug] Not auto-detecting udid, running on sim
info: [debug] Could not parse plist file (as binary) at /Users/Test.app/en.lproj/Localizable.strings
info: Will try to parse the plist file as XML
info: [debug] Could not parse plist file (as XML) at /Users/Test.app/en.lproj/Localizable.strings
warn: Could not parse app Localizable.strings assuming it doesn't exist
info: [debug] Getting bundle ID from app
info: [debug] Parsed app Info.plist (as binary)
info: [debug] Creating instruments
info: [debug] Preparing uiauto bootstrap
info: [debug] Dynamic bootstrap dir: /Users/Library/Application Support/appium/bootstrap
info: [debug] Dynamic env: {"nodePath":"/usr/local/Cellar/node/4.1.0/bin/node","commandProxyClientPath":"/usr/local/lib/node_modules/appium/node_modules/appium-uiauto/bin/command-proxy-client.js","instrumentsSock":"/tmp/instruments_sock","interKeyDelay":null,"justLoopInfinitely":false,"autoAcceptAlerts":false,"autoDismissAlerts":false,"sendKeyStrategy":"oneByOne"}
info: [debug] Dynamic bootstrap code: // This file is automatically generated. D...ot manually modify!
info: [debug] Dynamic bootstrap path: /Users/Library/Application Support/appium/bootstrap/bootstrap-bf740a9394e481ef.js
info: [debug] Reusing dynamic bootstrap: /Users/Library/Application Support/appium/bootstrap/bootstrap-bf740a9394e481ef.js
info: [debug] Getting device string from opts: {"forceIphone":false,"forceIpad":false,"xcodeVersion":"7.1","iOSSDKVersion":"9.1","deviceName":"iPhone 6","platformVersion":"9.1"}
info: [debug] fixDevice is on
info: [debug] Fixing device. Changed from: "iPhone 6 (9.1)" to: "iPhone 6 (9.1) ["
info: [debug] Final device string is: 'iPhone 6 (9.1) ['
info: [debug] We're on iOS7.1+ so forcing defaultDevice on
info: [debug] Getting device string from opts: {"forceIphone":false,"forceIpad":false,"xcodeVersion":"7.1","iOSSDKVersion":"9.1","deviceName":"iPhone 6","platformVersion":"9.1"}
info: [debug] fixDevice is on
info: [debug] Fixing device. Changed from: "iPhone 6 (9.1)" to: "iPhone 6 (9.1) ["
info: [debug] Final device string is: 'iPhone 6 (9.1) ['
info: [debug] Parsed app Info.plist (as binary)
info: [debug] Wrote new app Info.plist with device type
info: [debug] Checking whether we need to set app preferences
info: [debug] Running ios sim reset flow
info: [debug] Killing the simulator process
info: [debug] Killing any other simulator daemons
info: [debug] Killall Simulator
info: [debug] Cleaning sim data files
info: node-simctl: Executing: xcrun with args: simctl erase A50BFCE3-39A6-4CDA-9D7A-01BBAFC06CA0 and timeout: 2000
info: [debug] Cleaning app data files
warn: Applications directory /Users/Library/Developer/CoreSimulator/Devices/A50BFCE3-39A6-4CDA-9D7A-01BBAFC06CA0/data/Containers/Data/Application doesn't exist. Have you run this simulator before?
warn: Applications directory /Users/Library/Developer/CoreSimulator/Devices/A50BFCE3-39A6-4CDA-9D7A-01BBAFC06CA0/data/Containers/Bundle/Application doesn't exist. Have you run this simulator before?
info: Couldn't find app directories to delete. Probably it's not installed
info: [debug] Not setting locale
info: [debug] No iOS / app preferences to set
info: [debug] Starting iOS 8.* simulator log capture
info: [debug] Not pre-launching simulator
info: [debug] Starting command proxy.
info: [debug] Instruments socket server started at /tmp/instruments_sock
info: [debug] Starting instruments
info: [debug] Instruments is at: /Applications/Xcode.app/Contents/Developer/usr/bin/instruments
info: Launching instruments
info: [debug] Attempting to run app on iPhone 6 (9.1) [
info: On xcode 7.0, instruments-without-delay does not work, skippinginstruments-without-delay
info: [debug] Spawning instruments with command: /Applications/Xcode.app/Contents/Developer/usr/bin/instruments -t /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.xrplugin/Contents/Resources/Automation.tracetemplate -D /tmp/appium-instruments/instrumentscli0.trace -w "iPhone 6 (9.1) [" /Users/Test.app -e UIASCRIPT "/Users/Library/Application Support/appium/bootstrap/bootstrap-bf740a9394e481ef.js" -e UIARESULTSPATH /tmp/appium-instruments
info: [debug] And launch timeouts (in ms): {"global":90000}
info: [debug] [INST] Waiting for device to boot...
info: [debug] [INST STDERR] 2015-10-21 13:29:31.895 instruments[3192:50268] WebKit Threading Violation - initial use of WebKit from a secondary thread.
info: [debug] [INST STDERR] 2015-10-21 13:29:53.976 instruments[3192:50261] Attempting to change event horizon while disengage
info: [debug] [INST STDERR] 2015-10-21 13:29:53.976 instruments[3192:51306] Attempting to change event horizon while disengage
info: [debug] [INST STDERR] Instruments Trace Error : Target failed to run: The operation couldn’t be completed. (FBSOpenApplicationErrorDomain error 1.) : Failed to launch process with bundle identifier 'com.apsalar.sdkBatchTest2'
info: [debug] [INSTSERVER] Instruments exited with code 253
info: [debug] Killall instruments
info: [debug] Instruments crashed on startup
info: [debug] Attempting to retry launching instruments, this is retry #1
info: [debug] Killall Simulator
info: Launching instruments
info: [debug] Attempting to run app on iPhone 6 (9.1) [
info: On xcode 7.0, instruments-without-delay does not work, skippinginstruments-without-delay
info: [debug] Spawning instruments with command: /Applications/Xcode.app/Contents/Developer/usr/bin/instruments -t /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.xrplugin/Contents/Resources/Automation.tracetemplate -D /tmp/appium-instruments/instrumentscli0.trace -w "iPhone 6 (9.1) [" /Users/Test.app -e UIASCRIPT "/Users/Library/Application Support/appium/bootstrap/bootstrap-bf740a9394e481ef.js" -e UIARESULTSPATH /tmp/appium-instruments
info: [debug] And launch timeouts (in ms): {"global":90000}
info: [debug] [INST STDERR] 2015-10-21 13:30:00.033 instruments[3298:51578] **WebKit Threading Violation - initial use of WebKit from a secondary thread.**
info: [debug] [INST] Waiting for device to boot...
info: [debug] [INST STDERR] 2015-10-21 13:30:07.851 instruments[3298:51576] Attempting to change event horizon while disengage
info: [debug] [INST STDERR] 2015-10-21 13:30:07.851 instruments[3298:51577] Attempting to change event horizon while disengage
info: [debug] [INST STDERR] Instruments Trace Error : Target failed to run: The operation couldn’t be completed. (FBSOpenApplicationErrorDomain error 1.) : Failed to launch process with bundle identifier 'com.apsalar.sdkBatchTest2'
info: [debug] [INSTSERVER] Instruments exited with code 253
info: [debug] Killall instruments

And I have UI Automation enabled

Adding udid worked !!

desired_caps = dict()
            desired_caps['platformName'] = 'iOS'
            desired_caps['platformVersion'] = '9.1'
            desired_caps['deviceName'] = 'iPhone 6'
            desired_caps['udid'] = '09d905a109245efebd23ab741c0900e83769b3ae'
            desired_caps['app'] = os.path.abspath('/Users/Test.app')
            self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

Yup! Appium launches iOS simulators by default for iOS tests. The docs mention (next to the bundleId entry) this behavior is programmed in to Appium.