iOS - update a framework - ios

I built an app that uses a third party SDK. Recently I had to update the SDK with a new version. I removed the framework files from my application folder, copied the new ones, added them to the project, but it seems XCode is caching the old version.
I tried Clean, tried to delete Derived Data, nothing works. At this point it seems the only available option is to recreate the project and import all the source files. Obviously I am not keen on that. There must be an easy, fast solution to this issue.
Any clue?

Cocoa pods are easy to use and install.
CocoaPods is the dependency manager for Objective-C projects. It has
thousands of libraries and can help you scale your projects elegantly.
Ultimately, its goal is to improve discoverability of, and engagement
in, third party open-source libraries, by creating a more centralized
ecosystem.
However the frameworks need to be compatible with cocoa pods which most libraries are. You use terminal to install. This site may give you an idea how to install it.

Fixed it. I deleted all copies of the old SDK, whether or not they were in my project folder. Seems like XCode was linking to one of them... Another mystery.

Related

xcode how to develop with frameworks

Thanks for spending time reading my question.
I've been working as an iOS developer for more than 2 years and today I still feel shame because I don't know how to deal with frameworks. I've build some projects using my own frameworks, but I've never understood exactly what's the best practice doing this.
Lets see the following example:
Project -> FrameworkA -> AFNetworking - Charts - FMDB - more
So, I have a big FrameworkA with mostly all the app behavior and then a small project referencing this FrameworkA and customizing just icons, texts and images. I use to manage dependencies with CocoaPods and I would like to use it with FrameworkA. By this I could reference external libraries easily, but it seems it doesn't work for frameworks, only for projects. So, my questions is: how can I add AFNetworking, Charts, FMDB, etc to my FrameworkA and then reference the framework form my project?
I appreciate if you can give me some idea using CocoaPods or any other dependency manager. I don't like the old way by doing this manually.
I hope my case is clear.
Thanks!
It sounds like you are asking how to embed external frameworks such as AFNetworking into a framework you are developing, and then use that framework in your app.
This is what's known as embedded frameworks where one framework is stored within another. Generally speaking it's not a great idea and should be avoided because it can cause version clash issues.
The way I'd recommend doing this is to use CocoaPods or Carthage to link the external frameworks (AFNetworking, etc) into your framework project. But do to try to embedded them.
Then in your app project, again use CocoaPods or Carthage to link in your framework (you won't need to link the external ones unless you are directly using them in the app code). Then add the necessary build steps to copy both your framework file and all the external framework files to the finished app's framework directory.

Using Cocoapods with custom framework that also needs third party libraries

I've been running into a bit of a problem trying to find a set up that would work for my situation:
I'm building 2 iOS applications and a framework that's being shared between the 2 apps. Lets call the apps app A and app B.
So for both apps A and B I have cocoapods set up and the shared framework is being added as a submodule. I didnt want to create a pod for my framework cuz it's being developed at the same time(is it a good reason to not create a pod for it?).
So everything is fine till the framework needs its own third party dependencies, since I can't use cocoapods for the framework as it's being added as subproject into project A and B' workspaces, I had to do a "dirty" job of just embedding the framework's third party libraries into its project just to keep going.
But obviously this is not going to scale well, I was wondering if any of you guys have had similar situations and how did you go about managing it? I was thinking maybe using Carthage for the framework to keep track of the dependencies and for the project A and B still us Cocoapods.
Any pointers would be much appreciated, thanks
Let me know if you need any clarifications or if I'm missing something.
I've found something like this https://stackoverflow.com/a/26168055/8529947
but the thing that I'm not sure about this approach is doing this will modify build settings of the shared framework which is not a good idea since both project A and B will be modifying the shared framework build settings at the same time. Is that the case or am I missing something here?

How to install projects without cocoa pods?

I have seen various libraries on GitHub that look useful, but only list CocoaPods as an install method. I'm not sure I want to be dependent on CocoaPods, because I'm wary of Apple breaking it in some future OS X/Xcode update. Is there a way to get these libraries into my Xcode project without using CocoaPods?
Role of CocoaPods is to automate and simplify the process, but you don't need to use CocoaPods if you don't want to.
In case of "manual installation", usually it would be:
download the project from GitHub
add the files to Xcode
import headers
But there is no universal recipe for every project, it may slightly differ from case to case, but usually it boils down to previously mentioned.
The best way if you don't want to use CocoaPods is to read the project documentation, and study examples if there are any.
Of course there is. Basically you need to download the library project, drag the project into your own project, do some library dependency setup and you're done.
For details, check out https://github.com/Alamofire/Alamofire for manually adding a Swift library. And https://github.com/jverkoey/ObjQREncoder for manually adding a Objective-C library to your project.
The only way to install things without Cocoapods is to just drag the source code of other projects into your class. For example, most Github projects can be installed via Cocoapods, or you can just drag the relevant source code into your projects. You don't need to drag in all of the project resources, all you need is usually class files

iOS dependency management and packaging

I'm completely new to iOS development and coming from an Android background. I was starting to look at what alternatives are out there for dependency management in iOS and found out that CocoaPods seems to be the most prevalent option.
After reading a lot of links about this topic I'm kinda at a loss and wondering what is the usual way dependencies are handled in iOS.
I have two questions:
1) What would the equivalent of using gradle to generate library (.aar) projects be in iOS? If there's any equivalent option. From what I've seen one can wrap static libraries and headers into frameworks and these can be used in other apps, is this the standard way to do it?
2) If (1) is correct, does CocoaPods offer a mechanism to add frameworks as dependencies?
I don't have a Android background but from what I understand of .aar files CocoaPods does something very similar. CocoaPods uses .podspec files (described here) to generate static libraries (and soon dynamic frameworks which are new in iOS 8) that are then linked into your project.
A podspec can define source files, assets, libraries, or frameworks that a source vendors for linking into your application. So yes it does support adding frameworks as dependencies, although until iOS 8 frameworks were not supported at all on iOS.
As far as the 'standard' way to do it, I think that's based on opinion. There are a few general ways to include dependencies you can choose from.
Drag files, frameworks, and whatever else you need into your project manually. Updating these is more difficult and that also means you have to configure your .xcodeproj depending on what features that library needs (such as ARC)
Drag a provided .xcodeproj into your project, and link the relevant target from the given project. This can be nice if the library provides a project that can build a framework or static library, in this case you'd pull in that library but their project would handle custom compiler flags.
Do either of the above while including them as git submodules. Assuming nothing massive changes in the project this helps a lot with updating your dependencies.
Use CocoaPods. CocoaPods will handle all the custom linking and updates based on semantic versioning (usually).
Use Carthage. Carthage is an in- between CocoaPods and the .xcodeproj solution. It will download code based on semantic versions defined by git tags, then you drag the generated frameworks into your project.
All of these options have pros and cons and the decision normally comes down to how you feel about the control you have over the inclusion of the library, and how automated you want it to be.
I do not have android nor iOS background however I've been developing a CI tool for both platforms and here are the answers
As You mentioned this a framework and pods (libraries) from cocoapods are distributed that way. For instance, have a look at Apphance. When spec is clicked it's visible that this library will be accessible as a Apphance-Production.framework.
You add pods to Podfile and download them with pod install command. This command will made classes from Apphance accessible from the code. Some people do commit downloaded pods, other not (it's like adding jars or aars to source control).

Working with libraries in Xcode (i.e. ImageMagick, AdMob) include in project or link?

(This may have been asked many times before but I'm not seeing it in the suggested questions/search)
Assuming I have 3rd party code libraries like ImageMagick and AdMob which I may use in multiple iOS projects, is it "better" to link to them or to include them in the project?
I'm using XCode with git. In one project I have included them so they are all under source control. In another project they are linked and I am getting "?" (question mark) icons next to all the library files. Confusing.
My honest suggestion for using 3rd party libraries would be to use CocoaPods for as many as you can get your hands on. Which there is a good chance all would be available.
Reasons why CocoaPod inclusion is better:
Easy to add and remove from project
Automatic linkage to your project
Easy to update after including
Drawbacks to CocoaPod use:
Doesn't help you if your library isn't included
You don't want to use the newly created xcworkspace instead of xcodeproj
The reasons not to use them are pretty weak, and I will admit to be biased in favor of them. I have had to work with lots of static libraries and frameworks, most of which are created in house. CocoaPods has made sharing, maintaining, and installing libraries a piece of cake. So please consider using them in your project.
If CocoaPods aren't your thing or not an option, linking against the library or framework is probably second best. If you drag and drop into your project (while easy) makes updating later kind of a pain. Dynamic linking allows you to swap them out from the file directory without having to change anything in your Xcode project. It requires a bit more finesse to get set up, but ultimately will be better for the long haul. IMO anyway.

Resources