Add Swift framework to Cordova Plugin - ios

I am having trouble importing frameworks to my Cordova plugin. When I try to access them in my source files, it fails with 'undeclared' errors. My plugin folder structure is as follows:
plugin.xml
ios/ERS.swift
ios/ERS-Bridging-Header.h
ios/libs/AEXML.framework
ios/libs/KissXML.framework
ios/libs/SwiftyRSA.framework
ios/libs/XUCore.framework
ios/libs/XUEETCommunicator.swift
Content of bridging header is:
#ifndef ERS_Bridging_Header_h
#define ERS_Bridging_Header_h
#import <AEXML/AEXML.h>
#import <KissXML/KissXML.h>
#import <SwiftyRSA/SwiftyRSA.h>
#import <XUCore/XUCore.h>
#endif
And of my plugin.xml:
<platform name="ios">
<config-file parent="/*" target="config.xml">
<feature name="eet"><param name="ios-package" value="eet" />
</feature>
</config-file>
<source-file src="src/ios/ERS.swift" />
<source-file src="src/ios/ERS-Bridging-Header.h" />
<!-- Library for EET -->
<source-file src="src/ios/libs/XUCzechLocaleSpecificData.swift" />
<source-file src="src/ios/libs/XUEETCommunicator.swift" />
<framework src="src/ios/libs/AEXML.framework" custom="true" embed="true"/>
<framework src="src/ios/libs/KissXML.framework" custom="true" embed="true" />
<framework src="src/ios/libs/SwiftyRSA.framework" custom="true" embed="true" />
<framework src="src/ios/libs/XUCore.framework" custom="true" embed="true" />
</platform>
After this configuration, i am getting following error (along with others of the same type):
XUEETCommunicator.swift:99:18: error: use of unresolved identifier
'AEXMLOptions'
I am also using Cordova Swift Support plugin, but I still cant get it to work. Also tried this solution:
https://stackoverflow.com/a/36723619/7141625
But after that, the project file is corrupted and can not be parsed.
I am reviewing the code in XCode 9 and also trying to build it in Ionic3 project via
ionic cordova build ios
with the same result.

Related

How to properly reference an iOS 3rd party framework in Ionic/Cordova build so it doesn't throw dyld: Library not loaded: #rpath error

