module Pod::Generator::AppTargetHelper

Stores the common logic for creating app targets within projects including generating standard import and main files for app hosts.

Constants

IOS_APP_HOST_MAIN_CONTENTS
LAUNCHSCREEN_STORYBOARD_CONTENTS
LAUNCHSCREEN_STORYBOARD_CONTENTS_IOS_8
MACOS_APP_HOST_MAIN_CONTENTS

Public Class Methods

add_app_host_main_file(project, target, platform, group, name = 'App') click to toggle source

Creates and links a default app host 'main.m' file.

@param [Project] project

the Xcodeproj to generate the main file into.

@param [PBXNativeTarget] target

the native target to link the generated main file into.

@param [Symbol] platform

the platform of the target. Can be `:ios` or `:osx`, etc.

@param [String] name

The name to use for the target, defaults to 'App'.

@return [Array<PBXBuildFile>] the created build file references.

# File lib/cocoapods/generator/app_target_helper.rb, line 95
def self.add_app_host_main_file(project, target, platform, group, name = 'App')
  source_file = AppTargetHelper.create_app_host_main_file(project, platform, name)
  source_file_ref = group.new_file(source_file)
  target.add_file_references([source_file_ref])
end
add_app_project_import(project, target, pod_target, platform, name = 'App') click to toggle source

Creates and links an import file for the given pod target and into the given native target.

@param [Project] project

the Xcodeproj to generate the target into.

@param [PBXNativeTarget] target

the native target to link the generated import file into.

@param [PodTarget] pod_target

the pod target to use for when generating the contents of the import file.

@param [Symbol] platform

the platform of the target. Can be `:ios` or `:osx`, etc.

@param [String] name

The name to use for the target, defaults to 'App'.

@return [Array<PBXBuildFile>] the created build file references.

# File lib/cocoapods/generator/app_target_helper.rb, line 50
def self.add_app_project_import(project, target, pod_target, platform, name = 'App')
  source_file = AppTargetHelper.create_app_import_source_file(project, pod_target, platform, name)
  group = project[name] || project.new_group(name, name)
  source_file_ref = group.new_file(source_file)
  target.add_file_references([source_file_ref])
end
add_app_target(project, platform_name, deployment_target, name = 'App', product_basename = nil) click to toggle source

Adds a single app target to the given project with the provided name.

@param [Project] project

the Xcodeproj to generate the target into.

@param [Symbol] platform_name

the platform of the target. Can be `:ios` or `:osx`, etc.

@param [String] deployment_target

the deployment target for the platform.

@param [String] name

The name to use for the target, defaults to 'App'.

@param [String] product_basename

The product basename to use for the target, defaults to `name`.

@return [PBXNativeTarget] the new target that was created.

# File lib/cocoapods/generator/app_target_helper.rb, line 26
def self.add_app_target(project, platform_name, deployment_target, name = 'App', product_basename = nil)
  project.new_target(:application, name, platform_name, deployment_target, nil,
                     nil, product_basename)
end
add_empty_swift_file(project, target, name = 'App') click to toggle source

Creates and links an empty Swift file for the given target.

@param [Project] project

the Xcodeproj to generate the target into.

@param [PBXNativeTarget] target

the native target to link the generated import file into.

@param [String] name

The name to use for the target, defaults to 'App'.

@return [Array<PBXBuildFile>] the created build file references.

# File lib/cocoapods/generator/app_target_helper.rb, line 70
def self.add_empty_swift_file(project, target, name = 'App')
  swift_file = project.path.dirname.+("#{name}/dummy.swift")
  swift_file.parent.mkpath
  File.write(swift_file, '')
  group = project[name] || project.new_group(name, name)
  swift_file_ref = group.new_file(swift_file)
  target.add_file_references([swift_file_ref])
end
add_launchscreen_storyboard(project, target, group, deployment_target, name = 'App') click to toggle source

Creates a default launchscreen storyboard.

@param [Project] project

the Xcodeproj to generate the launchscreen storyboard into.

@param [PBXNativeTarget] target

the native target to link the generated launchscreen storyboard into.

@param [Symbol] platform

the platform of the target. Can be `:ios` or `:osx`, etc.

@param [String] deployment_target

the deployment target for the platform.

@param [String] name

The name to use for the target, defaults to 'App'.

@return [PBXFileReference] the created file reference of the launchscreen storyboard.

# File lib/cocoapods/generator/app_target_helper.rb, line 120
def self.add_launchscreen_storyboard(project, target, group, deployment_target, name = 'App')
  launch_storyboard_file = AppTargetHelper.create_launchscreen_storyboard_file(project, deployment_target, name)
  launch_storyboard_ref = group.new_file(launch_storyboard_file)
  target.resources_build_phase.add_file_reference(launch_storyboard_ref)
end
add_swift_version(target, swift_version) click to toggle source

Adds the provided swift version into the given target.

@param [PBXNativeTarget] target

the native target to add the swift version into.

