Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 0 additions & 3 deletions .github/actions/xcode-cache/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,3 @@ runs:
path: spm_cache
key: ${{ env.IMAGE }}-spm-${{ hashFiles('**/Package.resolved') }}
restore-keys: ${{ env.IMAGE }}-spm-
- uses: mikehardy/buildcache-action@v2
with:
cache_key: ${{ env.IMAGE }}-buildcache-
68 changes: 30 additions & 38 deletions .github/workflows/cron-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,34 +21,29 @@ jobs:
strategy:
matrix:
include:
- ios: 18.5
xcode: 16.4
os: macos-15
- ios: "26.1"
device: "iPhone 17 Pro"
setup_runtime: false
- ios: "18.5"
device: "iPhone 16 Pro"
setup_runtime: false
- ios: 17.5
xcode: 15.4
os: macos-14
- ios: "17.5"
device: "iPhone 15 Pro"
setup_runtime: false
- ios: 16.4
xcode: 15.3 # fails on 15.4
os: macos-14
setup_runtime: true
- ios: "16.4"
device: "iPhone 14 Pro"
setup_runtime: true
- ios: 15.5
xcode: 15.3 # fails on 15.4
os: macos-14
- ios: "15.5"
device: "iPhone 13 Pro"
setup_runtime: true
fail-fast: false
runs-on: ${{ matrix.os }}
runs-on: macos-15
env:
GITHUB_EVENT: ${{ toJson(github.event) }}
ALLURE_TOKEN: ${{ secrets.ALLURE_TOKEN }}
STREAM_DEMO_APP_SECRET: ${{ secrets.STREAM_DEMO_APP_SECRET }}
XCODE_VERSION: ${{ matrix.xcode }}
IOS_SIMULATOR_DEVICE: "${{ matrix.device }} (${{ matrix.ios }})" # For the Allure report
XCODE_VERSION: "26.1.1"
IOS_SIMULATOR_DEVICE: "${{ matrix.device }} (${{ matrix.ios }})"
steps:
- uses: actions/[email protected]
- uses: ./.github/actions/bootstrap
Expand All @@ -66,7 +61,7 @@ jobs:
- name: Launch Allure TestOps
run: bundle exec fastlane allure_launch cron:true
- name: Run UI Tests (Debug)
run: bundle exec fastlane test_e2e_mock device:"${{ matrix.device }} (${{ matrix.ios }})"
run: bundle exec fastlane test_e2e_mock device:"${{ env.IOS_SIMULATOR_DEVICE }}"
timeout-minutes: 120
- name: Allure TestOps Upload
if: success() || failure()
Expand Down Expand Up @@ -94,30 +89,26 @@ jobs:
strategy:
matrix:
include:
- ios: 18.5
xcode: 16.4
os: macos-15
- ios: "26.1"
device: "iPhone 17 Pro"
setup_runtime: false
- ios: "18.5"
device: "iPhone 16 Pro"
setup_runtime: false
- ios: 17.5
xcode: 15.4
os: macos-14
- ios: "17.5"
device: "iPhone 15 Pro"
setup_runtime: false
- ios: 16.4
xcode: 15.3 # fails on 15.4
os: macos-14
setup_runtime: true
- ios: "16.4"
device: "iPhone 14 Pro"
setup_runtime: true
- ios: 15.5
xcode: 15.3 # fails on 15.4
os: macos-14
- ios: "15.5"
device: "iPhone 13 Pro"
setup_runtime: true
fail-fast: false
runs-on: ${{ matrix.os }}
runs-on: macos-15
env:
XCODE_VERSION: ${{ matrix.xcode }}
XCODE_VERSION: "26.1.1"
IOS_SIMULATOR_DEVICE: "${{ matrix.device }} (${{ matrix.ios }})"
steps:
- uses: actions/[email protected]
- uses: ./.github/actions/bootstrap
Expand All @@ -131,7 +122,7 @@ jobs:
version: ${{ matrix.ios }}
device: ${{ matrix.device }}
- name: Run LLC Tests (Debug)
run: bundle exec fastlane test device:"${{ matrix.device }} (${{ matrix.ios }})" cron:true
run: bundle exec fastlane test device:"${{ env.IOS_SIMULATOR_DEVICE }}" cron:true
timeout-minutes: 100
- name: Parse xcresult
if: failure()
Expand All @@ -147,24 +138,25 @@ jobs:
fastlane/test_output/logs/*/Diagnostics/simctl_diagnostics/DiagnosticReports/*

build-old-xcode:
name: Build LLC + UI (Xcode 15)
name: Build LLC + UI (Old Xcode)
runs-on: macos-14
env:
XCODE_VERSION: "15.4"
XCODE_VERSION: "16.1"
steps:
- name: Connect Bot
uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.BOT_SSH_PRIVATE_KEY }}
- uses: actions/[email protected]
- uses: ./.github/actions/xcode-cache
- uses: ./.github/actions/ruby-cache
- name: List Xcode versions
run: mdfind "kMDItemCFBundleIdentifier = 'com.apple.dt.Xcode'"
- name: Build LLC
run: bundle exec fastlane test device:"iPhone 8" build_for_testing:true
run: bundle exec fastlane test device:"iPhone 16" build_for_testing:true
timeout-minutes: 25
- name: Build UI
run: bundle exec fastlane test_ui device:"iPhone 8" build_for_testing:true
run: bundle exec fastlane test_ui device:"iPhone 16" build_for_testing:true
timeout-minutes: 25
- name: Build XCFrameworks
run: bundle exec fastlane build_xcframeworks
Expand All @@ -177,7 +169,7 @@ jobs:
name: Automated Code Review
runs-on: macos-14
env:
XCODE_VERSION: "15.4"
XCODE_VERSION: "16.1"
steps:
- uses: actions/[email protected]
- uses: ./.github/actions/bootstrap
Expand Down
13 changes: 7 additions & 6 deletions .github/workflows/smoke-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ concurrency:

env:
HOMEBREW_NO_INSTALL_CLEANUP: 1 # Disable cleanup for homebrew, we don't need it on CI
IOS_SIMULATOR_DEVICE: "iPhone 16 Pro (18.5)"
IOS_SIMULATOR_DEVICE: "iPhone 17 Pro (26.1)"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_PR_NUM: ${{ github.event.pull_request.number }}

Expand Down Expand Up @@ -48,7 +48,7 @@ jobs:
name: Automated Code Review
runs-on: macos-14
env:
XCODE_VERSION: "15.4"
XCODE_VERSION: "16.1"
if: ${{ github.event.inputs.record_snapshots != 'true' }}
steps:
- uses: actions/[email protected]
Expand All @@ -63,21 +63,22 @@ jobs:
if: startsWith(github.event.pull_request.head.ref, 'release/')

build-old-xcode:
name: Build LLC + UI (Xcode 15)
name: Build SDKs (Old Xcode)
runs-on: macos-14
if: ${{ github.event.inputs.record_snapshots != 'true' }}
env:
XCODE_VERSION: "15.4"
XCODE_VERSION: "16.1"
steps:
- uses: actions/[email protected]
- uses: ./.github/actions/xcode-cache
- uses: ./.github/actions/ruby-cache
- name: List Xcode versions
run: mdfind "kMDItemCFBundleIdentifier = 'com.apple.dt.Xcode'"
- name: Build LLC
run: bundle exec fastlane test device:"iPhone 13" build_for_testing:true
run: bundle exec fastlane test device:"iPhone 16" build_for_testing:true
timeout-minutes: 25
- name: Build UI
run: bundle exec fastlane test_ui device:"iPhone 13" build_for_testing:true
run: bundle exec fastlane test_ui device:"iPhone 16" build_for_testing:true
timeout-minutes: 25

test-llc-debug:
Expand Down
2 changes: 1 addition & 1 deletion .swiftformat
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Stream rules
--header "\nCopyright Β© {year} Stream.io Inc. All rights reserved.\n"
--swiftversion 5.6
--swiftversion 5.10

# Use allow-list
--rules blankLinesAroundMark
Expand Down
14 changes: 12 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

### πŸ”„ Changed

# [4.95.0](https://github.com/GetStream/stream-chat-swift/releases/tag/4.95.0)
_December 18, 2025_

## StreamChat
### βœ… Added
- Add `hideHistoryBefore` to add members for configuring the history visibility [#3892](https://github.com/GetStream/stream-chat-swift/pull/3892)
## StreamChatUI
### 🐞 Fixed
- Fix reading messages from muted users [#3896](https://github.com/GetStream/stream-chat-swift/pull/3896)

# [4.94.0](https://github.com/GetStream/stream-chat-swift/releases/tag/4.94.0)
_December 02, 2025_

Expand Down Expand Up @@ -255,7 +265,7 @@ _June 17, 2025_
- Add new `Filter.isNil` to make it easier to query by nil values [#3623](https://github.com/GetStream/stream-chat-swift/pull/3623)
- Add Message Reminders [#3623](https://github.com/GetStream/stream-chat-swift/pull/3623)
- Add `ChatMessageController.createReminder()`
- Add `ChatMessageController.updateReminder()`
- Add `ChatMessageController.updateReminder()`
- Add `ChatMessageController.deleteReminder()`
- Add `MessageReminderListController` and `MessageReminderListQuery`

Expand Down Expand Up @@ -392,7 +402,7 @@ _February 27, 2025_
- Add `CurrentUserController`:
- `deleteDraft()`
- `loadDraftMessages()`
- `loadMoreDraftMessages()`
- `loadMoreDraftMessages()`

### 🐞 Fixed
- Update channel's preview message when coming back to online [#3574](https://github.com/GetStream/stream-chat-swift/pull/3574)
Expand Down
20 changes: 15 additions & 5 deletions DemoApp/StreamChat/Components/DemoChatChannelListRouter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -251,11 +251,21 @@ final class DemoChatChannelListRouter: ChatChannelListRouter {
self.rootViewController.presentAlert(title: "User ID is not valid")
return
}
channelController.addMembers(
[MemberInfo(userId: id, extraData: nil)],
message: "Members added to the channel"
) { error in
if let error = error {
self.rootViewController.presentAlert(
title: "How many days to show?",
message: "Enter the number of days of history to show, 0 for full history",
textFieldPlaceholder: "Days"
) { daysString in
let hideHistoryBefore: Date? = {
guard let daysString, let days = Int(daysString) else { return nil }
return Calendar.current.date(byAdding: .day, value: -days, to: Date())
}()
channelController.addMembers(
[MemberInfo(userId: id, extraData: nil)],
hideHistoryBefore: hideHistoryBefore,
message: "Members added to the channel"
) { error in
guard let error else { return }
self.rootViewController.presentAlert(
title: "Couldn't add user \(id) to channel \(cid)",
message: "\(error)"
Expand Down
1 change: 0 additions & 1 deletion Githubfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ export ALLURECTL_VERSION='2.16.0'
export XCRESULTS_VERSION='1.19.1'
export YEETD_VERSION='1.0'
export GCLOUD_VERSION='464.0.0'
export MINT_VERSION='0.17.5'
export SONAR_VERSION='6.2.1.4610'
export IPSW_VERSION='3.1.592'
export INTERFACE_ANALYZER_VERSION='1.0.7'
Expand Down
7 changes: 5 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swift-tools-version:5.7
// swift-tools-version:5.10

import Foundation
import PackageDescription
Expand Down Expand Up @@ -31,7 +31,10 @@ let package = Package(
.target(
name: "StreamChat",
exclude: ["Info.plist"],
resources: [.copy("Database/StreamChatModel.xcdatamodeld")]
resources: [.copy("Database/StreamChatModel.xcdatamodeld")],
swiftSettings: [
.unsafeFlags(["-Osize"], .when(configuration: .release))
]
),
.target(
name: "StreamChatUI",
Expand Down
14 changes: 12 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
<a href="https://sonarcloud.io/summary/new_code?id=GetStream_stream-chat-swift"><img src="https://sonarcloud.io/api/project_badges/measure?project=GetStream_stream-chat-swift&metric=coverage" /></a>
</p>
<p align="center">
<img id="stream-chat-label" alt="StreamChat" src="https://img.shields.io/badge/StreamChat-7.28%20MB-blue"/>
<img id="stream-chat-ui-label" alt="StreamChatUI" src="https://img.shields.io/badge/StreamChatUI-4.89%20MB-blue"/>
<img id="stream-chat-label" alt="StreamChat" src="https://img.shields.io/badge/StreamChat-6.76%20MB-blue"/>
<img id="stream-chat-ui-label" alt="StreamChatUI" src="https://img.shields.io/badge/StreamChatUI-4.91%20MB-blue"/>
</p>

This is the official iOS SDK for [Stream Chat](https://getstream.io/chat/sdk/ios/), a service for building chat and messaging applications. This library includes both a low-level SDK and a set of reusable UI components.
Expand Down Expand Up @@ -98,6 +98,16 @@ To find out more about this product, please check our [docs](https://getstream.i

---

## AI Components

Bring your AI experience to life with Stream’s frontend components available for [SwiftUI](https://github.com/GetStream/stream-chat-swift-ai) (and other platforms, such as React, React Native, and Android).

Featuring natural streaming message animation, full markdown and code rendering, charts, tables, thinking indicators, text-to-speech, and a completely flexible composer. Designed to work seamlessly with Stream Chat’s frontend SDKs, it’s everything you need to ship a premium AI chat interface out of the box.

To find out more about these components, please check our [docs](https://getstream.io/chat/docs/sdk/ios/ai-integrations/overview/).

---

## We are hiring

We've closed a [\$38 million Series B funding round](https://techcrunch.com/2021/03/04/stream-raises-38m-as-its-chat-and-activity-feed-apis-power-communications-for-1b-users/) in 2021 and we keep actively growing.
Expand Down
18 changes: 9 additions & 9 deletions Scripts/bootstrap.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ if [ "${SKIP_SWIFT_BOOTSTRAP:-}" != true ]; then
puts "Install SwiftLint v${SWIFT_LINT_VERSION}"
DOWNLOAD_URL="https://github.com/realm/SwiftLint/releases/download/${SWIFT_LINT_VERSION}/SwiftLint.pkg"
DOWNLOAD_PATH="/tmp/SwiftLint-${SWIFT_LINT_VERSION}.pkg"
curl -sL "$DOWNLOAD_URL" -o "$DOWNLOAD_PATH"
wget "$DOWNLOAD_URL" -O "$DOWNLOAD_PATH"
sudo installer -pkg "$DOWNLOAD_PATH" -target /
swiftlint version

Expand All @@ -39,7 +39,7 @@ if [ "${SKIP_SWIFT_BOOTSTRAP:-}" != true ]; then
DOWNLOAD_PATH="/tmp/swiftformat-${SWIFT_FORMAT_VERSION}.zip"
BIN_PATH="/usr/local/bin/swiftformat"
brew uninstall swiftformat || true
curl -sL "$DOWNLOAD_URL" -o "$DOWNLOAD_PATH"
wget "$DOWNLOAD_URL" -O "$DOWNLOAD_PATH"
unzip -o "$DOWNLOAD_PATH" -d /tmp/swiftformat-${SWIFT_FORMAT_VERSION}
sudo mv /tmp/swiftformat-${SWIFT_FORMAT_VERSION}/swiftformat "$BIN_PATH"
sudo chmod +x "$BIN_PATH"
Expand All @@ -50,7 +50,7 @@ if [ "${SKIP_SWIFT_BOOTSTRAP:-}" != true ]; then
DOWNLOAD_PATH="/tmp/swiftgen-${SWIFT_GEN_VERSION}.zip"
INSTALL_DIR="/usr/local/lib/swiftgen"
BIN_PATH="/usr/local/bin/swiftgen"
curl -sL "$DOWNLOAD_URL" -o "$DOWNLOAD_PATH"
wget "$DOWNLOAD_URL" -O "$DOWNLOAD_PATH"
sudo rm -rf "$INSTALL_DIR"
sudo mkdir -p "$INSTALL_DIR"
sudo unzip -o "$DOWNLOAD_PATH" -d "$INSTALL_DIR"
Expand All @@ -62,7 +62,7 @@ fi
if [[ ${INSTALL_SONAR-default} == true ]]; then
puts "Install sonar scanner v${SONAR_VERSION}"
DOWNLOAD_URL="https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_VERSION}-macosx-x64.zip"
curl -sL "${DOWNLOAD_URL}" -o ./fastlane/sonar.zip
wget "${DOWNLOAD_URL}" -O ./fastlane/sonar.zip
cd fastlane
unzip sonar.zip
rm sonar.zip
Expand All @@ -78,19 +78,19 @@ cp Scripts/DemoApp-StreamDevelopers.xcscheme StreamChat.xcodeproj/xcshareddata/x
if [[ ${INSTALL_ALLURE-default} == true ]]; then
puts "Install allurectl v${ALLURECTL_VERSION}"
DOWNLOAD_URL="https://github.com/allure-framework/allurectl/releases/download/${ALLURECTL_VERSION}/allurectl_darwin_amd64"
curl -sL "${DOWNLOAD_URL}" -o ./fastlane/allurectl
wget "${DOWNLOAD_URL}" -O ./fastlane/allurectl
chmod +x ./fastlane/allurectl

puts "Install xcresults v${XCRESULTS_VERSION}"
DOWNLOAD_URL="https://github.com/eroshenkoam/xcresults/releases/download/${XCRESULTS_VERSION}/xcresults"
curl -sL "${DOWNLOAD_URL}" -o ./fastlane/xcresults
wget "${DOWNLOAD_URL}" -O ./fastlane/xcresults
chmod +x ./fastlane/xcresults
fi

if [[ ${INSTALL_YEETD-default} == true ]]; then
PACKAGE="yeetd-normal.pkg"
puts "Install yeetd v${YEETD_VERSION}"
wget "https://github.com/biscuitehh/yeetd/releases/download/${YEETD_VERSION}/${PACKAGE}"
wget "https://github.com/biscuitehh/yeetd/releases/download/${YEETD_VERSION}/${PACKAGE}" -O "${PACKAGE}"
sudo installer -pkg ${PACKAGE} -target /
puts "Running yeetd daemon"
yeetd &
Expand All @@ -110,7 +110,7 @@ fi
if [[ ${INSTALL_IPSW-default} == true ]]; then
puts "Install ipsw v${IPSW_VERSION}"
FILE="ipsw_${IPSW_VERSION}_macOS_universal.tar.gz"
wget "https://github.com/blacktop/ipsw/releases/download/v${IPSW_VERSION}/${FILE}"
wget "https://github.com/blacktop/ipsw/releases/download/v${IPSW_VERSION}/${FILE}" -O "${FILE}"
tar -xzf "$FILE"
chmod +x ipsw
sudo mv ipsw /usr/local/bin/
Expand All @@ -119,7 +119,7 @@ fi
if [[ ${INSTALL_INTERFACE_ANALYZER-default} == true ]]; then
puts "Install interface-analyser v${INTERFACE_ANALYZER_VERSION}"
FILE="interface-analyser"
wget "https://github.com/GetStream/stream-module-interface-analyser/releases/download/v${INTERFACE_ANALYZER_VERSION}/${FILE}"
wget "https://github.com/GetStream/stream-module-interface-analyser/releases/download/v${INTERFACE_ANALYZER_VERSION}/${FILE}" -O "${FILE}"
chmod +x ${FILE}
sudo mv ${FILE} /usr/local/bin/
fi
Loading
Loading