Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自定义Cordova插件:将框架添加到";“嵌入式二进制文件”;_Ios_Xcode_Cordova_Cordova Plugins - Fatal编程技术网

Ios 自定义Cordova插件:将框架添加到";“嵌入式二进制文件”;

Ios 自定义Cordova插件:将框架添加到";“嵌入式二进制文件”;,ios,xcode,cordova,cordova-plugins,Ios,Xcode,Cordova,Cordova Plugins,在自定义Cordova插件中,如何在plugin.xml中配置特定的.framework文件,以便将其添加到Xcode中的“嵌入式二进制文件”部分? 如果目前无法直接在plugin.xml中实现这一点,我愿意接受其他建议。在Cordova的plugin.xml支持这一点之前,我已经实施了一个变通方法,希望在将来,一旦在这些条目中嵌入属性将产生相同的效果:,目前,这个属性没有帮助,因此,需要采取以下解决方法 以下解决方案使用Cordova 5.3.3版有效 首先,确保将框架条目添加到plugin.

在自定义Cordova插件中,如何在plugin.xml中配置特定的.framework文件,以便将其添加到Xcode中的“嵌入式二进制文件”部分?
如果目前无法直接在plugin.xml中实现这一点,我愿意接受其他建议。

在Cordova的plugin.xml支持这一点之前,我已经实施了一个变通方法,希望在将来,一旦
在这些条目中嵌入
属性将产生相同的效果:
,目前,这个属性没有帮助,因此,需要采取以下解决方法

以下解决方案使用Cordova 5.3.3版有效

首先,确保将框架条目添加到plugin.xml: 接下来,在我们的钩子代码中需要一个特定的节点模块,这个模块就是

安装节点xcode(必须是0.8.7或更高版本): 最后是钩子本身的代码-

