无法找到使用我的主应用目标构建自己的框架目标的正确方法

时间:2017-10-11 10:41:36

标签: ios swift xcode cocoapods

我决定将我的主项目拆分为两部分,以便在iOS小部件中重用代码。

所以我在xcworkspace(cocoa touch framework)中创建了一个新的目标文件。 两个目标都有一些共同的pod依赖关系,我无法确定正确的构建方式。

Xcode targets

首先尝试:

在podfile中,我已为两个目标指定了所需的广告连播,但在构建时,我发现了多个错误

  

Class Foo在MyApp和MyFramework中实现。将使用两者之一。哪一个未定义。

第二次尝试:

然后我尝试将框架目标放在主应用目标中(就像我们通常使用测试目标一样)

target 'MyApp' do
    main_pods
    app_pods

    target 'MyFramework' do
        inherit! :search_paths

        target 'MyFrameworkTests' do
            inherit! :search_paths
            testing_pods
        end
    end
end

然后框架不会构建,因为它没有找到依赖项 例如:

  

没有这样的模块Firebase

注意

为了构建我的主要目标,我首先要构建框架目标,否则它无法找到“我的框架”'模块。在构建主要目标时无法构建两者?

2 个答案:

答案 0 :(得分:1)

我还有一个应用程序,我在一个单独的项目中创建了一个框架,但是同一个工作区。我使用pod来获取所有外部库,并通过将其添加到Xcode中的Embedded Binaries将我自己的框架嵌入到应用程序的目标中。我的Podfile如下所示:

workspace 'MyApp'

abstract_target 'BasePods' do
    use_frameworks!

    pod 'Alamofire', '~> 4.4'
    pod 'PromiseKit', '~> 4.1'
    project '../MyAppProject/MyApp/MyApp.xcodeproj'

    target 'MyApp'
    target 'MyAppDevelopment'
end

target 'MyAppCore' do
  use_frameworks!

    pod 'Alamofire', '~> 4.4'
    pod 'PromiseKit', '~> 4.1'
    project '../MyAppProject/MyAppCore/MyAppCore.xcodeproj'

      target 'MyAppCoreTests' do
    inherit! :search_paths
    end
end

这里发生了什么我创建了两个独立的pod目标 - 一个用于app,另一个用于框架。我拆分它们因为它们位于不同的目录中。

答案 1 :(得分:1)

知道了,我有静态库框架依赖项,iOS链接器不支持动态库的静态库依赖项。

CF问题:https://github.com/CocoaPods/CocoaPods/issues/7126

我已通过上述问题中的解决方法通过Podfile解决了这个问题:

post_install do |installer|
    sharedLibrary = installer.aggregate_targets.find { |aggregate_target| aggregate_target.name == 'Pods-SampleFramework' }
    installer.aggregate_targets.each do |aggregate_target|
        if aggregate_target.name == 'Pods-SampleApp'
            aggregate_target.xcconfigs.each do |config_name, config_file|
                sharedLibraryPodTargets = sharedLibrary.pod_targets
                aggregate_target.pod_targets.select { |pod_target| sharedLibraryPodTargets.include?(pod_target) }.each do |pod_target|
                    pod_target.specs.each do |spec|
                        frameworkPaths = unless spec.attributes_hash['ios'].nil? then spec.attributes_hash['ios']['vendored_frameworks'] else spec.attributes_hash['vendored_frameworks'] end || Set.new
                        frameworkNames = Array(frameworkPaths).map(&:to_s).map do |filename|
                            extension = File.extname filename
                            File.basename filename, extension
                        end
                        frameworkNames.each do |name|
                            puts "Removing #{name} from OTHER_LDFLAGS"
                            config_file.frameworks.delete(name)
                        end
                    end
                end
                xcconfig_path = aggregate_target.xcconfig_path(config_name)
                config_file.save_as(xcconfig_path)
            end
        end
    end
end