-
Notifications
You must be signed in to change notification settings - Fork 280
Expand file tree
/
Copy pathreact-native-update.podspec
More file actions
214 lines (189 loc) Β· 8.9 KB
/
Copy pathreact-native-update.podspec
File metadata and controls
214 lines (189 loc) Β· 8.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
require 'json'
require 'rubygems' # Required for version comparison
new_arch_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'
package = JSON.parse(File.read(File.join(__dir__, 'package.json')))
podspec_dir = File.dirname(__FILE__)
Pod::Spec.new do |s|
is_expo_in_podfile = false
begin
# Check Podfile for use_expo_modules!
podfile_path = File.join(Pod::Config.instance.installation_root, 'Podfile')
if File.exist?(podfile_path)
podfile_content = File.read(podfile_path)
is_expo_in_podfile = podfile_content.include?('use_expo_modules!')
end
rescue => e
# Silently ignore errors during check
end
# Determine final validity by checking Podfile presence AND Expo version
valid_expo_project = false # Default
if is_expo_in_podfile
# Only check expo version if use_expo_modules! is present
is_version_sufficient = false
begin
expo_version_str = `node --print \"require('expo/package.json').version\"`.strip
if expo_version_str && !expo_version_str.empty?
match = expo_version_str.match(/^\d+/)
if match
major_version = match[0].to_i
is_version_sufficient = major_version >= 50
end
end
rescue
# Node command failed, version remains insufficient
end
# Final check
valid_expo_project = is_version_sufficient
end
# Set platform based on whether it's a valid Expo project and if we can parse its target
final_ios_deployment_target = '11.0' # Default target
if valid_expo_project
# --- Try to find and parse ExpoModulesCore.podspec only if it's an Expo project ---
parsed_expo_ios_target = nil
expo_modules_core_podspec_path = begin
package_json_path = `node -p "require.resolve('expo-modules-core/package.json')"`.strip
File.join(File.dirname(package_json_path), 'ExpoModulesCore.podspec') if $?.success? && package_json_path && !package_json_path.empty?
rescue
nil
end
if expo_modules_core_podspec_path && File.exist?(expo_modules_core_podspec_path)
begin
content = File.read(expo_modules_core_podspec_path)
match = content.match(/s\.platforms\s*=\s*\{[\s\S]*?:ios\s*=>\s*'([^\']+)'/) # Match within s.platforms hash
if match && match[1]
parsed_expo_ios_target = match[1]
else
match = content.match(/s\.platform\s*=\s*:ios,\s*'([^\']+)'/) # Fallback to s.platform = :ios, 'version'
if match && match[1]
parsed_expo_ios_target = match[1]
end
end
rescue => e
# Pod::UI.warn "Failed to read or parse ExpoModulesCore.podspec content: #{e.message}"
end
end
if parsed_expo_ios_target
final_ios_deployment_target = parsed_expo_ios_target
end
end
s.platforms = { :ios => final_ios_deployment_target }
s.name = package['name']
s.version = package['version']
s.summary = package['description']
s.license = package['license']
s.authors = package['author']
s.homepage = package['homepage']
s.cocoapods_version = '>= 1.6.0'
s.source = { :git => 'https://github.com/reactnativecn/react-native-update.git', :tag => "#{s.version}" }
s.libraries = 'bz2', 'z'
# No search path into the pod source: every include under ios/ resolves
# relative to the including file (the cpp/ core via ../../cpp/...), and the
# former absolute "#{podspec_dir}/ios" entry made the generated xcconfig
# machine-specific.
s.pod_target_xcconfig = {
'USER_HEADER_SEARCH_PATHS' => "\"$(PODS_ROOT)/Headers/Public/SSZipArchive\" \"$(PODS_ROOT)/Headers/Public/React-Codegen/RCTPushySpec\"",
"DEFINES_MODULE" => "YES"
}
# buildTime for binary-rebuild detection (SyncBinaryVersion) and the check
# request. The stamp is refreshed on every build and ships as a resource.
# When the pod source is not writable (read-only checkout or cache) the
# committed value is kept; +buildTime falls back to the main bundle's
# Info.plist mtime when the file is missing or empty, so it is never blank.
s.resource = 'ios/pushy_build_time.txt'
build_time_phase = {
:name => 'Generate build time',
:script => "set -x; f=\"${PODS_TARGET_SRCROOT:-#{podspec_dir}}/ios/pushy_build_time.txt\"; if [ -w \"$f\" ] || { [ ! -e \"$f\" ] && [ -w \"$(dirname \"$f\")\" ]; }; then date +%s > \"$f\"; else echo \"warning: $f is not writable, keeping the shipped build time\"; fi",
:execution_position => :before_compile
}
# Declaring the output lets Xcode order the resource copy (into the app, or
# into this pod's framework under use_frameworks!) after the stamp is
# written and stops the output-less-phase warning. A phase with outputs and
# no inputs is otherwise skipped once the file exists β and it is committed
# β so the phase must also be marked always out of date to keep refreshing
# the stamp every build. CocoaPods < 1.11 has no such key; there the phase
# stays output-less (runs every build, as before).
if defined?(Pod::Specification::DSL::SCRIPT_PHASE_OPTIONAL_KEYS) &&
Pod::Specification::DSL::SCRIPT_PHASE_OPTIONAL_KEYS.include?(:always_out_of_date)
build_time_phase[:output_files] = ['$(PODS_TARGET_SRCROOT)/ios/pushy_build_time.txt']
build_time_phase[:always_out_of_date] = '1'
end
s.script_phase = build_time_phase
# Privacy manifest (required-reason APIs: disk space, file timestamps,
# system boot time, user defaults) delivered as its own resource bundle so
# static and dynamic integrations both carry it.
s.resource_bundles = { 'react-native-update_privacy' => ['ios/PrivacyInfo.xcprivacy'] }
s.dependency 'React'
s.dependency "React-Core"
# The unzip guard relies on the 2.x delegate contract
# (zipArchiveShouldUnzipFileAtIndex:... cancels, _sanitizedPath); a future
# major could change it silently.
s.dependency 'SSZipArchive', '~> 2.4'
# Conditionally add Expo dependency
if valid_expo_project
s.public_header_files = ['ios/ImportReact.h']
s.dependency 'ExpoModulesCore'
end
s.subspec 'RCTPushy' do |ss|
ss.source_files = ['ios/RCTPushy/*.{h,m,mm}',
'cpp/update_flow_core/flow_json.{h,cpp}',
'cpp/update_flow_core/update_flow_core.{h,cpp}',
'cpp/patch_core/archive_patch_core.{h,cpp}',
'cpp/patch_core/digest.{h,cpp}',
'cpp/patch_core/hbc_transform.{h,cpp}',
'cpp/patch_core/hbc_transform_wire.{h,cpp}',
'cpp/patch_core/patch_core.{h,cpp}',
'cpp/patch_core/state_core.{h,cpp}',
'android/jni/hpatch.{h,c}',
'android/jni/HDiffPatch/libHDiffPatch/HPatch/*.{h,c}',
'android/jni/HDiffPatch/file_for_patch.{h,c}',
'android/jni/lzma/C/LzmaDec.{h,c}',
'android/jni/lzma/C/Lzma2Dec.{h,c}']
ss.public_header_files = ['ios/RCTPushy/*.h']
end
# Conditionally add Expo subspec and check ExpoModulesCore version
if valid_expo_project
supports_bundle_url_final = false # Default
# 1. Try executing node to get the version string
expo_modules_core_version_str = begin
# Use node to directly require expo-modules-core/package.json and get its version
`node --print \"require('expo-modules-core/package.json').version\"` # Execute, keep raw output
rescue
# Node command failed (e.g., node not found, package not found). Return empty string.
''
end
# 2. Process the obtained version string (if not empty)
if expo_modules_core_version_str && !expo_modules_core_version_str.empty?
begin
# Compare versions using Gem::Version (handles trailing newline)
installed_version = Gem::Version.new(expo_modules_core_version_str)
target_version = Gem::Version.new('1.12.0')
supports_bundle_url_final = installed_version >= target_version
rescue ArgumentError
# If Gem::Version fails parsing, supports_bundle_url_final remains false.
end
end
s.subspec 'Expo' do |ss|
ss.source_files = 'ios/Expo/**/*.{h,m,mm,swift}'
if supports_bundle_url_final
ss.pod_target_xcconfig = { 'SWIFT_ACTIVE_COMPILATION_CONDITIONS' => 'EXPO_SUPPORTS_BUNDLEURL' }
end
end
end
if defined?(install_modules_dependencies()) != nil
install_modules_dependencies(s);
else
if new_arch_enabled
folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
s.pod_target_xcconfig = {
"HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
}.merge(s.pod_target_xcconfig)
s.dependency "React-Codegen"
s.dependency "RCT-Folly"
s.dependency "RCTRequired"
s.dependency "RCTTypeSafety"
s.dependency "ReactCommon/turbomodule/core"
end
end
end