ObjC Category doesn't link to iOS7 - objective-c

I'm using SDWebImage with CocoaPods, and the app I'm working on must support iOS7.
After installing SDWebImage version 4.0.0 with CocoaPods, I import it into a class with #import <SDWebImage/UIImageView+WebCache.h>.
I use one of the category's methods, sd_setImageWithURL:, to asynchronously download an image.
This works fine on iOS8-10. But for some reason (only on iOS7), the app crashes saying that the sd_setImageWithURL: is an unrecognized selector.
Why would the category not load properly on only one OS? This doesn't make any sense to me at all. :/
Update:
I ran an analysis on the project, and I noticed this warning:
ld: warning: ignoring file <path/to/file>/libSDWebImage.a, file was built for archive which is not the architecture being linked (armv7): <path/to/file>/libSDWebImage.a
(The path was really long. I replaced it with <path/to/file>)
As I suspected, this warning does not show up when running on newer versions of iOS, which also use a different architecture, arm64.
So, it looks like the library libSDWebImage.a is being build for arm64. What can I do about this?

I set Build Active Architecture Only to NO in Build Settings, then did the "deep clean" as suggested by the answer here: Undefined symbols for architecture armv7: cocoaPods iPhone 5
That seemed to solve the issue for me.

Related

Black screen during requests for ios 9 - PromiseKit?

When I updated xCode and build on iOs 9, during all my synchronisation requests, my screen is black. It is working, but it seems that threads are not handled the same way. I am using AFNetworking and PromiseKit pods.
I did not updated PromiseKit (my current version is 1.6.0) because the last version is in Swift and I have an error
dyld: Library not loaded: #rpath/libswiftCore.dylib
Referenced from: /Users/[user]/Library/Developer/Xcode/DerivedData/Build/Products/Debug-iphonesimulator/PromiseKit.framework/PromiseKit
Reason: image not found
For that error I tried
Runpath Search Paths
$(inherited)
#executable_path/Frameworks
#loader_path/Frameworks
Embedded Content Contains swift Code to 'YES'
'OU' parameter in my certificates
updating cocoapods, xcode
deleting derived datas, reinstalling my pods, cleaning
Do you think black screen could be fixed only by updating PromiseKit or could be another reason? Do you have any idea how to fix libSwiftCore issue ? Thanks !

Confirmation: does "Cocoa-Touch framework" only support for iOS8 or later? [duplicate]

