why you do not want to make all in code?
1) example of customatization with testNG below. you can create whatever parameters you need and process them in test code e.g. to take application configured for test environment or (if application supports) repoint it itself in code.
2) about iOS code suggest to talk with developers to create different schemas for each test environment.
e.g. example how we build with jenkins for Simulator:
xcodebuild -workspace XXXX.xcworkspace -scheme XXXXAlpha -sdk iphonesimulator10.2 -configuration Debug -destination "platform=iOS Simulator,name=iPhone 6s,OS=10.2" -derivedDataPath output clean build
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="test_iOS">
<listeners>
<listener class-name="com.xxxx.base.RetryListener" />
<listener class-name="com.xxxx.base.TestListener" />
</listeners>
<parameter name="runDestination" value="Local"/>
<parameter name="devicePlatform" value="iOS"/>
<parameter name="osVersion" value="10.2"/>
<parameter name="appType" value="alpha"/>
<parameter name="appiumServer2_Port" value="4726"/> <!-- 4725 Android_1, 4726 Android_2, 4727 iOS-->
<!--
<parameter name="osVersion" value="8.4"/>
<parameter name="appType" value="Group"/>
<parameter name="deviceUDID" value="3059d615cfff135bf283ded0d5d4d67c6132502b"/> //iPad mini
<parameter name="bundleID" value="com.???"/>
<parameter name="someData" value="???"/>
<parameter name="runDestination" value="Local"/>
<parameter name="devicePlatform" value="iOS fullReset/>
-->
<test name="test" preserve-order="true">
<parameter name="devicePlatform" value="iOS"/> <!-- fullReset -->
<parameter name="deviceName" value="iPhone 6s"/> <!-- iPad Air iPhone 6s -->
<classes>
<class name="com.xxxxx.tests.ios.webLinks">
<methods>
<include name="test_1"></include>
<include name="test_2"></include>
</methods>
</class>
</classes>
</test>
</suite>