Skip to content

Commit ab10cce

Browse files
committed
feat: update xcode permission by command
1 parent 348835a commit ab10cce

File tree

2 files changed

+90
-94
lines changed

2 files changed

+90
-94
lines changed

Tools/ios_extension_setup.rb

Lines changed: 54 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -39,96 +39,92 @@
3939
end
4040

4141
# 3. Add Source Files
42-
# Assumes files are in [ProjectRoot]/[ExtensionName]
43-
extension_group_path = File.join(project_root, extension_target_name)
44-
extension_rel_path = extension_target_name # Relative to project root
42+
# Calculate relative path from .xcodeproj folder to Extension folder
43+
# We know project_root is where extension folder lives.
44+
# We know project_path is the .xcodeproj file.
45+
require 'pathname'
46+
project_dir_path = File.dirname(project_path)
47+
extension_dir_path = File.join(project_root, extension_target_name)
48+
49+
# Make sure extension directory exists
50+
unless File.directory?(extension_dir_path)
51+
puts "Error: Extension directory not found at #{extension_dir_path}"
52+
exit 1
53+
end
54+
55+
# Calculate relative path: e.g. ../../../AgoraBCExtension
56+
# This path is what we put in the PBXGroup so it resolves correctly relative to the project.
57+
relative_group_path = Pathname.new(extension_dir_path).relative_path_from(Pathname.new(project_dir_path)).to_s
58+
puts "Extension Relative Path: #{relative_group_path}"
4559

46-
# Xcodeproj has group[] access via [name], but find_sub_group isn't standard in older versions or some forks?
47-
# Standard Xcodeproj::Project::Object::PBXGroup usage:
60+
# Get or Create Group
4861
extension_group = project.main_group.find_subpath(extension_target_name) || project.main_group[extension_target_name]
4962

5063
unless extension_group
51-
# If the folder exists on disk, we can add it
52-
if File.directory?(extension_group_path)
53-
extension_group = project.main_group.new_group(extension_target_name, extension_rel_path)
64+
# Create group with the relative path
65+
extension_group = project.main_group.new_group(extension_target_name, relative_group_path)
66+
5467
# Add files recursively
55-
Dir.glob(File.join(extension_group_path, "*")).each do |file_path|
68+
Dir.glob(File.join(extension_dir_path, "*")).each do |file_path|
5669
next if file_path.include?(".DS_Store")
5770
file_name = File.basename(file_path)
71+
72+
# For files inside the folder, we can add them to the group.
73+
# If the group has a path set, new_reference(file_name) adds it relative to the group path.
5874
file_ref = extension_group.new_reference(file_name)
5975

60-
if file_name.end_with?(".h", ".m", ".swift", ".c", ".cpp")
76+
if file_name.end_with?(".h", ".m", ".swift", ".c", ".cpp", ".mm")
6177
extension_target.add_file_references([file_ref])
6278
elsif file_name.end_with?(".plist")
6379
# Plist doesn't go to compile sources
6480
end
6581
end
66-
else
67-
puts "Warning: Extension directory #{extension_group_path} does not exist."
68-
end
6982
end
7083

7184
# 4. Configure Build Settings
85+
86+
# Retrieve Main Target Signing Info
87+
main_dev_team = ""
88+
# main_sign_identity = ""
89+
# main_prov_profile = ""
90+
unless main_target.build_configurations.empty?
91+
main_config = main_target.build_configurations.first
92+
main_dev_team = main_config.build_settings['DEVELOPMENT_TEAM']
93+
# main_sign_identity = main_config.build_settings['CODE_SIGN_IDENTITY']
94+
end
95+
7296
extension_target.build_configurations.each do |config|
7397
config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = extension_bundle_id
74-
# Assuming Info.plist is at [ExtensionName]/Info.plist relative to project file or project root?
75-
# Xcodeproj paths are relative to project file usually.
76-
# If project file is in [Root]/Intermediate/ProjectFiles/..., and source is in [Root]/Extension...
77-
config.build_settings['INFOPLIST_FILE'] = "$(PROJECT_DIR)/../../#{extension_target_name}/Info.plist"
78-
# Adjust this path logic based on where .xcodeproj is vs where source files are
7998

