diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 1103d6b9d..344736312 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -8,25 +8,106 @@ on:
branches:
- "**"
env:
- CI_XCODE_14: /Applications/Xcode_14.2.app/Contents/Developer
CI_XCODE_15: /Applications/Xcode_15.4.0.app/Contents/Developer
- CI_XCODE_16: /Applications/Xcode_16.0.app/Contents/Developer
+ CI_XCODE_16: /Applications/Xcode_16.1.0.app/Contents/Developer
jobs:
- tests:
+ test-xcode:
env:
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
timeout-minutes: 45
strategy:
matrix:
- script:
- - test:ios
- - test:macos
- - test:parse_live_query:all
- - xcode14 # runs build:starters on Xcode 14
- - xcode15 # runs build:starters on Xcode 15
- - xcode16 # runs build:starters on Xcode 16
+ include:
+ # Xcode
+ - name: Xcode 15
+ script: build:starters
+ iosVersion: '18.1'
+ iosDeviceModel: iPhone 16
+ watchOsVersion: '11.1'
+ watchDeviceModel: Apple Watch Series 10 (46mm)
+ tvOsVersion: '18.1'
+ tvDeviceModel: Apple TV
+ macosVersion: 14
+ developerDir: CI_XCODE_15
+ - name: Xcode 16
+ script: build:starters
+ iosVersion: '18.1'
+ iosDeviceModel: iPhone 16
+ watchOsVersion: '11.1'
+ watchDeviceModel: Apple Watch Series 10 (46mm)
+ tvOsVersion: '18.1'
+ tvDeviceModel: Apple TV
+ macosVersion: 14
+ developerDir: CI_XCODE_16
+ # Core Module
+ - name: Core Module, iOS 17
+ script: test:ios
+ iosVersion: '17.5'
+ iosDeviceModel: iPhone 15
+ macosVersion: 15
+ developerDir: CI_XCODE_16
+ - name: Core Module, iOS 18
+ script: test:ios
+ iosVersion: '18.1'
+ iosDeviceModel: iPhone 16
+ macosVersion: 15
+ developerDir: CI_XCODE_16
+ - name: Core Module, macOS 14
+ script: test:macos
+ macosVersion: 14
+ developerDir: CI_XCODE_16
+ - name: Core Module, macOS 15
+ script: test:macos
+ macosVersion: 15
+ developerDir: CI_XCODE_16
+ # LiveQuery Module
+ - name: LiveQuery Module, iOS 17
+ script: test:parse_live_query:ios
+ iosVersion: '17.5'
+ iosDeviceModel: iPhone 15
+ macosVersion: 15
+ developerDir: CI_XCODE_16
+ - name: LiveQuery Module, iOS 18
+ script: test:parse_live_query:ios
+ iosVersion: '18.1'
+ iosDeviceModel: iPhone 16
+ macosVersion: 15
+ developerDir: CI_XCODE_16
+ - name: LiveQuery Module, macOS 14
+ script: test:parse_live_query:osx
+ macosVersion: 14
+ developerDir: CI_XCODE_15
+ - name: LiveQuery Module, macOS 15
+ script: test:parse_live_query:osx
+ macosVersion: 15
+ developerDir: CI_XCODE_16
+ - name: LiveQuery Module, watchOS 10
+ script: test:parse_live_query:watchos
+ watchOsVersion: '10.5'
+ watchDeviceModel: Apple Watch Series 9 (45mm)
+ macosVersion: 15
+ developerDir: CI_XCODE_15
+ - name: LiveQuery Module, watchOS 11
+ script: test:parse_live_query:watchos
+ watchOsVersion: '11.1'
+ watchDeviceModel: Apple Watch Series 10 (46mm)
+ macosVersion: 15
+ developerDir: CI_XCODE_16
+ - name: LiveQuery Module, tvOS 17
+ script: test:parse_live_query:tvos
+ tvOsVersion: '17.5'
+ tvDeviceModel: Apple TV
+ macosVersion: 15
+ developerDir: CI_XCODE_16
+ - name: LiveQuery Module, tvOS 18
+ script: test:parse_live_query:tvos
+ tvOsVersion: '18.1'
+ tvDeviceModel: Apple TV
+ macosVersion: 15
+ developerDir: CI_XCODE_16
fail-fast: false
- runs-on: ${{ ((matrix.script == 'xcode15' || matrix.script == 'xcode16') && 'macos-14') || 'macos-13' }}
+ runs-on: macos-${{ matrix.macosVersion }}
+ name: ${{ matrix.name }}
steps:
- uses: actions/checkout@v4
- name: Cache SPM
@@ -49,9 +130,9 @@ jobs:
- name: Submodules
run: git submodule update --init --recursive
- name: Build-Test
- run: set -o pipefail && env NSUnbufferedIO=YES bundle exec rake ${{ ((matrix.script == 'xcode14' || matrix.script == 'xcode15' || matrix.script == 'xcode16') && 'build:starters') || matrix.script }}
+ run: set -o pipefail && env NSUnbufferedIO=YES IOS_VERSION="${{ matrix.iosVersion }}" IOS_DEVICE_MODEL="${{ matrix.iosDeviceModel }}" WATCH_DEVICE_MODEL="${{ matrix.watchDeviceModel }}" WATCH_OS_VERSION="${{ matrix.watchOsVersion }}" TV_DEVICE_MODEL="${{ matrix.tvDeviceModel }}" TV_OS_VERSION="${{ matrix.tvOsVersion }}" bundle exec rake ${{ matrix.script }}
env:
- DEVELOPER_DIR: ${{ (matrix.script == 'xcode15' && env.CI_XCODE_15) || (matrix.script == 'xcode16' && env.CI_XCODE_16) || env.CI_XCODE_14 }}
+ DEVELOPER_DIR: ${{ env[matrix.developerDir] }}
- name: Generate Environment Variables
if: ${{ always() }}
env:
@@ -68,7 +149,7 @@ jobs:
echo "Build Result Location: $BUILD_RESULTS"
- name: Upload Artifact Logs
if: ${{ failure() }}
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME }}
path: |
@@ -103,7 +184,7 @@ jobs:
plugin: xcode
file: ${{ env.COVERAGE_PATH }}
docs:
- runs-on: macos-13
+ runs-on: macos-14
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
@@ -117,7 +198,7 @@ jobs:
run: |
./Scripts/jazzy.sh
env:
- DEVELOPER_DIR: ${{ env.CI_XCODE_14 }}
+ DEVELOPER_DIR: ${{ env.CI_XCODE_16 }}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
diff --git a/.github/workflows/release-automated.yml b/.github/workflows/release-automated.yml
index 3c6083792..884501e3a 100644
--- a/.github/workflows/release-automated.yml
+++ b/.github/workflows/release-automated.yml
@@ -3,11 +3,11 @@ on:
push:
branches: [ master, release, alpha, beta ]
env:
- CI_XCODE_14: '/Applications/Xcode_14.2.app/Contents/Developer'
+ CI_XCODE_16: /Applications/Xcode_16.1.0.app/Contents/Developer
jobs:
release:
- runs-on: macos-13
+ runs-on: macos-14
outputs:
current_tag: ${{ steps.tag.outputs.current_tag }}
steps:
@@ -46,7 +46,7 @@ jobs:
publish-docs:
needs: release
if: needs.release.outputs.current_tag != ''
- runs-on: macos-13
+ runs-on: macos-14
steps:
- name: Checkout repository
uses: actions/checkout@v4
@@ -62,7 +62,7 @@ jobs:
run: |
./Scripts/jazzy.sh
env:
- DEVELOPER_DIR: ${{ env.CI_XCODE_14 }}
+ DEVELOPER_DIR: ${{ env.CI_XCODE_16 }}
- name: Deploy Jazzy Docs
uses: peaceiris/actions-gh-pages@v3
with:
diff --git a/.github/workflows/release-manual-docs.yml b/.github/workflows/release-manual-docs.yml
index a88ef4faf..150763731 100644
--- a/.github/workflows/release-manual-docs.yml
+++ b/.github/workflows/release-manual-docs.yml
@@ -6,12 +6,12 @@ on:
default: ''
description: 'Version tag:'
env:
- CI_XCODE_14: '/Applications/Xcode_14.2.app/Contents/Developer'
+ CI_XCODE_16: /Applications/Xcode_16.1.0.app/Contents/Developer
jobs:
publish-docs:
if: github.event.inputs.tag != ''
- runs-on: macos-13
+ runs-on: macos-14
steps:
- name: Checkout repository
uses: actions/checkout@v4
@@ -27,7 +27,7 @@ jobs:
run: |
./Scripts/jazzy.sh
env:
- DEVELOPER_DIR: ${{ env.CI_XCODE_14 }}
+ DEVELOPER_DIR: ${{ env.CI_XCODE_16 }}
- name: Deploy Jazzy Docs
uses: peaceiris/actions-gh-pages@v3
with:
diff --git a/Gemfile b/Gemfile
index bcf060416..a22bf78f0 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,9 +1,9 @@
source 'https://rubygems.org'
# Docs
-gem 'jazzy', '~> 0.15.3'
+gem 'jazzy', '0.15.3'
# Development
-gem 'xcpretty', '~> 0.4.0'
-gem 'rake', '~> 13.2.1'
-gem 'plist', '~> 3.7.1'
+gem 'xcpretty', '0.3.0'
+gem 'rake', '13.2.1'
+gem 'plist', '3.7.1'
diff --git a/Gemfile.lock b/Gemfile.lock
index 255a43c70..7a0834d8f 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -103,7 +103,7 @@ GEM
rake (13.2.1)
redcarpet (3.6.0)
rexml (3.3.9)
- rouge (3.28.0)
+ rouge (2.0.7)
ruby-macho (2.5.1)
sassc (2.4.0)
ffi (~> 1.9)
@@ -123,18 +123,18 @@ GEM
colored2 (~> 3.1)
nanaimo (~> 0.4.0)
rexml (>= 3.3.6, < 4.0)
- xcpretty (0.4.0)
- rouge (~> 3.28.0)
+ xcpretty (0.3.0)
+ rouge (~> 2.0.7)
PLATFORMS
arm64-darwin
x86_64-darwin
DEPENDENCIES
- jazzy (~> 0.15.3)
- plist (~> 3.7.1)
- rake (~> 13.2.1)
- xcpretty (~> 0.4.0)
+ jazzy (= 0.15.3)
+ plist (= 3.7.1)
+ rake (= 13.2.1)
+ xcpretty (= 0.3.0)
BUNDLED WITH
2.5.22
diff --git a/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-iOS.xcscheme b/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-iOS.xcscheme
index c7e38565f..9e5527268 100644
--- a/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-iOS.xcscheme
+++ b/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-iOS.xcscheme
@@ -81,6 +81,12 @@
+
+
+
+
@@ -90,6 +96,9 @@
+
+
diff --git a/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-macOS.xcscheme b/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-macOS.xcscheme
index 2b3c0355f..f2a1764f4 100644
--- a/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-macOS.xcscheme
+++ b/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-macOS.xcscheme
@@ -62,6 +62,11 @@
BlueprintName = "ParseUnitTests-macOS"
ReferencedContainer = "container:Parse.xcodeproj">
+
+
+
+
diff --git a/README.md b/README.md
index 08243bb99..124696956 100644
--- a/README.md
+++ b/README.md
@@ -32,6 +32,9 @@ A library that gives you access to the powerful Parse Server backend from your i
---
- [Getting Started](#getting-started)
+- [Compatibility](#compatibility)
+ - [Parse Server](#parse-server)
+ - [Xcode, iOS, macOS](#xcode-ios-macos)
- [How Do I Contribute?](#how-do-i-contribute)
- [Dependencies](#dependencies)
@@ -49,6 +52,27 @@ The easiest way to install the SDK is via Swift Package Manager.
Take a look at the public [documentation][docs] & [API][api] and start building.
+## Compatibility
+
+### Parse Server
+
+Parse Apple SDK is compatible with the following versions of Parse Server.
+
+| Parse Apple SDK | Parse Server |
+|-----------------|--------------|
+| 1.0.0 | >= 1.0.0 |
+
+### Xcode, iOS, macOS
+
+The Parse Apple SDK is continuously tested with the most recent releases of Xcode to ensure compatibility. We follow the annual release schedule of Xcode to support the current and previous major Xcode version.
+
+| Xcode Version | iOS Version | macOS Version | macOS Version | Release Date | End-of-Support Date | Parse Apple SDK Support |
+|---------------|-------------|---------------|---------------|----------------|---------------------|-------------------------|
+| Xcode 13 | iOS 15 | macOS 12 | watchOS 8 | September 2021 | October 2023 | >= 1.19.3 <2.7.2 |
+| Xcode 14 | iOS 16 | macOS 13 | watchOS 9 | September 2022 | October 2024 | >= 2.7.2 <= 5.0.0 |
+| Xcode 15 | iOS 17 | macOS 14 | watchOS 10 | September 2023 | October 2025 | >= 3.0.0 |
+| Xcode 16 | iOS 18 | macOS 15 | watchOS 11 | September 2024 | tbd | >= 4.2.0 |
+
## How Do I Contribute?
We want to make contributing to this project as easy and transparent as possible. Please refer to the [Contribution Guidelines][contributing].
diff --git a/Rakefile b/Rakefile
index 7601b3812..1058d38c1 100644
--- a/Rakefile
+++ b/Rakefile
@@ -12,9 +12,23 @@ require_relative 'Vendor/xctoolchain/Scripts/xctask/build_task'
SCRIPT_PATH = File.expand_path(File.dirname(__FILE__))
starters_path = File.join(SCRIPT_PATH, 'ParseStarterProject')
-ios_simulator = 'platform="iOS Simulator",name="iPhone 14"'
-tvos_simulator = 'platform="tvOS Simulator",name="Apple TV"'
-watchos_simulator = 'platform="watchOS Simulator",name="Apple Watch Series 8 (45mm)"'
+ios_version = ENV.fetch('IOS_VERSION')
+ios_device_model = ENV.fetch('IOS_DEVICE_MODEL')
+tvos_version = ENV.fetch('TV_OS_VERSION')
+tv_device_model = ENV.fetch('TV_DEVICE_MODEL')
+watchos_version = ENV.fetch('WATCH_OS_VERSION')
+watch_device_model = ENV.fetch('WATCH_DEVICE_MODEL')
+
+puts "IOS_VERSION: #{ios_version}"
+puts "IOS_DEVICE_MODEL: #{ios_device_model}"
+puts "TV_OS_VERSION: #{tvos_version}"
+puts "TV_DEVICE_MODEL: #{tv_device_model}"
+puts "WATCH_OS_VERSION: #{watchos_version}"
+puts "WATCH_DEVICE_MODEL: #{watch_device_model}"
+
+ios_simulator = "platform=\"iOS Simulator\",name=\"#{ios_device_model}\",OS=\"#{ios_version}\""
+tvos_simulator = "platform=\"tvOS Simulator\",name=\"#{tv_device_model}\",OS=\"#{tvos_version}\""
+watchos_simulator = "platform=\"watchOS Simulator\",name=\"#{watch_device_model}\",OS=\"#{watchos_version}\""
build_action = [XCTask::BuildAction::CLEAN, XCTask::BuildAction::BUILD];
@@ -82,6 +96,9 @@ namespace :build do
end
task :objc do
+ puts 'Running iOS ObjC Starter Project'
+ puts "IOS_VERSION: #{ios_version}"
+ puts "IOS_DEVICE_MODEL: #{ios_device_model}"
project = 'ParseStarterProject'
ios_starters_path = File.join(starters_path, 'iOS', project)
task = XCTask::BuildTask.new do |t|
@@ -101,6 +118,9 @@ namespace :build do
end
task :swift do
+ puts 'Running iOS Swift Starter Project'
+ puts "IOS_VERSION: #{ios_version}"
+ puts "IOS_DEVICE_MODEL: #{ios_device_model}"
project = 'ParseStarterProject-Swift'
ios_starters_path = File.join(starters_path, 'iOS', project)
task = XCTask::BuildTask.new do |t|
@@ -127,6 +147,7 @@ namespace :build do
end
task :objc do
+ puts 'Running macOS ObjC Starter Project'
macos_starter_folder = File.join(starters_path, 'OSX', 'ParseOSXStarterProject')
task = XCTask::BuildTask.new do |t|
t.directory = macos_starter_folder
@@ -144,6 +165,7 @@ namespace :build do
end
task :swift do
+ puts 'Running macOS Swift Starter Project'
macos_starter_folder = File.join(starters_path, 'OSX', 'ParseOSXStarterProject-Swift')
task = XCTask::BuildTask.new do |t|
t.directory = macos_starter_folder
@@ -169,6 +191,9 @@ namespace :build do
end
task :swift do
+ puts 'Running tvOS Swift Starter Project'
+ puts "TV_OS_VERSION: #{tvos_version}"
+ puts "TV_DEVICE_MODEL: #{tv_device_model}"
tvos_starter_folder = File.join(starters_path, 'tvOS', 'ParseStarterProject-Swift')
task = XCTask::BuildTask.new do |t|
t.directory = tvos_starter_folder
@@ -194,6 +219,9 @@ namespace :build do
end
task :swift do
+ puts 'Running watchOS Swift Starter Project'
+ puts "WATCH_OS_VERSION: #{watchos_version}"
+ puts "WATCH_DEVICE_MODEL: #{watch_device_model}"
watchos_starter_folder = File.join(starters_path, 'watchOS', 'ParseStarterProject-Swift')
task = XCTask::BuildTask.new do |t|
t.directory = watchos_starter_folder
@@ -218,6 +246,7 @@ namespace :build do
end
task :objc do
+ puts 'Running Live Query macOS ObjC Starter Project'
live_query_starter_folder = File.join(SCRIPT_PATH, 'ParseLiveQuery', 'Examples')
task = XCTask::BuildTask.new do |t|
t.directory = live_query_starter_folder
@@ -235,6 +264,7 @@ namespace :build do
end
task :swift do
+ puts 'Running Live Query macOS Swift Starter Project'
live_query_starter_folder = File.join(SCRIPT_PATH, 'ParseLiveQuery', 'Examples')
task = XCTask::BuildTask.new do |t|
t.directory = live_query_starter_folder
@@ -265,6 +295,9 @@ end
namespace :test do
desc 'Run iOS Tests'
task :ios do |_, args|
+ puts 'Running iOS Tests'
+ puts "IOS_VERSION: #{ios_version}"
+ puts "IOS_DEVICE_MODEL: #{ios_device_model}"
task = XCTask::BuildTask.new do |t|
t.directory = SCRIPT_PATH
t.workspace = 'Parse.xcworkspace'
@@ -283,6 +316,7 @@ namespace :test do
desc 'Run macOS Tests'
task :macos do |_, args|
+ puts 'Running macOS Tests'
task = XCTask::BuildTask.new do |t|
t.directory = SCRIPT_PATH
t.workspace = 'Parse.xcworkspace'
@@ -307,6 +341,9 @@ namespace :test do
end
task :ios do
+ puts 'Running ParseLiveQuery iOS Tests'
+ puts "IOS_VERSION: #{ios_version}"
+ puts "IOS_DEVICE_MODEL: #{ios_device_model}"
task = XCTask::BuildTask.new do |t|
t.directory = SCRIPT_PATH
t.workspace = 'Parse.xcworkspace'
@@ -324,6 +361,9 @@ namespace :test do
end
task :tvos do
+ puts 'Running ParseLiveQuery tvOS Tests'
+ puts "TV_OS_VERSION: #{tvos_version}"
+ puts "TV_DEVICE_MODEL: #{tv_device_model}"
task = XCTask::BuildTask.new do |t|
t.directory = SCRIPT_PATH
t.workspace = 'Parse.xcworkspace'
@@ -340,6 +380,9 @@ namespace :test do
end
task :watchos do
+ puts 'Running ParseLiveQuery watchOS Tests'
+ puts "WATCH_OS_VERSION: #{watchos_version}"
+ puts "WATCH_DEVICE_MODEL: #{watch_device_model}"
task = XCTask::BuildTask.new do |t|
t.directory = SCRIPT_PATH
t.workspace = 'Parse.xcworkspace'
@@ -356,6 +399,7 @@ namespace :test do
end
task :osx do
+ puts 'Running ParseLiveQuery macOS Tests'
task = XCTask::BuildTask.new do |t|
t.directory = SCRIPT_PATH
t.workspace = 'Parse.xcworkspace'