Swift, Xcode: Using Swift FrameWork in current Project with pods - swift

I have a tvOS project developed in Swift 3.2 + Xcode 8.3.3, and Objective-C.
When I started developing the project, I started with SingleViewApplication and later added PODS which generated ABC.xcworkspace for me.
Now I open ABC.xcworkspace with Xcode for any development.
The project hierarchy is:
-ABC
--ABC folder
-Pods
--Podfile
After I create a framework in Swift and add it to the project by Files -> Add Files to ABC and then add it to Embedded binaries And Linked Frameworks and Libraries
Then, I tried to import and use UIViewController created in Framework.
I see the error no such module.
I referred to other posts for resolving this error such as setting path recursive in framework search path, but nothing is working for me.
If you need more information, please let me know.
Know that, if I follow the standard way ie 1. creating new project 2. create new framework 3. create new xcworkspace then drag 1 & 2 in 3, it works fine.

Related

How to set custom working directory in Xcode for Swift packages?

So I was trying to set "custom working directory" in Xcode for my Swift package, like this
You can see I used the good old $(PROJECT_DIR) here.
But when I started to run the project, Xcode prompted me with this
So how can I make this work?

How do I use Swift Package Manager with an existing macOS project?

I've been using Cocoapods to manage dependencies for my Swift project. I came across this package which is not listed at Cocoapods. Instead it suggests using Swift Package Manager. However, whenever I try to use Swift Package Manager to do basically anything, it ends up completely destroying my entire project.
So, in order to figure out how to actually use Swift Package Manager, I'm playing with it in a test project.
Here's what I've tried:
Create a new project from Xcode
File -> New -> Project -> Cocoa App
Product Name: basic-ssh-test
This creates a basic application which loads a blank window when I hit "Run". Just for fun I added print("test") to the applicationDidFinishLaunching function in my AppDelegate so the debug window says "test" when I run the program.
Now I want to add the Shout package as a dependency.
swift package init --type executable
This creates the following files:
Creating executable package: basic-ssh-test
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/basic-ssh-test/main.swift
Creating Tests/
Now I'm going to add the "Shout" dependency to my new Package.swift file:
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "basic-ssh-test",
dependencies: [
.package(url: "https://github.com/jakeheis/Shout", from: "0.2.0")
],
targets: [
.target(
name: "basic-ssh-test",
dependencies: ["Shout"]),
]
)
And I'll pull in the dependencies:
swift package resolve
This results in the dependencies being pulled into the .build directory:
Fetching https://github.com/jakeheis/Shout
Fetching https://github.com/jakeheis/CSSH
Fetching https://github.com/IBM-Swift/BlueSocket
Cloning https://github.com/IBM-Swift/BlueSocket
Resolving https://github.com/IBM-Swift/BlueSocket at 0.12.91
Cloning https://github.com/jakeheis/CSSH
Resolving https://github.com/jakeheis/CSSH at 1.0.3
Cloning https://github.com/jakeheis/Shout
Resolving https://github.com/jakeheis/Shout at 0.3.0
Now I regenerate the xcodeproj file:
swift package generate-xcodeproj
Now when I open the xcodeproj file there is a new group called Sources that has a single directory basic-ssh-test with a single swift file in it main.swift with print("Hello, world!").
The code that I'm actually interested in running is now in a blue folder called basic-ssh-test. All of the necessary files are still in there, but instead of running my application, Xcode is running the main.swift file. I can tell because the debug output is "Hello, world!" instead of "test".
I've read a couple of tutorials that claim that Swift Package Manager will move my source files and continue to build the same as before, but that's clearly not the case.
There's also no longer a "Main Interface" option in my Build Settings, so I can't select "MainMenu.xib" as my application starting point.
This is essentially the same thing that happens when I try to use Swift Project Manager with my existing project. It pulls in the dependencies, but it basically ignores my entire existing project and just runs the "hello world" code.
How do I use Swift Package Manager to add a dependency to an existing project without ignoring the existing codebase?
I think SPM is only compatible with Mac command line executables or libraries. This explicitly states SPM doesn't support iOS, watchOS, or tvOS platforms at all. But, since macOS AppKit/Cocoa application targets are very similar to iOS or tvOS Xcode targets, I would say this statement implies that SPM can't be used with macOS Cocoa applications out of the box either, which is what I think you're hoping for.
It looks like there is some work here on how to use it with iOS application targets which should largely translate to a macOS Cocoa target.
Until the time of this writing answer, Swift Package Manager do not support the iOS, tvOS, and watchOS. Instead, you will have to add the files from the package directly to your project.
I would suggest you creating a Dependencies group in your project and a group below that with the package name, like this answer:
So, first you will add the files dependency that you want to import into your project to the name of the package name that included in Dependencies group that we make before.
After you add the files then you can access the code as you usually would when you write it yourself like the image below. No need imports. You can see more details in here. hope it helps.
You can create a windowed application using SPM (I have a whole project sitting waiting for ABI that does this) you just need some boiler plate in swift.main. I’ll dig it out.
However the method others are suggesting is never going to work (with current versions of SPM).
However, what I am seeing is that you really want to use SPM to manage dependencies (keeping up to date etc). So I think you could do that much more easily.
Rather than creating a executable as your default target, instead create a library (perhaps call it basic-ssh-dependencies). Generate your Xcode project and drag THAT into your primary Xcode project and configure your target to to depend on it. When you update the library from SPM for changes in dependencies you should re-gen your Xcode-proj.
Let me know your mileage and any wrinkles, or if I’ve misunderstood what you are trying to achieve.
Update for XCode 11
This is A LOT easier now with XCode 11. As of this writing the current version of XCode is 11.3.1.
For an existing XCode project simply:
go to File->Swift Packages->Add Package Dependency...
enter the URL of the hosted package you want to add
choose the rules about which versions your app will use
click Finish

