Skip to content

Commit

Permalink
Add support for pre-built XCFramework
Browse files Browse the repository at this point in the history
  • Loading branch information
testableapple committed Oct 23, 2023
1 parent ec18c34 commit 304fe8a
Show file tree
Hide file tree
Showing 11 changed files with 189 additions and 3 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ Pods/
Carthage/
!Sample/Carthage/

# Ignore Products folder
Products/

# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
Expand Down
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

### ⚠️ Important

- Dependencies are no longer exposed (this includes Nuke and SwiftyGif). If you were using those dependencies we were exposing, you would need to import them manually. If you encounter any SPM-related problems, be sure to reset the package caches.
- Dependencies are no longer exposed (this includes Nuke and SwiftyGif). If you were using those dependencies we were exposing, you would need to import them manually. This is due to our newest addition supporting Module Stable XCFramework, see more below in the "Added" section. If you encounter any SPM-related problems, be sure to reset the package caches.

### ✅ Added
- Add message preview with attachments in channel list
- Add support for pre-built XCFramework

### 🐞 Fixed
- Made some `ChannelList` and `MessageListView` parameters optional
Expand Down
2 changes: 2 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ GEM
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3)
fastlane-plugin-create_xcframework (1.1.2)
fastlane-plugin-emerge (0.6.0)
faraday (~> 1.1)
fastlane-plugin-lizard (1.3.3)
Expand Down Expand Up @@ -405,6 +406,7 @@ DEPENDENCIES
danger
danger-commit_lint
fastlane
fastlane-plugin-create_xcframework
fastlane-plugin-emerge
fastlane-plugin-lizard
fastlane-plugin-sonarcloud_metric_kit
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
//
// Copyright © 2023 Stream.io Inc. All rights reserved.
//
// ⚠️ Generated file, please use `fastlane :bump_SDK_version or fastlane release major|minor|patch` lanes

import Foundation

enum SystemEnvironment {
/// A Stream Chat version.
public static let version: String = "4.39.0"
}
25 changes: 25 additions & 0 deletions StreamChatSwiftUI-XCFramework.podspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
Pod::Spec.new do |spec|
spec.name = "StreamChatSwiftUI-XCFramework"
spec.version = "4.39.0"
spec.summary = "StreamChat SwiftUI Chat Components"
spec.description = "StreamChatSwiftUI SDK offers flexible SwiftUI components able to display data provided by StreamChat SDK."

spec.homepage = "https://getstream.io/chat/"
spec.license = { :type => "BSD-3", :file => "LICENSE" }
spec.author = { "getstream.io" => "[email protected]" }
spec.social_media_url = "https://getstream.io"
spec.swift_version = '5.2'
spec.platform = :ios, "14.0"
spec.requires_arc = true

spec.module_name = "StreamChatSwiftUI"
spec.source = { :http => "https://github.com/GetStream/stream-chat-swiftui/releases/download/#{spec.version}/#{spec.module_name}.zip" }
spec.vendored_frameworks = "#{spec.module_name}.xcframework"
spec.preserve_paths = "#{spec.module_name}.xcframework/*"

spec.framework = "Foundation", "UIKit", "SwiftUI"

spec.dependency "StreamChat-XCFramework", "~> 4.39.0"

