I have a project that contains an App, a custom keyboard and an embedded framework. A bit of context...
The app was created as an ObjC project a while ago, the keyboard was also started as ObjC. The embedded framework was added later as ObjC as well.
The project is being converted to Swift. I can see the Swift compiler options in the project but setting a value at the project level trickles down into User-Defined settings at the target level.
Here's a screenshot of what I'm trying to explain.
On the left is the project-level settings, on the right are the target-level settings.
Please note that creating a new project with the same setup does show the Swift compiler settings.
How can I make these settings show up? What are the impacts of having these settings in User-Defined? Are they going to act the same way?
Related
I have my own Xcode project which contains some controllers. I want to make its SDK, for use it in another application. In parent application it works as child. Parent app will share some data with my controller and my controller works on it and gives back some result. So kindly guide for me. Examples are - Payment Gateway SDK's. I am looking for the same.
I can see you add tag for swift. In Swift, static libraries are not supported, so you must exclusively use a framework (aka dynamic library) when linking an app to a library. Framework is similar to sdk.
Here are the steps:
1)Create the Framework using New > Project under IOS > Framework & Library, select Cocoa Touch Framework
2)To avoid the "ld: warning: directory not found for option..." goto Library Search Paths in Build Settings for your target and delete the paths.
3)You can't mix Objective-C with Swift so don't even consider adding the Swift-Header bridge file in your code.
4)There are some cases in swift where you need to import code from unexposed Frameworks. I've successfully used the module-map inside the framework to deal with these case.
5)I also select CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES in the Build Settings to solve 'include of non-modular header inside framework module'. That seems to work
6)I make sure that the header file that gets generated is marked as Public (not Project). Click on the file and you'll see the selection in the inspector under 'Target Membership'
Link
Also you can follow this tutorial. Since you have already created project.
Create a framework target, make all source code files a member of the new target, add the new target as target to the podfile. For everything else the tutorial should work. It should help you in understanding the steps.
Build framework
Framework Project: https://github.com/twodayslate/SwiftGMP
I built this this project and dragged the SwiftGMP.framework into my iOS application. I can import SwiftGMP just fine but I cannot use any of the functions or structs even though they are set to public in the framework. What am I missing? I'm hoping it is just a flag or build setting. The SwiftGMP-Swift.h is being generated.
edit:// I got it working by dragging project into my application and then settings the library path in my main project. Doesn't seem right but it works.
Take a look at the settings of this project which uses SwiftGMP without adding it as a separate sub-project.
before Xcode 7, I were able to build a Framework for (development) distribution for both device and simulator (usually as a fat-binary) and include it into any of my projects. When I now try to build and integrate the Framework I still can see my classes and the Framework-Module and use both in my code, but when I try to reference them from within my Storyboard, they are no longer visible.
Correct me if I am wrong - I've been working with Frameworks since swift was released, but my memories might deceive me here - but I remember being able to use classes from a Framework and reference them in an InterfaceBuilder-file in the previous versions. Referencing a framework-class is no problem when the Framework-target is build from within the same Project.
To test this, I simply set up a Framework-Project and added a custom UIViewController. Then I've build the Framework and imported it into another SingleView-Application. I already checked if there is a possible setting preventing the Framework-module from being visible (BitCode, SDK, Deployment Target) and configured the ViewController as public.
Maybe I'm just missing some new setting Apple introduced in Xcode 7 ;-)
I'm trying to create one Xcode workspace that includes 3 projects:
- 2 different iOS apps
- One dynamic framework project
The two iOS apps should use the framework.
Sounds very easy and reasonable thing to do, but I just can't seem to make it to work.
When I add the framework to the iOS app target as linked library, the build process works but when running I get an exception that the framework could not be found.
If I go to the Embed Binaries -> click add -> choose the framework from the framework project, nothing happens (the embed binaries section stays empty.
I tried to do first add the framework as linked library, then add it to the embed binaries. Now compilation doesn't work (can't find the framework).
What am I missing? Every single example in the documentation shows how to add a framework as a new target under the same project. But that's doesn't help. I want the framework to be a separate project that a team can work on separately.
Open Xcode, so you can see Xcode in the menu bar.
Then go File>New>Workspace.
I believe you just drag and drop other projects into the workspace.
I've never really used a workspace, although I have made one before.
Base on this question
Why don't iOS framework dependencies need to be explicitly linked to a static library
I read the selected answer and still don't understand so I made an example project
Test Project on Github
In the test project, I remove all framework from Link Binary With Libraries and File navigation for both main project and the static library (including Foundation.framework and UIKit.framework too), basically, both project link to 0 frameworks.
Questions are
In static library, it's including MapKit/MapKit.h without referencing the Mapkit.framework to the project, why is its still working?
In main project, I remove UIKit.framework and Foundation.framework from the project, why is it still working?
Since it's working for now, will there be any issue later?
Thank you for your comment.
P.S. By working, I mean I can run on the simulator and I can archive the main project without any error.
Edit 25/07/2014
I tried with the real app that I'm working on, it's the same.
I highlight Foundation, UIKit, CoreData and 10 another frameworks in File Navigation, well, all of them.
Uncheck the target in Utilities Panel --> Target Membership
Build : Pass, Run : Pass
Every functionality of my app is still working as expected. I don't get this.
Check your project build settings. Underneath LLVM 5.1 — Language — Modules you should see the option 'Link Frameworks Automatically'. In your case it sounds like it's set to 'YES', the default.
In that case, instead of producing an error when you reference a class that the compiler doesn't know, it'll figure out which Framework contains that class and link it. In your code it'll be MKMapView or one of the other MapKit classes that triggers the linkage.
EDIT: from the relevant 'What's New?' document:
Auto Linking is enabled for frameworks imported by code modules. When
a source file includes a header from a framework that supports
modules, the compiler generates extra information in the object file
to automatically link in that framework. The result is that, in most
cases, you will not need to specify a separate list of the frameworks
to link with your target when you use a framework API that supports
modules.
Another way of looking at it is that the compiler is smart enough to mutate #import to #import when the framework has been built appropriately. All system frameworks have been.
To elaborate #Tommy's answer, a framework that supports modules satisfies the following 2 conditions:
Under Build Settings > Packaging
Define Modules is set to YES
Module Map File exists.
So, if you're certain that the framework you're using in your code modularizes like that, you can choose to not explicitly add it in the link phase as it will be automatically added as long as in the project file, under Apple Clang - Language - Modules, The option Link Frameworks Automatically is set to YES.