更新Phonegap iOS应用程序以支持64位架构时的问题

3
我有一个使用许多插件的Phonegap应用,在iOS设备上运行良好。然而,我目前在Xcode中使用$(ARCHS_STANDARD_32_BIT)作为体系结构设置,并且现在认为我需要更新为arch_standard并包括arm64作为有效架构,以满足苹果公司2015年2月1日的要求。
当我试图在iPhone 6上运行项目时,我现在遇到了16个错误,如下所示。有两个问题:
1)我需要使用第一段提到的archs_standard和arm64更改吗?
2)我该怎么解决这些问题以便能够提交我的应用程序?是否所有的问题都与我正在使用的单个插件有关?我需要找到列在错误中的每个插件的更新版本(或自己进行更新),还是问题与其他相关事项有关?我看不到一些插件有64位的更新版本,因此不确定这是问题所在。我对Obj C不是很熟悉,因此非常感谢您在这里提供任何帮助!
感谢您提前的帮助!
错误消息:

架构为arm64的未定义符号: "_CDVPageDidLoadNotification",引用自: CDVSplashScreen.o中的-[CDVSplashScreen pluginInitialize] "_OBJC_CLASS_$_CDVInvokedUrlCommand",引用自: CDVFile.o中的objc-class-ref "_OBJC_METACLASS_$_CDVCommandQueue",引用自: MainViewController.o中的_OBJC_METACLASS_ $ _ MainCommandQueue "_OBJC_CLASS_$_CDVPlugin",引用自: CDVLocation.o中的_OBJC_CLASS_ $ _ CDVLocation FacebookConnectPlugin.o中的_OBJC_CLASS_ $ _ FacebookConnectPlugin IonicKeyboard.o中的_OBJC_CLASS_ $ _ IonicKeyboard CDVInAppBrowser.o中的_OBJC_CLASS_ $ _ CDVInAppBrowser APPEmailComposer.o中的_OBJC_CLASS_ $ _ APPEmailComposer CDVStatusBar.o中的_OBJC_CLASS_ $ _ CDVStatusBar CDVVibration.o中的_OBJC_CLASS_ $ _ CDVVibration ... "_OBJC_METACLASS_$_CDVViewController",引用自: MainViewController.o中的_OBJC_METACLASS_ $ _ MainViewController "_CDVLocalNotification",引用自: AppDelegate.o中的-[AppDelegate application:didReceiveLocalNotification:] "_OBJC_CLASS_$_CDVViewController",引用自: CDVStatusBar.o中的l_OBJC_ $ _ CATEGORY_CDVViewController_ $ _ StatusBar MainViewController.o中的_OBJC_CLASS_ $ _ MainViewController CDVFile.o中的objc-class-ref "_OBJC_METACLASS_$_CDVCommandDelegateImpl",引用自: MainViewController.o中的_OBJC_METACLASS_ $ _ MainCommandDelegate "_OBJC_CLASS_$_CDVWebViewDelegate",引用自: CDVInAppBrowser.o中的objc-class-ref "_OBJC_CLASS_$_CDVCommandQueue",引用自: MainViewController.o中的_OBJC_CLASS_ $ _ MainCommandQueue "_OBJC_CLASS_$_CDVUserAgentUtil",引用自: CDVInAppBrowser.o中的objc-class-ref "_CDVPluginHandleOpenURLNotification",引用自: AppDelegate.o中的-[AppDelegate application:handleOpenURL:] CDVInAppBrowser.o中的-[CDVInAppBrowser openInSystem:] "_OBJC_CLASS_$_CDVCommandDelegateImpl",引用自: MainViewController.o中的_OBJC_CLASS_ $ _ MainCommandDelegate "_OBJC_CLASS_$_CDVPluginResult",引用自: CDVLocation.o中的objc-class-ref FacebookConnectPlugin.o中的objc-class-ref CDVInAppBrowser.o中的objc-class-ref APPEmailComposer.o中的objc-class-ref CDVStatusBar.o中的objc-class-ref CDVLocalFilesystem.o中的objc-class-ref PushPlugin.o中的objc-class-ref ... ld:在架构arm64中找不到符号 clang:链接器命令失败,退出代码为1(使用-v查看调用)


CDV的东西是你自己的还是插件?我没有使用过PhoneGap,但看起来它似乎没有为64位编译。你重新编译了所有依赖库吗?你不能将32位库与64位项目链接。 - Blair MacIntyre
检查您的插件是否为64位,如果它不支持64位,则必须获取支持64位插件的新插件。 - Shashi3456643
@BlairMacIntyre 我相信所有的CDV错误都是第三方插件引起的。有没有关于如何将库更改为64位的建议(考虑到我对Obj C不是很熟悉)?顺便说一句,感谢您的快速回复! - manihiki
1
@Blair的评论是正确的。正如你所提到的,当你编译代码时,插件会出现64位错误,这意味着你的插件不是64位的。如果你有插件的源代码,请在构建架构中放置arm64。前往你下载插件的供应商网站,下载支持64位的插件源代码或插件构建。我曾经遇到过与Dropbox相同的问题,我使用的是32位,但当我需要将应用提交到AppStore时,我从Dropbox下载了64位api,它就可以工作了。 - Shashi3456643
针对未来的观众,请注意,下面jcesarmobile提供的解决方案是解决这个问题的简单方法。 - manihiki
显示剩余3条评论
2个回答