I have an Ionic5 (cli 6.3.0)/Cordova 9.0.3 (cordova-lib#9.0.2) project that uses plugins.
I am attempting to create a custom plugin for a 3rd party framework.
I know the skeleton of the plugin is correct since I created it with Plugman and before adding the framework I could build/run and get feedback that "coolMethod" had been run from Objective-C file.
Even after adding the framework, I can get the plugin to install correctly with ionic cordova plugin add ./packages/cordova-plugin-my-custom-stuff
I can get Ionic/Cordova to build the iOS project successfully with ionic cordova build ios
But when I try to run the iOS emulator from either Ionic command line ionic cordova run ios or from auto-generated xCode project, I get
dyld: Library not loaded: #rpath/MyThirdPartySDK.framework/MyThirdPartySDK
Referenced from: /Users/myUser/Library/Developer/CoreSimulator/Devices/C9E28EFF-B017-4F5E-
BA89-5200AE5D64EA/data/Containers/Bundle/Application/775C8394-B014-4B01-89CA-
1D462FD54F4A/MyName Mobile-UAT.app/MyName Mobile-UAT
Reason: image not found
The structure of the project (condensed for clarity) is like so:
MyProject
-node_modules
-packages
-cordova-plugin-my-custom-stuff
-src
-ios
MyCustomStuff.m
-MyThirdPartySDK.framework
-Headers
MobileAPI.h
MyThirdPartySDK.h
-Modules
module.modulemap
MyThirdPartySDK
-www
cordova-plugin-my-custom-stuff.js
package.json
plugin.xml
The plugin.xml ios section looks like:
<platform name="ios">
<config-file parent="/*" target="config.xml">
<feature name="MyCustomStuff">
<param name="ios-package" value="MyCustomStuff"/>
</feature>
</config-file>
<source-file src="src/ios/MyCustomStuff.m"/>
<source-file src="src/ios/MyCustomStuffSDK.framework" framework="true"/>
<header-file src="src/ios/MyCustomStuffSDK.framework/Headers/MobileAPI.h" target-dir="MyCustomStuff" />
</platform>
I am looking for a solution that resides within the plugin.xml configuration or some other ionic /cordovaproject configuration. I would like to avoid editing the xCode project as this is all generated "automagically" by the ionic/cordova command line.
Finally figured it out.
<platform name="ios">
<config-file parent="/*" target="config.xml">
<feature name="MyCustomPlugin">
<param name="ios-package" value="MyCustomPlugin"/>
</feature>
</config-file>
<source-file src="src/ios/MyCustomPlugin.m"/>
<source-file src="src/ios/MyCustomPlugin.framework" target-dir="lib" framework="true" />
<framework src="src/ios/MyCustomPlugin.framework" embed="true" custom="true" />
<header-file src="src/ios/MyCustomPlugin.framework/Headers/MobileAPI.h" target-dir="MyCustomPlugin" />
</platform>

Adding custom cordova plugin to linked and embed framework in IOS XCode

I currently have this code in my custom cordova plugin,
<framework src="src/ios/Frameworks/XXX.framework" custom="true" embed="true"/>
<framework src="src/ios/Frameworks/XXXFramework.framework" custom="true" embed="true"/>
When I cordova build ios it will only go into embedded binaries but not linked frameworks and libraries. I wish to import both of the framework to both linked and embedded sections.
Please refer to Image below :
Image
Any help would be appreciated, thank you.
For adding libraries to "Embedded Binaries" section in Xcode (Starting from cordova-ios 4.4.0 and cordova 7.0.0), put this in your plugin.xml:
<framework src="src/ios/XXX.framework" embed="true" custom="true" />
For adding libraries to "Linked Frameworks and Libraries" section in Xcode,
put this in your plugin.xml:
<source-file src="src/ios/XXX.framework" target-dir="lib" framework="true" />
Both of them can exist at the same time. For example:
<platform name="ios">
....
<source-file src="src/ios/XXX.m"/>
<source-file src="src/ios/XXX.framework" target-dir="lib" framework="true" />
<framework src="src/ios/XXX.framework" embed="true" custom="true" />
....
</platform>

File Not Found Bridging Header Ionic Cordova

I have an Ionic Cordova application with a custom plugin and when running I am getting this error:
/Users/brendanwinter/Desktop/ionic/platforms/ios/MyApp/Bridging-Header.h:31:9: error: 'ProjectSDK/ProjectSDK.h' file not found
#import <ProjectSDK/ProjectSDK.h>
^
<unknown>:0: error: failed to import bridging header '/Users/brendanwinter/Desktop/ionic/platforms/ios/MyApp/Bridging-Header.h'
It seems the error is here:
error: 'ProjectSDK/ProjectSDK.h' file not found
#import <ProjectSDK/ProjectSDK.h>
I am using
cordova-plugin-swift-support plugin
ProjectSDK-Bridging-Header.h file in plugin folder contains:
#import <ProjectSDK/ProjectSDK.h>
plugin.xml contains
<?xml version='1.0' encoding='utf-8'?>
<plugin id="cordova-projectsdkplugin" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
<name>ProjectSDKPlugin</name>
<js-module name="ProjectSDKPlugin" src="www/ProjectSDKPlugin.js">
<clobbers target="projectsdk" />
</js-module>
<platform name="ios">
<config-file target="config.xml" parent="/*">
<feature name="ProjectSDK">
<param name="ios-package" value="ProjectSDK" />
</feature>
</config-file>
<framework src="src/ios/ProjectSDK.framework" custom="true" />
<header-file src="src/ios/ProjectSDK-Bridging-Header.h" />
<source-file src="src/ios/ProjectSDK.swift" />
</platform>
</plugin>
It runs using Xcode but when running ionic cordova run ios it gives the error above.
What directory does the Bridging Header pull from?
I have tried putting the framework at the same level as Bridging-Header, and ProjectSDK-Bridging-Header, but does not work.
Thank you!

Custom Cordova iOS plugin

I'm new in developing with cordova and would like to add a custom written iOS plugin from file system. I use cordova version 4.3.0 with iOS version 3.8.0.
When trying to add the plugin with " $ cordova plugin add ../my_plugin_dir" I get the following error:
Error during processing of action! Attempting to revert...
Failed to install 'at.researchstudio.knowledgepulse.reminder':Error: Uh oh!
".../plugins/at.researchstudio.knowledgepulse.reminder/src/ios/Kpreminder.m" not found!
But the m-source file is in this folder!!! What am I doing wrong??
Plugin-Structure:
at.researchstudio.knowledgepulse.reminder/
plugin.xml
src/
ios/
Kpreminder.h
Kpreminder.m
www/
reminder.js
The plugin.xml looks like the following
<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
id="at.researchstudio.knowledgepulse.reminder" version="0.0.1">
<name>Kpreminder</name>
<description>Reminder Functionalities for KP</description>
<keywords>KnowledgePulse reminder</keywords>
<js-module src="www/reminder.js" name="reminder">
<clobbers target="reminder" />
</js-module>
<platform name="ios">
<config-file target="config.xml" parent="/*">
<feature name="Kpreminder">
<param name="ios-package" value="Kpreminder"/>
</feature>
</config-file>
<header-file src="src/ios/Kpreminder.h" />
<source-file src="src/ios/Kpreminder.m" />
</platform>
</plugin>
I think you may put you plugin in 'plugins'folder,put into other folder
like $project_folder/myplugins/at.researchstudio.knowledgepulse.reminder
then install it

"PushPlugin not found" using Cordova 2.5 for iOS

I am using PushPlugin https://github.com/phonegap-build/PushPlugin and Cordova 2.5 for an iOS applicaiton.
In my Plugins folder I have these files:
Appdelegate+notification.h
Appdelegate+notification.m
PushPlugin.h
PushPlugin.m
In config.xml I have included the plugin like this:
<plugin name="PushPlugin" value="PushPlugin" />
I have also PushNotification.js in my www folder and included that in index.html.
When I run the application and execute the line in my push.js file:
pushNotification.register(this.tokenHandler,this.errorHandler, {"badge":"true","sound":"true","alert":"true","ecb":app.onNotificationAPN"});
Then I get this error:
Error: Plugin 'PushPlugin' not found, or is not a CDVPlugin. Check your plugin mapping in config.xml
Is PushPlugin compatible with Cordova 2.5?
I had this same issue when trying to get the pushplugin to work. I got it working by putting this block of code inside the config.xml (not the one in the www folder, but the one in the project folder)
<!-- ios -->
<platform name="ios">
<config-file target="config.xml" parent="/*">
<feature name="PushPlugin">
<param name="ios-package" value="PushPlugin"/>
</feature>
</config-file>
<source-file src="src/ios/AppDelegate+notification.m" />
<source-file src="src/ios/PushPlugin.m" />
<header-file src="src/ios/AppDelegate+notification.h" />
<header-file src="src/ios/PushPlugin.h" />
</platform>
If you download the sample project from git, there's a file called plugin.xml that has a bunch of stuff that needs to be added to the xml (I think).
Hope that helps.

Resources