When using an embedded framework (dyld) in Xcode 6.0.1 with deployment target less that iOS 8 I get:
Build is successful
Runtime library loading error
Error:
dyld: Library not loaded: #rpath/ObjectiveLyricsTouch2.framework/ObjectiveLyricsTouch2
Referenced from: /private/var/mobile/Containers/Bundle/Application/DC65ACA9-98E5-46CD-95F8-829D3416F6C0/musiXmatch.app/musiXmatch
Reason: image not found
(lldb)
For some time I was thinking that this is my problem as well, but for normal apps (non-iOS-8-extension) you just need to change one build setting in your casual Xcode 6 iOS Universal Framework target (set Mach-O Type to Static Library):
There should be no problem with iTunes Connect and iOS 7 after that :)
So,
after digging around I came out with the solution
Supposed to have yours MyEmbeddedFramework.framework to add to the app, do this
Remove MyEmbeddedFramework.framework in the tab General > Embedded Binaries
Remove the Build Phases > Copy Phase "Frameworks" if you have MyEmbeddedFramework.framework there.
Clean Build Folder
Move the MyEmbeddedFramework.framework in the void Embedded Frameworks section.
You will see now that a new Build Phase > Embedded Frameworks is created by XCode6 (not you, it is done automatically)
Now if you have 5, it should run without erros.
So to recap, to make it works you should see MyEmbeddedFramework.framework in
A) General > Embedded Binaries
B) Build Phase > Embedded Frameworks
It worked fine on iPhone5/iOS8 not on iPhone4S/iOS7 where I get:
dyld: Library not loaded: #rpath/ObjectiveLyricsTouch2.framework/ObjectiveLyricsTouch2
Referenced from: /var/mobile/Applications/739D9C44-3B91-4D4F-805B-83BE66C9CBCA/musiXmatch.app/musiXmatch
Reason: no suitable image found. Did find:
/private/var/mobile/Applications/739D9C44-3B91-4D4F-805B-83BE66C9CBCA/musiXmatch.app/Frameworks/ObjectiveLyricsTouch2.framework/ObjectiveLyricsTouch2: incompatible cpu-subtype: 0x0000000B in /private/var/mobile/Applications/739D9C44-3B91-4D4F-805B-83BE66C9CBCA/musiXmatch.app/Frameworks/ObjectiveLyricsTouch2.framework/ObjectiveLyricsTouch2
The problem was in the EmbeddedFramework. I had to
1) Set Architecture to default
2) Set Valid Architectures to: armv7, armv7s and armv64 (as Apple suggests armv64 is needed to have Embedded Frameworks working).
Then I was able to run the app with an embedded framework on
iPhone5S/iPhone5C iOS8
iPhone5S/iPhone5C iOS7
iPod 5th gen / iOS7
iPhone4S / iOS7
iPhone4 / iOS7
Anyways when submitting to iTunesConnect I get some errors for the Minimum Required Version:
The MinimumOSVersion of framework "..." is invalid. The minimum value is iOS 8.0;
Invalid Architecture: Apps that include and app extension and a framework must support arm64;
As of right now there is no way to use an embedded framework to share code between an app and widget and have it run on iOS 8 as well as iOS 7 & previous.
Here's some more reading on that http://atomicbird.com/blog/ios-app-extension-tips
Frameworks vs. iOS 7
If you are sharing code between an app and an extension, one nice way to do so is to create your own embedded framework to hold the code. On iOS 8 it'll load dynamically for both cases, so you're set.
If you still support iOS 7 (or earlier), it's not so clear cut. Embedded frameworks don't work there. The App Extension Programming Guide breezily notes that you can use dlopen to deal with this. With that approach you write code to load the framework dynamically at run time rather than rely on iOS loading it for you, if you've verified that the code is running on a version of iOS that supports doing so.
But how do you use that code on iOS 7? You don't. If your shared code is in an embedded framework, there's no way to execute it on iOS 7. It's just unavailable.
The dlopen approach might be handy if you only need the shared code on iOS 8. If you need it on iOS 7, you'll need to include it in the app target. And once you do that, you have no need of the framework. You could still use a framework for the app extension, but doing so is not actually useful. You'd be doing the work of creating the framework but not getting any benefit from it. Just include the shared code in both targets.
And from Apple's extension guide https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensibilityPG.pdf
If you link to an embedded framework from your containing app, you can still deploy it to versions of iOS older than 8.0, even though embedded frameworks are not available in those versions.
Fixed the error in xcode 6.1.1
using vim or vi open the project.pbxproj file.
At the end of the file (search for 8.1) , there would be Begin XCBuildConfiguration section
Look for your framework.
In out case even though the deployment target was set to 7.1 via Xcode -> general in target settings, the entry in the file had 8.1 for both debug & release
Here's the old file section looks like:
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "#rpath";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
INFOPLIST_FILE = ENFramework/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.1;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) #executable_path/Frameworks #loader_path/Frameworks";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
New section looks like :
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "#rpath";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
INFOPLIST_FILE = ENFramework/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) #executable_path/Frameworks #loader_path/Frameworks";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
Now we don't get error just a warning (but works on iOS 7.1 device) :
ld: warning: embedded dylibs/frameworks only run on iOS 8 or later
This looks like an xcode bug which incorrectly sets different ios targets and then causes error.
Going deeper on Apple Documentation I found out about dlopen command, which is used to make the linking of the libraries on some conditions, depending on system versions and libraries supported.
dlopen example of use:
Is the function 'dlopen()' private API?
So let's look at the solution provided by Apple Docs:
Deploying a Containing App to Older Versions of iOS
If you link to an embedded framework from your containing app, you can
still deploy it to versions of iOS older than 8.0, even though
embedded frameworks are not available in those versions.
The mechanism that lets you do this is the dlopen command, which you use to conditionally link and load a framework bundle. You employ this command as an alternative to the build-time linking you can specify in the Xcode General or Build Phases target editor. The main idea is to link embedded frameworks into your containing app only when running in iOS 8.0 or newer.
You must use Objective-C, not Swift, in your code statements that conditionally load a framework bundle. The rest of your app can be written in either language, and the embedded framework itself can likewise be written in either language.
After calling dlopen, access the embedded framework classes using the following type of statement:
MyLoadedClass *loadedClass = [[NSClassFromString (#"MyClass") alloc] init];
IMPORTANT
If your containing app target links to an embedded framework, it must
include the arm64 architecture or it will be rejected by the App
Store.
To set up an app extension Xcode project to take advantage of conditional linking
For each of your contained app extensions, set the deployment target
to be iOS 8.0 or later, as usual. Do this in the “Deployment info”
section of the General tab in the Xcode target editor.
For your containing app, set the deployment target to be the oldest
version of iOS that you want to support.
In your containing app, conditionalize calls to the dlopen command
within a runtime check for the iOS version by using the
systemVersion method. Call the dlopen command only if your
containing app is running in iOS 8.0 or later. Be sure to use
Objective-C, not Swift, when making this call.
Certain iOS APIs use embedded frameworks via the dlopen command. You must conditionalize your use of these APIs just as you do when calling dlopen directly. These APIs are from the CFBundleRef opaque type:
CFBundleGetFunctionPointerForName
CFBundleGetFunctionPointersforNames
And from the NSBundle class:
load
loadAndReturnError:
classNamed:
In a containing app you are deploying to versions of iOS older than
8.0, call these APIs only within a runtime check that ensures you are running in iOS 8.0 or newer, and call these APIs using Objective-C.
We tried running the latest code on the following configurations:
iOS 8+ — iPhone 5s
iOS 7.1.2 — iPhone 4
iOS 6.1.3 — iPad 4
The App is working fine on all the three devices but the warning is present in the Xcode while compiling .
"embedded dylibs/frameworks only run on iOS 8 or later”
Also I tried to Archive the App in order to submit it to the app store it went on fine.
Also, found out a link where in an apple developer stated this to be a bug
https://devforums.apple.com/message/999579#999579
Just for the record... I had this issue when changing a project from iOS8 to iOS7 deployment type.
The app used cocoapods and no custom embedded frameworks.
I had to change the main project two targets
Application
Application-Test
Changing Mach-O Type to static (from above answer).
Then on the cocoapods project. Under each sub pod project changing the Mach-O type to static, leaving the main pod Project Mach-O setting to blank.
I set the Mach-O Type to EXECUTABLE and it worked for me. Setting it to Static, Dynamic or Bundle created other errors when I ran it.
Target > "Your App" > Build Settings > Linking > Mach-O Type > Executable
I solve this problem following way :
Use same deployment target in both target "Embedded Framework" and "main App" target.
So, temporary, i said no to dynamic library, while many devices on iOS 7. How i solved my problem. I was need lib for transferring model between app and extension. So, i put my model to JSON string into shared container. And it works like a charm.
When you use dynamic library on ios you must code signed the library. In the Xcode 6, you should select the "Code Sign On Copy". And with the Xcode5, you should sign the library by your self with run script. like :
LOCATION="${BUILT_PRODUCTS_DIR}"/"${FRAMEWORKS_FOLDER_PATH}"
IDENTITY="iPhone Developer: xxxxx"
codesign --verbose --force --sign "$IDENTITY" "$LOCATION/BeeFramework.framework/BeeFramework"
Remove the use frameworks! from your PodFile if you want the Framework to work in iOS 7.0. i.e. run pod deintegrate command, modify your PodFile and then rerun the pod install command
Also after this, I had to add all the .h file's of the Framework in the Bridging file, that fixed the issue. Also remove the import TestLibrary from the swift files
I had a bug when updating to xcode 7.3. And I had solution for me.
- Change targets in pods project -> 7.0
- Hope it useful!
I was running into an issue where i needed to include some libraries as embedded frameworks otherwise i received the above error and when I did just that, I received errors when submitting to the app store.
My solution was to use Pods and make sure you uncomment the "use_frameworks!" line.
iOS Dynamic framework pre iOS v8
Dynamic framework aka Embedded framework is supported from iOS v8, but you can try to change Mach-O type[About] to Dynamic Library (which is set by default for supported target)
Dynamic linking error[About]
dyld: Library not loaded: #rpath/<some_path>
It is an dynamic linker error which links binary in load or runtime
[Vocabulary]

Xcode 6 and Embedded Frameworks only supported in iOS8

When using an embedded framework (dyld) in Xcode 6.0.1 with deployment target less that iOS 8 I get:
Build is successful
Runtime library loading error
Error:
dyld: Library not loaded: #rpath/ObjectiveLyricsTouch2.framework/ObjectiveLyricsTouch2
Referenced from: /private/var/mobile/Containers/Bundle/Application/DC65ACA9-98E5-46CD-95F8-829D3416F6C0/musiXmatch.app/musiXmatch
Reason: image not found
(lldb)
For some time I was thinking that this is my problem as well, but for normal apps (non-iOS-8-extension) you just need to change one build setting in your casual Xcode 6 iOS Universal Framework target (set Mach-O Type to Static Library):
There should be no problem with iTunes Connect and iOS 7 after that :)
So,
after digging around I came out with the solution
Supposed to have yours MyEmbeddedFramework.framework to add to the app, do this
Remove MyEmbeddedFramework.framework in the tab General > Embedded Binaries
Remove the Build Phases > Copy Phase "Frameworks" if you have MyEmbeddedFramework.framework there.
Clean Build Folder
Move the MyEmbeddedFramework.framework in the void Embedded Frameworks section.
You will see now that a new Build Phase > Embedded Frameworks is created by XCode6 (not you, it is done automatically)
Now if you have 5, it should run without erros.
So to recap, to make it works you should see MyEmbeddedFramework.framework in
A) General > Embedded Binaries
B) Build Phase > Embedded Frameworks
It worked fine on iPhone5/iOS8 not on iPhone4S/iOS7 where I get:
dyld: Library not loaded: #rpath/ObjectiveLyricsTouch2.framework/ObjectiveLyricsTouch2
Referenced from: /var/mobile/Applications/739D9C44-3B91-4D4F-805B-83BE66C9CBCA/musiXmatch.app/musiXmatch
Reason: no suitable image found. Did find:
/private/var/mobile/Applications/739D9C44-3B91-4D4F-805B-83BE66C9CBCA/musiXmatch.app/Frameworks/ObjectiveLyricsTouch2.framework/ObjectiveLyricsTouch2: incompatible cpu-subtype: 0x0000000B in /private/var/mobile/Applications/739D9C44-3B91-4D4F-805B-83BE66C9CBCA/musiXmatch.app/Frameworks/ObjectiveLyricsTouch2.framework/ObjectiveLyricsTouch2
The problem was in the EmbeddedFramework. I had to
1) Set Architecture to default
2) Set Valid Architectures to: armv7, armv7s and armv64 (as Apple suggests armv64 is needed to have Embedded Frameworks working).
Then I was able to run the app with an embedded framework on
iPhone5S/iPhone5C iOS8
iPhone5S/iPhone5C iOS7
iPod 5th gen / iOS7
iPhone4S / iOS7
iPhone4 / iOS7
Anyways when submitting to iTunesConnect I get some errors for the Minimum Required Version:
The MinimumOSVersion of framework "..." is invalid. The minimum value is iOS 8.0;
Invalid Architecture: Apps that include and app extension and a framework must support arm64;
As of right now there is no way to use an embedded framework to share code between an app and widget and have it run on iOS 8 as well as iOS 7 & previous.
Here's some more reading on that http://atomicbird.com/blog/ios-app-extension-tips
Frameworks vs. iOS 7
If you are sharing code between an app and an extension, one nice way to do so is to create your own embedded framework to hold the code. On iOS 8 it'll load dynamically for both cases, so you're set.
If you still support iOS 7 (or earlier), it's not so clear cut. Embedded frameworks don't work there. The App Extension Programming Guide breezily notes that you can use dlopen to deal with this. With that approach you write code to load the framework dynamically at run time rather than rely on iOS loading it for you, if you've verified that the code is running on a version of iOS that supports doing so.
But how do you use that code on iOS 7? You don't. If your shared code is in an embedded framework, there's no way to execute it on iOS 7. It's just unavailable.
The dlopen approach might be handy if you only need the shared code on iOS 8. If you need it on iOS 7, you'll need to include it in the app target. And once you do that, you have no need of the framework. You could still use a framework for the app extension, but doing so is not actually useful. You'd be doing the work of creating the framework but not getting any benefit from it. Just include the shared code in both targets.
And from Apple's extension guide https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensibilityPG.pdf
If you link to an embedded framework from your containing app, you can still deploy it to versions of iOS older than 8.0, even though embedded frameworks are not available in those versions.
Fixed the error in xcode 6.1.1
using vim or vi open the project.pbxproj file.
At the end of the file (search for 8.1) , there would be Begin XCBuildConfiguration section
Look for your framework.
In out case even though the deployment target was set to 7.1 via Xcode -> general in target settings, the entry in the file had 8.1 for both debug & release
Here's the old file section looks like:
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "#rpath";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
INFOPLIST_FILE = ENFramework/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.1;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) #executable_path/Frameworks #loader_path/Frameworks";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
New section looks like :
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "#rpath";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
INFOPLIST_FILE = ENFramework/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) #executable_path/Frameworks #loader_path/Frameworks";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
Now we don't get error just a warning (but works on iOS 7.1 device) :
ld: warning: embedded dylibs/frameworks only run on iOS 8 or later
This looks like an xcode bug which incorrectly sets different ios targets and then causes error.
Going deeper on Apple Documentation I found out about dlopen command, which is used to make the linking of the libraries on some conditions, depending on system versions and libraries supported.
dlopen example of use:
Is the function 'dlopen()' private API?
So let's look at the solution provided by Apple Docs:
Deploying a Containing App to Older Versions of iOS
If you link to an embedded framework from your containing app, you can
still deploy it to versions of iOS older than 8.0, even though
embedded frameworks are not available in those versions.
The mechanism that lets you do this is the dlopen command, which you use to conditionally link and load a framework bundle. You employ this command as an alternative to the build-time linking you can specify in the Xcode General or Build Phases target editor. The main idea is to link embedded frameworks into your containing app only when running in iOS 8.0 or newer.
You must use Objective-C, not Swift, in your code statements that conditionally load a framework bundle. The rest of your app can be written in either language, and the embedded framework itself can likewise be written in either language.
After calling dlopen, access the embedded framework classes using the following type of statement:
MyLoadedClass *loadedClass = [[NSClassFromString (#"MyClass") alloc] init];
IMPORTANT
If your containing app target links to an embedded framework, it must
include the arm64 architecture or it will be rejected by the App
Store.
To set up an app extension Xcode project to take advantage of conditional linking
For each of your contained app extensions, set the deployment target
to be iOS 8.0 or later, as usual. Do this in the “Deployment info”
section of the General tab in the Xcode target editor.
For your containing app, set the deployment target to be the oldest
version of iOS that you want to support.
In your containing app, conditionalize calls to the dlopen command
within a runtime check for the iOS version by using the
systemVersion method. Call the dlopen command only if your
containing app is running in iOS 8.0 or later. Be sure to use
Objective-C, not Swift, when making this call.
Certain iOS APIs use embedded frameworks via the dlopen command. You must conditionalize your use of these APIs just as you do when calling dlopen directly. These APIs are from the CFBundleRef opaque type:
CFBundleGetFunctionPointerForName
CFBundleGetFunctionPointersforNames
And from the NSBundle class:
load
loadAndReturnError:
classNamed:
In a containing app you are deploying to versions of iOS older than
8.0, call these APIs only within a runtime check that ensures you are running in iOS 8.0 or newer, and call these APIs using Objective-C.
We tried running the latest code on the following configurations:
iOS 8+ — iPhone 5s
iOS 7.1.2 — iPhone 4
iOS 6.1.3 — iPad 4
The App is working fine on all the three devices but the warning is present in the Xcode while compiling .
"embedded dylibs/frameworks only run on iOS 8 or later”
Also I tried to Archive the App in order to submit it to the app store it went on fine.
Also, found out a link where in an apple developer stated this to be a bug
https://devforums.apple.com/message/999579#999579
Just for the record... I had this issue when changing a project from iOS8 to iOS7 deployment type.
The app used cocoapods and no custom embedded frameworks.
I had to change the main project two targets
Application
Application-Test
Changing Mach-O Type to static (from above answer).
Then on the cocoapods project. Under each sub pod project changing the Mach-O type to static, leaving the main pod Project Mach-O setting to blank.
I set the Mach-O Type to EXECUTABLE and it worked for me. Setting it to Static, Dynamic or Bundle created other errors when I ran it.
Target > "Your App" > Build Settings > Linking > Mach-O Type > Executable
I solve this problem following way :
Use same deployment target in both target "Embedded Framework" and "main App" target.
So, temporary, i said no to dynamic library, while many devices on iOS 7. How i solved my problem. I was need lib for transferring model between app and extension. So, i put my model to JSON string into shared container. And it works like a charm.
When you use dynamic library on ios you must code signed the library. In the Xcode 6, you should select the "Code Sign On Copy". And with the Xcode5, you should sign the library by your self with run script. like :
LOCATION="${BUILT_PRODUCTS_DIR}"/"${FRAMEWORKS_FOLDER_PATH}"
IDENTITY="iPhone Developer: xxxxx"
codesign --verbose --force --sign "$IDENTITY" "$LOCATION/BeeFramework.framework/BeeFramework"
Remove the use frameworks! from your PodFile if you want the Framework to work in iOS 7.0. i.e. run pod deintegrate command, modify your PodFile and then rerun the pod install command
Also after this, I had to add all the .h file's of the Framework in the Bridging file, that fixed the issue. Also remove the import TestLibrary from the swift files
I had a bug when updating to xcode 7.3. And I had solution for me.
- Change targets in pods project -> 7.0
- Hope it useful!
I was running into an issue where i needed to include some libraries as embedded frameworks otherwise i received the above error and when I did just that, I received errors when submitting to the app store.
My solution was to use Pods and make sure you uncomment the "use_frameworks!" line.
iOS Dynamic framework pre iOS v8
Dynamic framework aka Embedded framework is supported from iOS v8, but you can try to change Mach-O type[About] to Dynamic Library (which is set by default for supported target)
Dynamic linking error[About]
dyld: Library not loaded: #rpath/<some_path>
It is an dynamic linker error which links binary in load or runtime
[Vocabulary]

Undefined symbols for architecture armv7 and Phonegap

I have a Static iOS Library which uses Phonegap as a component. ( I follow the steps provided by the documentation), I can compile the library alone without problems.
Now I try to use my static library in an iOS Application.
So I have my App which have a project reference to my static library which have an project reference to phonegap.
It looks like
App
Library
Phonegap
Now when I want to compile I get many errors and all look like:
Undefined symbols for architecture armv7:
"_kUTTypeVideo", referenced from:
-[CDVCapture captureVideo:] in libmyLibrary.a(CDVCapture.o)
I try to change the valid architectures in many combinations and the switch build valid architectures only but nothing works.
Its no ARC Project if it helps...
It seems that cordova library you are using is not armv7 compatible. Use latest cordova library that is compatible with armv7 architecture.
I currently found the problem, I have to import all the frameworks that described in the phonegap documentation not only in the static library that uses phonegap but rather also in the main app.
I had the same issue...it seems that you are using older version of PhoneGap (say 1.2 ...). The only solution to this issue is to use Cordova library (the latest one), which resolved my issue.

Trying to hack the AWS IOS SDK so that it works for OSX. I get this error

I've removed the import of the UIKit framework, and now I get this error. Do I have to somehow recompile the framework? It's not really giving me anything to go on...
And if it means anything, I am able to run the SDK examples in IOS so there aren't any system requirements that I'm not meeting.
ld: warning: ignoring file /Developer/SDKs/MacOSX10.7.sdk/Library/Frameworks//AWSiOSSDK.framework/AWSiOSSDK, missing required architecture x86_64 in file
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_AmazonS3Client", referenced from:
objc-class-ref in Constants.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
You can't just use the .framework provided by Amazon, because the binary is only for iOS. You need to rebuild the framework from the source, which thankfully comes in the SDK.
I created a XCode project with the source from the iOS SDK that appears to work. I have only tested some of the rudimentary S3 code but since it works in iOS, presumably, and I am able to communicate with S3, I think it should be good for all the services it supports.
https://bitbucket.org/danap/osx-aws-toolkit
Please feel free to fork and submit pull requests with changes.
I've created a fork of the AWS iOS SDK which can be built and used for Mac OS X development. Check it out: https://github.com/amberdixon/aws-sdk-ios. In the readme, I've included instructions on how to build the Mac OS X-compatible version of the AWS iOS SDK framework, which you can import into your OS X projects.