public header files in iOS static library - ios

I have developed static library for my applications. It generates .framework, .bundle, .a files.
I want to enhance the use of library. Currently my framework has 4-5 files as public scope to application. Only those headers are visible to application (Interface). Is there any way to create common header file at build time of framework, which will contain/ imports of all public files from my source code(frame work code.)
e.g. once I build framework code, it will generate .framework which will create/have common.h header file consisting all imports of public files.
By doing this, application needs to import only common.h. I know we can do this manually also. But is there any scope to do this by script at build time?
Thanks.

I tried using script I got success!
Here are the steps:
1. In build script where we create fat binary, we need to find out all .h headers. We need to take path in variable.
2. Loop and collect all public variable
3. Create and locate common.h (This will be path of header folder in .framework)
4. Put all files common.h

Related

How to create a framework from a C library with nested headers

I want to create a iOS framework for a popular C library.
My Current Setup:
This is what I'm doing:
Build the library for iOS and iPhone simulator architectures
Combine the two archive .a files into a single fat library using lipo
Use libtool -static -o to get the final library
By this stage I have a binary and a bunch of header files. In xcode:
Drop the binary (from step 3) and ensure its linked under: Target > General > Framework and Libraries, and Target > Build Phases > Link Binary with Libraries
I copy all the header files from the C library and place them under dir Dependencies/myClibrary/include/. The include dir contains a master header file myClibrary.h which includes a number of header files from ./abstract/*.h.
At top level of the xcode project dir, I also create a module.map file with content:
module MyWrapperFramework [system] {
header "Dependencies/myClibrary/include/myClibrary.h"
export *
}
Add all header files to xcode and for each header file, under Target Membership change value from project to public.
Build
Testing the framework in an App
I am able to build the framework, with settings as mentioned above. However, when I want to test it in a test Objective C app, I import the framework and call functions related to the myClibrary. On building the app, I get the error:
'myClibrary/abstract/headername.h' file not found
The above error originates from myClibrary's master header file myClibrary.
Most of the tutorial that I could find deals with C libraries having a single header file. How can I create a iOS framework from a C library that contains nested header files?
In case, nested header files are not the main issue here, what am i doing wrong?
A framework's headers get installed in the Headers directory inside the .framework. The compiler knows enough magic that when you say #import <myClibrary/myClibrary.h> that it will start the search for myClibrary.h inside that Headers directory.
As a result, the default public header build rules are to copy all public .h files (no matter their position in the source tree) into that Headers directory. That directory should be set as the $PUBLIC_HEADERS_FOLDER_PATH variable during building.
It seems as though you need to install headers into different directories. You could simply set the value of the Public Headers Folder Path in build settings to be a subdirectory, which will then install all public headers there. You could then have a custom Copy Files build phase to install just the single, overall header into the original headers directory.
Or, you could just add just the headers which go into the root as public headers, then have a custom Copy Files phase for all the rest, which copy them into a custom subdirectory. I think if you choose "Wrapper" as the destination, that is the root of the framework, so if the subpath is "Headers/abstract" that should work (though I have not tested myself). If you need to have multiple subdirectories, you would need a custom Copy Files build phase for each one.
Or, of course, have a custom build script to copy the headers more manually, if that's easier than multiple build phases (say one that copies all files in the include directory to $PUBLIC_HEADERS_FOLDER_PATH but preserving the structure, if there are a lot of subdirectories).

xcode static library public/private/project header files

So, I have an iOS app project with a static library as subproject. As found multiple times here on SO, you should set the visibility of the library header files to public/private/project, depending on who should be able to use them.
Based on that, I created one class with a header file that exposes functionality to the app project (or whoever is going to use this library). Naturally, this header file imports a number of headers from other classes inside the library project. As these other header files do not provide functionality that should be exposed to the library's users, i would like to set these to "project", making them invisible to the rest of the world.
However, when i set header files to "project" they don't get copied into any of the private or public header folders. This results in a 'ProjectHeader.h' file not found error when using #import "ProjectHeader.h" in the PublicLibraryClassHeader.h when compiling the app project that uses the library.
So the question is: How can I set header files to "project" in a library project and stil use them from within that library project? Am I misunderstanding the concept of public/private/project header files in static libraries?
The easies way is to convert your static library into framework. Framework is a static library in a specific container, that does all magic for you. Btw, this words about public headers are related to frameworks, not to static libraries.

How to access variables from iOS static library in client application?

I am builiding libraries in iOS, for that i want to access variables from my iOS static library. To do this, is it necessary to declare variables used in my library class as public variables?, so that I can access variables from my library class from another application?
If so, how to declare variables as public in library class? If not, is there any other method to access variables from library in client application?
If the headers are copied in the Copy Files build phase, then their symbols will be available to the client application which links your static library. This build phase is created automatically for you when Xcode creates the static iOS library project.
If you wish to exercise more control over which headers are public and which are private, then you'll need to create separate copy headers build phases for public and private headers and manually move header files between those build phases. You'll also need to adjust the header search paths. This blog post may help with those implementation details.

How do I access a public header from a static library that imports a private header? Recieveing Lexical or Preprocessor Issue

I have a static library project in Xcode where I have utilized the Copy Headers portion of build phases to make only certain classes accessible from another project and keep all other classes from being accessed outside of my static library project.
I have created a View Controller project where I link to the library (.a file) that I have built. When I import in my header that exists in the include folder auto generated by Xcode's Copy Headers feature (I'm assuming this is now a public header file), let's call it Header A, it returns an error Lexical or Preprocessor Issue, and that it cannot find a header file which is imported by Header A but was not added to the Copy Headers section because I do not want users to have access to it (I am assuming it is a private header since I have not added it to the include folder through Copy Headers), let's call it Header B.
If I copy the header file to the include path, than Xcode allows navigation to see the code which is what I am trying to avoid. Is there a way to only allow access to certain classes, which may themselves access private classes? Is there a certain way to declare classes as Public and Private that I am missing?
I appreciate your help!

How can I create static library and can add just .a file on any project in ios

How can I create static library and can add just .a file on any project in ios.
I tried doing this but couldn't do it.
Thanks in advance
if you want create static lib mean refer the link http://jaym2503.blogspot.in/2013/01/how-to-make-universal-static-library.html
Step 1 : Create a New Project, Named it "Logger"
Step 2 : Create Classes
You can create as many classes you wants, In our tutorial we will create one class named "Logger".
So, now two files should be in our resource.
1. Logger.h
2. Logger.m
Step 3 : Put some useful code into Classes
Step 4 : Create New Target
Create New Target from File Menu.
New Target
Select Cocoa Touch Static Library
Step 5 : Add files to Compile Resource
Select "Logger" Target of Static Library
Go to Build Phases
In Complied Sources section, Add all the .m and .mm files.
In Copy Files section, Add all the .h files and resource files.
Build Phases
Step 6 : Compile Project with Static Library Target
Compile Project for iOS Device
Compile Project for Simulator
You can find two different .a files generated in build folders.
Find .a file
Step 7: Make Static Library Universal
You can find two different library now, one is for simulator and one is for iOS devices.
Create a New Folder and name it LoggerMerge.
Copy libLogger.a file of Debug-iphoneos folder to "LoggerMerge" rename it to libLogger_device.a
Copy libLogger.a file of Debug-iphonesimulator folder to "LoggerMerge" rename it to libLogger_simulator.a
Open LoggerMerge folder with Terminal
Fire below command
lipo -create "libLogger_simulator.a" "libLogger_device.a" -output "libLogger.a"
Now, you can find libLogger.a in LoggerMerge folder, this is Universal static library file.
Now, Just one thing you need is headers, See above screenshot there is folder called include in both build folder. Just copy header file from this folder.
Step 8 : Test Static Library
Create New Project, name it TestLogger
Import libLogger.a and header files
Import header file "Logger.h" anywhere you want to use
Now, Use this Logger class as default practice.
In our case, [Logger log:#"Test String"];
Run Project in Simulator and Device both
That's it!! You have your own static Library!!
Step 1: Starting a New Static Library Project
Open XCode and start a new project. Under iOS, select Library and “Cocoa Touch Static Library” say it as "staticlibrary". This will create a nice new project for us that builds a .a file.
Step 2: Code your static library
First we need to add some files. Add a new NSObject subclass to your project and name it StaticClass.Then Write some useful code in those files.
Step 3: Building And Distributing Your Library
Once you are happy with your library, simply build it in XCode. Obviously, don’t do build and run as you can’t run it (again unless you have a test suite). Now, look under the Products group in XCode and you should see a file called lib(libraryName).a. In our case, it’s libstaticlibrary.a.
Right click on that file and select “Reveal In Finder”. Drag this file into a new folder that you create where you will be bundling all of your library files.Now, do the same with all of the .h files. In our case, just copy StaticClass.h into this new directory. Your directory structure should now look like:
FolderName
|- libstaticlibrary.a
|- StaticClass.h
Now you can zip this folder and sell it to would-be iOS developers for millions!
Step 4: Linking Your Library In A New Project
So now that you have built your shiny new static library, it’s time to test it out in another application.
Create a new View-Based project (or whatever it doesn’t really matter). Name it as Test.
Now, just drag this folder into the project and XCode will set up all of the linking automatically. When prompted to copy, I usually say yes, but you can do whatever you want depending on how you intend on using the library. Sometimes just linking and not copying is far more beneficial if you have multiple projects sharing a single library. It ensures that they all use the most up to date version.
You should now see the .a file along with the header files in the new project.
Step 5: Using The Static Library Code
Now that all of the linking is set up, you just use your library like any other class.
For Further clarifications
http://www.raywenderlich.com/41377/creating-a-static-library-in-ios-tutorial hope this tutorial helps for you.
Objective-C consumer -> Objective-C static library
Xcode version 10.2.1
1. Create Objective-C static library
Follow section 1. Create Objective-C static library
2. Objective-C consumer with Objective-C static library
Follow section 2. Swift consumer with Objective-C static library
3. Consume Objective-C static library from Objective-C
Import module to the Objective-C client code[module_name]
#import module_name;
//or umbrella or public header
#import <module_name/module_name.h>
[More examples]

Resources