mattermost-mobile-upstream/ios/Podfile
Bill Gardner 1352e5c066
Migrate calls WebSocket to URLSession for TLS 1.3 support on iOS (#9622)
- Migrate calls WebSocket from SocketRocket to @mattermost/react-native-network-client for TLS 1.3 support on iOS (SocketRocket is capped at TLS 1.2 via CFStream/SecureTransport)
- Add native sendBinary support (iOS via Starscream, Android via OkHttp) — no more patch-package workaround
- Add WebSocket message validation: verify msg is a proper object before casting, check msg.seq is a number before updating sequence counter
- Handle promise rejections from native WebSocket operations (open, send, sendBinary) with error logging
- Update @mattermost/react-native-network-client to 1.9.2 release
- Move events dependency to calls-common upstream
- Fix fmt consteval build error for Xcode 26 via Podfile post_install patch
- Update unit tests for websocket_client
2026-04-01 08:45:25 -04:00

131 lines
4.6 KiB
Ruby

def node_require(script)
# Resolve script with node to allow for hoisting
require Pod::Executable.execute_command('node', ['-p',
"require.resolve(
'#{script}',
{paths: [process.argv[1]]},
)", __dir__]).strip
end
require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking")
node_require('react-native/scripts/react_native_pods.rb')
node_require('react-native-permissions/scripts/setup.rb')
platform :ios, '16.0' #min_ios_version_supported
prepare_react_native_project!
Pod::UI.puts "Configuring Pod with statically linked Frameworks".green
use_frameworks! :linkage => :static
setup_permissions([
"Camera",
"Microphone",
"Notifications",
"PhotoLibrary"
])
# Conditional Intune MAM support
intune_enabled = ENV['INTUNE_ENABLED'] == 'true' || ENV['INTUNE_ENABLED'] == '1'
if intune_enabled
puts "🔐 Intune MAM features enabled"
end
config = use_native_modules!
target 'Mattermost' do
# Pods for Mattermost
use_expo_modules!
use_react_native!(
:path => config[:reactNativePath],
# An absolute path to your application root.
:app_path => "#{Pod::Config.instance.installation_root}/.."
)
pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi', :modular_headers => true
pod 'React-jsc', :path => '../node_modules/react-native/ReactCommon/jsc', :modular_headers => true
pod 'simdjson', path: '../node_modules/@nozbe/simdjson', :modular_headers => true
pod 'Gekidou', :path => './Gekidou'
pod 'CocoaLumberjack', :modular_headers => true
pod 'TurboLogIOSNative', :git => 'https://github.com/larkox/react-native-turbo-log-ios-native.git', :modular_headers => true
# Conditional Intune MAM pod (internal builds only)
if intune_enabled
pod 'mattermost-intune', :path => '../libraries/@mattermost/intune'
end
end
target 'NotificationService' do
inherit! :search_paths
pod 'TurboLogIOSNative', :git => 'https://github.com/larkox/react-native-turbo-log-ios-native.git', :modular_headers => true
pod 'Sentry/HybridSDK', '8.48.0'
pod 'Gekidou', :path => './Gekidou'
end
target 'MattermostShare' do
inherit! :search_paths
pod 'Sentry/HybridSDK', '8.48.0'
pod 'Gekidou', :path => './Gekidou'
pod 'OpenGraph', '1.4.1'
end
post_install do |installer|
# https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202
react_native_post_install(
installer,
config[:reactNativePath],
:mac_catalyst_enabled => false
)
installer.pods_project.targets.each do |t|
t.build_configurations.each do |bc|
bc.build_settings['SWIFT_VERSION'] = '5.9'
bc.build_settings['OTHER_LDFLAGS'] = ['$(inherited)', '-ObjC']
bc.build_settings['STRIP_SWIFT_SYMBOLS'] = 'NO'
bc.build_settings['ENABLE_BITCODE'] = 'NO'
end
end
# fmt 11.0.2 detection logic unconditionally sets FMT_USE_CONSTEVAL=1 on
# Xcode 26 / Clang 18+, where consteval is stricter and fmt's usage breaks.
# Patch base.h to force FMT_USE_CONSTEVAL=0 after the detection block.
# Note: an upstream fix for this is in the works, see ticket:
# https://github.com/expo/expo/issues/44229
fmt_base_h = File.join(installer.sandbox.root, 'fmt/include/fmt/base.h')
if File.exist?(fmt_base_h)
content = File.read(fmt_base_h)
patch_marker = '// [PATCHED] disable consteval for Xcode 26 compatibility'
unless content.include?(patch_marker)
patched = content.sub(
"#endif\n#if FMT_USE_CONSTEVAL",
"#endif\n#{patch_marker}\n#undef FMT_USE_CONSTEVAL\n#define FMT_USE_CONSTEVAL 0\n#if FMT_USE_CONSTEVAL"
)
File.chmod(0644, fmt_base_h)
File.write(fmt_base_h, patched)
Pod::UI.puts 'Patched fmt/include/fmt/base.h to disable consteval for Xcode 26.'
end
end
# ensure stdlib is embedded for Gekidou to work correctly in extensions
%w[NotificationService MattermostShare].each do |ext_name|
target = installer.aggregate_targets.flat_map(&:user_project).flat_map(&:targets).find { |x| x.name == ext_name }
next unless target
target.build_configurations.each do |c|
c.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'YES'
c.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'YES'
end
end
# make sure the main app is NOT extension-only
app_target = installer.aggregate_targets.flat_map(&:user_project).flat_map(&:targets).find { |t| t.name == 'Mattermost' }
if app_target
app_target.build_configurations.each do |c|
c.build_settings.delete('APPLICATION_EXTENSION_API_ONLY')
end
end
end