Class: RunLoop::Device

Inherits:
Object
  • Object
show all
Defined in:
lib/run_loop/device.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, version, udid, state = nil) ⇒ Device

Create a new device.

Parameters:

  • name (String)

    The name of the device. For sims this should be ‘iPhone 5s’ and for physical devices it will be the name the user gave to the device.

  • version (String, RunLoop::Version)

    The iOS version that is running on the device. Can be a string or a Version instance.

  • udid (String)

    The device identifier.

  • state (String) (defaults to: nil)

    (nil) This a simulator only value. It refers to the Booted/Shutdown/Creating state of the simulator. For pre-Xcode 6 simulators, this value should be nil.



24
25
26
27
28
29
30
31
32
33
34
# File 'lib/run_loop/device.rb', line 24

def initialize(name, version, udid, state=nil)
  @name = name
  @udid = udid
  @state = state

  if version.is_a? String
    @version = RunLoop::Version.new version
  else
    @version = version
  end
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



4
5
6
# File 'lib/run_loop/device.rb', line 4

def name
  @name
end

#simulator_accessibility_plist_pathObject (readonly)

Returns the value of attribute simulator_accessibility_plist_path.



9
10
11
# File 'lib/run_loop/device.rb', line 9

def simulator_accessibility_plist_path
  @simulator_accessibility_plist_path
end

#simulator_log_file_pathObject (readonly)

Returns the value of attribute simulator_log_file_path.



11
12
13
# File 'lib/run_loop/device.rb', line 11

def simulator_log_file_path
  @simulator_log_file_path
end

#simulator_preferences_plist_pathObject (readonly)

Returns the value of attribute simulator_preferences_plist_path.



10
11
12
# File 'lib/run_loop/device.rb', line 10

def simulator_preferences_plist_path
  @simulator_preferences_plist_path
end

#simulator_root_dirObject (readonly)

Returns the value of attribute simulator_root_dir.



8
9
10
# File 'lib/run_loop/device.rb', line 8

def simulator_root_dir
  @simulator_root_dir
end

#stateObject (readonly)

Returns the value of attribute state.



7
8
9
# File 'lib/run_loop/device.rb', line 7

def state
  @state
end

#udidObject (readonly)

Returns the value of attribute udid.



6
7
8
# File 'lib/run_loop/device.rb', line 6

def udid
  @udid
end

#versionObject (readonly)

Returns the value of attribute version.



5
6
7
# File 'lib/run_loop/device.rb', line 5

def version
  @version
end

Class Method Details

.device_with_identifier(udid_or_name, sim_control = RunLoop::SimControl.new) ⇒ RunLoop::Device

Returns a device given a udid or name. In the case of a physical device, the udid is the device identifier. In the case of a simulator the name is the _instruments identifier_ as reported by ‘$ xcrun instruments -s devices` - this is the identifier that can be passed to instruments.

Note that if you have a device and simulator with the same name, the simulator will always be selected.

Examples:

RunLoop::Device.device_with_identifier('iPhone 4s (8.3 Simulator')
RunLoop::Device.device_with_identifier('6E43E3CF-25F5-41CC-A833-588F043AE749')
RunLoop::Device.device_with_identifier('denis') # Simulator or device named 'denis'
RunLoop::Device.device_with_identifier('893688959205dc7eb48d603c558ede919ad8dd0c')

Parameters:

  • udid_or_name (String)

    A name or udid that identifies the device you are looking for.

  • sim_control (RunLoop::SimControl) (defaults to: RunLoop::SimControl.new)

    An instance of SimControl that can be used for looking of simulators and providing an XCTools instance. Users should never need to provide this.

Returns:

Raises:

  • (ArgumentError)

    If no matching device can be found.



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/run_loop/device.rb', line 58

def self.device_with_identifier(udid_or_name, sim_control=RunLoop::SimControl.new)
  simulator = sim_control.simulators.detect do |sim|
    sim.instruments_identifier == udid_or_name ||
          sim.udid == udid_or_name
  end

  return simulator if !simulator.nil?

  physical_device = sim_control.xctools.instruments(:devices).detect do |device|
    device.name == udid_or_name ||
          device.udid == udid_or_name
  end

  return physical_device if !physical_device.nil?

  raise ArgumentError, "Could not find a device with a UDID or name matching '#{udid_or_name}'"
end

Instance Method Details

#instruction_setString

Note:

Finding the instruction set of a device requires a third-party tool like ideviceinfo. Example: ‘$ ideviceinfo -u 89b59 < snip > ab7ba –key ’CPUArchitecture’ => arm64`

Return the instruction set for this device.

Simulator The simulator instruction set will be i386 or x86_64 depending on the the (marketing) name of the device.

Returns:

  • (String)

    An instruction set.

Raises:

  • (RuntimeError)

    Raises an error if this device is a physical device.



130
131
132
133
134
135
136
137
138
139
140
# File 'lib/run_loop/device.rb', line 130

def instruction_set
  if self.simulator?
    if ['iPhone 4s', 'iPhone 5', 'iPad 2', 'iPad Retina'].include?(self.name)
      'i386'
    else
      'x86_64'
    end
  else
    raise 'Finding the instruction set of a device requires a third-party tool like ideviceinfo'
  end
end

#instruments_identifier(xcode_tools = RunLoop::XCTools.new) ⇒ String

Returns and instruments-ready device identifier that is a suitable value for DEVICE_TARGET environment variable.

Returns:

  • (String)

    An instruments-ready device identifier.

Raises:

  • (RuntimeError)

    If trying to obtain a instruments-ready identifier for a simulator when Xcode < 6.



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/run_loop/device.rb', line 90

def instruments_identifier(xcode_tools=RunLoop::XCTools.new)
  if physical_device?
    self.udid
  else
    unless xcode_tools.xcode_version_gte_6?
      raise "Expected Xcode >= 6, but found version #{xcode_tools.xcode_version} - cannot create an identifier"
    end
    if self.version == RunLoop::Version.new('7.0.3')
      version_part = self.version.to_s
    else
      version_part = "#{self.version.major}.#{self.version.minor}"
    end
    "#{self.name} (#{version_part} Simulator)"
  end
end

#physical_device?Boolean

Is this a physical device?

Returns:

  • (Boolean)

    Returns true if this is a device.



108
109
110
# File 'lib/run_loop/device.rb', line 108

def physical_device?
  not self.udid[/[a-f0-9]{40}/, 0].nil?
end

#simulator?Boolean

Is this a simulator?

Returns:

  • (Boolean)

    Returns true if this is a simulator.



114
115
116
# File 'lib/run_loop/device.rb', line 114

def simulator?
  not self.physical_device?
end

#to_sObject



76
77
78
79
80
81
82
# File 'lib/run_loop/device.rb', line 76

def to_s
  if simulator?
    "#<Simulator: #{instruments_identifier} #{udid} #{instruction_set}>"
  else
    "#<Device: #{name} #{udid}>"
  end
end