Xcode: Copy Headers: Public vs. Private vs. Project?

XcodeHeaderStatic Libraries

Xcode Problem Overview


I'm building a Cocoa Touch Static Library. How should I decide whether to copy a header file as public, private, or project?

Xcode Solutions


Solution 1 - Xcode

> Public: The interface is finalized and meant to be used by your product’s clients. A public header is included in the product as readable source code without restriction. > > Private: The interface isn’t intended for your clients or it’s in early stages of development. A private header is included in the product, but it’s marked “private”. Thus the symbols are visible to all clients, but clients should understand that they're not supposed to use them. > > Project: The interface is for use only by implementation files in the current project. A project header is not included in the target, except in object code. The symbols are not visible to clients at all, only to you.

Source: Xcode Developer Library > Tools & Languages > IDEs > Project Editor Help > Setting the Visibility of a Header File

Solution 2 - Xcode

Randy's answer is good and gives you all the relevant background. I wanted to add some info to help you based on how you expect your library will be used.

PROJECT: If you are distributing your project, and expect users to include your project as a sub-project in their own, you should ensure your headers are marked as 'project'. Not doing so will lead to issues like this: https://stackoverflow.com/questions/5332115/xcode-4-archive-version-unspecified

Note that this applies to every sub-project...including sub-projects of sub-projects, recursively.

PUBLIC: If you expect users of your library to only link against your object (and NOT have your original project), make sure your headers are marked as 'public' (only for headers they'll need to refer to).

Solution 3 - Xcode

Objective-C Headers: Public, Private, Project

[Objective-C static library manual]
[Target Membership]

public - API which is exposed for consumer

private - API which is exposed for consumer but it is risky to use it

project - API is not visible for consumer. A kind of encapsulation on module level

File structure

ClassA.h - public
ClassB.h - project
ClassC.h - private

https://i.stack.imgur.com/PAgmF.png" height="200" />

Headers folder is set by:

Public Headers Folder Path(PUBLIC_HEADERS_FOLDER_PATH)
//default value is
$(CONTENTS_FOLDER_PATH)/Headers

PrivateHeaders folder is set by:

Private Headers Folder Path(PRIVATE_HEADERS_FOLDER_PATH)
//default value is
$(CONTENTS_FOLDER_PATH)/PrivateHeaders

https://i.stack.imgur.com/cERXo.png" height="200" />

1.To expose Objective-C code for Objective-C or Swift consumers you should use .modulemap and public headers

//Swift
import SomeModule

//Objective-C
@import SomeModule;

[.modulemap] -> only public headers or error

2.To expose Objective-C code for Objective-C consumer with non-module usage

//Objective-C

//umbrella
#import <ObjCFramework/ObjCFramework.h>

//specific руфвук
#import <ObjCFramework/ClassA.h>
//#import <ObjCFramework/ClassB.h> //error
#import <ObjCFramework/ClassC.h>

when you import a project header you get

Showing All Messages
'ObjCFramework/ClassB.h' file not found

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionma11hew28View Question on Stackoverflow
Solution 1 - XcodeConstantino TsarouhasView Answer on Stackoverflow
Solution 2 - XcodeWilliam PowerView Answer on Stackoverflow
Solution 3 - XcodeyoAlex5View Answer on Stackoverflow