Embedding Frameworks from SwiftPM into Cocoa Application (XCODE)

I'm using a project called "HAP" (https://github.com/Bouke/HAP) that is built using SwiftPM.
The included example "HAP-server", works great from Command Line and I have used the params "swift package generate-xcodeproj" to create an XCODE project.
I can also load the HAP in XCODE and build/debug the target "HAP-server".
I'd like to use this framework in my Cocoa Application and have added the HAP.xcodeproj into my project. I added the produced files as "Embedded Binaries" and "Linked Frameworks and Libraries".
That allows me to "import HAP" into my view controller class.
However, when I try to build my Cocoa target, I get the following message -- seems related to the dependency "Kitura-net" from the HAP project...
"Missing required modules: 'CCurl', 'CHTTPParser'"
What is the best way to use frameworks from a SwiftPM in my project?
I assume it has something to do with Search headers... anyone have an idea?
UPDATE #1:
I have tried adding to my Cocoa Project that is importing the library that is using Kitura by "Link Binary With Libraries", libcurl.4.dylib from usr/lib/ but it still gives me the same error.
UPDATE #2:
UPDATE #3
I ended up figuring it out by using this method: Importing CommonCrypto in a Swift framework
I needed to create a modulemap for each of the items it was throwing a fit about, in my case: CCURL & CHTTPParser. Once I did that, I could compile.
You can see an example of embedding Kitura in an Xcode project in this repo https://github.com/IBM-Swift/Kitura-HelloWorld-iOS. Makefile in this repo runs build scripts to fix an Xcode Project to run Kitura on iOS. You need to compile curl for iOS - see instructions in the README.
From what I remember, you need to add the directory with curl headers to Header Search Paths, the directory with libcurl.a to Library Search Paths, and also add -lz flag to Other Linker Flags.

ZipKit and Xcode 4

