Awesome
cocoapod-to-cordova
Build tools the creates and updates a cordova plugman plugin.xml and vendored product from a cocoapod spec.
- Fetch and build a cocoapod dependency.
- Install and rename the cocoapod source files into the plugin.
- Create and set the required
<platform name="ios">
plugin.xml elements. - Correctly handle some common issues in building a cordova plugin
- Freeze the cocoapod dependency version as specified in the podfile.
- Easy to pull in updates from the cocoapod dependency
- Easy to use the best practice of only placing a compiled lib and not source files in the plugin
This build tool will not:
- Template or write any obj-c wrappers / interfaces
- Template or write any javascript APIs
- Specify modules / clobbering or handle other sections of plugin.xml
Install
- Start creating your plugin following the Plugin Spec. Note that you must have the
<platform name="ios">
element in your plugin.xml before proceeding. - Clone this repo into your plugin repo. Recommended to put it in 'scripts/update-ios-cocoapod'
cd plugin-xml-dir && mkdir -p scripts && cd scripts
git clone https://github.com/mkcode/cocoapod-to-cordova update-ios-cocoapod
- Configure the
podfile
inscripts/update-ios-cocoapod
. See below. - Build
cd scripts/update-ios-cocoapod
make # For an ios release
make build-sim # For debugging in the ios simulator
make && make clean # Build and cleanup
Update
- Update the pod dependency version in
podfile
pod 'POD_NAME', '-> 3.2'
- Rebuild
cd scripts/update-ios-cocoapod
make && make clean
- Update CDVPlugin interfaces if there were any API changes
Configuring the podfile
See http://guides.cocoapods.org/using/the-podfile.html for more info on using podfiles
Add a platform and a pod entry. See
platform :ios, '6.0'
pod 'POD_NAME', 'POD_VERSION'
Integrate CocoapodToCordovaBuilder
into the post_install hook
post_install do |installer|
require './cocoapod-to-cordova'
build = CocoapodToCordovaBuilder.new('POD_NAME', installer.project)
build.update_xcode_project!
end
Set the root_path and destination if they are not the defaults
# The directory path where plugin.xml lives
build.root_path = File.expand_path(File.join('.', '../..')) # default
# The root installation directory. Relative to the root_path.
build.destination = 'src/ios/vendor' #default
CocoapodToCordovaBuilder#configure can take a number of options
build.configure({
# Product is renamed and moved to the destination dir
product: { name: "libmypod.a" },
# Include the spanish localization from 'es.lproj'.
localization: 'es',
# Don't copy some headers. Copy the rest to 'destination/head'
headers: { exclude: ['private_header.h', 'other_header.h'], sub_dir: 'head' },
# Exclude this framework
frameworks: { exclude: ['Foundation.framework'] },
# Exclude this resource and copy the rest to 'destination/assets'
resources: { sub_dir: 'assets', exclude: ['other-img.png'] }
})
Cordova Notes
- Cordova plugins will fail to install if there is a filename conflict between the existing cordova project and the incomming plugin. If a generated plugin fails to install when installing with
cordova plugin add ...
, then add the conflicting files to the appropriateexclude
section of the build configuration. - Localization files (en.lproj, es.lproj, etc) will always result in file name conflicts. This tool handles them specifically; by excluding them from the resources and only copying the specified .lproj's contained files into the project. See
localization
inconfigure
Examples
This tool was extracted from Cordova-DBCamera.
See it in action there scripts/update-ios/cocoapod
Podfile in Cordova-DBCamera
platform :ios, '6.0'
pod 'DBCamera', git: 'git://github.com/danielebogo/dbcamera.git'
post_install do |installer|
require './cocoapod-to-cordova'
build = CocoapodToCordovaBuilder.new('DBCamera', installer.project)
build.configure({
product: { name: 'libdbcamera.a'},
localization: 'en',
headers: {
exclude: [
'DBCameraBaseCropViewController+Private.h',
'DBCameraBaseCropViewController.h',
'DBCameraCollectionViewController.h',
'DBCameraCropView.h',
'DBCameraGridView.h',
'DBCameraLibraryViewController.h',
'DBCameraMacros.h',
'DBCameraManager.h',
'DBCameraSegueViewController.h',
'DBCollectionViewCell.h',
'DBCollectionViewFlowLayout.h',
'DBLibraryManager.h',
'UIImage+Crop.h'
]
}
})
build.update_plugin!
end
And the generated plugin.xml
<?xml version='1.0' encoding='UTF-8'?>
<plugin id='com.vulume.cordova.dbcamera' version='0.0.1' xmlns='http://apache.org/cordova/ns/plugins/1.0' xmlns:android='http://schemas.android.com/apk/res/android'>
<name>
dbcamera
</name>
<description>
Plugman compatible wrapper for DBCamera.
</description>
<author>
Chris Ewald, Vulume Inc.
</author>
<keywords>
camera, ios
</keywords>
<license>
MIT
</license>
<js-module name='dbcamera' src='www/dbcamera.js'>
<clobbers target='cordova.plugins.dbcamera'/>
</js-module>
<platform name='ios'>
<config-file parent='/*' target='config.xml'>
<feature name='DBCamera'>
<param name='ios-package' value='CDVdbcamera'/>
</feature>
</config-file>
<source-file src='src/ios/CDVdbcamera.m'/>
<framework src='Foundation.framework' autogen='true'/>
<framework src='AVFoundation.framework' autogen='true'/>
<framework src='CoreMedia.framework' autogen='true'/>
<header-file src='src/ios/vendor/headers/DBCameraContainerViewController.h' autogen='true'/>
<header-file src='src/ios/vendor/headers/DBCameraViewController.h' autogen='true'/>
<header-file src='src/ios/vendor/headers/DBCameraDelegate.h' autogen='true'/>
<header-file src='src/ios/vendor/headers/DBCameraView.h' autogen='true'/>
<resource-file src='src/ios/vendor/resources/DBCameraImages.xcassets' autogen='true'/>
<resource-file src='src/ios/vendor/resources/en.lproj/DBCamera.strings' autogen='true'/>
<source-file framework='true' src='src/ios/vendor/libdbcamera.a' autogen='true'/>
</platform>
</plugin>