99+
# Info.plist path relative to the PROJECT FILE (not the group)
100+
config.build_settings['INFOPLIST_FILE'] = "#{relative_group_path}/Info.plist"
101+
102+
config.build_settings['PRODUCT_NAME'] = extension_target_name
80103
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
81104
config.build_settings['SKIP_INSTALL'] = 'YES'
82-
end
83-
84-
# 5. Add Frameworks
85-
# Framework path: [ProjectRoot]/IOSFramework/AgoraReplayKitExtension.framework
86-
framework_root = File.join(project_root, "IOSFramework")
87-
framework_name = "AgoraReplayKitExtension.framework"
88-
framework_path = File.join(framework_root, framework_name)
89-
90-
if File.exist?(framework_path)
91-
# framework_group = project.main_group.find_sub_group("IOSFramework")
92-
framework_group = project.main_group.find_subpath("IOSFramework") || project.main_group["IOSFramework"]
93-
unless framework_group
94-
framework_group = project.main_group.new_group("IOSFramework", "IOSFramework") # path relative to project root usually
95-
end
96-
97-
framework_ref = framework_group.find_file_by_path(framework_name)
98-
unless framework_ref
99-
framework_ref = framework_group.new_reference(framework_name)
100-
end
101-
102-
# Add to Extension Frameworks Build Phase
103-
unless extension_target.frameworks_build_phase.files_references.include?(framework_ref)
104-
extension_target.frameworks_build_phase.add_file_reference(framework_ref)
105-
puts "Added framework to extension target."
106-
end
105+
config.build_settings['TARGETED_DEVICE_FAMILY'] = "1,2" # iPhone, iPad
107106

108-
# Add Framework Search Paths
109-
extension_target.build_configurations.each do |config|
110-
paths = config.build_settings['FRAMEWORK_SEARCH_PATHS']
111-
paths = [paths] if paths.is_a?(String)
112-
paths = [] if paths.nil?
113-
114-
# Add path relative to project or absolute
115-
new_path = "$(PROJECT_DIR)/../../IOSFramework"
116-
unless paths.include?(new_path)
117-
paths << new_path
118-
config.build_settings['FRAMEWORK_SEARCH_PATHS'] = paths
119-
end
107+
# Apply Main Target Signing
108+
if main_dev_team && !main_dev_team.empty?
109+
config.build_settings['DEVELOPMENT_TEAM'] = main_dev_team
110+
config.build_settings['CODE_SIGN_STYLE'] = 'Automatic'
111+
else
112+
config.build_settings['CODE_SIGN_STYLE'] = 'Automatic'
120113
end
121-
else
122-
puts "Warning: Framework not found at #{framework_path}"
123114
end
124115

116+
puts "Skipping Framework addition as requested."
117+
# (Framework logic removed)
118+
119+
125120

126121
# 6. Add Dependency to Main Target
127122
unless main_target.dependencies.any? { |dep| dep.target == extension_target }
128123
main_target.add_dependency(extension_target)
129124
puts "Added dependency to main target"
130125
end
131-
126+
# 6. Add Extension to Main Target's Embed App Extensions Phase
127+
# Build Phase: Copy Files (PlugIns)
132128
# 7. Embed Extension in Main App
133129
# Look for 'Embed App Extensions' phase or create it
134130
# symbol_dst_subfolder_spec :plugins is 13

Utility/UnrealProjectManager.py

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -196,42 +196,42 @@ def AddIOSBroadcastExtension(path_project_root, src_root_path_resource):
196196
PrintErr(f"[AddIOSBroadcastExtension] Source path {src_extension_path} does not exist!")
197197