We're trying to set up ZipKit as part of our Xcode 4 project using these instructions and we're having trouble getting our application to compile.
Here's the setup we currently have (as I'm not allowed to post images, I'll just give you the links to them):
Project Setup
All builds are set to go into a shared directory:
Xcode Preferences.
When building the app, we get the following error:
UIUpdateDownloadDialog.m:10:9: fatal error: 'ZKDataArchive.h' file not found 1
That line in UIUpdateDownloadDialog.m says #import "ZKDataArchive.h".
Any ideas on what we're doing wrong?
Thank you!
I'm sorry it took so long to respond, but my schedule has been very hectic.
We managed to get ZipKit working under XCode 4 and be able to build for both the simulator and devices.
Here's how we did it:
We opened the Demo project from ZipKit and went all the way down to find the included ZipKit.xcodeproj.
Once we had that, we opened our project and [dragged ZipKit into the frameworks folder of our project. http://i.stack.imgur.com/zcbYR.png
We changed the build settings of both the targets in our project (as well as the static library touchzipkit) to Build Active Architecture Only.
We were then able to build everywhere.
In fact, last night we were about to send the app update to Apple, but when trying to create the archive we got a linking error! But that's a question on its own.
Thank you all for trying to help!
It looks like there is a ZipKit framework - try adding that to your project instead of the whole project and importing like so:
#import <ZipKit/ZipKit.h>
The other alternative is to try adding the Zipkit directory to the include path, though having ZipKit as sub-project should include all the classes and header files.

ZipKit and iPhone

I tried to use the ZipKit framework (http://bitbucket.org/kolpanic/zipkit/wiki/UsingZipKit) in the test application for iPad. I followed the "Traditional way" of the installation (as it is described on their page) with no success. Hope somebody can help me with it:
1/ I used hg to get sources
2/ I build the ZipKit project (Release build)
3/ After doing this there was created in the build folder the new ZipKit.framework folder
4/ I have created a new test project for the iPad 3.2 (XCode 3.2.4)
5/ I have drag&dropped the ZipKit.framework folder created in the step 3) into Frameworks section on my new test project
6/ In Targets section I have created new Copy File Build Phase and I drag&drop the ZipKit.Framework from Frameworks section to the new Copy Files folder.
7/ Then I build and run the project.
The project cannot be even started, it is being closed after I press the project icon - so I must do something terribly wrong. In the console output I can see the error - it is pretty clear what is missing, but I do not know what to do with that... Might be some XCode expert or someone, who used the ZipKit can help me - this must some really stupid mistake I am doing...
There is the console output:
dyld: Library not loaded: #rpath/Frameworks/ZipKit.framework/Versions/A/ZipKit
Referenced from: /Users/sten/Library/Application Support/iPhone Simulator/3.2/Applications/3C51FC4F-0E85-48D2-BC68-D01ADD73DAE1/ZipExample.app/ZipExample
Reason: image not found
Failed to launch simulated application: iPhone Simulator failed to find the process ID of com.yourcompany.ZipExample.
BTW - I have tried to run the ZipKit Touch example provided with the framework and it works perfectly...
Thanks a lot
BR
STeN
There is the screenshot of my test project - on the left side you can see the ZipKit.framework I drag&drop into my project:
Is there a basic page which shows some simple code for inflating and deflating files and directories for ZipKit?
UPDATE:
I figured this out but it was a scavenger hunt:
NSString *filePath = [userDocumentsDirectory stringByAppendingPathComponent:#"newFile.zip"];
ZKFileArchive *archive = [ZKFileArchive archiveWithArchivePath:filePath];
[archive deflateDirectory:exportDirectory relativeToPath:nil usingResourceFork:NO];
You should go back and read it again.
The "traditional way" is not the right way to do this - Apple don't allow iOS applications with external frameworks like this - you want to link against the static library instead using the process described under "Static Library Target".
I've updated the Using ZipKit page to make it clear which ZipKit target should be used for what type of product.