addEmbedded.js文件:
“严格使用”;
const xcode=require('xcode'),
fs=需要('fs'),
路径=要求(“路径”);
module.exports=函数(上下文){
if(process.length>=5&&process.argv[1].indexOf('cordova')=-1){
if(process.argv[4]!=“ios”){
return;//插件只适用于ios平台。
}
}
函数fromDir(起始路径、筛选器、rec、多个){
如果(!fs.existsSync(起始路径)){
控制台日志(“无目录”,起始路径);
返回;
}
const files=fs.readdirSync(起始路径);
var resultFiles=[]
对于(变量i=0;i=0){
如果(多个){
push(文件名);
}否则{
返回文件名;
}
}
}
如果(多个){
返回结果文件;
}
}
函数getFileIdAndRemoveFromFrameworks(myProj,fileBasename){
var fileId='';
const pbxFrameworksBuildPhaseObjFiles=myProj.pbxFrameworksBuildPhaseObj(myProj.getFirstTarget().uuid).files;

对于(var i=0;i@Alon Amir,感谢您的分享,它工作得很好!虽然,我的应用程序在调试模式下运行得很好,但不是在发布模式下。我发现LD_RUNPATH_SEARCH_path只是作为proj.getBuildProperty添加到调试模式,没有生成参数作为第一个结果。我对您的代码进行了一些修改,以便它在调试模式下工作,同时我也可以n释放模式:

function addRunpathSearchBuildProperty(proj, build) {
   const LD_RUNPATH_SEARCH_PATHS =  proj.getBuildProperty("LD_RUNPATH_SEARCH_PATHS", build);
   if(!LD_RUNPATH_SEARCH_PATHS) {
      proj.addBuildProperty("LD_RUNPATH_SEARCH_PATHS", "\"$(inherited) @executable_path/Frameworks\"", build);
   } else if(LD_RUNPATH_SEARCH_PATHS.indexOf("@executable_path/Frameworks") == -1) {
      var newValue = LD_RUNPATH_SEARCH_PATHS.substr(0,LD_RUNPATH_SEARCH_PATHS.length-1);
      newValue += ' @executable_path/Frameworks\"';
      proj.updateBuildProperty("LD_RUNPATH_SEARCH_PATHS", newValue, build);
   }
}

myProj.parseSync();
addRunpathSearchBuildProperty(myProj, "Debug");
addRunpathSearchBuildProperty(myProj, "Release");

为了让我的插件在XCode 8.0和cordova ios 4.2上与项目一起构建,我必须在构建后的
阶段运行钩子。另外,确保节点环境使用最新的XCode节点版本(^0.8.9),否则在复制文件阶段会出现bug


plugin.xml需要
custom=“true”
才能让Cordova复制框架文件,这与在添加平台后甚至在准备之后运行此钩子时对.pbxproj所做的更改相冲突。从今天发布的Cordova ios 4.4.0和Cordova 7.0.0开始,支持
embed=“true”

要将库添加到Xcode中的“嵌入式二进制文件”部分(从cordova ios 4.4.0和cordova 7.0.0开始),请将其放入plugin.xml中:

<framework src="src/ios/XXX.framework"   embed="true" custom="true" />
<source-file src="src/ios/XXX.framework" target-dir="lib" framework="true" />

要将库添加到Xcode中的“链接框架和库”部分, 将其放入plugin.xml中:

<framework src="src/ios/XXX.framework"   embed="true" custom="true" />
<source-file src="src/ios/XXX.framework" target-dir="lib" framework="true" />

它们可以同时存在。例如:

<!-- iOS Sample -->
<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>


<!-- Android Sample for your reference -->
<platform name="android">
    ....
    <source-file src="src/android/XXX.java"/>
    <framework src="src/android/build.gradle" custom="true" type="gradleReference" />
    <resource-file src="src/android/SDK/libs/XXX.aar" target="libs/XXX.aar" />
    ....  
</platform>

....
....  
....
....  

为什么必须在嵌入式二进制文件上,而不是在链接的框架和库中?你能告诉我你要使用哪个框架吗?它是一个自定义框架,没有源代码,不是公共框架,它是由第三方提供给我们公司的,它必须是嵌入式的,而不是链接的,否则我在启动时会遇到运行时异常“找不到图像”。谢谢!很高兴知道它对您有所帮助。虽然如果您使用
updateBuildProperty
addBuildProperty
而不使用第三个参数(如在我的钩子中),它应该应用于所有生成设置,但以下是节点xcode lib的条件(
build
是第三个参数)
if((build&&config.name==build)| |(!build))
。如果您的项目未能在“发布”中生成,请尝试确保您嵌入的框架支持“位代码”,或者在您自己的cordova项目中禁用“位代码”(有一个插件+挂钩)。问题不在updateBuildProperty或addBuildProperty中,而是在getBuildProperty中:首先是调试条目,其中LD_RUNPATH_SEARCHPATHS由于某种原因已经设置,因此“target”被设置为该值。之后,它到达发布条目。由于没有LD_RUNPATH_SEARCHPATHS条目,“target”“不会更改!因此,以后不会调用addBuildProperty。我希望我能够稍微澄清一下我的情况(并且做得正确)。位代码标志似乎不是问题,因为一旦我正确设置了搜索路径,它就可以完美运行。这个-
npm I xcode
-用于安装xcode模块。谢谢你的回答!但我还有一个问题;要使它工作,我必须先添加插件,然后再添加到iOS平台。框架被复制以嵌入只有在这些步骤中才需要。如果已经安装了iOS平台,那么插件可以将框架复制到embedded吗?@Macarat如果您不使用CLI工作流,那么您不需要任何这些,只需打开Xcode,然后将框架文件添加到embedded binaries部分,与cordova无关。@AlonAmir谢谢r这是一个很好的解决方案!cordova插件braintree插件中使用了这种技术,在构建框架时,它告诉我无法找到标题。有什么建议吗?谢谢!@jdixon04谢谢,很高兴知道!关于您的问题,请确保您使用的是
#import
语句导入时使用
(而不是
<source-file src="src/ios/XXX.framework" target-dir="lib" framework="true" />
<!-- iOS Sample -->
<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>


<!-- Android Sample for your reference -->
<platform name="android">
    ....
    <source-file src="src/android/XXX.java"/>
    <framework src="src/android/build.gradle" custom="true" type="gradleReference" />
    <resource-file src="src/android/SDK/libs/XXX.aar" target="libs/XXX.aar" />
    ....  
</platform>