spec.cocoapods_version = ">= 1.11.0"
end
4 changes: 4 additions & 0 deletions StreamChatSwiftUI.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@
82D64C1A2AD7E5B700C5C79E /* NukeCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82D64BCA2AD7E5B700C5C79E /* NukeCache.swift */; };
82D64C1B2AD7E5B700C5C79E /* ImageCaching.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82D64BCB2AD7E5B700C5C79E /* ImageCaching.swift */; };
82D64C1C2AD7E5B700C5C79E /* DataCaching.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82D64BCC2AD7E5B700C5C79E /* DataCaching.swift */; };
82FA42442AE67FF900C7390B /* SystemEnvironment+Version.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82FA42432AE67FF900C7390B /* SystemEnvironment+Version.swift */; };
8400A345282C05F60067D3A0 /* StreamChatWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8400A344282C05F60067D3A0 /* StreamChatWrapper.swift */; };
8400A34A282C07D60067D3A0 /* InternetConnectionMonitor_Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8400A349282C07D60067D3A0 /* InternetConnectionMonitor_Mock.swift */; };
8400A34C282C081E0067D3A0 /* OHHTTPStubs in Frameworks */ = {isa = PBXBuildFile; productRef = 8400A34B282C081E0067D3A0 /* OHHTTPStubs */; };
Expand Down Expand Up @@ -606,6 +607,7 @@
82D64BCB2AD7E5B700C5C79E /* ImageCaching.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageCaching.swift; sourceTree = "<group>"; };
82D64BCC2AD7E5B700C5C79E /* DataCaching.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataCaching.swift; sourceTree = "<group>"; };
82E8D79C2902B949008A8F78 /* StreamChatSwiftUITestsApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = StreamChatSwiftUITestsApp.entitlements; sourceTree = "<group>"; };
82FA42432AE67FF900C7390B /* SystemEnvironment+Version.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SystemEnvironment+Version.swift"; sourceTree = "<group>"; };
840008BA27E8D64A00282D88 /* MessageActions_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageActions_Tests.swift; sourceTree = "<group>"; };
8400A344282C05F60067D3A0 /* StreamChatWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StreamChatWrapper.swift; sourceTree = "<group>"; };
8400A349282C07D60067D3A0 /* InternetConnectionMonitor_Mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternetConnectionMonitor_Mock.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1473,6 +1475,7 @@
children = (
8465FCED2746A95600AF091E /* L10n.swift */,
8465FCEE2746A95600AF091E /* L10n_template.stencil */,
82FA42432AE67FF900C7390B /* SystemEnvironment+Version.swift */,
);
path = Generated;
sourceTree = "<group>";
Expand Down Expand Up @@ -2353,6 +2356,7 @@
8465FD9A2746A95700AF091E /* ReactionsHelperViews.swift in Sources */,
8465FDC02746A95700AF091E /* ChatChannelList.swift in Sources */,
82D64B682AD7E5AC00C5C79E /* ObjcAssociatedWeakObject.swift in Sources */,
82FA42442AE67FF900C7390B /* SystemEnvironment+Version.swift in Sources */,
82D64BE02AD7E5B700C5C79E /* LazyImage.swift in Sources */,
82D64C052AD7E5B700C5C79E /* Deprecated.swift in Sources */,
84DEC8EC27611CAE00172876 /* SendInChannelView.swift in Sources */,
Expand Down
1 change: 1 addition & 0 deletions StreamChatSwiftUIArtifacts.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
2 changes: 2 additions & 0 deletions docusaurus/docs/iOS/basics/integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ You can learn more about [our Module Stable XCFrameworks here](#xcframeworks)
- `https://github.com/getstream/stream-chat-swift-spm`
- For the UIKit components (**StreamChatUI**, which depends on **StreamChat**) use:
- `https://github.com/getstream/stream-chat-swift-spm`
- For the SwiftUI components (**StreamChatSwiftUI**, which depends on **StreamChat**) use:
- `https://github.com/getstream/stream-chat-swiftui-spm`

</p>
</details>
Expand Down
135 changes: 133 additions & 2 deletions fastlane/Fastfile
Original file line number Diff line number Diff line change
Expand Up @@ -30,25 +30,71 @@ after_all do |lane|
stop_sinatra if lane == :test_e2e_mock
end

lane :build_xcframeworks do
match_me
output_directory = "#{Dir.pwd}/../Products"
team_id = File.read('Matchfile').match(/team_id\("(.*)"\)/)[1]
codesign = ["codesign --timestamp -v --sign 'Apple Distribution: Stream.io Inc (#{team_id})'"]
sdk_names.each do |sdk|
create_xcframework(
project: xcode_project,
scheme: sdk,
destinations: ['iOS'],
include_BCSymbolMaps: true,
include_debug_symbols: true,
xcframework_output_directory: output_directory,
remove_xcarchives: true
)
sh('../Scripts/removeUnneededSymbols.sh', sdk, output_directory)
codesign << lane_context[SharedValues::XCFRAMEWORK_OUTPUT_PATH]
end
sh(codesign.join(' ')) # We need to sign all frameworks at once
end

desc 'Release a new version'
lane :release do |options|
previous_version_number = last_git_tag
artifacts_path = File.absolute_path('../StreamChatSwiftUIArtifacts.json')
swift_environment_path = File.absolute_path('../Sources/StreamChatSwiftUI/Generated/SystemEnvironment+Version.swift')
extra_changes = lambda do |release_version|
# Set the framework version on the artifacts
artifacts = JSON.parse(File.read(artifacts_path))
artifacts[release_version.to_s] = "https://github.com/#{github_repo}/releases/download/#{release_version}/StreamChatSwiftUI.zip"
File.write(artifacts_path, JSON.dump(artifacts))

# Set the framework version in SystemEnvironment+Version.swift
new_content = File.read(swift_environment_path).gsub!(previous_version_number, release_version)
File.open(swift_environment_path, 'w') { |f| f.puts(new_content) }
end

pod_lint
version_number = release_ios_sdk(
version: options[:version],
bump_type: options[:type],
sdk_names: sdk_names,
github_repo: github_repo
podspec_names: ['StreamChatSwiftUI', 'StreamChatSwiftUI-XCFramework'],
github_repo: github_repo,
extra_changes: extra_changes
)
publish_release(version: version_number)
end

desc "Publish a new release to GitHub and CocoaPods"
lane :publish_release do |options|
clean_products
build_xcframeworks
compress_frameworks
clean_products

publish_ios_sdk(
version: options[:version],
sdk_names: sdk_names,
github_repo: github_repo
podspec_names: ['StreamChatSwiftUI', 'StreamChatSwiftUI-XCFramework'],
github_repo: github_repo,
upload_assets: ['Products/StreamChatSwiftUI.zip']
)

update_spm(version: options[:version])
end

private_lane :appstore_api_key do
Expand Down Expand Up @@ -180,6 +226,91 @@ lane :build_demo do |options|
)
end

