なぜリモートで開発するのか?
リモートXcode開発は、Macを持っていない人だけのものではありません。多くのプロフェッショナルなチームは、ローカルマシンを持っていてもリモートMacサーバーを使っています。それには大きな利点があるからです:
-
常時稼働のビルドサーバー
リモートMacはデータセンターで24時間365日稼働します。CI/CDパイプライン、夜間ビルド、自動テストが、ノートPCを開いたままにしなくても実行されます。
-
1Gbpsネットワーク
データセンター級のネットワークにより、gitのクローン、依存関係のダウンロード、成果物のアップロードが高速になります。CocoaPodsのインストールやSPMの解決が数秒で完了します。
-
一貫した環境
チームの全員が同じサーバー構成に接続します。異なるmacOSバージョンやXcode設定に起因する「自分のマシンでは動く」問題はもうありません。
-
どんなデバイスからでも作業
Windowsノート、Linuxデスクトップ、Chromebook、さらにはSSHクライアントを備えたiPadからでも、専用macOSサーバー上の完全なXcode開発環境にアクセスできます。1回のビルドだけXcodeが必要なら、Mac miniを1日単位でレンタルできます($14/日から、USD・税抜。自動更新をオンにしない限り24時間で停止)。
方法1:SSH + xcodebuild CLI
最も軽量なアプローチです。お好みのエディタでローカル(またはサーバー上)でコードを編集し、SSH経由でxcodebuildを使ってビルドします。この方法はターミナルを備えたあらゆるデバイスで機能します。
SSHキーを設定する
# Generate SSH key on your local machine (if you don't have one)
ssh-keygen -t ed25519 -C "dev@company.com"
# Copy your public key to the remote Mac
ssh-copy-id user@your-mac.myremotemac.com
# Configure SSH for convenience (~/.ssh/config)
Host mac-dev
HostName your-mac.myremotemac.com
User your-username
IdentityFile ~/.ssh/id_ed25519
ForwardAgent yes
ServerAliveInterval 60
ServerAliveCountMax 3
Compression yes
# Now connect with just:
ssh mac-dev
よく使うxcodebuildコマンド
# List available schemes
xcodebuild -list -project MyApp.xcodeproj
# Build for iOS Simulator
xcodebuild -project MyApp.xcodeproj \
-scheme MyApp \
-destination 'generic/platform=iOS Simulator' \
clean build
# Build with workspace (CocoaPods/SPM)
xcodebuild -workspace MyApp.xcworkspace \
-scheme MyApp \
-destination 'generic/platform=iOS Simulator' \
build
# Run unit tests (use any device listed by: xcrun simctl list devices available)
xcodebuild test \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-destination 'platform=iOS Simulator,name=iPhone 17,OS=latest' \
-resultBundlePath ./TestResults.xcresult
# Archive for distribution (App Store Connect requires Xcode 26 or later)
xcodebuild archive \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-configuration Release \
-destination 'generic/platform=iOS' \
-archivePath ./build/MyApp.xcarchive \
CODE_SIGN_IDENTITY="Apple Distribution" \
PROVISIONING_PROFILE_SPECIFIER="MyApp Distribution"
# Export IPA from archive
xcodebuild -exportArchive \
-archivePath ./build/MyApp.xcarchive \
-exportPath ./build/ipa \
-exportOptionsPlist ExportOptions.plist
# Upload to App Store Connect
xcrun altool --upload-app \
-f ./build/ipa/MyApp.ipa \
-t ios \
-u "apple-id@example.com" \
-p "@keychain:AC_PASSWORD"
永続セッションのためのtmuxの使用
SSH接続が切れてもビルドを継続させるには、tmuxを使います。
# Install tmux via Homebrew
brew install tmux
# Start a new tmux session
tmux new -s build
# Run your build inside tmux
xcodebuild -workspace MyApp.xcworkspace -scheme MyApp build
# Detach from tmux: press Ctrl+B, then D
# Your build keeps running on the server
# Reconnect later
ssh mac-dev
tmux attach -t build
方法2:フルGUIのためのVNC
VNCを使うと、Xcodeのビジュアルインターフェース、Interface Builder、iOSシミュレータ、Instrumentsを含むmacOSデスクトップにフルアクセスできます。完全なXcode GUI体験が必要なときに最適な方法です。
画面共有に接続する
# My Remote Mac serves Screen Sharing (VNC) on port 59010:
# point your VNC client at YOUR-IP:59010 and sign in with
# your macOS username and password
# On a Mac you manage yourself, turn on Screen Sharing in
# System Settings > General > Sharing. Since macOS 12.1 the
# kickstart command can no longer enable it.
# Verify Screen Sharing is running (over SSH)
sudo launchctl list | grep -i screensharing
OS別の推奨VNCクライアント
| お使いのOS | 推奨クライアント | 備考 |
|---|---|---|
| Windows | RealVNC Viewer(無料) | 最高のパフォーマンス。AppleのHigh-DPIに対応 |
| Linux | Remmina または TigerVNC | RemminaはSSHトンネリングを内蔵 |
| macOS | 内蔵の画面共有 | Finder >「移動」>「サーバへ接続」> vnc:// を開く |
| Chromebook | VNC Viewer(Chrome Web Store) | 基本的なGUIアクセスには十分機能する |
| iPad/iPhone | Screens 5 または RealVNC | macOS操作のためのタッチジェスチャー |
SSHトンネルでVNCを安全にする
すべてのトラフィックを暗号化するため、VNC接続には常にSSHトンネルを使いましょう。
# Create SSH tunnel for VNC (run on your LOCAL machine)
ssh -L 5900:localhost:5900 -N -f mac-dev
# Now connect your VNC client to: localhost:5900
# All traffic is encrypted through the SSH tunnel
# On Windows with PuTTY:
# Connection > SSH > Tunnels
# Source port: 5900
# Destination: localhost:5900
# Click "Add", then connect
VNC最適化のヒント
- 画面解像度を下げる:レンダリングを高速化するため、リモートMacをRetinaではなく1920x1080に設定します。
- 色深度を下げる:パフォーマンス向上のため、VNCクライアントで色品質を「中」または16ビットに設定します。
- 透明度を無効にする:リモートMacで、システム設定 >「アクセシビリティ」>「ディスプレイ」>「透明度を下げる」を選択します。
- 不要なアプリを閉じる:開いているウィンドウが増えるほど、転送が必要な画面データが増えます。
- SSH圧縮を使う:トンネル用のSSH configに
Compression yesを追加します。
方法3:VS Code Remote SSH
VS Code Remote SSHは、両方の長所を提供します。ローカルエディタの応答性と、リモートMacの処理能力です。キー入力はローカルで、ビルドはサーバー上で実行されます。
インストールと設定
# Step 1: Install VS Code extensions
# Open VS Code and install these extensions:
# - Remote - SSH (ms-vscode-remote.remote-ssh)
# - Swift (sswg.swift-lang)
# - CodeLLDB (vadimcn.vscode-lldb) - for debugging
# Step 2: Configure SSH in ~/.ssh/config
Host mac-dev
HostName your-mac.myremotemac.com
User your-username
IdentityFile ~/.ssh/id_ed25519
ForwardAgent yes
ServerAliveInterval 60
# Step 3: Connect
# Press Ctrl+Shift+P (or Cmd+Shift+P on macOS)
# Type: "Remote-SSH: Connect to Host"
# Select: mac-dev
# VS Code installs its server component on the remote Mac
# Open your project folder
ビルドタスクの設定
VS Codeからxcodebuildを実行するために、プロジェクトに.vscode/tasks.jsonを作成します:
{
"version": "2.0.0",
"tasks": [
{
"label": "Build iOS (Simulator)",
"type": "shell",
"command": "xcodebuild",
"args": [
"-workspace", "MyApp.xcworkspace",
"-scheme", "MyApp",
"-destination", "generic/platform=iOS Simulator",
"build"
],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": ["$xcodebuild"]
},
{
"label": "Run Tests",
"type": "shell",
"command": "xcodebuild",
"args": [
"test",
"-workspace", "MyApp.xcworkspace",
"-scheme", "MyApp",
"-destination", "platform=iOS Simulator,name=iPhone 17,OS=latest"
],
"group": "test",
"problemMatcher": ["$xcodebuild"]
},
{
"label": "Clean Build",
"type": "shell",
"command": "xcodebuild",
"args": [
"-workspace", "MyApp.xcworkspace",
"-scheme", "MyApp",
"clean"
],
"problemMatcher": []
}
]
}
これでCtrl+Shift+B(またはCmd+Shift+B)を押すとビルドが実行され、出力がVS Codeの統合ターミナルに表示されます。
VS CodeでのSwift言語サポート
# On the remote Mac, install SourceKit-LSP (comes with Xcode)
# Verify it's available:
xcrun sourcekit-lsp --help
# VS Code Swift extension will automatically detect SourceKit-LSP
# You get:
# - Code completion for Swift and SwiftUI
# - Jump to definition
# - Find references
# - Inline error diagnostics
# - Symbol search
方法4:SSH経由のJetBrains IDE(Toolbox App)
JetBrainsはSwiftとXcodeのプロジェクト向けIDEを提供していません。AppCodeは提供終了(アップデートとサポートは2023年12月31日に終了)、Fleetも配布を終了しています(2025年12月22日以降)。SwiftにはVNC経由のXcodeかVS Code Remote SSHを使ってください。リポジトリにKotlin Multiplatform、バックエンド、Webのコードもある場合は、JetBrainsのリモート開発が引き続き役立ちます。JetBrains Toolbox AppがSSHでMacに接続してIntelliJベースのIDEバックエンドを実行し、シンクライアントがUIをローカルで描画します(JetBrains GatewayはLinuxのバックエンドにのみ対応)。
Toolbox AppでJetBrains IDEを接続する
# JetBrains Gateway only connects to Linux backends: a Mac host
# goes through the JetBrains Toolbox App instead
# Step 1: Install the Toolbox App on your local machine
# (jetbrains.com/toolbox-app)
# Step 2: Create the SSH connection
# In the Toolbox App: SSH > New SSH Connection
# Server: your-username@your-mac.myremotemac.com
# (the Toolbox App uses OpenSSH, so your ~/.ssh/config keys apply)
# Step 3: Install the IDE backend on the remote Mac
# Open the server's Tools tab and pick an IntelliJ-based IDE
# (for example IntelliJ IDEA for Kotlin Multiplatform)
# Step 4: Open your project folder on the remote Mac
# Keep editing Swift in Xcode (Method 2) or VS Code (Method 3)
ヒント:JetBrainsのリモート開発は安定したインターネット接続(最低10 Mbps)で最も快適に動作します。シンクライアントがUIをローカルでレンダリングするため、遠距離でも軽快に感じられます。
リモートでのコード署名の管理
コード署名は、リモートiOS開発で最も厄介な部分の一つです。ここでは、リモートMacサーバーで証明書とプロビジョニングプロファイルを管理する方法を説明します。
Apple Developer Portalから証明書をエクスポートする
# Option 1: Export from existing Mac as .p12
# On your local Mac (if you have one):
# Open Keychain Access > My Certificates
# Right-click your distribution certificate > Export
# Save as .p12 with a strong password
# Transfer to remote Mac
scp ~/Desktop/Certificates.p12 mac-dev:~/
# On the remote Mac, import:
security import ~/Certificates.p12 \
-k ~/Library/Keychains/login.keychain-db \
-P "your-p12-password" \
-T /usr/bin/codesign -T /usr/bin/security
# Allow codesign access without password prompts
security set-key-partition-list \
-S apple-tool:,apple:,codesign: \
-s -k "your-login-password" \
~/Library/Keychains/login.keychain-db
# Option 2: Create new certificate on remote Mac
# Use VNC to open Xcode > Settings > Accounts
# Add your Apple ID
# Xcode manages certificates automatically
CI/CDのためのキーチェーン管理
# Create a dedicated keychain for CI/CD
security create-keychain -p "keychain-password" build.keychain-db
# Set it as the default keychain
security default-keychain -s build.keychain-db
# Unlock the keychain (needed for automated builds)
security unlock-keychain -p "keychain-password" build.keychain-db
# Set keychain timeout to prevent auto-lock during builds
security set-keychain-settings -t 3600 -u build.keychain-db
# Import certificate
security import Certificates.p12 \
-k build.keychain-db \
-P "p12-password" \
-T /usr/bin/codesign
# Let codesign use the key without a prompt (needed over SSH)
security set-key-partition-list \
-S apple-tool:,apple:,codesign: \
-s -k "keychain-password" build.keychain-db
# Add to search list
security list-keychains -s build.keychain-db login.keychain-db
# Verify
security find-identity -v -p codesigning build.keychain-db
プロビジョニングプロファイル
# Download profiles from Apple Developer Portal
# Or use the xcodebuild automatic provisioning:
# Install provisioning profiles manually
# (Xcode 16 and later read them from this folder; older versions
# used ~/Library/MobileDevice/Provisioning Profiles)
mkdir -p ~/Library/Developer/Xcode/UserData/Provisioning\ Profiles/
cp MyApp_Distribution.mobileprovision \
~/Library/Developer/Xcode/UserData/Provisioning\ Profiles/
# List installed profiles
ls ~/Library/Developer/Xcode/UserData/Provisioning\ Profiles/
# Decode profile info
security cms -D -i ~/Library/Developer/Xcode/UserData/Provisioning\ Profiles/MyApp_Distribution.mobileprovision
ファイル同期の戦略
ワークフローに応じて、適切なファイル同期戦略を選びましょう。
Git(推奨)
最もシンプルで信頼性の高いアプローチです。ローカルで編集し、リポジトリにプッシュして、リモートMacでプルします。
# Local machine: push changes
git add . && git commit -m "Update views" && git push
# Remote Mac: pull and build
ssh mac-dev "cd ~/MyApp && git pull && xcodebuild build"
rsync(高速同期)
SSH経由で変更されたファイルのみを同期します。ディレクトリ全体をコピーするより高速です。
# Sync local project to remote Mac
rsync -avz --exclude '.git' --exclude 'DerivedData' \
--exclude 'build' --exclude '.DS_Store' \
./MyApp/ mac-dev:~/MyApp/
# Watch for changes and auto-sync (using fswatch on macOS/Linux)
fswatch -o ./MyApp/Sources/ | while read; do
rsync -avz ./MyApp/Sources/ mac-dev:~/MyApp/Sources/
done
SSHFS(リモートファイルシステムのマウント)
リモートMacのファイルシステムをローカルドライブとしてマウントします。ローカルにあるかのようにファイルを編集できます。
# Install SSHFS
# Linux: sudo apt install sshfs
# macOS: brew install macfuse sshfs
# Windows: Install WinFsp + SSHFS-Win
# Mount remote directory
mkdir ~/remote-mac
sshfs mac-dev:/Users/your-username/MyApp ~/remote-mac
# Edit files locally -- they are actually on the remote Mac
code ~/remote-mac
# Unmount when done
fusermount -u ~/remote-mac # Linux
umount ~/remote-mac # macOS
パフォーマンスのヒント
これらの設定でリモート開発体験を最適化しましょう。
SSH圧縮
データ転送を削減するため、SSH configで圧縮を有効にします。
# ~/.ssh/config
Host mac-dev
Compression yes
CompressionLevel 6
SSH多重化
SSH接続を再利用して、再接続の遅延をなくします。
# Create the socket folder once: mkdir -p ~/.ssh/sockets
# ~/.ssh/config
Host mac-dev
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 600
RAMディスク上のDerivedData
ビルドを高速化するため、XcodeのDerivedDataをRAMディスクに移動します。サイズは小さく保ち、24GB以上のMacでのみ使ってください。RAMディスクは再起動のたびに消去されます。
# Create a 4 GB RAM disk (24 GB+ Macs only;
# it is erased at every restart)
diskutil erasevolume HFS+ \
"RAMDisk" $(hdiutil attach \
-nomount ram://8388608)
# Point Xcode DerivedData to RAM disk
defaults write com.apple.dt.Xcode \
IDECustomDerivedDataLocation \
/Volumes/RAMDisk/DerivedData
Moshによるローカルキャッシュ
不安定な接続での応答性を高めるため、SSHの代わりにMoshを使います。
# Install Mosh on both machines
brew install mosh
# Connect (handles roaming and sleep)
mosh user@your-mac.myremotemac.com
VNC解像度の設定
# Set a lower resolution for better VNC performance
# On the remote Mac, install displayplacer (Homebrew core)
brew install displayplacer
# List current display settings (note the display id)
displayplacer list
# Apply 1920x1080, using the id shown by the list command
displayplacer "id:1 res:1920x1080 hz:60 color_depth:8 scaling:off"
よくある質問
SSH、VNC、VS Codeのどれを選ぶべきですか?
XcodeのSwiftUIプレビューをリモートで使えますか?
VNCはどれくらいの帯域幅を使いますか?
リモートで複数のシミュレータインスタンスを実行できますか?
xcrun simctlを使います。ビルド中にSSH接続が切れたらどうなりますか?
tmuxやscreenを使っていれば、ビルドはサーバー上で実行され続け、セッションに再アタッチできます。tmuxがなければ、ビルドプロセスは終了してしまいます。ビルドは常にtmuxセッション内で実行することを強くお勧めします。