class SimCtl::Device
Attributes
Public Class Methods
# File lib/simctl/device.rb, line 17 def initialize(args) args['is_available'] = args.delete('isAvailable') super end
Public Instance Methods
# File lib/simctl/device.rb, line 262 def ==(other) return false if other.nil? return false unless other.is_a? Device other.udid == udid end
# File lib/simctl/device.rb, line 22 def availability is_available end
Returns true/false if the device is available
@return [Bool]
# File lib/simctl/device.rb, line 30 def available? case is_available when String is_available !~ /unavailable/i else is_available end end
Boots the device
@return [void]
# File lib/simctl/device.rb, line 42 def boot SimCtl.boot_device(self) end
Deletes the device
@return [void]
# File lib/simctl/device.rb, line 49 def delete SimCtl.delete_device(self) end
Returns the device type
@return [SimCtl::DeviceType, String]
# File lib/simctl/device.rb, line 56 def devicetype @devicetype ||= SimCtl.devicetype(identifier: plist.deviceType) rescue plist.deviceType end
Erases the device
@return [void]
# File lib/simctl/device.rb, line 65 def erase SimCtl.erase_device(self) end
Installs an app on a device
@param path Absolute path to the app that should be installed @return [void]
# File lib/simctl/device.rb, line 73 def install(path) SimCtl.install_app(self, path) end
Returns the keychain bar object
@return [SimCtl::keychain]
# File lib/simctl/device.rb, line 109 def keychain @keychain ||= SimCtl::Keychain.new(self) end
Kills the device
@return [void]
# File lib/simctl/device.rb, line 88 def kill SimCtl.kill_device(self) end
Launches the Simulator
@return [void]
# File lib/simctl/device.rb, line 95 def launch(scale = 1.0, opts = {}) SimCtl.launch_device(self, scale, opts) end
Launches an app in the given device
@param opts [Hash] options hash - ‘{ wait_for_debugger: true/false }` @param identifier [String] the app identifier @param args [Array] optional launch arguments @return [void]
# File lib/simctl/device.rb, line 119 def launch_app(identifier, args = [], opts = {}) SimCtl.launch_app(self, identifier, args, opts) end
Returns the launchctl object
@ return [SimCtl::DeviceLaunchctl]
# File lib/simctl/device.rb, line 102 def launchctl @launchctl ||= DeviceLaunchctl.new(self) end
# File lib/simctl/device.rb, line 268 def method_missing(method_name, *args, &block) if method_name[-1] == '!' new_method_name = method_name.to_s.chop.to_sym if respond_to?(new_method_name) warn "[#{Kernel.caller.first}] `#{method_name}` is deprecated. Please use `#{new_method_name}` instead." return send(new_method_name, &block) end end super end
Opens the url on the device
@param url [String] The url to be opened on the device @return [void]
# File lib/simctl/device.rb, line 136 def open_url(url) SimCtl.open_url(self, url) end
# File lib/simctl/device.rb, line 140 def path @path ||= DevicePath.new(self) end
Change privacy settings
@param action [String] grant, revoke, reset @param service [String] all, calendar, contacts-limited, contacts, location,
location-always, photos-add, photos, media-library, microphone, motion, reminders, siri
@param bundle [String] bundle identifier @return [void]
# File lib/simctl/device.rb, line 152 def privacy(action, service, bundle) SimCtl.privacy(self, action, service, bundle) end
Returns true/false if the device is ready Uses [SimCtl::DeviceLaunchctl] to look for certain services being running.
Unfortunately the ‘booted’ state does not mean the Simulator is ready for installing or launching applications.
@return [Bool]
# File lib/simctl/device.rb, line 163 def ready? running_services = launchctl.list.reject { |service| service.pid.to_i == 0 }.map(&:name) (required_services_for_ready - running_services).empty? end
Reloads the device information
@return [void]
# File lib/simctl/device.rb, line 171 def reload device = SimCtl.device(udid: udid) device.instance_variables.each do |ivar| instance_variable_set(ivar, device.instance_variable_get(ivar)) end end
Renames the device
@return [void]
# File lib/simctl/device.rb, line 181 def rename(name) SimCtl.rename_device(self, name) @name = name end
Resets the device
@return [void]
# File lib/simctl/device.rb, line 189 def reset SimCtl.reset_device name, devicetype, runtime end
Returns the runtime object
@return [SimCtl::Runtime, String]
# File lib/simctl/device.rb, line 196 def runtime @runtime ||= SimCtl.runtime(identifier: plist.runtime) rescue plist.runtime end
Saves a screenshot to a file
@param file Path where the screenshot should be saved to @param opts Optional hash that supports two keys:
-
type: Can be png, tiff, bmp, gif, jpeg (default is png)
-
display: Can be main or tv for iOS, tv for tvOS and main for watchOS
@return [void]
# File lib/simctl/device.rb, line 209 def screenshot(file, opts = {}) SimCtl.screenshot(self, file, opts) end
Returns the settings object
@ return [SimCtl::DeviceSettings]
# File lib/simctl/device.rb, line 216 def settings @settings ||= DeviceSettings.new(path) end
Shuts down the runtime
@return [void]
# File lib/simctl/device.rb, line 223 def shutdown SimCtl.shutdown_device(self) end
Spawn a process on a device
@param path [String] path to executable @param args [Array] arguments for the executable @return [void]
# File lib/simctl/device.rb, line 232 def spawn(path, args = [], opts = {}) SimCtl.spawn(self, path, args, opts) end
Returns the status bar object
@return [SimCtl::StatusBar]
# File lib/simctl/device.rb, line 246 def status_bar @status_bar ||= SimCtl::StatusBar.new(self) end
Terminates an app on the given device
@param identifier [String] the app identifier @param args [Array] optional terminate arguments @return [void]
# File lib/simctl/device.rb, line 128 def terminate_app(identifier, args = []) SimCtl.terminate_app(self, identifier, args) end
Uninstall an app from a device
@param app_id App identifier of the app that should be uninstalled @return [void]
# File lib/simctl/device.rb, line 81 def uninstall(app_id) SimCtl.uninstall_app(self, app_id) end
Reloads the device until the given block returns true
@return [void]
# File lib/simctl/device.rb, line 253 def wait(timeout = SimCtl.default_timeout) Timeout.timeout(timeout) do loop do break if yield SimCtl.device(udid: udid) end end reload end
Private Instance Methods
# File lib/simctl/device.rb, line 281 def plist @plist ||= OpenStruct.new(CFPropertyList.native_types(CFPropertyList::List.new(file: path.device_plist).value)) end
# File lib/simctl/device.rb, line 285 def required_services_for_ready case runtime.type when :tvos, :watchos if Xcode::Version.gte? '8.0' [ 'com.apple.mobileassetd', 'com.apple.nsurlsessiond' ] else [ 'com.apple.mobileassetd', 'com.apple.networkd' ] end when :ios if Xcode::Version.gte? '9.0' [ 'com.apple.backboardd', 'com.apple.mobile.installd', 'com.apple.CoreSimulator.bridge', 'com.apple.SpringBoard' ] elsif Xcode::Version.gte? '8.0' [ 'com.apple.SimulatorBridge', 'com.apple.SpringBoard', 'com.apple.backboardd', 'com.apple.mobile.installd' ] else [ 'com.apple.SimulatorBridge', 'com.apple.SpringBoard', 'com.apple.mobile.installd' ] end else [] end end