diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6b3ca21f6..609059815 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -9,6 +9,7 @@ on:
- "**"
env:
CI_XCODE_16: /Applications/Xcode_16.4.0.app/Contents/Developer
+ CI_XCODE_26: /Applications/Xcode_26.4.app/Contents/Developer
jobs:
test-xcode:
env:
@@ -17,7 +18,7 @@ jobs:
strategy:
matrix:
include:
- # Xcode
+ # Xcode 16
- name: Xcode 16
script: build:starters
iosVersion: '18.5'
@@ -57,6 +58,46 @@ jobs:
tvDeviceModel: Apple TV
macosVersion: 15
developerDir: CI_XCODE_16
+ # Xcode 26
+ - name: Xcode 26
+ script: build:starters
+ iosVersion: '26.4'
+ iosDeviceModel: iPhone 17 Pro Max
+ watchOsVersion: '26.4'
+ watchDeviceModel: Apple Watch SE 3 (40mm)
+ tvOsVersion: '26.4'
+ tvDeviceModel: Apple TV
+ macosVersion: 26
+ developerDir: CI_XCODE_26
+ # Core Module
+ - name: Core Module, iOS 26.4
+ script: test:ios
+ iosVersion: '26.4'
+ iosDeviceModel: iPhone 17 Pro Max
+ macosVersion: 26
+ developerDir: CI_XCODE_26
+ - name: LiveQuery Module, iOS 26.4
+ script: test:parse_live_query:ios
+ iosVersion: '26.4'
+ iosDeviceModel: iPhone 17 Pro Max
+ macosVersion: 26
+ developerDir: CI_XCODE_26
+ - name: LiveQuery Module, macOS 26
+ script: test:parse_live_query:osx
+ macosVersion: 26
+ developerDir: CI_XCODE_26
+ - name: LiveQuery Module, watchOS 26.4
+ script: test:parse_live_query:watchos
+ watchOsVersion: '26.4'
+ watchDeviceModel: Apple Watch SE 3 (40mm)
+ macosVersion: 26
+ developerDir: CI_XCODE_26
+ - name: LiveQuery Module, tvOS 26.4
+ script: test:parse_live_query:tvos
+ tvOsVersion: '26.4'
+ tvDeviceModel: Apple TV
+ macosVersion: 26
+ developerDir: CI_XCODE_26
fail-fast: false
runs-on: macos-${{ matrix.macosVersion }}
name: ${{ matrix.name }}
@@ -85,25 +126,11 @@ jobs:
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: ${{ env[matrix.developerDir] }}
- - name: Generate Environment Variables
- if: ${{ always() }}
- env:
- ARTIFACT_NAME: ${{ matrix.script }}-logs
- TEST_RESULTS: ${{ matrix.script }}.xcresult
- run: |
- ARTIFACT_NAME=${{ env.ARTIFACT_NAME }}
- TEST_RESULTS=$(find ~/Library/Developer/Xcode/DerivedData -name "*.xcresult")
- BUILD_RESULTS=$(find ~/Library/Developer/Xcode/DerivedData -name "*.xcactivitylog")
- echo ARTIFACT_NAME=${ARTIFACT_NAME//:/-} >> $GITHUB_ENV # replace colon with dashes
- echo TEST_RESULTS=${TEST_RESULTS} >> $GITHUB_ENV
- echo "Artifact Name: $ARTIFACT_NAME"
- echo "Test Result Location: $TEST_RESULTS"
- echo "Build Result Location: $BUILD_RESULTS"
- name: Upload Artifact Logs
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
- name: ${{ env.ARTIFACT_NAME }}
+ name: ${{ matrix.name }}-logs
path: |
~/Library/Developer/Xcode/DerivedData/Parse-*/Logs/Test
~/Library/Developer/Xcode/DerivedData/**/Logs/Build
@@ -119,7 +146,9 @@ jobs:
env:
COVERAGE_PATH: ${{ github.workspace }}/build/${{ matrix.script }}-coverage.xml
run: |
+ TEST_RESULTS=$(find ~/Library/Developer/Xcode/DerivedData -name "*.xcresult")
COVERAGE_PATH=${COVERAGE_PATH//:/-}
+ echo TEST_RESULTS=${TEST_RESULTS} >> $GITHUB_ENV
echo COVERAGE_PATH=$COVERAGE_PATH >> $GITHUB_ENV
echo "TEST_RESULTS: $TEST_RESULTS"
echo "COVERAGE_PATH: $COVERAGE_PATH"
@@ -146,6 +175,8 @@ jobs:
bundler-cache: true
- name: Submodules
run: git submodule update --init --recursive
+ - name: SPM
+ run: swift package resolve
- name: Create Jazzy Docs
run: |
./Scripts/jazzy.sh
diff --git a/.github/workflows/release-manual-docs.yml b/.github/workflows/release-manual-docs.yml
index 67d0f1449..ab9517b5f 100644
--- a/.github/workflows/release-manual-docs.yml
+++ b/.github/workflows/release-manual-docs.yml
@@ -31,6 +31,8 @@ jobs:
bundler-cache: true
- name: Submodules
run: git submodule update --init --recursive
+ - name: SPM
+ run: swift package resolve
- name: Create Jazzy Docs
run: |
./Scripts/jazzy.sh
diff --git a/.ruby-version b/.ruby-version
index 872e12081..fcdb2e109 100644
--- a/.ruby-version
+++ b/.ruby-version
@@ -1 +1 @@
-ruby-3.1.0
+4.0.0
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 21ab01cfd..1c3512566 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -21,7 +21,7 @@ For analyzing bugs, creating bug fixes and features we recommend to clone this r
Install all dependencies:
```
git submodule update --init --recursive
- gem install bundler -v 2.5.22
+ gem install bundler -v 4.0.10
bundle install
```
Run the tests:
diff --git a/Gemfile b/Gemfile
index 1fa770346..3cd0eb127 100644
--- a/Gemfile
+++ b/Gemfile
@@ -2,6 +2,7 @@ source 'https://rubygems.org'
# Docs
gem 'jazzy', '0.15.4'
+gem 'cgi', '0.5.1'
# Development
gem 'xcpretty', '0.3.0'
diff --git a/Gemfile.lock b/Gemfile.lock
index da0bb3865..533721403 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,10 +1,7 @@
GEM
remote: https://rubygems.org/
specs:
- CFPropertyList (3.0.7)
- base64
- nkf
- rexml
+ CFPropertyList (3.0.8)
activesupport (7.2.3.1)
base64
benchmark (>= 0.3)
@@ -25,7 +22,8 @@ GEM
atomos (0.1.3)
base64 (0.3.0)
benchmark (0.5.0)
- bigdecimal (4.0.1)
+ bigdecimal (4.1.1)
+ cgi (0.5.1)
claide (1.1.0)
cocoapods (1.16.2)
addressable (~> 2.8)
@@ -66,14 +64,14 @@ GEM
cocoapods-try (1.2.0)
colored2 (3.1.2)
concurrent-ruby (1.3.6)
- connection_pool (2.5.5)
+ connection_pool (3.0.2)
drb (2.2.3)
escape (0.0.4)
- ethon (0.15.0)
+ ethon (0.18.0)
ffi (>= 1.15.0)
- ffi (1.17.2-arm64-darwin)
- ffi (1.17.2-x86_64-darwin)
- ffi (1.17.2-x86_64-linux-gnu)
+ logger
+ ffi (1.17.4)
+ ffi (1.17.4-arm64-darwin)
fourflusher (2.3.1)
fuzzy_match (2.0.4)
gh_inspector (1.1.3)
@@ -93,17 +91,17 @@ GEM
sassc (~> 2.1)
sqlite3 (~> 1.3)
xcinvoke (~> 0.3.0)
- json (2.15.2.1)
+ json (2.19.3)
liferaft (0.0.6)
logger (1.7.0)
+ mini_portile2 (2.8.9)
minitest (5.27.0)
molinillo (0.8.0)
- mustache (1.1.1)
+ mustache (1.1.2)
mutex_m (0.3.0)
nanaimo (0.4.0)
nap (1.1.0)
netrc (0.11.0)
- nkf (0.2.0)
open4 (1.3.4)
plist (3.7.1)
public_suffix (4.0.7)
@@ -115,11 +113,10 @@ GEM
sassc (2.4.0)
ffi (~> 1.9)
securerandom (0.4.1)
- sqlite3 (1.7.3-arm64-darwin)
- sqlite3 (1.7.3-x86_64-darwin)
- sqlite3 (1.7.3-x86_64-linux)
- typhoeus (1.5.0)
- ethon (>= 0.9.0, < 0.16.0)
+ sqlite3 (1.7.3)
+ mini_portile2 (~> 2.8.0)
+ typhoeus (1.6.0)
+ ethon (>= 0.18.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
xcinvoke (0.3.0)
@@ -135,15 +132,76 @@ GEM
rouge (~> 2.0.7)
PLATFORMS
- arm64-darwin
- x86_64-darwin
- x86_64-linux
+ arm64-darwin-25
+ ruby
DEPENDENCIES
+ cgi (= 0.5.1)
jazzy (= 0.15.4)
plist (= 3.7.1)
rake (= 13.2.1)
xcpretty (= 0.3.0)
+CHECKSUMS
+ CFPropertyList (3.0.8) sha256=2c99d0d980536d3d7ab252f7bd59ac8be50fbdd1ff487c98c949bb66bb114261
+ activesupport (7.2.3.1) sha256=11ebed516a43a0bb47346227a35ebae4d9427465a7c9eb197a03d5c8d283cb34
+ addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
+ algoliasearch (1.27.5) sha256=26c1cddf3c2ec4bd60c148389e42702c98fdac862881dc6b07a4c0b89ffec853
+ atomos (0.1.3) sha256=7d43b22f2454a36bace5532d30785b06de3711399cb1c6bf932573eda536789f
+ base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
+ benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
+ bigdecimal (4.1.1) sha256=1c09efab961da45203c8316b0cdaec0ff391dfadb952dd459584b63ebf8054ca
+ cgi (0.5.1) sha256=e93fcafc69b8a934fe1e6146121fa35430efa8b4a4047c4893764067036f18e9
+ claide (1.1.0) sha256=6d3c5c089dde904d96aa30e73306d0d4bd444b1accb9b3125ce14a3c0183f82e
+ cocoapods (1.16.2) sha256=0ff1c860f32df3db8b16df09b58da1a6bb2a12fe55f6d5e8be994a74fadd1e5e
+ cocoapods-core (1.16.2) sha256=4bb1b5c420691e60cf36fa227dec6bc48c096c34c97bb7aa512ea7f3246fc12b
+ cocoapods-deintegrate (1.0.5) sha256=517c2a448ef563afe99b6e7668704c27f5de9e02715a88ee9de6974dc1b3f6a2
+ cocoapods-downloader (2.1) sha256=bb6ebe1b3966dc4055de54f7a28b773485ac724fdf575d9bee2212d235e7b6d1
+ cocoapods-plugins (1.0.0) sha256=725d17ce90b52f862e73476623fd91441b4430b742d8a071000831efb440ca9a
+ cocoapods-search (1.0.1) sha256=1b133b0e6719ed439bd840e84a1828cca46425ab73a11eff5e096c3b2df05589
+ cocoapods-trunk (1.6.0) sha256=5f5bda8c172afead48fa2d43a718cf534b1313c367ba1194cebdeb9bfee9ed31
+ cocoapods-try (1.2.0) sha256=145b946c6e7747ed0301d975165157951153d27469e6b2763c83e25c84b9defe
+ colored2 (3.1.2) sha256=b13c2bd7eeae2cf7356a62501d398e72fde78780bd26aec6a979578293c28b4a
+ concurrent-ruby (1.3.6) sha256=6b56837e1e7e5292f9864f34b69c5a2cbc75c0cf5338f1ce9903d10fa762d5ab
+ connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
+ drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
+ escape (0.0.4) sha256=e49f44ae2b4f47c6a3abd544ae77fe4157802794e32f19b8e773cbc4dcec4169
+ ethon (0.18.0) sha256=b598afc9f30448cb068b850714b7d6948e941476095d04f90a4ac65b8d6efcb2
+ ffi (1.17.4) sha256=bcd1642e06f0d16fc9e09ac6d49c3a7298b9789bcb58127302f934e437d60acf
+ ffi (1.17.4-arm64-darwin) sha256=19071aaf1419251b0a46852abf960e77330a3b334d13a4ab51d58b31a937001b
+ fourflusher (2.3.1) sha256=1b3de61c7c791b6a4e64f31e3719eb25203d151746bb519a0292bff1065ccaa9
+ fuzzy_match (2.0.4) sha256=b5de4f95816589c5b5c3ad13770c0af539b75131c158135b3f3bbba75d0cfca5
+ gh_inspector (1.1.3) sha256=04cca7171b87164e053aa43147971d3b7f500fcb58177698886b48a9fc4a1939
+ httpclient (2.9.0) sha256=4b645958e494b2f86c2f8a2f304c959baa273a310e77a2931ddb986d83e498c8
+ i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5
+ jazzy (0.15.4) sha256=d7766c62fe722b0b1b868c05e79be1fab3249ab2279435f3a0adcb1d955a3c4a
+ json (2.19.3) sha256=289b0bb53052a1fa8c34ab33cc750b659ba14a5c45f3fcf4b18762dc67c78646
+ liferaft (0.0.6) sha256=631ec13c52d2e62851d4e761f5ff5e090ef26437f92dc451effa3f82fa5a5acd
+ logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
+ mini_portile2 (2.8.9) sha256=0cd7c7f824e010c072e33f68bc02d85a00aeb6fce05bb4819c03dfd3c140c289
+ minitest (5.27.0) sha256=2d3b17f8a36fe7801c1adcffdbc38233b938eb0b4966e97a6739055a45fa77d5
+ molinillo (0.8.0) sha256=efbff2716324e2a30bccd3eba1ff3a735f4d5d53ffddbc6a2f32c0ca9433045d
+ mustache (1.1.2) sha256=d420243400354da78ded2d81541b381ad8d94e8e9b95022d0d71d66f8ef36c00
+ mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
+ nanaimo (0.4.0) sha256=faf069551bab17f15169c1f74a1c73c220657e71b6e900919897a10d991d0723
+ nap (1.1.0) sha256=949691660f9d041d75be611bb2a8d2fd559c467537deac241f4097d9b5eea576
+ netrc (0.11.0) sha256=de1ce33da8c99ab1d97871726cba75151113f117146becbe45aa85cb3dabee3f
+ open4 (1.3.4) sha256=a1df037310624ecc1ea1d81264b11c83e96d0c3c1c6043108d37d396dcd0f4b1
+ plist (3.7.1) sha256=3f9542db1115d10fb77d87604dcb426755174920cc89453755efacb34a1cc42c
+ public_suffix (4.0.7) sha256=8be161e2421f8d45b0098c042c06486789731ea93dc3a896d30554ee38b573b8
+ rake (13.2.1) sha256=46cb38dae65d7d74b6020a4ac9d48afed8eb8149c040eccf0523bec91907059d
+ redcarpet (3.6.1) sha256=d444910e6aa55480c6bcdc0cdb057626e8a32c054c29e793fa642ba2f155f445
+ rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142
+ rouge (2.0.7) sha256=2da14eb856839a81ad708883c2495507f50f973f3f46904cc7d87784039ed169
+ ruby-macho (2.5.1) sha256=9075e52e0f9270b552a90b24fcc6219ad149b0d15eae1bc364ecd0ac8984f5c9
+ sassc (2.4.0) sha256=4c60a2b0a3b36685c83b80d5789401c2f678c1652e3288315a1551d811d9f83e
+ securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
+ sqlite3 (1.7.3) sha256=fa77f63c709548f46d4e9b6bb45cda52aa3881aa12cc85991132758e8968701c
+ typhoeus (1.6.0) sha256=bacc41c23e379547e29801dc235cd1699b70b955a1ba3d32b2b877aa844c331d
+ tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
+ xcinvoke (0.3.0) sha256=67e936a5afa64659c58687c3d316947e287dcddb63769cb9778089bef9c1fe9a
+ xcodeproj (1.27.0) sha256=8cc7a73b4505c227deab044dce118ede787041c702bc47636856a2e566f854d3
+ xcpretty (0.3.0) sha256=75c7cc577be3527e7663ca627cbeb47613904c3a44f34cca3a92d202053e04f7
+
BUNDLED WITH
- 2.3.27
+ 4.0.10
diff --git a/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-iOS.xcscheme b/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-iOS.xcscheme
index cec359cae..1890ed420 100644
--- a/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-iOS.xcscheme
+++ b/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-iOS.xcscheme
@@ -96,6 +96,15 @@
+
+
+
+
+
+
diff --git a/README.md b/README.md
index b087aeb1b..b84d2e039 100644
--- a/README.md
+++ b/README.md
@@ -66,6 +66,7 @@ The Parse Apple SDK is continuously tested with the most recent releases of Xcod
| Xcode 14 | iOS 16 | macOS 13 | watchOS 9 | tvOS 16 | September 2022 | October 2024 | >= 2.7.2 < 5.0.0 |
| Xcode 15 | iOS 17 | macOS 14 | watchOS 10 | tvOS 17 | September 2023 | October 2025 | >= 3.0.0 <= 5.1.1 |
| Xcode 16 | iOS 18 | macOS 15 | watchOS 11 | tvOS 18 | September 2024 | tbd | >= 4.2.0 |
+| Xcode 26 | iOS 26 | macOS 26 | watchOS 26 | tvOS 26 | September 2025 | tbd | >= 6.2.0 |
## How Do I Contribute?
diff --git a/Scripts/jazzy.sh b/Scripts/jazzy.sh
index 5980869b4..48c5cb25c 100755
--- a/Scripts/jazzy.sh
+++ b/Scripts/jazzy.sh
@@ -1,8 +1,30 @@
-mkdir -p ./Parse/Bolts # Create a temporary bolts folder
-cp -R Carthage/Checkouts/Bolts-ObjC/Bolts/**/*.h ./Parse/Bolts # Copy bolts
+#!/usr/bin/env bash
+
+set -eo pipefail
+
+bolts_headers_dir=""
+for candidate in \
+ "./.build/checkouts/Bolts-ObjC/Bolts" \
+ "./.build/checkouts/Bolts/Bolts" \
+ "./build/checkouts/Bolts-ObjC/Bolts" \
+ "./SourcePackages/checkouts/Bolts-ObjC/Bolts"; do
+ if [[ -d "$candidate" ]]; then
+ bolts_headers_dir="$candidate"
+ break
+ fi
+done
+
+if [[ -z "$bolts_headers_dir" ]]; then
+ echo "Unable to locate Bolts headers. Resolve SwiftPM dependencies first (for example, run 'swift package resolve')."
+ exit 1
+fi
+
+mkdir -p ./Parse/Bolts
+cp -R "$bolts_headers_dir"/. ./Parse/Bolts
+trap 'rm -rf ./Parse/Bolts' EXIT
ver=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" Parse/Parse/Resources/Parse-iOS.Info.plist`
-set -eo pipefail && bundle exec jazzy \
+bundle exec jazzy \
--objc \
--clean \
--author "Parse Community" \
@@ -17,5 +39,3 @@ set -eo pipefail && bundle exec jazzy \
--umbrella-header Parse/Parse/Source/Parse.h \
--framework-root Parse \
--output docs/api
-
-rm -rf ./Parse/Bolts # cleanup temporary bolts