Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
294 views
in Technique[技术] by (71.8m points)

xcode6 - How to include AFNetworking as a Framework for using in an iOS App and Extension via CocoaPods

NB: This is related to this question on project structure, but I have decided to a vastly the use-case to better abstract the problem.

Problem

How do I include in my iOS App and an accompanying iOS Extension (, or ) via CocoaPods?

Issues

  • For use in Extensions, AFNetworking needs to be build with #define AF_APP_EXTENSIONS, does this mean I need 2 versions AFNetworking? One for the Extension and one for the App?

  • How do I set up the Podfile so frameworks are built and copied to the correct places? Documentation on use_frameworks! is a bit thin.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Update:

As Rhythmic Fistman mentioned the original answer's method gets overwritten when doing a new pod install.

Aelam provided the following method in this Github issue:

Add this to your podfile. remember to replace the target name

post_install do |installer_representation|
    installer_representation.project.targets.each do |target|
        if target.name == "Pods-YOU_EXTENSION_TARGET-AFNetworking"
            target.build_configurations.each do |config|
                    config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'AF_APP_EXTENSIONS=1']
            end
        end
    end
end

Obsolete answer:

1) Be sure that pod 'AFNetworking' is included for both targets (your container app and extension) in your podfile.

Example in my case:

target 'ContainerAppTarget', :exclusive => true do
  pod "SDKThatInternallyUsesAFNetworking"
end

target 'ExtensionTarget', :exclusive => true do
   pod 'AFNetworking'
end

2) In XCode, click on Pods on the hierarchy view to bring its build options. Then on the build options, select the target for which you are looking at the build options in the dropdown. There select Pods-{Extension Target Name}-AFNetworking (it should have been created automatically by pod install. Then select Build Settings. Then under Apple LLVM 6.0 - Language, verify that Prefix header has a filename. That filename on my case was Target Support Files/Pods-{Extension Target Name}-AFNetworking/Pods-{Extension Target Name}-AFNetworking-prefix.pch. If it doesn't have such a filename or similar then add it.

3) Go to that prefix header file that was named there or you added there. It'll be almost empty, then add the following line at the end:

#define AF_APP_EXTENSIONS

That should allow your container app to point to a version of AFNetworking built normally and your extension app to another built with the flag set. So only one version of the library but built in two different ways, each on one of the targets.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...