3

1)我需要使用第一段提到的archs_standard和arm64更改吗?

是的,如果您想将应用程序提交到商店,您必须使用$(ARCHS_STANDARD)和arm64。

2)我该如何解决这些问题以便提交我的应用程序?所有问题都与我使用的单个插件有关吗?我需要找到更新版本(或自己更新)错误列表中列出的每个插件,还是问题与其他内容有关?我看不到一些插件的64位更新,所以不确定问题是否出在这里。我对Obj C不太熟悉,因此感谢任何帮助!

插件没问题,问题在于cordovaLib项目。您还需要将cordovaLib项目更改为$(ARCHS_STANDARD)并重新构建libCordova.a,或者更好地,使用大于3.4的cordova版本,它将包含64位支持。

编辑: 从manihiki提供的链接获取更多详细信息:

您需要更新项目中的Build Settings。步骤在该问题中提到并在下面重现:

//Update build settings for your project  
Select your Project icon Choose Build Settings.  
For “Architectures”, select $ARCHS_STANDARD – Standard architectures (armv7, armv7s, arm64) 
For “Valid Architectures”, add “arm64″ 

//Update build settings for cordovaLib project 
Select your CordovaLib.xcodeproj icon  
In the Build Settings for the Project (not Target), delete *all* the conditional architecture settings (hover to see the minus sign). This is what is recommended by Apple in their Xcode 5.1 Release Notes.  
For “Architectures”, select $ARCHS_STANDARD – Standard architectures(armv7, armv7s, arm64)  
For “Valid Architectures”, add “arm64″  

//Update build settings for the Target  
In the Build Settings for the Target, delete *all* the conditional architecture settings (hover to see the minus sign).  
For “Architectures”, select $ARCHS_STANDARD – Standard architectures (armv7, armv7s, arm64)  
For “Valid Architectures”, add “arm64″

有些插件可能无法正常工作,您需要进行以下更改: 在CordovaLib/Classes/CDVCommandQueue.m文件中,修改如下代码:

objc_msgSend(obj, normalSelector, command);

转换为:

((void (*)(id, SEL, id))objc_msgSend)(obj, normalSelector, command);

CordovaLib/Classes/CDVViewController.m 上进行修改

更改这个内容

if ((BOOL)objc_msgSend(plugin, selector, request, navigationType) == YES)

转换为:

if (((BOOL (*)(id, SEL, id, int))objc_msgSend)(plugin, selector, request, navigationType) == YES)

所有细节都可以在这里找到 https://shazronatadobe.wordpress.com/2014/03/12/xcode-5-1-and-cordova-ios/


谢谢!我将CordovaLib的架构更改为$(ARCHS_STANDARD),现在它可以编译而没有致命错误了!但是,当应用程序在设备上运行时,似乎只加载了部分内容就卡住了。我明天会自己再仔细研究一下,但你有什么想法可能是导致这个问题的原因吗?在切换到64位之前,它在我所有的测试设备上都能正常运行。 - manihiki
我不知道,但是在更改为$(ARCHS_STANDARD)后,我的应用程序运行良好。 - jcesarmobile
1
搞定了。这是一个关于插件和arm64的晦涩问题,可能只与某些插件有关(我认为在我的情况下是StatusBar插件)。如果对未来的任何人有所帮助,我的解决方案首先是jcesarmobile写的,然后是“Xcode 5.1和Cordova iOS”中的#1:https://shazronatadobe.wordpress.com/,它导致了这里:https://git-wip-us.apache.org/repos/asf?p=cordova-ios.git;h=82ce4f2 - manihiki
我已将所有信息添加到答案中。 - jcesarmobile

0

我继承了一个遗留的PhoneGap/Cordova应用程序,并在将Architecture Build Setting更改为$(ARCHS_STANDARD)时收到了许多类似的错误。

在更新(删除然后添加)九个PhoneGap插件中的两个插件(具体而言是com.phonegap.plugins.barcodescannerorg.apache.cordova.geolocation)并每次删除/添加PhoneGap iOS平台后,我成功地构建了该应用程序。通过在错误中搜索类名并确定它们所关联的插件,我针对这两个插件进行了定位。

要“更新”插件:

cordova plugin rm com.phonegap.plugins.barcodescanner
cordova plugin add com.phonegap.plugins.barcodescanner

移除/添加 PhoneGap/Cordova iOS 平台:

cordova platform remove ios
cordova platform add ios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接