Cordova plugin.xml添加“Header Search Paths”条目

时间:2014-08-17 11:25:30

标签: xcode cordova phonegap-plugins cordova-plugins

我想在"标题搜索路径"下添加一个新条目。一旦我的Cordova插件被添加到Xcode项目中。

如何在Cordova plugin.xml文件中配置它?

感谢。

3 个答案:

答案 0 :(得分:3)

据我所知,在整个项目范围内无法做到这一点。

但是,有一种方法可以为每个源文件添加搜索路径,从而完成相同的操作。 plugin.xml中的source-file元素支持compiler-flags属性。对于此属性,您可以添加编译器(在本例中为clang命令)支持的任何标志。要添加到标头搜索路径的编译器标志是-I<path>。请注意,如果您包含空格(例如-I <path>),Cordova将生成格式错误的.xcodeproj文件夹,您将无法在Xcode中打开项目,也无法从命令行构建Cordova项目。另请注意,在这种情况下,<path>与Cordova生成的.xcodeproj文件夹相关。

所以,例如,如果你的插件文件夹中有这些文件(让我们称之为〜/ com.MyPlugin /):

myAngleHeader.h
mySource.m
mySource.h

其中mySource.h包含行#include <myAngleHeader.h> mySource.m包含第#include "mySource.h"

然后你想要放入你的plugin.xml(〜/ com.MyPlugin / plugin.xml):

<source-file src="myAngleHeader.h" />
<source-file src="mySource.h" />
<source-file src="mySource.m" compiler-flags="-ImyApp/Plugins/com.MyPlugin/" />

其中&#34; myApp&#34;是您的Cordova项目的名称。请再次注意,-I标志后必须没有空格。

遗憾的是,此方法要求开发人员控制插件和Cordova项目。如果你想发布一个供所有人使用的插件,它将不会非常有用。可能有更好的方法来做到这一点;我很乐意听到其他解决方案。

希望有所帮助!

答案 1 :(得分:2)

我想通过配置更新我的标题搜索路径,因为它始终是在构建日设置它的手动任务。我已经添加了这个插件:

Cordova-Custom-Plugin

然后我可以将这些添加到我的配置中,并且不必再担心它。

<platform name="ios">
   <!-- Set orientation on iPhone -->
   <config-file platform="ios" target="*-Info.plist" parent="UISupportedInterfaceOrientations">
     <array>
       <string>UIInterfaceOrientationPortrait</string>
       <string>UIInterfaceOrientationPortraitUpsideDown</string>
     </array>
   </config-file>
   <!-- Set orientation on iPad -->
   <config-file platform="ios" target="*-Info.plist" parent="UISupportedInterfaceOrientations~ipad">
     <array>
       <string>UIInterfaceOrientationLandscapeLeft</string>
       <string>UIInterfaceOrientationLandscapeRight</string>
     </array>
   </config-file>
   <!-- Set Header Search Paths-->
   <preference name="ios-XCBuildConfiguration-HEADER\_SEARCH\_PATHS" value="'$(TARGET_BUILD_DIR)/usr/local/lib/include' '$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include' '$(BUILT_PRODUCTS_DIR)'" buildType="release" xcconfigEnforce="true" />

答案 2 :(得分:1)

@JohnWalthour

我需要为我正在创建的cordova插件执行此操作,并且可以使用"after plugin install"挂钩。我意识到我可以在安装后运行node.js脚本并修改HEADER_SEARCH_PATHS中的${project}/platforms/ios/cordova/build.xcconfig

它需要变脏,但效果很好。这项工作的一个关键部分是,在info.plist中将Bundle名称分配给${PRODUCT_NAME},这样您就可以在${PRODUCT_NAME}中使用build.xcconfig,它会插入您的项目/应用名称。 Cordova已经为您设置了${PRODUCT_NAME}变量。

以下是相关代码 -

plugin.xml(简洁和重要的缩写)

<platform name="ios">
  .....
  <hook type="after_plugin_install" src="hooks/AfterPluginInstall.js" />
  <hook type="before_plugin_uninstall" src="hooks/BeforePluginUninstall.js" />
  .....
</platform>

AfterPluginInstall.js

#!/usr/bin/env node
'use strict';

let cwd = process.cwd();
let fs = require('fs');
let path = require('path');

console.log('InstagramAssetsPicker AfterPluginInstall.js, attempting to modify build.xcconfig');

let xcConfigBuildFilePath = path.join(cwd, 'platforms', 'ios', 'cordova', 'build.xcconfig');
console.log('xcConfigBuildFilePath: ', xcConfigBuildFilePath);
let lines = fs.readFileSync(xcConfigBuildFilePath, 'utf8').split('\n');

let headerSearchPathLineNumber;
lines.forEach((l, i) => {
  if (l.indexOf('HEADER_SEARCH_PATHS') > -1) {
    headerSearchPathLineNumber = i;
  }
});

if (lines[headerSearchPathLineNumber].indexOf('InstagramAssetsPicker') > -1) {
  console.log('build.xcconfig already setup for InstagramAssetsPicker');
  return;
}

lines[headerSearchPathLineNumber] += ' "$(SRCROOT)/$(PRODUCT_NAME)/cordova-plugin-InstagramAssetsPicker/GPUImageHeaders"';

let newConfig = lines.join('\n');

fs.writeFile(xcConfigBuildFilePath, newConfig, function (err) {
  if (err) {
    console.log('error updating build.xcconfig, err: ', err);
    return;
  }
  console.log('successfully updated HEADER_SEARCH_PATHS in build.xcconfig');
});

BeforePluginUninstall.js

#!/usr/bin/env node
'use strict';

let cwd = process.cwd();
let fs = require('fs');
let path = require('path');

console.log('InstagramAssetsPicker BeforePluginInstall.js, attempting to modify build.xcconfig');

let xcConfigBuildFilePath = path.join(cwd, 'platforms', 'ios', 'cordova', 'build.xcconfig');
console.log('xcConfigBuildFilePath: ', xcConfigBuildFilePath);
let lines = fs.readFileSync(xcConfigBuildFilePath, 'utf8').split('\n');

let headerSearchPathLineNumber;
lines.forEach((l, i) => {
  if (l.indexOf('HEADER_SEARCH_PATHS') > -1) {
    headerSearchPathLineNumber = i;
  }
});

if (lines[headerSearchPathLineNumber].indexOf('InstagramAssetsPicker') === -1) {
  console.log('build.xcconfig does not have header path for InstagramAssetsPicker.');
  return;
}

let line = lines[headerSearchPathLineNumber];
lines[headerSearchPathLineNumber] = line.replace(/\ "\$\(SRCROOT\)\/\$\(PRODUCT_NAME\)\/cordova-plugin-InstagramAssetsPicker\/GPUImageHeaders\"/i, '');

let newConfig = lines.join('\n');

fs.writeFile(xcConfigBuildFilePath, newConfig, function (err) {
  if (err) {
    console.log('error updating build.xcconfig, err: ', err);
    return;
  }
  console.log('successfully updated HEADER_SEARCH_PATHS in build.xcconfig');
});