198198
# 2. Prepare Frameworks
199-
PrintLog("[AddIOSBroadcastExtension] Preparing Frameworks")
200-
201-
# Ex. [Project] / IOSFramework
202-
root_path_framework_dir = path_project / "IOSFramework"
203-
if not root_path_framework_dir.exists():
204-
root_path_framework_dir.mkdir(parents=True)
205-
206-
extension_folder_name = "AgoraReplayKitExtension.framework"
207-
path_target_extension = root_path_framework_dir / extension_folder_name
208-
209-
if path_target_extension.exists():
210-
FileUtility.DeleteDir(path_target_extension)
211-
212-
# Src: [Project] /Plugins/AgoraPlugin/Source/ThirdParty/AgoraPluginLibrary/IOS/Release/AgoraReplayKitExtension.embeddedframework.zip
213-
src_zip_relative = Path("Plugins/AgoraPlugin/Source/ThirdParty/AgoraPluginLibrary/IOS/Release/AgoraReplayKitExtension.embeddedframework.zip")
214-
src_zip_file_path_replay_kit = path_project / src_zip_relative
215-
dst_zip_file_path_replay_kit = root_path_framework_dir / src_zip_file_path_replay_kit.name
216-
217-
if src_zip_file_path_replay_kit.exists():
218-
FileUtility.CopyFile(src_zip_file_path_replay_kit, dst_zip_file_path_replay_kit)
219-
220-
OneZipCommand = ZipCommand()
221-
OneZipCommand.UnZipFile(dst_zip_file_path_replay_kit, root_path_framework_dir)
222-
223-
target_unzip_path = root_path_framework_dir / dst_zip_file_path_replay_kit.stem
224-
225-
# Ex. [Project] / IOSFramework / AgoraReplayKitExtension.embeddedframework / AgoraReplayKitExtension.framework
226-
unzipped_folder = target_unzip_path / extension_folder_name
227-
if unzipped_folder.exists():
228-
unzipped_folder.rename(target_unzip_path.parent / extension_folder_name)
229-
230-
FileUtility.DeleteFile(dst_zip_file_path_replay_kit)
231-
FileUtility.DeleteDir(target_unzip_path)
232-
PrintLog("[AddIOSBroadcastExtension] Framework preparation done.")
233-
else:
234-
PrintWarn(f"[AddIOSBroadcastExtension] Framework zip not found at {src_zip_file_path_replay_kit}")
199+
# PrintLog("[AddIOSBroadcastExtension] Preparing Frameworks")
200+
#
201+
# # Ex. [Project] / IOSFramework
202+
# root_path_framework_dir = path_project / "IOSFramework"
203+
# if not root_path_framework_dir.exists():
204+
# root_path_framework_dir.mkdir(parents=True)
205+
#
206+
# extension_folder_name = "AgoraReplayKitExtension.framework"
207+
# path_target_extension = root_path_framework_dir / extension_folder_name
208+
#
209+
# if path_target_extension.exists():
210+
# FileUtility.DeleteDir(path_target_extension)
211+
#
212+
# # Src: [Project] /Plugins/AgoraPlugin/Source/ThirdParty/AgoraPluginLibrary/IOS/Release/AgoraReplayKitExtension.embeddedframework.zip
213+
# src_zip_relative = Path("Plugins/AgoraPlugin/Source/ThirdParty/AgoraPluginLibrary/IOS/Release/AgoraReplayKitExtension.embeddedframework.zip")
214+
# src_zip_file_path_replay_kit = path_project / src_zip_relative
215+
# dst_zip_file_path_replay_kit = root_path_framework_dir / src_zip_file_path_replay_kit.name
216+
#
217+
# if src_zip_file_path_replay_kit.exists():
218+
# FileUtility.CopyFile(src_zip_file_path_replay_kit, dst_zip_file_path_replay_kit)
219+
#
220+
# OneZipCommand = ZipCommand()
221+
# OneZipCommand.UnZipFile(dst_zip_file_path_replay_kit, root_path_framework_dir)
222+
#
223+
# target_unzip_path = root_path_framework_dir / dst_zip_file_path_replay_kit.stem
224+
#
225+
# # Ex. [Project] / IOSFramework / AgoraReplayKitExtension.embeddedframework / AgoraReplayKitExtension.framework
226+
# unzipped_folder = target_unzip_path / extension_folder_name
227+
# if unzipped_folder.exists():
228+
# unzipped_folder.rename(target_unzip_path.parent / extension_folder_name)
229+
#
230+
# FileUtility.DeleteFile(dst_zip_file_path_replay_kit)
231+
# FileUtility.DeleteDir(target_unzip_path)
232+
# PrintLog("[AddIOSBroadcastExtension] Framework preparation done.")
233+
# else:
234+
# PrintWarn(f"[AddIOSBroadcastExtension] Framework zip not found at {src_zip_file_path_replay_kit}")
235235

236236
# 3. Configure Xcode Project via Ruby Script
237237
PrintLog("[AddIOSBroadcastExtension] Configuring Xcode Project via Ruby...")

0 commit comments

Comments
 (0)