Compare commits
35 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
537e8557ac | ||
|
|
ef8c551b0f | ||
|
|
2b22adce9b | ||
|
|
744765583e | ||
|
|
d3f529d1d9 | ||
|
|
988a09f7ac | ||
|
|
62af283ecd | ||
|
|
971381a4ab | ||
|
|
cfc63e1f38 | ||
|
|
589bc22574 | ||
|
|
3333385db6 | ||
|
|
d234833546 | ||
|
|
cdc913a5a3 | ||
|
|
6586f404f1 | ||
|
|
250ee365e4 | ||
|
|
4f0d0c87cb | ||
|
|
702f5020bc | ||
|
|
01430ed68c | ||
|
|
99f90d8e5a | ||
|
|
ad15231e7c | ||
|
|
d78acb3b57 | ||
|
|
c5efe4350c | ||
|
|
411965ed2e | ||
|
|
c1e876e62a | ||
|
|
58eeb3f4c5 | ||
|
|
c80d9ba699 | ||
|
|
4c2a3ad06b | ||
|
|
31fdc383ab | ||
|
|
a8985c5264 | ||
|
|
710839eafd | ||
|
|
1e357dc100 | ||
|
|
cfe476404a | ||
|
|
69bc8c3788 | ||
|
|
2238d25dc2 | ||
|
|
c44e490a7d |
@ -1,9 +1,13 @@
|
||||
# cocoapods-binary
|
||||
|
||||
<p align="center"><img src="/test/logo.png" width="622"></p>
|
||||
|
||||
[](https://travis-ci.org/leavez/cocoapods-binary)
|
||||
|
||||
A CocoaPods plugin to integrate pods in form of prebuilt frameworks, not source code, by adding **just one flag** in podfile. Speed up compiling dramatically.
|
||||
|
||||
Good news: Introduction on cocoapods offical site: [Pre-compiling dependencies](http://guides.cocoapods.org/plugins/pre-compiling-dependencies.html) ( NOTE: This plugin is a community work, not official.)
|
||||
|
||||
|
||||
## Why
|
||||
|
||||
You may wonder why CocoaPods doesn't have a function to integrate libs in form of binaries, if there are dozens or hundreds of pods in your podfile and compile them for a great many times meaninglessly. Too many source code of libs slow down your compile and the response of IDE (e.g. code completion), and then reduce work efficiency, leaving us time to think about the meaning of life.
|
||||
|
||||
@ -2,6 +2,8 @@ require_relative 'helper/podfile_options'
|
||||
require_relative 'helper/feature_switches'
|
||||
require_relative 'helper/prebuild_sandbox'
|
||||
require_relative 'helper/passer'
|
||||
require_relative 'helper/names'
|
||||
|
||||
|
||||
|
||||
# NOTE:
|
||||
@ -24,13 +26,9 @@ module Pod
|
||||
|
||||
# make a symlink to target folder
|
||||
prebuild_sandbox = Pod::PrebuildSandbox.from_standard_sandbox(standard_sanbox)
|
||||
real_file_folder = prebuild_sandbox.framework_folder_path_for_pod_name(self.name)
|
||||
|
||||
target_folder = standard_sanbox.pod_dir(self.name)
|
||||
target_folder.rmtree if target_folder.exist?
|
||||
target_folder.mkdir
|
||||
|
||||
# make a relatvie symbol link for all children
|
||||
# if spec used in multiple platforms, it may return multiple paths
|
||||
target_names = prebuild_sandbox.existed_target_names_for_pod_name(self.name)
|
||||
|
||||
def walk(path, &action)
|
||||
path.children.each do |child|
|
||||
result = action.call(child, &action)
|
||||
@ -50,31 +48,51 @@ module Pod
|
||||
target = target_folder + source.relative_path_from(basefolder)
|
||||
make_link(source, target)
|
||||
end
|
||||
|
||||
target_names.each do |name|
|
||||
|
||||
# symbol link copy all substructure
|
||||
walk(real_file_folder) do |child|
|
||||
source = child
|
||||
# only make symlink to file and `.framework` folder
|
||||
if child.directory? and child.extname == ".framework"
|
||||
mirror_with_symlink(source, real_file_folder, target_folder)
|
||||
next false # return false means don't go deeper
|
||||
elsif child.file?
|
||||
mirror_with_symlink(source, real_file_folder, target_folder)
|
||||
next true
|
||||
else
|
||||
next true
|
||||
# symbol link copy all substructure
|
||||
real_file_folder = prebuild_sandbox.framework_folder_path_for_target_name(name)
|
||||
|
||||
# If have only one platform, just place int the root folder of this pod.
|
||||
# If have multiple paths, we use a sperated folder to store different
|
||||
# platform frameworks. e.g. AFNetworking/AFNetworking-iOS/AFNetworking.framework
|
||||
|
||||
target_folder = standard_sanbox.pod_dir(self.name)
|
||||
if target_names.count > 1
|
||||
target_folder += real_file_folder.basename
|
||||
end
|
||||
end
|
||||
target_folder.rmtree if target_folder.exist?
|
||||
target_folder.mkpath
|
||||
|
||||
# symbol link copy resource for static framework
|
||||
hash = Prebuild::Passer.resources_to_copy_for_static_framework || {}
|
||||
path_objects = hash[self.name]
|
||||
if path_objects != nil
|
||||
path_objects.each do |object|
|
||||
make_link(object.real_file_path, object.target_file_path)
|
||||
|
||||
walk(real_file_folder) do |child|
|
||||
source = child
|
||||
# only make symlink to file and `.framework` folder
|
||||
if child.directory? and child.extname == ".framework"
|
||||
mirror_with_symlink(source, real_file_folder, target_folder)
|
||||
next false # return false means don't go deeper
|
||||
elsif child.file?
|
||||
mirror_with_symlink(source, real_file_folder, target_folder)
|
||||
next true
|
||||
else
|
||||
next true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# symbol link copy resource for static framework
|
||||
hash = Prebuild::Passer.resources_to_copy_for_static_framework || {}
|
||||
|
||||
path_objects = hash[name]
|
||||
if path_objects != nil
|
||||
path_objects.each do |object|
|
||||
make_link(object.real_file_path, object.target_file_path)
|
||||
end
|
||||
end
|
||||
end # of for each
|
||||
|
||||
end # of method
|
||||
|
||||
end
|
||||
end
|
||||
@ -95,7 +113,7 @@ module Pod
|
||||
changes = Pod::Prebuild::Passer.prebuild_pods_changes
|
||||
updated_names = []
|
||||
if changes == nil
|
||||
updated_names = PrebuildSandbox.from_standard_sandbox(self.sandbox).exsited_framework_names
|
||||
updated_names = PrebuildSandbox.from_standard_sandbox(self.sandbox).exsited_framework_pod_names
|
||||
else
|
||||
added = changes.added
|
||||
changed = changes.changed
|
||||
@ -127,45 +145,72 @@ module Pod
|
||||
|
||||
# call original
|
||||
old_method2.bind(self).()
|
||||
# ...
|
||||
# ...
|
||||
# ...
|
||||
# after finishing the very complex orginal function
|
||||
|
||||
|
||||
# check the prebuilt targets
|
||||
targets = self.prebuild_pod_targets
|
||||
targets_have_different_platforms = targets.select {|t| t.pod_name != t.name }
|
||||
# check
|
||||
self.validate_every_pod_only_have_one_form
|
||||
|
||||
if targets_have_different_platforms.count > 0
|
||||
names = targets_have_different_platforms.map(&:pod_name)
|
||||
STDERR.puts "[!] Binary doesn't support pods who integrate in 2 or more platforms simultaneously: #{names}".red
|
||||
exit
|
||||
|
||||
# prepare
|
||||
cache = []
|
||||
|
||||
def add_vendered_framework(spec, platform, added_framework_file_path)
|
||||
if spec.attributes_hash[platform] == nil
|
||||
spec.attributes_hash[platform] = {}
|
||||
end
|
||||
vendored_frameworks = spec.attributes_hash[platform]["vendored_frameworks"] || []
|
||||
vendored_frameworks = [vendored_frameworks] if vendored_frameworks.kind_of?(String)
|
||||
vendored_frameworks += [added_framework_file_path]
|
||||
spec.attributes_hash[platform]["vendored_frameworks"] = vendored_frameworks
|
||||
end
|
||||
def empty_source_files(spec)
|
||||
spec.attributes_hash["source_files"] = []
|
||||
["ios", "watchos", "tvos", "osx"].each do |plat|
|
||||
if spec.attributes_hash[plat] != nil
|
||||
spec.attributes_hash[plat]["source_files"] = []
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
specs = self.analysis_result.specifications
|
||||
prebuilt_specs = (specs.select do |spec|
|
||||
self.prebuild_pod_names.include? spec.root.name
|
||||
end)
|
||||
|
||||
# make sturcture to fast get target by name
|
||||
name_to_target_hash = self.pod_targets.reduce({}) do |sum, target|
|
||||
sum[target.name] = target
|
||||
sum
|
||||
end
|
||||
|
||||
prebuilt_specs.each do |spec|
|
||||
# `spec` may be a subspec, so we use the root's name
|
||||
root_name = spec.root.name
|
||||
|
||||
target = name_to_target_hash[root_name]
|
||||
next if Prebuild::Passer.target_names_to_skip_integration_framework.include? target.pod_name
|
||||
|
||||
# use the prebuilt framework
|
||||
original_vendored_frameworks = spec.attributes_hash["vendored_frameworks"] || []
|
||||
if original_vendored_frameworks.kind_of?(String)
|
||||
original_vendored_frameworks = [original_vendored_frameworks]
|
||||
# Use the prebuild framworks as vendered frameworks
|
||||
# get_corresponding_targets
|
||||
targets = Pod.fast_get_targets_for_pod_name(spec.root.name, self.pod_targets, cache)
|
||||
targets.each do |target|
|
||||
# the framework_file_path rule is decided when `install_for_prebuild`,
|
||||
# as to compitable with older version and be less wordy.
|
||||
framework_file_path = target.framework_name
|
||||
framework_file_path = target.name + "/" + framework_file_path if targets.count > 1
|
||||
add_vendered_framework(spec, target.platform.name.to_s, framework_file_path)
|
||||
end
|
||||
# Clean the source files
|
||||
# we just add the prebuilt framework to specific platform and set no source files
|
||||
# for all platform, so it doesn't support the sence that 'a pod perbuild for one
|
||||
# platform and not for another platform.'
|
||||
empty_source_files(spec)
|
||||
|
||||
# to remove the resurce bundle target.
|
||||
# When specify the "resource_bundles" in podspec, xcode will generate a bundle
|
||||
# target after pod install. But the bundle have already built when the prebuit
|
||||
# phase and saved in the framework folder. We will treat it as a normal resource
|
||||
# file.
|
||||
# https://github.com/leavez/cocoapods-binary/issues/29
|
||||
if spec.attributes_hash["resource_bundles"]
|
||||
bundle_names = spec.attributes_hash["resource_bundles"].keys
|
||||
spec.attributes_hash["resource_bundles"] = nil
|
||||
spec.attributes_hash["resources"] ||= []
|
||||
spec.attributes_hash["resources"] += bundle_names.map{|n| n+".bundle"}
|
||||
end
|
||||
original_vendored_frameworks += [target.framework_name]
|
||||
spec.attributes_hash["vendored_frameworks"] = original_vendored_frameworks
|
||||
spec.attributes_hash["source_files"] = []
|
||||
|
||||
# to avoid the warning of missing license
|
||||
spec.attributes_hash["license"] = {}
|
||||
|
||||
@ -48,7 +48,7 @@ Pod::HooksManager.register('cocoapods-binary', :pre_install) do |installer_conte
|
||||
# check user_framework is on
|
||||
podfile = installer_context.podfile
|
||||
podfile.target_definition_list.each do |target_definition|
|
||||
next if target_definition.prebuild_framework_names.empty?
|
||||
next if target_definition.prebuild_framework_pod_names.empty?
|
||||
if not target_definition.uses_frameworks?
|
||||
STDERR.puts "[!] Cocoapods-binary requires `use_frameworks!`".red
|
||||
exit
|
||||
@ -80,7 +80,8 @@ Pod::HooksManager.register('cocoapods-binary', :pre_install) do |installer_conte
|
||||
prebuild_podfile = Pod::Podfile.from_ruby(podfile.defined_in_file)
|
||||
|
||||
# install
|
||||
binary_installer = Pod::Installer.new(prebuild_sandbox, prebuild_podfile , nil)
|
||||
lockfile = installer_context.lockfile
|
||||
binary_installer = Pod::Installer.new(prebuild_sandbox, prebuild_podfile, lockfile)
|
||||
|
||||
if binary_installer.have_exact_prebuild_cache?
|
||||
binary_installer.install_when_cache_hit!
|
||||
@ -97,6 +98,7 @@ Pod::HooksManager.register('cocoapods-binary', :pre_install) do |installer_conte
|
||||
Pod::Podfile::DSL.enable_prebuild_patch false
|
||||
Pod::Config.force_disable_write_lockfile false
|
||||
Pod::Installer.disable_install_complete_message false
|
||||
Pod::UserInterface.warnings = [] # clean the warning in the prebuild step, it's duplicated.
|
||||
|
||||
|
||||
# -- step 2: pod install ---
|
||||
|
||||
@ -43,11 +43,9 @@ module Pod
|
||||
unchanged = changes.unchanged
|
||||
deleted = changes.deleted
|
||||
|
||||
unchange_framework_names = (added + unchanged)
|
||||
|
||||
exsited_framework_names = sandbox.exsited_framework_names
|
||||
exsited_framework_pod_names = sandbox.exsited_framework_pod_names
|
||||
missing = unchanged.select do |pod_name|
|
||||
not exsited_framework_names.include?(pod_name)
|
||||
not exsited_framework_pod_names.include?(pod_name)
|
||||
end
|
||||
|
||||
needed = (added + changed + deleted + missing)
|
||||
@ -58,7 +56,7 @@ module Pod
|
||||
# The install method when have completed cache
|
||||
def install_when_cache_hit!
|
||||
# just print log
|
||||
self.sandbox.exsited_framework_names.each do |name|
|
||||
self.sandbox.exsited_framework_target_names.each do |name|
|
||||
UI.puts "Using #{name}"
|
||||
end
|
||||
end
|
||||
@ -82,24 +80,21 @@ module Pod
|
||||
deleted = changes.deleted
|
||||
|
||||
existed_framework_folder.mkdir unless existed_framework_folder.exist?
|
||||
exsited_framework_names = sandbox.exsited_framework_names
|
||||
exsited_framework_pod_names = sandbox.exsited_framework_pod_names
|
||||
|
||||
# additions
|
||||
missing = unchanged.select do |pod_name|
|
||||
not exsited_framework_names.include?(pod_name)
|
||||
not exsited_framework_pod_names.include?(pod_name)
|
||||
end
|
||||
|
||||
|
||||
root_names_to_update = (added + changed + missing)
|
||||
|
||||
# transform names to targets
|
||||
name_to_target_hash = self.pod_targets.reduce({}) do |sum, target|
|
||||
sum[target.name] = target
|
||||
sum
|
||||
end
|
||||
targets = root_names_to_update.map do |root_name|
|
||||
name_to_target_hash[root_name]
|
||||
end || []
|
||||
cache = []
|
||||
targets = root_names_to_update.map do |pod_name|
|
||||
Pod.fast_get_targets_for_pod_name(pod_name, self.pod_targets, cache)
|
||||
end.flatten
|
||||
|
||||
# add the dendencies
|
||||
dependency_targets = targets.map {|t| t.recursive_dependent_targets }.flatten.uniq || []
|
||||
@ -117,8 +112,8 @@ module Pod
|
||||
Pod::Prebuild.remove_build_dir(sandbox_path)
|
||||
targets.each do |target|
|
||||
next unless target.should_build?
|
||||
output_path = sandbox.framework_folder_path_for_target_name(target.name)
|
||||
|
||||
output_path = sandbox.framework_folder_path_for_pod_name(target.name)
|
||||
output_path.mkpath unless output_path.exist?
|
||||
Pod::Prebuild.build(sandbox_path, target, output_path, bitcode_enabled)
|
||||
|
||||
@ -126,14 +121,16 @@ module Pod
|
||||
if target.static_framework? and !target.resource_paths.empty?
|
||||
framework_path = output_path + target.framework_name
|
||||
standard_sandbox_path = sandbox.standard_sanbox_path
|
||||
path_objects = target.resource_paths.select{|f| f.start_with? "${PODS_ROOT}"}.map do |path|
|
||||
path_objects = target.resource_paths.map do |path|
|
||||
object = Prebuild::Passer::ResourcePath.new
|
||||
object.real_file_path = framework_path + File.basename(path)
|
||||
object.target_file_path = path.gsub('${PODS_ROOT}', standard_sandbox_path.to_s)
|
||||
object.target_file_path = path.gsub('${PODS_ROOT}', standard_sandbox_path.to_s) if path.start_with? '${PODS_ROOT}'
|
||||
object.target_file_path = path.gsub("${PODS_CONFIGURATION_BUILD_DIR}", standard_sandbox_path.to_s) if path.start_with? "${PODS_CONFIGURATION_BUILD_DIR}"
|
||||
object
|
||||
end
|
||||
Prebuild::Passer.resources_to_copy_for_static_framework[target.name] = path_objects
|
||||
end
|
||||
|
||||
end
|
||||
Pod::Prebuild.remove_build_dir(sandbox_path)
|
||||
|
||||
@ -141,12 +138,12 @@ module Pod
|
||||
# copy vendored libraries and frameworks
|
||||
targets.each do |target|
|
||||
root_path = self.sandbox.pod_dir(target.name)
|
||||
target_folder = sandbox.framework_folder_path_for_pod_name(target.name)
|
||||
target_folder = sandbox.framework_folder_path_for_target_name(target.name)
|
||||
|
||||
# If target shouldn't build, we copy all the original files
|
||||
# This is for target with only .a and .h files
|
||||
if not target.should_build?
|
||||
Prebuild::Passer.target_names_to_skip_integration_framework << target.pod_name
|
||||
Prebuild::Passer.target_names_to_skip_integration_framework << target.name
|
||||
FileUtils.cp_r(root_path, target_folder, :remove_destination => true)
|
||||
next
|
||||
end
|
||||
@ -164,15 +161,20 @@ module Pod
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# save the pod_name for prebuild framwork in sandbox
|
||||
targets.each do |target|
|
||||
sandbox.save_pod_name_for_target target
|
||||
end
|
||||
|
||||
# Remove useless files
|
||||
# remove useless pods
|
||||
all_needed_names = self.pod_targets.map(&:name).uniq
|
||||
useless_names = sandbox.exsited_framework_names.reject do |name|
|
||||
useless_target_names = sandbox.exsited_framework_target_names.reject do |name|
|
||||
all_needed_names.include? name
|
||||
end
|
||||
useless_names.each do |name|
|
||||
path = sandbox.framework_folder_path_for_pod_name(name)
|
||||
useless_target_names.each do |name|
|
||||
path = sandbox.framework_folder_path_for_target_name(name)
|
||||
path.rmtree if path.exist?
|
||||
end
|
||||
|
||||
|
||||
@ -38,11 +38,6 @@ module Pod
|
||||
end
|
||||
|
||||
if should_prebuild and (not local)
|
||||
if current_target_definition.platform == :watchos
|
||||
# watchos isn't supported currently
|
||||
Pod::UI.warn "Binary doesn't support watchos currently: #{name}. You can manually set `binary => false` for this pod to suppress this warning."
|
||||
return
|
||||
end
|
||||
old_method.bind(self).(name, *args)
|
||||
end
|
||||
end
|
||||
|
||||
78
lib/cocoapods-binary/helper/names.rb
Normal file
78
lib/cocoapods-binary/helper/names.rb
Normal file
@ -0,0 +1,78 @@
|
||||
# ABOUT NAMES
|
||||
#
|
||||
# There are many kinds of name in cocoapods. Two main names are widely used in this plugin.
|
||||
# - root_spec.name (spec.root_name, targe.pod_name):
|
||||
# aka "pod_name"
|
||||
# the name we use in podfile. the concept.
|
||||
#
|
||||
# - target.name:
|
||||
# aka "target_name"
|
||||
# the name of the final target in xcode project. the final real thing.
|
||||
#
|
||||
# One pod may have multiple targets in xcode project, due to one pod can be used in mutiple
|
||||
# platform simultaneously. So one `root_spec.name` may have multiple coresponding `target.name`s.
|
||||
# Therefore, map a spec to/from targets is a little complecated. It's one to many.
|
||||
#
|
||||
|
||||
# Tool to transform Pod_name to target efficiently
|
||||
module Pod
|
||||
def self.fast_get_targets_for_pod_name(pod_name, targets, cache)
|
||||
pod_name_to_targets_hash = nil
|
||||
if cache.empty?
|
||||
pod_name_to_targets_hash = targets.reduce({}) do |sum, target|
|
||||
array = sum[target.pod_name] || []
|
||||
array << target
|
||||
sum[target.pod_name] = array
|
||||
sum
|
||||
end
|
||||
cache << pod_name_to_targets_hash
|
||||
else
|
||||
pod_name_to_targets_hash = cache.first
|
||||
end
|
||||
|
||||
pod_name_to_targets_hash[pod_name] || []
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Target:
|
||||
|
||||
# def pod_name
|
||||
# root_spec.name
|
||||
# end
|
||||
|
||||
# def name
|
||||
# pod_name + #{scope_suffix}
|
||||
# end
|
||||
|
||||
# def product_module_name
|
||||
# root_spec.module_name
|
||||
# end
|
||||
|
||||
# def framework_name
|
||||
# "#{product_module_name}.framework"
|
||||
# end
|
||||
|
||||
# def product_name
|
||||
# if requires_frameworks?
|
||||
# framework_name
|
||||
# else
|
||||
# static_library_name
|
||||
# end
|
||||
# end
|
||||
|
||||
# def product_basename
|
||||
# if requires_frameworks?
|
||||
# product_module_name
|
||||
# else
|
||||
# label
|
||||
# end
|
||||
# end
|
||||
|
||||
# def framework_name
|
||||
# "#{product_module_name}.framework"
|
||||
# end
|
||||
@ -11,40 +11,41 @@ module Pod
|
||||
|
||||
## --- option for setting using prebuild framework ---
|
||||
def parse_prebuild_framework(name, requirements)
|
||||
|
||||
should_prebuild = Pod::Podfile::DSL.prebuild_all
|
||||
|
||||
options = requirements.last
|
||||
return requirements unless options.is_a?(Hash)
|
||||
if options.is_a?(Hash) && options[Pod::Prebuild.keyword] != nil
|
||||
should_prebuild = options.delete(Pod::Prebuild.keyword)
|
||||
requirements.pop if options.empty?
|
||||
end
|
||||
|
||||
should_prebuild_framework = options.delete(Pod::Prebuild.keyword)
|
||||
pod_name = Specification.root_name(name)
|
||||
set_prebuild_for_pod(pod_name, should_prebuild_framework)
|
||||
requirements.pop if options.empty?
|
||||
set_prebuild_for_pod(pod_name, should_prebuild)
|
||||
end
|
||||
|
||||
def set_prebuild_for_pod(pod_name, should_prebuild)
|
||||
|
||||
if should_prebuild == true
|
||||
# watchos isn't supported currently
|
||||
return if self.platform == :watchos
|
||||
|
||||
@prebuild_framework_names ||= []
|
||||
@prebuild_framework_names.push pod_name
|
||||
@prebuild_framework_pod_names ||= []
|
||||
@prebuild_framework_pod_names.push pod_name
|
||||
else
|
||||
@should_not_prebuild_framework_names ||= []
|
||||
@should_not_prebuild_framework_names.push pod_name
|
||||
@should_not_prebuild_framework_pod_names ||= []
|
||||
@should_not_prebuild_framework_pod_names.push pod_name
|
||||
end
|
||||
end
|
||||
|
||||
def prebuild_framework_names
|
||||
names = @prebuild_framework_names || []
|
||||
def prebuild_framework_pod_names
|
||||
names = @prebuild_framework_pod_names || []
|
||||
if parent != nil and parent.kind_of? TargetDefinition
|
||||
names += parent.prebuild_framework_names
|
||||
names += parent.prebuild_framework_pod_names
|
||||
end
|
||||
names
|
||||
end
|
||||
def should_not_prebuild_framework_names
|
||||
names = @should_not_prebuild_framework_names || []
|
||||
def should_not_prebuild_framework_pod_names
|
||||
names = @should_not_prebuild_framework_pod_names || []
|
||||
if parent != nil and parent.kind_of? TargetDefinition
|
||||
names += parent.should_not_prebuild_framework_names
|
||||
names += parent.should_not_prebuild_framework_pod_names
|
||||
end
|
||||
names
|
||||
end
|
||||
@ -68,16 +69,16 @@ module Pod
|
||||
class Installer
|
||||
|
||||
def prebuild_pod_targets
|
||||
|
||||
@prebuild_pod_targets ||= (
|
||||
all = []
|
||||
|
||||
aggregate_targets = self.aggregate_targets.select { |a| a.platform != :watchos }
|
||||
aggregate_targets = self.aggregate_targets
|
||||
aggregate_targets.each do |aggregate_target|
|
||||
target_definition = aggregate_target.target_definition
|
||||
targets = aggregate_target.pod_targets || []
|
||||
|
||||
# filter prebuild
|
||||
prebuild_names = target_definition.prebuild_framework_names
|
||||
prebuild_names = target_definition.prebuild_framework_pod_names
|
||||
if not Podfile::DSL.prebuild_all
|
||||
targets = targets.select { |pod_target| prebuild_names.include?(pod_target.pod_name) }
|
||||
end
|
||||
@ -85,7 +86,7 @@ module Pod
|
||||
targets = (targets + dependency_targets).uniq
|
||||
|
||||
# filter should not prebuild
|
||||
explict_should_not_names = target_definition.should_not_prebuild_framework_names
|
||||
explict_should_not_names = target_definition.should_not_prebuild_framework_pod_names
|
||||
targets = targets.reject { |pod_target| explict_should_not_names.include?(pod_target.pod_name) }
|
||||
|
||||
all += targets
|
||||
@ -93,6 +94,7 @@ module Pod
|
||||
|
||||
all = all.reject {|pod_target| sandbox.local?(pod_target.pod_name) }
|
||||
all.uniq
|
||||
)
|
||||
end
|
||||
|
||||
# the root names who needs prebuild, including dependency pods.
|
||||
@ -100,6 +102,27 @@ module Pod
|
||||
@prebuild_pod_names ||= self.prebuild_pod_targets.map(&:pod_name)
|
||||
end
|
||||
|
||||
|
||||
def validate_every_pod_only_have_one_form
|
||||
|
||||
multi_targets_pods = self.pod_targets.group_by do |t|
|
||||
t.pod_name
|
||||
end.select do |k, v|
|
||||
v.map{|t| t.platform.name }.count > 1
|
||||
end
|
||||
|
||||
multi_targets_pods = multi_targets_pods.reject do |name, targets|
|
||||
contained = targets.map{|t| self.prebuild_pod_targets.include? t }
|
||||
contained.uniq.count == 1 # all equal
|
||||
end
|
||||
|
||||
return if multi_targets_pods.empty?
|
||||
|
||||
warnings = "One pod can only be prebuilt or not prebuilt. These pod have different forms in multiple targets:\n"
|
||||
warnings += multi_targets_pods.map{|name, targets| " #{name}: #{targets.map{|t|t.platform.name}}"}.join("\n")
|
||||
raise Informative, warnings
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -1,3 +1,5 @@
|
||||
require_relative "names"
|
||||
|
||||
module Pod
|
||||
class PrebuildSandbox < Sandbox
|
||||
|
||||
@ -19,31 +21,53 @@ module Pod
|
||||
self.root + "GeneratedFrameworks"
|
||||
end
|
||||
|
||||
def framework_folder_path_for_pod_name(name)
|
||||
# @param name [String] pass the target.name (may containing platform suffix)
|
||||
# @return [Pathname] the folder containing the framework file.
|
||||
def framework_folder_path_for_target_name(name)
|
||||
self.generate_framework_path + name
|
||||
end
|
||||
|
||||
def exsited_framework_names
|
||||
|
||||
def exsited_framework_target_names
|
||||
exsited_framework_name_pairs.map {|pair| pair[0]}.uniq
|
||||
end
|
||||
def exsited_framework_pod_names
|
||||
exsited_framework_name_pairs.map {|pair| pair[1]}.uniq
|
||||
end
|
||||
def existed_target_names_for_pod_name(pod_name)
|
||||
exsited_framework_name_pairs.select {|pair| pair[1] == pod_name }.map { |pair| pair[0]}
|
||||
end
|
||||
|
||||
|
||||
|
||||
def save_pod_name_for_target(target)
|
||||
folder = framework_folder_path_for_target_name(target.name)
|
||||
return unless folder.exist?
|
||||
flag_file_path = folder + "#{target.pod_name}.pod_name"
|
||||
File.write(flag_file_path.to_s, "")
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
|
||||
def pod_name_for_target_folder(target_folder_path)
|
||||
name = Pathname.new(target_folder_path).children.find do |child|
|
||||
child.to_s.end_with? ".pod_name"
|
||||
end
|
||||
name = name.basename(".pod_name").to_s unless name.nil?
|
||||
name ||= Pathname.new(target_folder_path).basename.to_s # for compatibility with older version
|
||||
end
|
||||
|
||||
# Array<[target_name, pod_name]>
|
||||
def exsited_framework_name_pairs
|
||||
return [] unless generate_framework_path.exist?
|
||||
generate_framework_path.children().map do |framework_name|
|
||||
if framework_name.directory?
|
||||
if not framework_name.children.empty?
|
||||
File.basename(framework_name)
|
||||
else
|
||||
nil
|
||||
end
|
||||
generate_framework_path.children().map do |framework_path|
|
||||
if framework_path.directory? && (not framework_path.children.empty?)
|
||||
[framework_path.basename.to_s, pod_name_for_target_folder(framework_path)]
|
||||
else
|
||||
nil
|
||||
end
|
||||
end.reject(&:nil?)
|
||||
end.reject(&:nil?).uniq
|
||||
end
|
||||
|
||||
def framework_existed?(root_name)
|
||||
return false unless generate_framework_path.exist?
|
||||
generate_framework_path.children().any? do |child|
|
||||
child.basename.to_s == root_name
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@ -15,11 +15,12 @@ def build_for_iosish_platform(sandbox,
|
||||
target,
|
||||
device,
|
||||
simulator,
|
||||
bitcode_enabled)
|
||||
bitcode_enabled,
|
||||
simulator_default_arch)
|
||||
|
||||
deployment_target = target.platform.deployment_target.to_s
|
||||
|
||||
target_label = target.label
|
||||
target_label = target.label # name with platform if it's used in multiple platforms
|
||||
Pod::UI.puts "Prebuilding #{target_label}..."
|
||||
|
||||
other_options = []
|
||||
@ -27,13 +28,13 @@ def build_for_iosish_platform(sandbox,
|
||||
other_options += ['OTHER_CFLAGS="-fembed-bitcode"']
|
||||
end
|
||||
xcodebuild(sandbox, target_label, device, deployment_target, other_options)
|
||||
xcodebuild(sandbox, target_label, simulator, deployment_target, other_options + ['ARCHS=x86_64', 'ONLY_ACTIVE_ARCH=NO'])
|
||||
xcodebuild(sandbox, target_label, simulator, deployment_target, other_options + ["ARCHS=#{simulator_default_arch}",'ONLY_ACTIVE_ARCH=NO'])
|
||||
|
||||
# paths
|
||||
root_name = target.pod_name
|
||||
target_name = target.name # equals target.label, like "AFNeworking-iOS" when AFNetworking is used in multiple platforms.
|
||||
module_name = target.product_module_name
|
||||
device_framwork_path = "#{build_dir}/#{CONFIGURATION}-#{device}/#{root_name}/#{module_name}.framework"
|
||||
simulator_framwork_path = "#{build_dir}/#{CONFIGURATION}-#{simulator}/#{root_name}/#{module_name}.framework"
|
||||
device_framwork_path = "#{build_dir}/#{CONFIGURATION}-#{device}/#{target_name}/#{module_name}.framework"
|
||||
simulator_framwork_path = "#{build_dir}/#{CONFIGURATION}-#{simulator}/#{target_name}/#{module_name}.framework"
|
||||
|
||||
device_binary = device_framwork_path + "/#{module_name}"
|
||||
simulator_binary = simulator_framwork_path + "/#{module_name}"
|
||||
@ -41,7 +42,7 @@ def build_for_iosish_platform(sandbox,
|
||||
|
||||
# the device_lib path is the final output file path
|
||||
# combine the bianries
|
||||
tmp_lipoed_binary_path = "#{build_dir}/#{root_name}"
|
||||
tmp_lipoed_binary_path = "#{build_dir}/#{target_name}"
|
||||
lipo_log = `lipo -create -output #{tmp_lipoed_binary_path} #{device_binary} #{simulator_binary}`
|
||||
puts lipo_log unless File.exist?(tmp_lipoed_binary_path)
|
||||
FileUtils.mv tmp_lipoed_binary_path, device_binary, :force => true
|
||||
@ -93,10 +94,10 @@ module Pod
|
||||
|
||||
# -- build the framework
|
||||
case target.platform.name
|
||||
when :ios then build_for_iosish_platform(sandbox, build_dir, output_path, target, 'iphoneos', 'iphonesimulator', bitcode_enabled)
|
||||
when :ios then build_for_iosish_platform(sandbox, build_dir, output_path, target, 'iphoneos', 'iphonesimulator', bitcode_enabled, "x86_64")
|
||||
when :osx then xcodebuild(sandbox, target.label)
|
||||
# when :tvos then build_for_iosish_platform(sandbox, build_dir, target, 'appletvos', 'appletvsimulator')
|
||||
# when :watchos then build_for_iosish_platform(sandbox, build_dir, target, 'watchos', 'watchsimulator')
|
||||
when :watchos then build_for_iosish_platform(sandbox, build_dir, output_path, target, 'watchos', 'watchsimulator', true, "i386")
|
||||
else raise "Unsupported platform for '#{target.name}': '#{target.platform.name}'" end
|
||||
|
||||
raise Pod::Informative, 'The build directory was not found in the expected location.' unless build_dir.directory?
|
||||
|
||||
@ -10,9 +10,59 @@
|
||||
3E1E218020A0B66900EFA102 /* import.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E1E217F20A0B66900EFA102 /* import.swift */; };
|
||||
3E83E326207BC00E0057855A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E83E325207BC00E0057855A /* AppDelegate.swift */; };
|
||||
3E83E328207BC00E0057855A /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E83E327207BC00E0057855A /* ViewController.swift */; };
|
||||
3EEAFD8720F1056D009A9D22 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3EEAFD8520F1056D009A9D22 /* Interface.storyboard */; };
|
||||
3EEAFD8920F1056D009A9D22 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3EEAFD8820F1056D009A9D22 /* Assets.xcassets */; };
|
||||
3EEAFD9020F1056E009A9D22 /* BinaryWatch Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 3EEAFD8F20F1056E009A9D22 /* BinaryWatch Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||
3EEAFD9520F1056E009A9D22 /* InterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EEAFD9420F1056E009A9D22 /* InterfaceController.swift */; };
|
||||
3EEAFD9720F1056E009A9D22 /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EEAFD9620F1056E009A9D22 /* ExtensionDelegate.swift */; };
|
||||
3EEAFD9920F1056E009A9D22 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3EEAFD9820F1056E009A9D22 /* Assets.xcassets */; };
|
||||
3EEAFD9D20F1056E009A9D22 /* BinaryWatch.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 3EEAFD8320F1056D009A9D22 /* BinaryWatch.app */; };
|
||||
3EEAFDA720F10610009A9D22 /* import.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EEAFDA620F10610009A9D22 /* import.swift */; };
|
||||
AEBC61E3160A9AC38C3A210D /* Pods_Binary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5687B1A81F152DBEF5CD4432 /* Pods_Binary.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
3EEAFD9120F1056E009A9D22 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 3E83E31A207BC00E0057855A /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 3EEAFD8E20F1056E009A9D22;
|
||||
remoteInfo = "BinaryWatch Extension";
|
||||
};
|
||||
3EEAFD9B20F1056E009A9D22 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 3E83E31A207BC00E0057855A /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 3EEAFD8220F1056D009A9D22;
|
||||
remoteInfo = BinaryWatch;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
3EEAFDA320F1056E009A9D22 /* Embed App Extensions */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 13;
|
||||
files = (
|
||||
3EEAFD9020F1056E009A9D22 /* BinaryWatch Extension.appex in Embed App Extensions */,
|
||||
);
|
||||
name = "Embed App Extensions";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
3EEAFDA520F1056E009A9D22 /* Embed Watch Content */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "$(CONTENTS_FOLDER_PATH)/Watch";
|
||||
dstSubfolderSpec = 16;
|
||||
files = (
|
||||
3EEAFD9D20F1056E009A9D22 /* BinaryWatch.app in Embed Watch Content */,
|
||||
);
|
||||
name = "Embed Watch Content";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
1856F5E2BE44EDB1E470521A /* Pods-Binary.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Binary.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Binary/Pods-Binary.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
3E1E217F20A0B66900EFA102 /* import.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = import.swift; sourceTree = "<group>"; };
|
||||
@ -20,6 +70,16 @@
|
||||
3E83E325207BC00E0057855A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
3E83E327207BC00E0057855A /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
|
||||
3E83E331207BC0120057855A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
3EEAFD8320F1056D009A9D22 /* BinaryWatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BinaryWatch.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3EEAFD8620F1056D009A9D22 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = "<group>"; };
|
||||
3EEAFD8820F1056D009A9D22 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
3EEAFD8A20F1056E009A9D22 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
3EEAFD8F20F1056E009A9D22 /* BinaryWatch Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "BinaryWatch Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3EEAFD9420F1056E009A9D22 /* InterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterfaceController.swift; sourceTree = "<group>"; };
|
||||
3EEAFD9620F1056E009A9D22 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = "<group>"; };
|
||||
3EEAFD9820F1056E009A9D22 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
3EEAFD9A20F1056E009A9D22 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
3EEAFDA620F10610009A9D22 /* import.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = import.swift; sourceTree = "<group>"; };
|
||||
5687B1A81F152DBEF5CD4432 /* Pods_Binary.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Binary.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
7EB848DBE64BD495BCC04ECC /* Pods-Binary.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Binary.release.xcconfig"; path = "Pods/Target Support Files/Pods-Binary/Pods-Binary.release.xcconfig"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
@ -33,6 +93,13 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
3EEAFD8C20F1056E009A9D22 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
@ -40,6 +107,8 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3E83E324207BC00E0057855A /* Binary */,
|
||||
3EEAFD8420F1056D009A9D22 /* BinaryWatch */,
|
||||
3EEAFD9320F1056E009A9D22 /* BinaryWatch Extension */,
|
||||
3E83E323207BC00E0057855A /* Products */,
|
||||
E8117D681BF19C1B3D847824 /* Pods */,
|
||||
8E13F0A6AED19C681C2CD7D5 /* Frameworks */,
|
||||
@ -50,6 +119,8 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3E83E322207BC00E0057855A /* Binary.app */,
|
||||
3EEAFD8320F1056D009A9D22 /* BinaryWatch.app */,
|
||||
3EEAFD8F20F1056E009A9D22 /* BinaryWatch Extension.appex */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
@ -65,6 +136,28 @@
|
||||
path = Binary;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3EEAFD8420F1056D009A9D22 /* BinaryWatch */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3EEAFD8520F1056D009A9D22 /* Interface.storyboard */,
|
||||
3EEAFD8820F1056D009A9D22 /* Assets.xcassets */,
|
||||
3EEAFD8A20F1056E009A9D22 /* Info.plist */,
|
||||
);
|
||||
path = BinaryWatch;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3EEAFD9320F1056E009A9D22 /* BinaryWatch Extension */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3EEAFD9420F1056E009A9D22 /* InterfaceController.swift */,
|
||||
3EEAFD9620F1056E009A9D22 /* ExtensionDelegate.swift */,
|
||||
3EEAFDA620F10610009A9D22 /* import.swift */,
|
||||
3EEAFD9820F1056E009A9D22 /* Assets.xcassets */,
|
||||
3EEAFD9A20F1056E009A9D22 /* Info.plist */,
|
||||
);
|
||||
path = "BinaryWatch Extension";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
8E13F0A6AED19C681C2CD7D5 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -94,29 +187,71 @@
|
||||
3E83E31F207BC00E0057855A /* Frameworks */,
|
||||
3E83E320207BC00E0057855A /* Resources */,
|
||||
9937F6A880D56826534273F0 /* [CP] Embed Pods Frameworks */,
|
||||
3EEAFDA520F1056E009A9D22 /* Embed Watch Content */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
3EEAFD9C20F1056E009A9D22 /* PBXTargetDependency */,
|
||||
);
|
||||
name = Binary;
|
||||
productName = Binary;
|
||||
productReference = 3E83E322207BC00E0057855A /* Binary.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
3EEAFD8220F1056D009A9D22 /* BinaryWatch */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 3EEAFDA420F1056E009A9D22 /* Build configuration list for PBXNativeTarget "BinaryWatch" */;
|
||||
buildPhases = (
|
||||
3EEAFD8120F1056D009A9D22 /* Resources */,
|
||||
3EEAFDA320F1056E009A9D22 /* Embed App Extensions */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
3EEAFD9220F1056E009A9D22 /* PBXTargetDependency */,
|
||||
);
|
||||
name = BinaryWatch;
|
||||
productName = BinaryWatch;
|
||||
productReference = 3EEAFD8320F1056D009A9D22 /* BinaryWatch.app */;
|
||||
productType = "com.apple.product-type.application.watchapp2";
|
||||
};
|
||||
3EEAFD8E20F1056E009A9D22 /* BinaryWatch Extension */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 3EEAFDA220F1056E009A9D22 /* Build configuration list for PBXNativeTarget "BinaryWatch Extension" */;
|
||||
buildPhases = (
|
||||
3EEAFD8B20F1056E009A9D22 /* Sources */,
|
||||
3EEAFD8C20F1056E009A9D22 /* Frameworks */,
|
||||
3EEAFD8D20F1056E009A9D22 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = "BinaryWatch Extension";
|
||||
productName = "BinaryWatch Extension";
|
||||
productReference = 3EEAFD8F20F1056E009A9D22 /* BinaryWatch Extension.appex */;
|
||||
productType = "com.apple.product-type.watchkit2-extension";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
3E83E31A207BC00E0057855A /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastSwiftUpdateCheck = 0930;
|
||||
LastSwiftUpdateCheck = 1000;
|
||||
LastUpgradeCheck = 0930;
|
||||
ORGANIZATIONNAME = me.leavez;
|
||||
TargetAttributes = {
|
||||
3E83E321207BC00E0057855A = {
|
||||
CreatedOnToolsVersion = 9.3;
|
||||
};
|
||||
3EEAFD8220F1056D009A9D22 = {
|
||||
CreatedOnToolsVersion = 10.0;
|
||||
};
|
||||
3EEAFD8E20F1056E009A9D22 = {
|
||||
CreatedOnToolsVersion = 10.0;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 3E83E31D207BC00E0057855A /* Build configuration list for PBXProject "Binary" */;
|
||||
@ -133,6 +268,8 @@
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
3E83E321207BC00E0057855A /* Binary */,
|
||||
3EEAFD8220F1056D009A9D22 /* BinaryWatch */,
|
||||
3EEAFD8E20F1056E009A9D22 /* BinaryWatch Extension */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
@ -145,6 +282,23 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
3EEAFD8120F1056D009A9D22 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
3EEAFD8920F1056D009A9D22 /* Assets.xcassets in Resources */,
|
||||
3EEAFD8720F1056D009A9D22 /* Interface.storyboard in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
3EEAFD8D20F1056E009A9D22 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
3EEAFD9920F1056E009A9D22 /* Assets.xcassets in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
@ -199,8 +353,42 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
3EEAFD8B20F1056E009A9D22 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
3EEAFD9720F1056E009A9D22 /* ExtensionDelegate.swift in Sources */,
|
||||
3EEAFDA720F10610009A9D22 /* import.swift in Sources */,
|
||||
3EEAFD9520F1056E009A9D22 /* InterfaceController.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
3EEAFD9220F1056E009A9D22 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 3EEAFD8E20F1056E009A9D22 /* BinaryWatch Extension */;
|
||||
targetProxy = 3EEAFD9120F1056E009A9D22 /* PBXContainerItemProxy */;
|
||||
};
|
||||
3EEAFD9C20F1056E009A9D22 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 3EEAFD8220F1056D009A9D22 /* BinaryWatch */;
|
||||
targetProxy = 3EEAFD9B20F1056E009A9D22 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
3EEAFD8520F1056D009A9D22 /* Interface.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
3EEAFD8620F1056D009A9D22 /* Base */,
|
||||
);
|
||||
name = Interface.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
3E83E332207BC0120057855A /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
@ -322,7 +510,10 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
INFOPLIST_FILE = Binary/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = me.leavez.Binary;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 4.0;
|
||||
@ -336,7 +527,10 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
INFOPLIST_FILE = Binary/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = me.leavez.Binary;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 4.0;
|
||||
@ -344,6 +538,86 @@
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
3EEAFD9E20F1056E009A9D22 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
IBSC_MODULE = BinaryWatch_Extension;
|
||||
INFOPLIST_FILE = BinaryWatch/Info.plist;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = me.leavez.Binary.watchkitapp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = watchos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_VERSION = 4.2;
|
||||
TARGETED_DEVICE_FAMILY = 4;
|
||||
WATCHOS_DEPLOYMENT_TARGET = 5.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
3EEAFD9F20F1056E009A9D22 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
IBSC_MODULE = BinaryWatch_Extension;
|
||||
INFOPLIST_FILE = BinaryWatch/Info.plist;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = me.leavez.Binary.watchkitapp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = watchos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_VERSION = 4.2;
|
||||
TARGETED_DEVICE_FAMILY = 4;
|
||||
WATCHOS_DEPLOYMENT_TARGET = 5.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
3EEAFDA020F1056E009A9D22 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
INFOPLIST_FILE = "BinaryWatch Extension/Info.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = me.leavez.Binary.watchkitapp.watchkitextension;
|
||||
PRODUCT_NAME = "${TARGET_NAME}";
|
||||
SDKROOT = watchos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_VERSION = 4.2;
|
||||
TARGETED_DEVICE_FAMILY = 4;
|
||||
WATCHOS_DEPLOYMENT_TARGET = 5.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
3EEAFDA120F1056E009A9D22 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
INFOPLIST_FILE = "BinaryWatch Extension/Info.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = me.leavez.Binary.watchkitapp.watchkitextension;
|
||||
PRODUCT_NAME = "${TARGET_NAME}";
|
||||
SDKROOT = watchos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_VERSION = 4.2;
|
||||
TARGETED_DEVICE_FAMILY = 4;
|
||||
WATCHOS_DEPLOYMENT_TARGET = 5.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
@ -365,6 +639,24 @@
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
3EEAFDA220F1056E009A9D22 /* Build configuration list for PBXNativeTarget "BinaryWatch Extension" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
3EEAFDA020F1056E009A9D22 /* Debug */,
|
||||
3EEAFDA120F1056E009A9D22 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
3EEAFDA420F1056E009A9D22 /* Build configuration list for PBXNativeTarget "BinaryWatch" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
3EEAFD9E20F1056E009A9D22 /* Debug */,
|
||||
3EEAFD9F20F1056E009A9D22 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 3E83E31A207BC00E0057855A /* Project object */;
|
||||
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"screen-width" : "<=145"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"screen-width" : ">145"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,28 @@
|
||||
{
|
||||
"assets" : [
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"filename" : "Circular.imageset",
|
||||
"role" : "circular"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"filename" : "Extra Large.imageset",
|
||||
"role" : "extra-large"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"filename" : "Modular.imageset",
|
||||
"role" : "modular"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"filename" : "Utilitarian.imageset",
|
||||
"role" : "utilitarian"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"screen-width" : "<=145"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"screen-width" : ">145"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"screen-width" : "<=145"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"screen-width" : ">145"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"screen-width" : "<=145"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"screen-width" : ">145"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
6
test/BinaryWatch Extension/Assets.xcassets/Contents.json
Normal file
6
test/BinaryWatch Extension/Assets.xcassets/Contents.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
21
test/BinaryWatch Extension/ExtensionDelegate.swift
Normal file
21
test/BinaryWatch Extension/ExtensionDelegate.swift
Normal file
@ -0,0 +1,21 @@
|
||||
//
|
||||
// ExtensionDelegate.swift
|
||||
// BinaryWatch Extension
|
||||
//
|
||||
// Created by Gao on 2018/7/7.
|
||||
// Copyright © 2018 me.leavez. All rights reserved.
|
||||
//
|
||||
|
||||
import WatchKit
|
||||
|
||||
class ExtensionDelegate: NSObject, WKExtensionDelegate {
|
||||
|
||||
func applicationDidFinishLaunching() {
|
||||
// Perform any final initialization of your application.
|
||||
}
|
||||
|
||||
func applicationDidBecomeActive() {
|
||||
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
|
||||
}
|
||||
|
||||
}
|
||||
36
test/BinaryWatch Extension/Info.plist
Normal file
36
test/BinaryWatch Extension/Info.plist
Normal file
@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>BinaryWatch Extension</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>XPC!</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>NSExtension</key>
|
||||
<dict>
|
||||
<key>NSExtensionAttributes</key>
|
||||
<dict>
|
||||
<key>WKAppBundleIdentifier</key>
|
||||
<string>me.leavez.Binary.watchkitapp</string>
|
||||
</dict>
|
||||
<key>NSExtensionPointIdentifier</key>
|
||||
<string>com.apple.watchkit</string>
|
||||
</dict>
|
||||
<key>WKExtensionDelegateClassName</key>
|
||||
<string>$(PRODUCT_MODULE_NAME).ExtensionDelegate</string>
|
||||
</dict>
|
||||
</plist>
|
||||
31
test/BinaryWatch Extension/InterfaceController.swift
Normal file
31
test/BinaryWatch Extension/InterfaceController.swift
Normal file
@ -0,0 +1,31 @@
|
||||
//
|
||||
// InterfaceController.swift
|
||||
// BinaryWatch Extension
|
||||
//
|
||||
// Created by Gao on 2018/7/7.
|
||||
// Copyright © 2018 me.leavez. All rights reserved.
|
||||
//
|
||||
|
||||
import WatchKit
|
||||
import Foundation
|
||||
|
||||
|
||||
class InterfaceController: WKInterfaceController {
|
||||
|
||||
override func awake(withContext context: Any?) {
|
||||
super.awake(withContext: context)
|
||||
|
||||
// Configure interface objects here.
|
||||
}
|
||||
|
||||
override func willActivate() {
|
||||
// This method is called when watch view controller is about to be visible to user
|
||||
super.willActivate()
|
||||
}
|
||||
|
||||
override func didDeactivate() {
|
||||
// This method is called when watch view controller is no longer visible
|
||||
super.didDeactivate()
|
||||
}
|
||||
|
||||
}
|
||||
1
test/BinaryWatch Extension/import.swift
Normal file
1
test/BinaryWatch Extension/import.swift
Normal file
@ -0,0 +1 @@
|
||||
|
||||
@ -0,0 +1,67 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"size" : "24x24",
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"role" : "notificationCenter",
|
||||
"subtype" : "38mm"
|
||||
},
|
||||
{
|
||||
"size" : "27.5x27.5",
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"role" : "notificationCenter",
|
||||
"subtype" : "42mm"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "watch",
|
||||
"role" : "companionSettings",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "watch",
|
||||
"role" : "companionSettings",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"role" : "appLauncher",
|
||||
"subtype" : "38mm"
|
||||
},
|
||||
{
|
||||
"size" : "44x44",
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"role" : "longLook",
|
||||
"subtype" : "42mm"
|
||||
},
|
||||
{
|
||||
"size" : "86x86",
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"role" : "quickLook",
|
||||
"subtype" : "38mm"
|
||||
},
|
||||
{
|
||||
"size" : "98x98",
|
||||
"idiom" : "watch",
|
||||
"scale" : "2x",
|
||||
"role" : "quickLook",
|
||||
"subtype" : "42mm"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch-marketing",
|
||||
"size" : "1024x1024",
|
||||
"scale" : "1x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
6
test/BinaryWatch/Assets.xcassets/Contents.json
Normal file
6
test/BinaryWatch/Assets.xcassets/Contents.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
15
test/BinaryWatch/Base.lproj/Interface.storyboard
Normal file
15
test/BinaryWatch/Base.lproj/Interface.storyboard
Normal file
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder.WatchKit.Storyboard" version="3.0" toolsVersion="11134" targetRuntime="watchKit" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="AgC-eL-Hgc">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11106"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBWatchKitPlugin" version="11055"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Interface Controller-->
|
||||
<scene sceneID="aou-V4-d1y">
|
||||
<objects>
|
||||
<controller id="AgC-eL-Hgc" customClass="InterfaceController" customModuleProvider="target"/>
|
||||
</objects>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
33
test/BinaryWatch/Info.plist
Normal file
33
test/BinaryWatch/Info.plist
Normal file
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>Binary</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
</array>
|
||||
<key>WKCompanionAppBundleIdentifier</key>
|
||||
<string>me.leavez.Binary</string>
|
||||
<key>WKWatchKitApp</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -25,6 +25,12 @@ def save_to_podfile(text):
|
||||
file.write(text[1])
|
||||
file.close()
|
||||
|
||||
path = os.path.dirname(os.path.abspath(__file__))
|
||||
path += "/BinaryWatch Extension/import.swift"
|
||||
file = open(path, "w+")
|
||||
file.write( "" if len(text) <= 2 else text[2])
|
||||
file.close()
|
||||
|
||||
|
||||
|
||||
def initial():
|
||||
@ -36,6 +42,9 @@ pod "Masonry"
|
||||
"""),
|
||||
"""
|
||||
import Masonry
|
||||
class A {
|
||||
let d = UIView().mas_top
|
||||
}
|
||||
""")
|
||||
|
||||
def addSwiftPod():
|
||||
@ -49,6 +58,10 @@ pod "Literal", :binary => true
|
||||
"""
|
||||
import RxCocoa
|
||||
import Literal
|
||||
class A {
|
||||
let a: CGRect = [1,2,3,4]
|
||||
func dd() { NSObject().rx.observe(CGRect.self, "frame") }
|
||||
}
|
||||
""")
|
||||
|
||||
def revertToSourceCode():
|
||||
@ -61,7 +74,13 @@ pod "Literal"
|
||||
"""),
|
||||
"""
|
||||
import RxCocoa
|
||||
import RxSwift
|
||||
import Literal
|
||||
class A {
|
||||
let a: CGRect = [1,2,3,4]
|
||||
let b = Observable.just(1)
|
||||
func dd() { NSObject().rx.observe(CGRect.self, "frame") }
|
||||
}
|
||||
""")
|
||||
|
||||
def addDifferentNamePod():
|
||||
@ -77,6 +96,11 @@ pod "lottie-ios", :binary => true
|
||||
import Masonry
|
||||
import Literal
|
||||
import Lottie
|
||||
class A {
|
||||
let a: CGRect = [1,2,3,4]
|
||||
let a2 = LOTAnimationView.self
|
||||
let d = UIView().mas_top
|
||||
}
|
||||
""")
|
||||
|
||||
|
||||
@ -93,6 +117,12 @@ import Masonry
|
||||
import Literal
|
||||
import Lottie
|
||||
import AFNetworking
|
||||
class A {
|
||||
let a: CGRect = [1,2,3,4]
|
||||
let a2 = LOTAnimationView.self
|
||||
let b = AFNetworkReachabilityManager()
|
||||
let d = UIView().mas_top
|
||||
}
|
||||
""")
|
||||
|
||||
def addVendoredLibPod():
|
||||
@ -107,6 +137,11 @@ pod "GrowingIO", :binary => true
|
||||
import Literal
|
||||
import AFNetworking
|
||||
import Instabug
|
||||
class A {
|
||||
let a: CGRect = [1,2,3,4]
|
||||
let b = AFNetworkReachabilityManager()
|
||||
let c = Instabug.self
|
||||
}
|
||||
""")
|
||||
|
||||
def deleteAPod():
|
||||
@ -118,6 +153,10 @@ pod "AFNetworking/Reachability", :binary => true
|
||||
"""
|
||||
import Literal
|
||||
import AFNetworking
|
||||
class A {
|
||||
let a: CGRect = [1,2,3,4]
|
||||
let b = AFNetworkReachabilityManager()
|
||||
}
|
||||
""")
|
||||
|
||||
def universalFlag():
|
||||
@ -131,9 +170,67 @@ pod "AFNetworking/Reachability"
|
||||
"""
|
||||
import Literal
|
||||
import AFNetworking
|
||||
class A {
|
||||
let a: CGRect = [1,2,3,4]
|
||||
let b = AFNetworkReachabilityManager()
|
||||
}
|
||||
""")
|
||||
|
||||
def multiplePlatforms():
|
||||
return (wrapper(
|
||||
"""
|
||||
pod "Literal", :binary => true
|
||||
pod "AFNetworking/Serialization", :binary => true
|
||||
end
|
||||
|
||||
target 'BinaryWatch Extension' do
|
||||
platform :watchos
|
||||
pod "AFNetworking/Serialization", :binary => true
|
||||
""") ,
|
||||
"""
|
||||
import Literal
|
||||
import AFNetworking
|
||||
class A {
|
||||
let a: CGRect = [1,2,3,4]
|
||||
func dd() { _ = AFURLRequestSerializationErrorDomain }
|
||||
}
|
||||
""",
|
||||
"""
|
||||
import AFNetworking
|
||||
class A {
|
||||
func dd() { _ = AFURLRequestSerializationErrorDomain }
|
||||
}
|
||||
"""
|
||||
)
|
||||
|
||||
def multiplePlatformsWithALLFlag():
|
||||
return (wrapper(
|
||||
"""
|
||||
all_binary!
|
||||
|
||||
pod "Literal"
|
||||
pod "AFNetworking/Serialization"
|
||||
end
|
||||
|
||||
target 'BinaryWatch Extension' do
|
||||
platform :watchos
|
||||
pod "AFNetworking/Serialization"
|
||||
""") ,
|
||||
"""
|
||||
import Literal
|
||||
import AFNetworking
|
||||
class A {
|
||||
let a: CGRect = [1,2,3,4]
|
||||
func dd() { _ = AFURLRequestSerializationErrorDomain }
|
||||
}
|
||||
""",
|
||||
"""
|
||||
import AFNetworking
|
||||
class A {
|
||||
func dd() { _ = AFURLRequestSerializationErrorDomain }
|
||||
}
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
BIN
test/logo.png
Normal file
BIN
test/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.3 KiB |
10
test/test.sh
10
test/test.sh
@ -46,5 +46,15 @@ python change_podfile.py "universalFlag"
|
||||
pod install
|
||||
build
|
||||
|
||||
#
|
||||
python change_podfile.py "multiplePlatforms"
|
||||
pod install
|
||||
build
|
||||
|
||||
#
|
||||
python change_podfile.py "multiplePlatformsWithALLFlag"
|
||||
pod install
|
||||
build
|
||||
|
||||
#
|
||||
exit 0
|
||||
|
||||
Loading…
Reference in New Issue
Block a user