desc 'Compresses the XCFrameworks into zip files'
lane :compress_frameworks do
Dir.chdir('..') do
FileUtils.cp('LICENSE', 'Products/LICENSE')
Dir.chdir('Products') do
sdk_names.each do |framework|
sh("zip -r #{framework} ./#{framework}.xcframework ./LICENSE")
sh("swift package compute-checksum #{framework}.zip")
end
sh('zip -r "StreamChat-All" ./*.xcframework ./LICENSE') if sdk_names.size > 1
end
end
end

desc 'Cleans Products and DerivedData folders'
lane :clean_products do
Dir.chdir('..') do
['*.xcframework', '*.bundle', '*.BCSymbolMaps', '*.dSYMs', 'LICENSE'].each do |f|
sh("rm -rf Products/#{f}")
end
end
end

desc 'Update XCFrameworks and submit to the SPM repository'
private_lane :update_spm do |options|
version = options[:version] || ''
UI.user_error!('You need to pass the version of the release you want to obtain the changelog from') unless version.length > 0

# Generate Checksums
stream_chat_swiftui_checksum = sh('swift package compute-checksum ../Products/StreamChatSwiftUI.zip').strip

# Update SPM Repo
spm_directory_name = 'StreamSPM'
spm_directory = "../../#{spm_directory_name}"
sh("git clone [email protected]:#{github_repo}-spm.git #{spm_directory}")

Dir.chdir(spm_directory) do
result = sh('basename `git rev-parse --show-toplevel`').strip
UI.error("Not using #{spm_directory_name} repo") unless result.to_s == spm_directory_name

file_lines = File.readlines('Package.swift')
file_data = ''
previous_module = ''

file_lines.each do |line|
formatted_line =
case previous_module
when "StreamChatSwiftUI"
line.gsub(/(checksum: ")[a-z0-9]+(")/, "\\1#{stream_chat_swiftui_checksum}\\2")
else
line
end

url_pattern = %r{(releases/download/)[.0-9]+(/)}
if line.match(url_pattern)
formatted_line = line.gsub(url_pattern, "\\1#{version}\\2")
previous_module = line.match(/([a-zA-Z]+).zip/).to_s.gsub(/.zip/, '')
end

file_data << formatted_line
end

# Write the new changes
File.open('./Package.swift', 'w') { |file| file << file_data }

# Update the repo
sh('git add -A')
sh("git commit -m 'Bump #{version}'")
sh('git push')

github_release = set_github_release(
repository_name: "#{github_repo}-spm",
api_token: ENV.fetch('GITHUB_TOKEN', nil),
name: version,
tag_name: version,
commitish: 'main',
description: "https://github.com/#{github_repo}/releases/tag/#{version}"
)
UI.success("New SPM release available: #{github_release['html_url']}")
end

# Clean Up
sh("rm -rf #{spm_directory}")
end

private_lane :update_testplan_on_ci do |options|
update_testplan(path: options[:path], env_vars: { key: 'CI', value: 'TRUE' }) if is_ci
end
Expand Down
5 changes: 5 additions & 0 deletions fastlane/Matchfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
git_url("[email protected]:GetStream/ios-certificates.git")

storage_mode("git")

team_id("EHV7XZLAHA")
1 change: 1 addition & 0 deletions fastlane/Pluginfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ gem 'fastlane-plugin-versioning'
gem 'fastlane-plugin-emerge'
gem 'fastlane-plugin-sonarcloud_metric_kit'
gem 'fastlane-plugin-stream_actions', '0.3.20'
gem 'fastlane-plugin-create_xcframework'

0 comments on commit 304fe8a

Please sign in to comment.