xcode-install-citrus 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.circleci/config.yml +33 -0
- data/.gitattributes +1 -0
- data/.gitignore +16 -0
- data/.rubocop.yml +21 -0
- data/.rubocop_todo.yml +78 -0
- data/Gemfile +12 -0
- data/LICENSE +22 -0
- data/README.md +198 -0
- data/Rakefile +16 -0
- data/bin/xcversion +12 -0
- data/bin//360/237/216/211 +3 -0
- data/lib/xcode/install.rb +761 -0
- data/lib/xcode/install/cleanup.rb +14 -0
- data/lib/xcode/install/cli.rb +30 -0
- data/lib/xcode/install/command.rb +32 -0
- data/lib/xcode/install/install.rb +55 -0
- data/lib/xcode/install/installed.rb +24 -0
- data/lib/xcode/install/list.rb +17 -0
- data/lib/xcode/install/select.rb +36 -0
- data/lib/xcode/install/selected.rb +12 -0
- data/lib/xcode/install/simulators.rb +65 -0
- data/lib/xcode/install/uninstall.rb +36 -0
- data/lib/xcode/install/update.rb +14 -0
- data/lib/xcode/install/version.rb +3 -0
- data/spec/cli_spec.rb +16 -0
- data/spec/curl_spec.rb +26 -0
- data/spec/fixtures/devcenter/xcode-20150414.html +263 -0
- data/spec/fixtures/devcenter/xcode-20150427.html +263 -0
- data/spec/fixtures/devcenter/xcode-20150508.html +279 -0
- data/spec/fixtures/devcenter/xcode-20150601.html +212 -0
- data/spec/fixtures/devcenter/xcode-20150608.html +315 -0
- data/spec/fixtures/devcenter/xcode-20150624.html +318 -0
- data/spec/fixtures/devcenter/xcode-20150909.html +309 -0
- data/spec/fixtures/devcenter/xcode-20160601.html +1872 -0
- data/spec/fixtures/devcenter/xcode-20160705-alt.html +317 -0
- data/spec/fixtures/devcenter/xcode-20160705.html +1909 -0
- data/spec/fixtures/devcenter/xcode-20160922.html +878 -0
- data/spec/fixtures/devcenter/xcode-20161024.html +663 -0
- data/spec/fixtures/hdiutil.plist +31 -0
- data/spec/fixtures/mail-verify.html +222 -0
- data/spec/fixtures/not_registered_as_developer.json +11 -0
- data/spec/fixtures/xcode.json +1 -0
- data/spec/fixtures/xcode_63.json +46 -0
- data/spec/fixtures/yolo.json +1 -0
- data/spec/install_spec.rb +62 -0
- data/spec/installed_spec.rb +19 -0
- data/spec/installer_spec.rb +101 -0
- data/spec/json_spec.rb +32 -0
- data/spec/list_spec.rb +57 -0
- data/spec/prerelease_spec.rb +108 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/uninstall_spec.rb +12 -0
- data/xcode-install.gemspec +32 -0
- metadata +195 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
module XcodeInstall
|
2
|
+
class Command
|
3
|
+
class Cleanup < Command
|
4
|
+
self.command = 'cleanup'
|
5
|
+
self.summary = 'Cleanup cached downloads.'
|
6
|
+
|
7
|
+
def run
|
8
|
+
installer = XcodeInstall::Installer.new
|
9
|
+
return if installer.cache_dir.nil? || installer.cache_dir.to_s.length < 5
|
10
|
+
FileUtils.rm_f(Dir.glob("#{installer.cache_dir}/*"))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module XcodeInstall
|
2
|
+
class Command
|
3
|
+
class InstallCLITools < Command
|
4
|
+
self.command = 'install-cli-tools'
|
5
|
+
self.summary = 'Installs Xcode Command Line Tools.'
|
6
|
+
|
7
|
+
def run
|
8
|
+
if installed?
|
9
|
+
print 'Xcode CLI Tools are already installed.'
|
10
|
+
exit(0)
|
11
|
+
end
|
12
|
+
install
|
13
|
+
end
|
14
|
+
|
15
|
+
def installed?
|
16
|
+
File.exist?('/Library/Developer/CommandLineTools/usr/lib/libxcrun.dylib')
|
17
|
+
end
|
18
|
+
|
19
|
+
def install
|
20
|
+
cli_placeholder_file = '/tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress'
|
21
|
+
# create the placeholder file that's checked by CLI updates' .dist code in Apple's SUS catalog
|
22
|
+
FileUtils.touch(cli_placeholder_file)
|
23
|
+
# find the CLI Tools update
|
24
|
+
product = `softwareupdate -l | grep "\*.*Command Line" | head -n 1 | awk -F"*" '{print $2}' | sed -e 's/^ *//' | tr -d '\n'`
|
25
|
+
`softwareupdate --verbose -i "#{product}"`
|
26
|
+
FileUtils.rm(cli_placeholder_file)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'claide'
|
2
|
+
require 'xcode/install/version'
|
3
|
+
|
4
|
+
module XcodeInstall
|
5
|
+
class PlainInformative < StandardError
|
6
|
+
include CLAide::InformativeError
|
7
|
+
end
|
8
|
+
|
9
|
+
class Informative < PlainInformative
|
10
|
+
def message
|
11
|
+
"[!] #{super}".ansi.red
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Command < CLAide::Command
|
16
|
+
require 'xcode/install/cleanup'
|
17
|
+
require 'xcode/install/cli'
|
18
|
+
require 'xcode/install/install'
|
19
|
+
require 'xcode/install/installed'
|
20
|
+
require 'xcode/install/list'
|
21
|
+
require 'xcode/install/select'
|
22
|
+
require 'xcode/install/selected'
|
23
|
+
require 'xcode/install/uninstall'
|
24
|
+
require 'xcode/install/update'
|
25
|
+
require 'xcode/install/simulators'
|
26
|
+
|
27
|
+
self.abstract_command = true
|
28
|
+
self.command = 'xcversion'
|
29
|
+
self.version = VERSION
|
30
|
+
self.description = 'Xcode installation manager.'
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
module XcodeInstall
|
4
|
+
class Command
|
5
|
+
class Install < Command
|
6
|
+
self.command = 'install'
|
7
|
+
self.summary = 'Install a specific version of Xcode.'
|
8
|
+
|
9
|
+
self.arguments = [
|
10
|
+
CLAide::Argument.new('VERSION', :true)
|
11
|
+
]
|
12
|
+
|
13
|
+
def self.options
|
14
|
+
[['--url', 'Custom Xcode DMG file path or HTTP URL.'],
|
15
|
+
['--force', 'Install even if the same version is already installed.'],
|
16
|
+
['--no-switch', 'Don’t switch to this version after installation'],
|
17
|
+
['--no-install', 'Only download DMG, but do not install it.'],
|
18
|
+
['--no-progress', 'Don’t show download progress.'],
|
19
|
+
['--no-clean', 'Don’t delete DMG after installation.'],
|
20
|
+
['--no-show-release-notes', 'Don’t open release notes in browser after installation.']].concat(super)
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(argv)
|
24
|
+
@installer = Installer.new
|
25
|
+
@version = argv.shift_argument
|
26
|
+
@version ||= File.read('.xcode-version') if File.exist?('.xcode-version')
|
27
|
+
@url = argv.option('url')
|
28
|
+
@force = argv.flag?('force', false)
|
29
|
+
@should_clean = argv.flag?('clean', true)
|
30
|
+
@should_install = argv.flag?('install', true)
|
31
|
+
@should_switch = argv.flag?('switch', true)
|
32
|
+
@progress = argv.flag?('progress', true)
|
33
|
+
@show_release_notes = argv.flag?('show-release-notes', true)
|
34
|
+
super
|
35
|
+
end
|
36
|
+
|
37
|
+
def validate!
|
38
|
+
super
|
39
|
+
|
40
|
+
help! 'A VERSION argument is required.' unless @version
|
41
|
+
if @installer.installed?(@version) && !@force
|
42
|
+
print "Version #{@version} already installed."
|
43
|
+
exit(0)
|
44
|
+
end
|
45
|
+
fail Informative, "Version #{@version} doesn't exist." unless @url || @installer.exist?(@version)
|
46
|
+
fail Informative, "Invalid URL: `#{@url}`" unless !@url || @url =~ /\A#{URI.regexp}\z/
|
47
|
+
end
|
48
|
+
|
49
|
+
def run
|
50
|
+
@installer.install_version(@version, @should_switch, @should_clean, @should_install,
|
51
|
+
@progress, @url, @show_release_notes)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module XcodeInstall
|
2
|
+
class Command
|
3
|
+
class Installed < Command
|
4
|
+
self.command = 'installed'
|
5
|
+
self.summary = 'List installed Xcodes.'
|
6
|
+
|
7
|
+
def self.options
|
8
|
+
[['--uuid', 'Show DVTPlugInCompatibilityUUIDs in the list.']].concat(super)
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(argv)
|
12
|
+
@uuid = argv.flag?('uuid', false)
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
installer = XcodeInstall::Installer.new
|
18
|
+
installer.installed_versions.each do |xcode|
|
19
|
+
puts "#{xcode.version}\t(#{xcode.path})\t#{@uuid ? xcode.uuid : ''}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module XcodeInstall
|
2
|
+
class Command
|
3
|
+
class List < Command
|
4
|
+
self.command = 'list'
|
5
|
+
self.summary = 'List Xcodes available for download.'
|
6
|
+
|
7
|
+
def self.options
|
8
|
+
[['--all', 'Show all available versions. (Default, Deprecated)']].concat(super)
|
9
|
+
end
|
10
|
+
|
11
|
+
def run
|
12
|
+
installer = XcodeInstall::Installer.new
|
13
|
+
puts installer.list
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module XcodeInstall
|
2
|
+
class Command
|
3
|
+
class Select < Command
|
4
|
+
self.command = 'select'
|
5
|
+
self.summary = 'Select installed Xcode via `xcode-select`.'
|
6
|
+
|
7
|
+
self.arguments = [
|
8
|
+
CLAide::Argument.new('VERSION', :true)
|
9
|
+
]
|
10
|
+
|
11
|
+
def self.options
|
12
|
+
[['--symlink', 'Update symlink in /Applications with selected Xcode']].concat(super)
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(argv)
|
16
|
+
@installer = Installer.new
|
17
|
+
@version = argv.shift_argument
|
18
|
+
@should_symlink = argv.flag?('symlink', false)
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
def validate!
|
23
|
+
super
|
24
|
+
|
25
|
+
fail Informative, 'Please specify a version to select.' if @version.nil?
|
26
|
+
fail Informative, "Version #{@version} not installed." unless @installer.installed?(@version)
|
27
|
+
end
|
28
|
+
|
29
|
+
def run
|
30
|
+
xcode = @installer.installed_versions.detect { |v| v.version == @version }
|
31
|
+
`sudo xcode-select --switch #{xcode.path}`
|
32
|
+
@installer.symlink xcode.version if @should_symlink
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'claide'
|
2
|
+
|
3
|
+
module XcodeInstall
|
4
|
+
class Command
|
5
|
+
class Simulators < Command
|
6
|
+
self.command = 'simulators'
|
7
|
+
self.summary = 'List or install iOS simulators.'
|
8
|
+
|
9
|
+
def self.options
|
10
|
+
[['--install=name', 'Install simulator beginning with name, e.g. \'iOS 8.4\', \'tvOS 9.0\'.'],
|
11
|
+
['--force', 'Install even if the same version is already installed.'],
|
12
|
+
['--no-install', 'Only download DMG, but do not install it.'],
|
13
|
+
['--no-progress', 'Don’t show download progress.']].concat(super)
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(argv)
|
17
|
+
@installed_xcodes = Installer.new.installed_versions
|
18
|
+
@install = argv.option('install')
|
19
|
+
@force = argv.flag?('force', false)
|
20
|
+
@should_install = argv.flag?('install', true)
|
21
|
+
@progress = argv.flag?('progress', true)
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def run
|
26
|
+
@install ? install : list
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
:private
|
31
|
+
|
32
|
+
def install
|
33
|
+
filtered_simulators = @installed_xcodes.map(&:available_simulators).flatten.uniq(&:name).select do |sim|
|
34
|
+
sim.name.start_with?(@install)
|
35
|
+
end
|
36
|
+
case filtered_simulators.count
|
37
|
+
when 0
|
38
|
+
puts "[!] No simulator matching #{@install} was found. Please specify a version from the following available simulators:".ansi.red
|
39
|
+
list
|
40
|
+
exit 1
|
41
|
+
when 1
|
42
|
+
simulator = filtered_simulators.first
|
43
|
+
fail Informative, "#{simulator.name} is already installed." if simulator.installed? && !@force
|
44
|
+
puts "Installing #{simulator.name} for Xcode #{simulator.xcode.bundle_version}..."
|
45
|
+
simulator.install(@progress, @should_install)
|
46
|
+
else
|
47
|
+
puts "[!] More than one simulator matching #{@install} was found. Please specify the full version.".ansi.red
|
48
|
+
filtered_simulators.each do |candidate|
|
49
|
+
puts "Xcode #{candidate.xcode.bundle_version} (#{candidate.xcode.path})".ansi.green
|
50
|
+
puts "xcversion simulators --install=#{candidate.name}"
|
51
|
+
end
|
52
|
+
exit 1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def list
|
57
|
+
@installed_xcodes.each do |xcode|
|
58
|
+
puts "Xcode #{xcode.version} (#{xcode.path})".ansi.green
|
59
|
+
xcode.available_simulators.each do |simulator|
|
60
|
+
puts simulator.to_s
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module XcodeInstall
|
2
|
+
class Command
|
3
|
+
class Uninstall < Command
|
4
|
+
self.command = 'uninstall'
|
5
|
+
self.summary = 'Uninstall a specific version of Xcode.'
|
6
|
+
|
7
|
+
self.arguments = [
|
8
|
+
CLAide::Argument.new('VERSION', :true)
|
9
|
+
]
|
10
|
+
|
11
|
+
def initialize(argv)
|
12
|
+
@installer = Installer.new
|
13
|
+
@version = argv.shift_argument
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
def validate!
|
18
|
+
super
|
19
|
+
help! 'A VERSION argument is required.' unless @version
|
20
|
+
|
21
|
+
fail Informative, "Version #{@version} is not installed." unless @installer.installed?(@version)
|
22
|
+
end
|
23
|
+
|
24
|
+
def run
|
25
|
+
installed_path = @installer.installed_versions.find { |x| x.version == @version }
|
26
|
+
return if installed_path.nil? || installed_path.path.nil?
|
27
|
+
|
28
|
+
`sudo rm -rf #{installed_path.path}`
|
29
|
+
|
30
|
+
return unless @installer.symlinks_to == installed_path.path
|
31
|
+
newest_version = @installer.installed_versions.last
|
32
|
+
@installer.symlink(newest_version)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module XcodeInstall
|
2
|
+
class Command
|
3
|
+
class Update < Command
|
4
|
+
self.command = 'update'
|
5
|
+
self.summary = 'Update cached list of available Xcodes.'
|
6
|
+
|
7
|
+
def run
|
8
|
+
installer = XcodeInstall::Installer.new
|
9
|
+
installer.rm_list_cache
|
10
|
+
installer.list
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/spec/cli_spec.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module XcodeInstall
|
4
|
+
describe Command::InstallCLITools do
|
5
|
+
it 'fails if tools are already installed' do
|
6
|
+
Command::InstallCLITools.any_instance.expects(:installed?).returns(true)
|
7
|
+
-> { Command::InstallCLITools.run }.should.raise(SystemExit)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'runs if tools are not installed' do
|
11
|
+
Command::InstallCLITools.any_instance.expects(:installed?).returns(false)
|
12
|
+
Command::InstallCLITools.any_instance.expects(:install)
|
13
|
+
Command::InstallCLITools.run
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/spec/curl_spec.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module XcodeInstall
|
4
|
+
def self.silence_stderr
|
5
|
+
begin
|
6
|
+
orig_stderr = $stderr.clone
|
7
|
+
$stderr.reopen File.new('/dev/null', 'w')
|
8
|
+
retval = yield
|
9
|
+
ensure
|
10
|
+
$stderr.reopen orig_stderr
|
11
|
+
end
|
12
|
+
retval
|
13
|
+
end
|
14
|
+
|
15
|
+
describe Curl do
|
16
|
+
it 'reports failure' do
|
17
|
+
`true`
|
18
|
+
curl = XcodeInstall::Curl.new
|
19
|
+
result = nil
|
20
|
+
XcodeInstall.silence_stderr do
|
21
|
+
result = curl.fetch(url: 'http://0.0.0.0/test')
|
22
|
+
end
|
23
|
+
result.should == false
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,263 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
5
|
+
<meta name="Author" content="Apple Inc." />
|
6
|
+
<meta name="viewport" content="width=1024" />
|
7
|
+
<link rel="shortcut icon" href="/favicon.ico" />
|
8
|
+
<link rel="icon" href="/favicon.ico" />
|
9
|
+
<link rel="stylesheet" href="https://www.apple.com/wss/fonts?family=Myriad+Set+Pro&v=1" type="text/css" />
|
10
|
+
<link rel="stylesheet" href="/assets/core/styles/base.css" type="text/css" />
|
11
|
+
<link rel="stylesheet" href="https://devimages.apple.com.edgekey.net/assets/core/styles/adc.css" type="text/css" />
|
12
|
+
<link rel="stylesheet" href="/assets/core/styles/templates.css" type="text/css" />
|
13
|
+
<link rel="stylesheet" href="https://devimages.apple.com.edgekey.net/assets/styles/topbar.css" type="text/css" />
|
14
|
+
<script src="https://devimages.apple.com.edgekey.net/assets/core/scripts/lib/prototype.js" type="text/javascript" charset="utf-8"></script>
|
15
|
+
<script src="https://devimages.apple.com.edgekey.net/assets/core/scripts/lib/scriptaculous.js" type="text/javascript" charset="utf-8"></script>
|
16
|
+
<script src="https://devimages.apple.com.edgekey.net/assets/core/scripts/browserdetect.js" type="text/javascript" charset="utf-8"></script>
|
17
|
+
<script src="https://devimages.apple.com.edgekey.net/assets/core/scripts/apple_core.js" type="text/javascript" charset="utf-8"></script>
|
18
|
+
<script src="https://devimages.apple.com.edgekey.net/assets/core/scripts/search_decorator.js" type="text/javascript" charset="utf-8"></script>
|
19
|
+
<script src="https://devimages.apple.com.edgekey.net/assets/core/scripts/adc_core.js" type="text/javascript" charset="utf-8"></script>
|
20
|
+
<script src="https://devimages.apple.com.edgekey.net/assets/scripts/ac_retina.js" type="text/javascript" charset="utf-8"></script>
|
21
|
+
<script src="https://devimages.apple.com.edgekey.net/assets/scripts/topbarDropdown.js" type="text/javascript" charset="utf-8"></script>
|
22
|
+
<script type="text/javascript">
|
23
|
+
document.write('<link rel="stylesheet" type="text/css" href="https://devimages.apple.com.edgekey.net/assets/styles/script.css" media="screen">');
|
24
|
+
</script>
|
25
|
+
<!-- Augmented Search -->
|
26
|
+
<link rel="stylesheet" href="https://devimages.apple.com.edgekey.net/assets/styles/augmented_search.css" type="text/css">
|
27
|
+
<script src="https://devimages.apple.com.edgekey.net/assets/scripts/lib/jquery/jquery-1.11.0.min.js"></script>
|
28
|
+
<script>jQuery.noConflict();</script>
|
29
|
+
<script src="https://devimages.apple.com.edgekey.net/assets/scripts/augmented_search.js"></script>
|
30
|
+
<title>Xcode - Downloads - Apple Developer</title>
|
31
|
+
<meta name="omni_page" content="Xcode Downloads and Resources - (English)">
|
32
|
+
<meta name="Description" content="Xcode includes the Xcode IDE, Instruments, iOS Simulator, the latest OS X and iOS SDKs, and more. Download Xcode and start creating apps for iOS and OS X.">
|
33
|
+
<link rel="stylesheet" href="/xcode/styles/xcode-tabs.css" type="text/css" />
|
34
|
+
<meta name="robots" content="noodp,noydir" />
|
35
|
+
<link rel="alternate" href="https://developer.apple.com/kr/xcode/downloads/" hreflang="ko-KR" />
|
36
|
+
<link rel="alternate" href="https://developer.apple.com/jp/xcode/downloads/" hreflang="ja-JP" />
|
37
|
+
<link rel="alternate" href="https://developer.apple.com/cn/xcode/downloads/" hreflang="zh-CN" />
|
38
|
+
<link rel="alternate" href="https://developer.apple.com/xcode/downloads/" hreflang="en" />
|
39
|
+
</head>
|
40
|
+
<body id="downloads" class="white">
|
41
|
+
<div id="globalheader-wrapper">
|
42
|
+
<nav id="globalheader" data-hires="true">
|
43
|
+
|
44
|
+
<h1 data-hires="true"><a href="/">Apple Developer</a></h1>
|
45
|
+
<ul id="gh-nav">
|
46
|
+
<li id="gh-nav-technologies"><a href="/technologies/">Technologies</a></li>
|
47
|
+
<li id="gh-nav-resources"><a href="/resources/">Resources</a></li>
|
48
|
+
<li id="gh-nav-programs"><a href="/programs/">Programs</a></li>
|
49
|
+
<li id="gh-nav-support"><a href="/support/">Support</a></li>
|
50
|
+
<li id="gh-nav-membercenter"><a href="/membercenter/">Member Center</a></li>
|
51
|
+
</ul>
|
52
|
+
|
53
|
+
<div id="gh-search" data-hires="true">
|
54
|
+
<form action="/search/index.php" method="get" accept-charset="utf-8"><div>
|
55
|
+
<label for="gh-adcsearch">
|
56
|
+
<span class="prettyplaceholder"></span>
|
57
|
+
<input type="text" name="q" id="gh-adcsearch" class="adcsearch prettysearch augmented">
|
58
|
+
</label>
|
59
|
+
</div></form>
|
60
|
+
</div>
|
61
|
+
|
62
|
+
<script type="text/javascript">
|
63
|
+
Event.onDOMReady(function() {
|
64
|
+
// Get root path for Global Header Active class
|
65
|
+
ghLocation = location.pathname.split('/')[1];
|
66
|
+
// Make sure it doesn't try to add a file extension to the css class
|
67
|
+
if(ghLocation.include('.')) ghLocation = ghLocation.split('.')[0];
|
68
|
+
// Add Global Header Active State Class
|
69
|
+
$$('body')[0].addClassName('gh-nav-'+location.pathname.split('/')[1]+'-active');
|
70
|
+
});
|
71
|
+
</script>
|
72
|
+
</nav>
|
73
|
+
</div>
|
74
|
+
|
75
|
+
<div id="top">
|
76
|
+
<!-- SiteCatalyst code version: H.8. Copyright 1997-2006 Omniture, Inc. -->
|
77
|
+
<script type="text/javascript">
|
78
|
+
/* RSID: */
|
79
|
+
var s_account="appleglobal,appleusdeveloper"
|
80
|
+
</script>
|
81
|
+
|
82
|
+
<script type="text/javascript" src="https://www.apple.com/metrics/scripts/s_code_h.js"></script>
|
83
|
+
<script type="text/javascript">
|
84
|
+
s.pageName=AC.Tracking.pageName();
|
85
|
+
s.channel="www.us.developer"
|
86
|
+
|
87
|
+
/************* DO NOT ALTER ANYTHING BELOW THIS LINE ! **************/
|
88
|
+
var s_code=s.t();if(s_code)document.write(s_code)</script>
|
89
|
+
<!-- End SiteCatalyst code version: H.8. -->
|
90
|
+
</div>
|
91
|
+
<div id="content" class="content" data-hires="true">
|
92
|
+
|
93
|
+
<header>
|
94
|
+
<img id="title" src="https://devimages.apple.com.edgekey.net/xcode/images/xcode-hero.png" width="856" height="130" alt="Xcode - the complete toolset for building great apps.">
|
95
|
+
</header>
|
96
|
+
|
97
|
+
<section class="layout-tabs">
|
98
|
+
<div class="tab-wrapper">
|
99
|
+
<div class="divider"></div>
|
100
|
+
<div class="grid4col tabs">
|
101
|
+
<div class="column one"><a href="/xcode/">What's New</a></div>
|
102
|
+
<div class="column two"><a href="/xcode/ide/">Xcode IDE</a></div>
|
103
|
+
<div class="column three"><a href="/xcode/interface-builder/">Interface Builder</a></div>
|
104
|
+
<div class="column four"><a href="/xcode/features/">Features</a></div>
|
105
|
+
<div class="column five active"><a href="/xcode/downloads/">Downloads</a></div>
|
106
|
+
</div>
|
107
|
+
</div>
|
108
|
+
</section>
|
109
|
+
|
110
|
+
<div class="maincontent margin-sides-40">
|
111
|
+
<section class="first">
|
112
|
+
<h2>Download Xcode for Free</h2>
|
113
|
+
</section>
|
114
|
+
|
115
|
+
<section class="download">
|
116
|
+
<img class="right padding-bottom-20" src="https://devimages.apple.com.edgekey.net/xcode/images/downloads.png" width="360" height="217" alt="" />
|
117
|
+
<h3>Xcode 6.3</h3>
|
118
|
+
<p class="width-45 margin-bottom-12">This release includes the Xcode IDE, LLVM compiler, Instruments, iOS Simulator, the latest OS X and iOS SDKs, WatchKit and the Swift 1.2 programming language.
|
119
|
+
</p>
|
120
|
+
<p class="width-45 margin-bottom-12">
|
121
|
+
Updated: Apr 8, 2015<br />
|
122
|
+
Build: 6D570<br />
|
123
|
+
SDK: iOS 8.4, OS X v10.10
|
124
|
+
</p>
|
125
|
+
<p class="width-45 margin-bottom-0">
|
126
|
+
<a class="arrow arrow-right" href="http://itunes.apple.com/us/app/xcode/id497799835?ls=1&mt=12">View in the Mac App Store</a></p>
|
127
|
+
</section>
|
128
|
+
|
129
|
+
<section class="pre-release divider-top cleared">
|
130
|
+
<img class="right padding-right-100" src="https://devimages.apple.com.edgekey.net/assets/elements/icons/128x128/xcode6-beta.png" width="128" height="128" alt="">
|
131
|
+
<h3>Xcode 6.4</h3>
|
132
|
+
<p class="width-45 margin-bottom-12">This is a pre-release version of the complete Xcode developer toolset for Mac, iPhone, iPad, and <span class="nowrap">Apple Watch.</span> This release requires <span class="nowrap">OS X Yosemite.</span>
|
133
|
+
</p>
|
134
|
+
<p class="width-45 margin-bottom-12">
|
135
|
+
Released: Apr 13, 2015<br />
|
136
|
+
Build: 6E7<br />
|
137
|
+
SDK: iOS 8.3 beta 4, OS X v10.10<br />
|
138
|
+
<ul class="links small">
|
139
|
+
<li class="dmg"><a href="/devcenter/download.action?path=/Developer_Tools/Xcode_6.4_Beta/Xcode_6.4_beta.dmg">Download Xcode 6.4</a></li>
|
140
|
+
<li class="document"><a href="/devcenter/download.action?path=/Developer_Tools/Xcode_6.4_Beta/Xcode_6.4_beta_Release_Notes.pdf">Xcode 6.4 beta Release Notes</a></li>
|
141
|
+
</ul>
|
142
|
+
</p>
|
143
|
+
</section>
|
144
|
+
|
145
|
+
|
146
|
+
<section class="related padding-top-40 divider-top">
|
147
|
+
<h2>Related Downloads and Resources</h2>
|
148
|
+
|
149
|
+
<div class="padding-top-30">
|
150
|
+
<img class="left" src="https://devimages.apple.com.edgekey.net/assets/elements/icons/64x64/downloads.png" width="64" height="64" alt="">
|
151
|
+
<h3>Additional Tools</h3>
|
152
|
+
<p>Sign in with your Apple ID to download previous versions of Xcode or additional tools from the developer downloads site. <a class="arrow arrow-right" href="/downloads/">View downloads</a></p>
|
153
|
+
</div>
|
154
|
+
|
155
|
+
<div class="padding-top-20">
|
156
|
+
<img class="left" src="https://devimages.apple.com.edgekey.net/assets/elements/icons/64x64/videos.png" width="64" height="64" alt="">
|
157
|
+
<h3>Videos</h3>
|
158
|
+
<p>Watch and learn from Apple engineers as they show how to bring the best of Apple technologies to your apps. <a class="arrow arrow-right" href="/videos/">Watch videos</a></p>
|
159
|
+
</div>
|
160
|
+
|
161
|
+
<div class="padding-top-20">
|
162
|
+
<img class="left" src="https://devimages.apple.com.edgekey.net/assets/elements/icons/64x64/library.png" width="64" height="64" alt="">
|
163
|
+
<h3>Guides and Tutorials</h3>
|
164
|
+
<p>Find a comprehensive set of programming guides, reference, and sample code for developing with the latest tools and technologies on iOS and OS X.<br /><a class="arrow arrow-right" href="/library/ios/navigation/#section=Topics&topic=Xcode">Read documentation</a></p>
|
165
|
+
</div>
|
166
|
+
|
167
|
+
<div class="padding-top-20">
|
168
|
+
<img class="left" src="https://devimages.apple.com.edgekey.net/assets/elements/icons/64x64/forum.png" width="64" height="64" alt="">
|
169
|
+
<h3>Forums</h3>
|
170
|
+
<p>Post questions and share comments about using Xcode with fellow developers.<br /><a class="arrow arrow-right" href="/devforums/">Join conversations</a></p>
|
171
|
+
</div>
|
172
|
+
</section>
|
173
|
+
</div>
|
174
|
+
</div><!-- /content -->
|
175
|
+
|
176
|
+
<div id="globalfooter">
|
177
|
+
<div id="breadory">
|
178
|
+
<ol id="breadcrumbs">
|
179
|
+
<li class="home"><a href="/">Developer</a></li>
|
180
|
+
<li><a href="/xcode/">Xcode</a></li>
|
181
|
+
<li>Downloads</li>
|
182
|
+
</ol>
|
183
|
+
<div id="directorynav" class="ipoditunes">
|
184
|
+
<div id="dn-cola" class="column first">
|
185
|
+
<h3><a href="/technologies/">What's New</a></h3>
|
186
|
+
<ul>
|
187
|
+
<li><a href="/ios8/">iOS 8</a></li>
|
188
|
+
<li><a href="/osx/whats-new/">OS X Yosemite</a></li>
|
189
|
+
<li><a href="/swift/">Swift</a></li>
|
190
|
+
<li><a href="/xcode/">Xcode 6</a></li>
|
191
|
+
</ul>
|
192
|
+
</div><!--/dn-cola-->
|
193
|
+
<div id="dn-colb" class="column">
|
194
|
+
<h3><a href="/resources/">Resources</a></h3>
|
195
|
+
<ul>
|
196
|
+
<li><a href="/devcenter/ios/index.action">iOS Dev Center</a></li>
|
197
|
+
<li><a href="/devcenter/mac/index.action">Mac Dev Center</a></li>
|
198
|
+
<li><a href="/devcenter/safari/index.action">Safari Dev Center</a></li>
|
199
|
+
<li><a href="/app-store/">App Store</a></li>
|
200
|
+
<li><a href="/iad/">iAd</a></li>
|
201
|
+
<li><a href="/icloud/">iCloud</a></li>
|
202
|
+
</ul>
|
203
|
+
</div><!--/dn-colb-->
|
204
|
+
<div id="dn-colc" class="column">
|
205
|
+
<h3 class="empty"> </h3>
|
206
|
+
<ul>
|
207
|
+
<li><a href="/devforums/">Forums</a></li>
|
208
|
+
<li><a href="/videos/">Videos</a></li>
|
209
|
+
<li><a href="/softwarelicensing/">Licensing and Trademarks</a></li>
|
210
|
+
<li><a href="/hardwaredrivers/">Hardware and Drivers</a></li>
|
211
|
+
<li><a href="/resources/cases/">iPod, iPhone, and iPad Cases</a></li>
|
212
|
+
<li><a href="/opensource/">Open Source</a></li>
|
213
|
+
</ul>
|
214
|
+
</div><!--/dn-colc-->
|
215
|
+
<div id="dn-cold" class="column">
|
216
|
+
<h3><a href="/programs/">Programs</a></h3>
|
217
|
+
<ul>
|
218
|
+
<li><a href="/programs/ios/">iOS Developer Program</a></li>
|
219
|
+
<li><a href="/programs/ios/enterprise/">iOS Developer Enterprise Program</a></li>
|
220
|
+
<li><a href="/programs/ios/university/">iOS Developer University Program</a></li>
|
221
|
+
<li><a href="/programs/mac/">Mac Developer Program</a></li>
|
222
|
+
<li><a href="/programs/safari/">Safari Developer Program</a></li>
|
223
|
+
<li><a href="/programs/mfi/">MFi Program</a></li>
|
224
|
+
</ul>
|
225
|
+
</div><!--/dn-cold-->
|
226
|
+
<div id="dn-cole" class="column last">
|
227
|
+
<h3><a href="/support/">Support</a></h3>
|
228
|
+
<ul>
|
229
|
+
<li><a href="/support/ios/">iOS Developer Program</a></li>
|
230
|
+
<li><a href="/support/mac/">Mac Developer Program</a></li>
|
231
|
+
<li><a href="/support/safari/">Safari Developer Program</a></li>
|
232
|
+
<li><a href="/support/appstore/">App Store</a></li>
|
233
|
+
<li><a href="/support/resources/itunes-connect.html">iTunes Connect</a></li>
|
234
|
+
<li><a href="/support/technical/">Technical Support</a></li>
|
235
|
+
</ul>
|
236
|
+
</div><!--/dn-cole-->
|
237
|
+
<div class="capbottom"></div>
|
238
|
+
</div><!--/directorynav-->
|
239
|
+
</div><!--/breadory-->
|
240
|
+
<p class="gf-buy">Shop the <a href="http://www.apple.com/store/">Apple Online Store</a> (1-800-MY-APPLE), visit an <a href="http://www.apple.com/retail/">Apple Retail Store</a>, or find a <a href="http://www.apple.com/buy/locator/">reseller</a>.</p>
|
241
|
+
<ul class="gf-links piped">
|
242
|
+
<li><a href="/news/" class="first">News</a></li>
|
243
|
+
<li><a href="/register/">Register</a></li>
|
244
|
+
<li><a href="/bug-reporting/">Report Bugs</a></li>
|
245
|
+
<li><a href="/contact/">Contact Us</a></li>
|
246
|
+
</ul>
|
247
|
+
<div class="gf-sosumi">
|
248
|
+
<p>Copyright © 2015 Apple Inc. All rights reserved.</p>
|
249
|
+
<ul class="piped">
|
250
|
+
<li><a href="http://www.apple.com/legal/internet-services/terms/site.html" class="first">Terms of Use</a></li>
|
251
|
+
<li><a href="http://www.apple.com/privacy/">Privacy Policy</a></li>
|
252
|
+
</ul>
|
253
|
+
</div>
|
254
|
+
<div id="localization-links">
|
255
|
+
<ul>
|
256
|
+
<li><a href="/cn/" title="Simplified Chinese">简体中文</a></li>
|
257
|
+
<li><a href="/jp/" title="Japanese">日本語</a></li>
|
258
|
+
<li><a href="/kr/" title="Korean">한국어</a></li>
|
259
|
+
</ul>
|
260
|
+
</div>
|
261
|
+
</div><!--/globalfooter-->
|
262
|
+
</body>
|
263
|
+
</html>
|