Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: post install error in iOS after running pod install, undefined method 'path' for nil:NilClass #45095

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions packages/react-native/scripts/cocoapods/privacy_manifest_utils.rb
Original file line number Diff line number Diff line change
Expand Up @@ -67,26 +67,34 @@ def self.read_privacyinfo_file(file_path)
end

def self.ensure_reference(file_path, user_project, target)
reference_exists = target.resources_build_phase.files_references.any? { |file_ref| file_ref.path&.end_with? "PrivacyInfo.xcprivacy" }
reference_exists = target.resources_build_phase.files_references.any? { |file_ref| file_ref&.path&.end_with? "PrivacyInfo.xcprivacy" }
unless reference_exists
# We try to find the main group, but if it doesn't exist, we default to adding the file to the project root – both work
file_root = user_project.root_object.main_group.children.find { |group| group.class == Xcodeproj::Project::Object::PBXGroup && (group.name == target.name || group.path == target.name) } || user_project
file_root = user_project.root_object.main_group.children.find { |group|
group.class == Xcodeproj::Project::Object::PBXGroup && (group.name == target.name || group.path == target.name)
} || user_project
file_ref = file_root.new_file(file_path)
build_file = target.resources_build_phase.add_file_reference(file_ref, true)
end
end

def self.get_privacyinfo_file_path(user_project, targets)

file_refs = targets.flat_map { |target| target.resources_build_phase.files_references }
existing_file = file_refs.find { |file_ref| file_ref.path&.end_with? "PrivacyInfo.xcprivacy" }
existing_file = file_refs.find { |file_ref| file_ref&.path&.end_with?("PrivacyInfo.xcprivacy") }


if existing_file
return existing_file.real_path
end

# We try to find a file we know exists in the project to get the path to the main group directory
info_plist_path = user_project.files.find { |file_ref| file_ref.name == "Info.plist" }
if info_plist_path.nil?
# return path that is sibling to .xcodeproj

path = user_project.path

return File.join(File.dirname(path), "PrivacyInfo.xcprivacy")
end
return File.join(File.dirname(info_plist_path.real_path),"PrivacyInfo.xcprivacy")
Expand Down Expand Up @@ -117,14 +125,15 @@ def self.get_used_required_reason_apis(installer)
end
end
end

return used_apis
end

def self.get_privacy_manifest_paths_from(user_project)
privacy_manifests = user_project
.files
.select { |p|
p.path&.end_with?('PrivacyInfo.xcprivacy')
p&.path&.end_with?('PrivacyInfo.xcprivacy')
}
return privacy_manifests
end
Expand Down Expand Up @@ -162,7 +171,7 @@ def self.add_privacy_manifest_if_needed(installer)
"NSPrivacyTracking" => false,
"NSPrivacyAccessedAPITypes" => get_core_accessed_apis
}
path = File.join(user_project.path.parent, "PrivacyInfo.xcprivacy")
path = File.join(user_project&.path.parent, "PrivacyInfo.xcprivacy")
Xcodeproj::Plist.write_to_path(privacy_manifest, path)
Pod::UI.puts "Your app does not have a privacy manifest! A template has been generated containing Required Reasons API usage in the core React Native library. Please add the PrivacyInfo.xcprivacy file to your project and complete data use, tracking and any additional required reasons your app is using according to Apple's guidance: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files. Then, you will need to manually add this file to your project in Xcode.".red
end
Expand Down
Loading