@param [String] swift_version

the swift version to set to.

@return [void]

# File lib/cocoapods/generator/app_target_helper.rb, line 158
def self.add_swift_version(target, swift_version)
  raise 'Cannot set empty Swift version to target.' if swift_version.blank?
  target.build_configurations.each do |configuration|
    configuration.build_settings['SWIFT_VERSION'] = swift_version
  end
end
add_xctest_search_paths(target) click to toggle source

Adds the xctest framework search paths into the given target.

@param [PBXNativeTarget] target

the native target to add XCTest into.

@return [void]

# File lib/cocoapods/generator/app_target_helper.rb, line 133
def self.add_xctest_search_paths(target)
  requires_libs = target.platform_name == :ios &&
    Version.new(target.deployment_target) < Version.new('12.2')

  target.build_configurations.each do |configuration|
    framework_search_paths = configuration.build_settings['FRAMEWORK_SEARCH_PATHS'] ||= '$(inherited)'
    framework_search_paths << ' "$(PLATFORM_DIR)/Developer/Library/Frameworks"'

    if requires_libs
      library_search_paths = configuration.build_settings['LIBRARY_SEARCH_PATHS'] ||= '$(inherited)'
      library_search_paths << ' "$(PLATFORM_DIR)/Developer/usr/lib"'
    end
  end
end
create_app_host_main_file(project, platform, name = 'App') click to toggle source

Creates a default app host 'main.m' file.

@param [Project] project

the Xcodeproj to generate the target into.

@param [Symbol] platform

the platform of the target. Can be `:ios` or `:osx`.

@param [String] name

The name of the folder to use and save the generated main file.

@return [Pathname] the new source file that was generated.

# File lib/cocoapods/generator/app_target_helper.rb, line 249
def self.create_app_host_main_file(project, platform, name = 'App')
  source_file = project.path.dirname.+("#{name}/main.m")
  source_file.parent.mkpath
  source_file.open('w') do |f|
    case platform
    when :ios, :tvos
      f << IOS_APP_HOST_MAIN_CONTENTS
    when :osx
      f << MACOS_APP_HOST_MAIN_CONTENTS
    end
  end
  source_file
end
create_app_import_source_file(project, pod_target, platform, name = 'App') click to toggle source

Creates a default import file for the given pod target.

@param [Project] project

the Xcodeproj to generate the target into.

@param [PodTarget] pod_target

the pod target to use for when generating the contents of the import file.

@param [Symbol] platform

the platform of the target. Can be `:ios` or `:osx`, etc.

@param [String] name

The name of the folder to use and save the generated main file.

@return [Pathname] the new source file that was generated.

# File lib/cocoapods/generator/app_target_helper.rb, line 181
def self.create_app_import_source_file(project, pod_target, platform, name = 'App')
  language = pod_target.uses_swift? ? :swift : :objc

  if language == :swift
    source_file = project.path.dirname.+("#{name}/main.swift")
    source_file.parent.mkpath
    import_statement = pod_target.should_build? && pod_target.defines_module? ? "import #{pod_target.product_module_name}\n" : ''
    source_file.open('w') { |f| f << import_statement }
  else
    source_file = project.path.dirname.+("#{name}/main.m")
    source_file.parent.mkpath
    import_statement = if pod_target.should_build? && pod_target.defines_module?
                         "@import #{pod_target.product_module_name};\n"
                       else
                         header_name = "#{pod_target.product_module_name}/#{pod_target.product_module_name}.h"
                         if pod_target.sandbox.public_headers.root.+(header_name).file?
                           "#import <#{header_name}>\n"
                         else
                           ''
                         end
                       end
    source_file.open('w') do |f|
      f << "@import Foundation;\n"
      f << "@import UIKit;\n" if platform == :ios || platform == :tvos
      f << "@import Cocoa;\n" if platform == :osx
      f << "#{import_statement}int main() {}\n"
    end
  end
  source_file
end
create_launchscreen_storyboard_file(project, deployment_target, name = 'App') click to toggle source

Creates a default launchscreen storyboard file.

@param [Project] project

the Xcodeproj to generate the launchscreen storyboard into.

@param [String] deployment_target

the deployment target for the platform.

@param [String] name

The name of the folder to use and save the generated launchscreen storyboard file.

@return [Pathname] the new launchscreen storyboard file that was generated.

# File lib/cocoapods/generator/app_target_helper.rb, line 225
def self.create_launchscreen_storyboard_file(project, deployment_target, name = 'App')
  launch_storyboard_file = project.path.dirname.+("#{name}/LaunchScreen.storyboard")
  launch_storyboard_file.parent.mkpath
  if Version.new(deployment_target) >= Version.new('9.0')
    File.write(launch_storyboard_file, LAUNCHSCREEN_STORYBOARD_CONTENTS)
  else
    File.write(launch_storyboard_file, LAUNCHSCREEN_STORYBOARD_CONTENTS_IOS_8)
  end
  launch_storyboard_file
end