React-native-onesignal: OneSignal OneSignalNotificationExtension 构建在 Xcode 12 上失败,与 cocoapods/架构/模拟器问题相关

创建于 2020-08-31  ·  32评论  ·  资料来源: OneSignal/react-native-onesignal

描述:

刚刚从 Xcode 10 更新到 Xcode 12,在 v10 之前这个项目构建并成功运行。

OneSignalNotificationExtension 目标构建失败:

Undefined symbol: _swift_getObjCClassMetadata

Undefined symbol: type metadata accessor for Foundation.UUID

Undefined symbol: Swift._bridgeAnythingToObjectiveC<A>(A) -> Swift.AnyObject

Undefined symbol: protocol descriptor for Swift.ExpressibleByFloatLiteral

Undefined symbol: associated conformance descriptor for Swift.ExpressibleByFloatLiteral.Swift.ExpressibleByFloatLiteral.FloatLiteralType: Swift._ExpressibleByBuiltinFloatLiteral

Undefined symbol: associated type descriptor for Swift.ExpressibleByFloatLiteral.FloatLiteralType

Undefined symbol: protocol descriptor for Swift.ExpressibleByIntegerLiteral

Undefined symbol: associated type descriptor for Swift.ExpressibleByIntegerLiteral.IntegerLiteralType

Undefined symbol: method descriptor for Swift.ExpressibleByIntegerLiteral.init(integerLiteral: A.IntegerLiteralType) -> A

Undefined symbol: static Foundation.UUID._unconditionallyBridgeFromObjectiveC(__C.NSUUID?) -> Foundation.UUID

Undefined symbol: value witness table for Builtin.Int32

Undefined symbol: protocol witness table for Swift.Int : Swift._ExpressibleByBuiltinIntegerLiteral in Swift


还有 100 个错误

我对 Xcode 和 Mac 不太好,所以如果不清楚或误导,我很抱歉。

谢谢

环境

反应原生 0.63.2
onesignal-react-native 3.9.1
Xcode 12
通过 npm 安装并与 pod 链接

重现问题的步骤:

  • 建造

  • Help Wanted

    最有用的评论

    我对 Xcode 12 也有一些问题

    我可以在 Xcode 11 上成功构建项目。但是,一旦我打开 Xcode12 并构建项目,我就会收到以下错误:

    ▸ Linking OneSignalNotificationServiceExtension
    
    ❌  clang: error: no such file or directory: '/Users/carloscuesta/project-folder/ios/build/project/Build/Products/Debug-iphonesimulator/libRCTOneSignal.a'
    

    这似乎不是 OneSignal 方面的错误。 看起来缓存或类似的东西有些奇怪,
    我尝试过的事情:

    • 删除 Xcode 派生数据 - rm -rf ~/Library/Developer/Xcode/DerivedData/
    • 清除 react-native、yarn 缓存并重新安装依赖项。
    • 重置模拟器数据和内容
    • 重新启动了计算机

    我不知道我还应该尝试什么,我想说一切都已正确链接,因为该应用程序在生产环境中运行良好,并且构建适用于 Xcode 11。

    我使用 OneSignal 指南手动链接了库,关于如何解决这个问题的任何想法? 🙏🏼

    通常当我遇到这个问题时,它是通过清理DerivedData解决的,但我无法摆脱错误😞

    所有32条评论

    你好,
    你的NotificationService.swift文件是什么样的? 它应该是这样的:

    import UserNotifications
    
    import OneSignal
    
    class NotificationService: UNNotificationServiceExtension {
    
        var contentHandler: ((UNNotificationContent) -> Void)?
        var receivedRequest: UNNotificationRequest!
        var bestAttemptContent: UNMutableNotificationContent?
    
        override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: <strong i="8">@escaping</strong> (UNNotificationContent) -> Void) {
            self.receivedRequest = request;
            self.contentHandler = contentHandler
            bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
    
            if let bestAttemptContent = bestAttemptContent {
                OneSignal.didReceiveNotificationExtensionRequest(self.receivedRequest, with: self.bestAttemptContent)
                contentHandler(bestAttemptContent)
            }
        }
    
        override func serviceExtensionTimeWillExpire() {
            // Called just before the extension will be terminated by the system.
            // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
            if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
                OneSignal.serviceExtensionTimeWillExpireRequest(self.receivedRequest, with: self.bestAttemptContent)
                contentHandler(bestAttemptContent)
            }
        }
    
    }
    

    查看设置说明中的步骤 4.3.6 并从那里继续以确保您已正确设置所有内容。

    希望这可以帮助。 干杯

    感谢您的反馈。

    我正在使用 Objective-C 文件。 我应该使用快速的吗?

    我以为你在使用 Swift。 如果您使用的是 Obj-C,请使用 Objective C 之一。 享受!

    我对 Xcode 12 也有一些问题

    我可以在 Xcode 11 上成功构建项目。但是,一旦我打开 Xcode12 并构建项目,我就会收到以下错误:

    ▸ Linking OneSignalNotificationServiceExtension
    
    ❌  clang: error: no such file or directory: '/Users/carloscuesta/project-folder/ios/build/project/Build/Products/Debug-iphonesimulator/libRCTOneSignal.a'
    

    这似乎不是 OneSignal 方面的错误。 看起来缓存或类似的东西有些奇怪,
    我尝试过的事情:

    • 删除 Xcode 派生数据 - rm -rf ~/Library/Developer/Xcode/DerivedData/
    • 清除 react-native、yarn 缓存并重新安装依赖项。
    • 重置模拟器数据和内容
    • 重新启动了计算机

    我不知道我还应该尝试什么,我想说一切都已正确链接,因为该应用程序在生产环境中运行良好,并且构建适用于 Xcode 11。

    我使用 OneSignal 指南手动链接了库,关于如何解决这个问题的任何想法? 🙏🏼

    通常当我遇到这个问题时,它是通过清理DerivedData解决的,但我无法摆脱错误😞

    我发现了一个奇怪的东西

    如果我尝试使用 Xcode 12 构建应用程序,它总是失败。 但是,如果我首先使用 Xcode 11 构建应用程序,然后打开 Xcode 12 并构建应用程序,它就可以工作了🤯

    但是,一旦我清理构建并尝试使用 Xcode 12 再次重建,它就会再次失败并再次出现相同的错误😖

    与 Xcode 12 和 onesignal-react-native 3.9.1 相同的错误:-(
    项目在更新之前正在运行。

    同样的错误。
    Onesignal SDK -> 2.15.2
    react-native-onesignal -> 3.9.1
    在 xCode 11 上运行良好。

    你好,
    这很奇怪@carloscuesta 。 您是否尝试在 Xcode 11 和 12 上查看项目之间的差异? 也许 12 出于某种原因正在更改一些重要的构建设置。

    当我将 Xcode 从 11 更新到 12 时遇到了类似的问题。

    @rgomezp

    我可以确认从 Xcode 11 到 Xcode 12 没有任何变化。 repo 的git status未修改。

    但是我仍然可以重现构建失败。 每当我在第一次工作后在 Xcode 11 和 Xcode 12 上构建时 😕

    Screenshot 2020-09-25 at 12 12 40

    Screenshot 2020-09-25 at 12 18 39

    你好,
    我相信这与之前在此处报告的Cocoapods 问题有关。

    如果需要在模拟器上运行应用程序,这可能会添加x86_64VALID_ARCH ,例如, x86_64 arm64 arm64e

    此堆栈溢出可能包含您需要的解决方案。

    嘿! 感谢您的帮助@rgomezp

    我会告诉你我的实验结果!

    添加排除的架构

    我在Project > Architectures > Excluded Architectures上的 StackOverflow 帖子中提出了arm64 Excluded Architectures

    Screenshot 2020-09-28 at 13 40 32

    这并没有解决问题。 我有同样的错误抱怨x86_64

    Screenshot 2020-09-28 at 13 39 50

    所以我继续将x86_64Excluded Architectures

    Screenshot 2020-09-28 at 13 41 12

    经过以下更改,以下错误似乎已修复。 但是,我还有另一个关于OneSignalNotificationServiceExtension.appex

    Embedded binary is not signed with the same certificate as the parent app. Verify the embedded binary target's code sign settings match the parent app's.
    

    但是我没有改变任何与 CodeSign 相关的东西🤔——Xcode11 构建工作正常

    Screenshot 2020-09-28 at 11 36 29

    清理DerivedData构建并重新启动计算机后。 我看到另一个错误: Link app (i386)

    如果我打开错误,我会看到在DerivedData文件夹中找不到很多文件。 它们都与 OneSignal 无关。 但是,如果它在 Xcode 11 上正常工作,我不知道为什么会失败。我现在很困惑 😅

    使用VALID_ARCHS

    这对我也不起作用。 我还读到这在 Xcode 12 上已被弃用,而应使用Excluded Architectures代替。

    我没有任何User-Defined Setting用于此。 因为我没有使用 CocoaPods 并且我手动链接了模块。

    在排除arm64后,我发现了一个有趣的链接,该链接讨论了 Xcode 的“相同证书”错误。

    它说扩展不应该排除那些架构。 不幸的是同样的错误:(

    我今天没有想法了😅

    我可以确认没有“排除的架构”修改的情况下,在不会引发任何错误

    所以它与模拟器本身的架构 100% 相关

    Screenshot 2020-09-29 at 09 17 24

    你好卡洛斯,
    感谢您的详细调查。 为了可见性,我还发现了这个堆栈溢出线程

    总结@carloscuesta问题,

    1. Embedded binary is not signed with the same certificate as the parent app...错误是通过将 arm64 和 x86_64 添加到Excluded Architectures来解决的,根据在 VALID ARCHS 上使用它的指南。
    2. Cocoapods 存储库中发布的解决方法对您不起作用,因为您手动链接了该库。

    Carlos,此时我不确定还能做什么,因为这听起来像是一个非 OneSignal 问题。

    如果其他人_are_使用 Cocoapods,请确认上面链接的 Cocoapods 解决方法对他们有效吗?

    @rgomezp

    感谢您提供的所有帮助。

    Carlos,此时我不确定还能做什么,因为这听起来像是一个非 OneSignal 问题。

    我对这个声明不是 100% 肯定,因为如果我取消链接整个 OneSignal 库并删除OneSignalNotificationServiceExtension项目构建在 Xcode12 上。 我不知道错误来自哪里,这是肯定的,也许这是一个特定的情况,因为库是手动链接的。 而且我不必接触任何与架构相关的东西

    但是,是的,让我们看看我们是否可以找到其他用例👍🏼

    Xcode 12 似乎是为具有架构的模拟器构建的 - arm64, i386, x86_64

    所以我的解决方法是

    1. 在项目构建设置的排除架构中添加arm64
    2. 从 RCTOneSignal 子项目构建设置中删除VALID ARCHS
      (VAILD ARCHS 已移至 Xcode 12 中构建设置的用户定义)

    它在我的项目中运行良好。

    @stanleyctcl您的解决方案有效! :tada:

    我没有看到RCTOneSignal库中的RCTOneSignal目标将VALID_ARCHS定义为User-Defined设置。 这是我们应该从图书馆方面删除的东西! 我会做一个 PR 来解决这个问题!

    Screenshot 2020-10-07 at 10 22 44

    这就是为什么我的所有更改都不起作用的原因。 因为 OneSignal 库定义了这个用户设置。

    嘿,谢谢@stanleyctcl
    您的解决方案对我有用。

    以前,我对 iOS 模拟器的发布模式构建失败。 我收到building for iOS Simulator, but linking in object file built for iOS, file onesignal错误。 但是,我可以在真实设备上构建发布模式而不会出现任何错误。 上面的解决方案解决了这个问题。

    不幸的是,在我实施您的解决方案后,我无法存档我的应​​用程序。 我收到了这个错误。

    No architectures to compile for (ARCHS=arm64, VALID_ARCHS=arm64 arm64e armv7 armv7s, EXCLUDED_ARCHS=(
        arm64
    ))
    

    任何线索?

    @abdullahizzuddiin确保您只排除了 iOS 模拟器的架构

    啊,我的坏。 我忘记了那个小细节。 感谢@carloscuesta指点我。 结果证明我只需要 set Excluded Architecture而没有从RCTOneSignal子项目构建设置中删除VALID ARCHS 。 🤔

    = = =
    我想,我得到了差异错误。 我已成功存档。 但是,在我选择“自动管理签名”后,我收到了这个错误
    image

    我可以在以前版本的 Xcode 上将应用程序部署到 Appstore,而不会出现任何问题。 以前,我用的是 11.7。 现在,我使用了 12.0,我立即收到了这个错误,而我的 repo 没有任何更改。

    //package.json
    react-native-onesignal: 3.8.1
    
    //Podfile
    pod 'OneSignal', '>= 2.14.2', '< 3.0'
    ...
    target 'OneSignalNotificationServiceExtension' do
      pod 'OneSignal', '>= 2.14.2', '< 3.0'
    end
    

    有什么线索吗? 还是应该创建单独的问题?

    附:
    我还向Apple Developer Forum提交了我的问题,以防万一这不是这个库的问题。

    我在 react native 0.60.0 版本上使用 react-native-onesignal 3.9.1 ......我能够通过在用户定义的设置(VALID_ARCHS)中包含 x86_64 来解决这个问题

    大家好,
    我认为这个问题可以安全关闭,因为它似乎不是 OneSignal 问题。


    @abdullahizzuddiin
    (不同的问题,考虑单独开票)

    为了可见,我将发布对Apple Dev Forum 主题的回复之一:

    问题:
    尝试在实际设备上运行构建失败,即使构建在我的 MacBook Pro 上成功。
    此消息出现以下错误:
    配置文件“iOS 团队配置文件:com.xxxxxxxxxxxx.Name of -App”不包括当前选择的设备“iPhone”(标识符 0000xxxx-000xxxxxxxxxxxxxxxxxx)。

    Xcode 帮助在线手册

    帐户首选项
    使用帐户首选项来管理开发者帐户资产(签名证书和配置文件)、添加存储库和添加服务器。

    要打开 Accounts 首选项,请选择 Xcode > Preferences 并单击 Accounts。
    I 然后我单击,管理证书,并通过单击加号添加新证书。

    问题解决了:
    然后我运行我的构建并清除了我的签名错误,应用程序安装在我的 iPhone 11 Pro Max 上。
    希望这个解决方案可以帮助你。

    @rgomezp

    这个问题混合了不同的问题。 您所指的那个与模拟器问题本身无关,这与RCTOneSignal因为VALID_ARCHS的用法

    我不知道我们是否应该在模拟器解决之前完全关闭这个问题。

    @rgomezp

    我遵循了您在上面摘录的 Apple Dev Forum 的建议。 但是,它并没有解决我的问题。

    我暂时将 Xcode 版本降级到 11.7,并且能够成功构建、运行和存档。 但是,我仍然可以在 Xcode 12.0 中执行这些操作

    我将保持打开状态,由 #1053 自动关闭

    Xcode 12 似乎是为具有架构的模拟器构建的 - arm64, i386, x86_64

    所以我的解决方法是

    1. Add **arm64** in  **Excluded Architectures** of Project Build setting
    
    2. Remove **VALID ARCHS** from RCTOneSignal subproject build setting.
       **(VAILD ARCHS was moved to User-Defined of build setting in Xcode 12)**
    

    它在我的项目中运行良好。

    这对我有用。 记得删除它。 不要只是让它空白"",因为它不起作用

    编辑:
    我的项目使用手动链接一个信号 3.2.12。
    反应原生 0.59.9
    代码 12

    我尝试了 stanleyctcl 解决方案,该解决方案可在模拟器中进行调试和发布构建。 但是当为通用设备/存档构建时,我遇到了与 abdullahizzuddiin 相同的问题

    没有要编译的架构 (ARCHS=arm64, VALID_ARCHS=arm64 arm64e armv7 armv7s, EXCLUDED_ARCHS=(
    arm64
    ))

    对我有用的解决方案是
    仅应用此

    2. Remove **VALID ARCHS** from RCTOneSignal subproject build setting.
       **(VAILD ARCHS was moved to User-Defined of build setting in Xcode 12)**
    

    这应该使存档工作但模拟器发布失败。 要解决这个问题。 您需要转到所有项目目标和 pod 的目标 -> 构建设置 -> 架构 -> 仅构建活动架构 -> 为发布模式设置“是”

    说明和步骤: https :
    进一步阅读: https :

    啊,我的坏。 我忘记了那个小细节。 感谢@carloscuesta指点我。 结果证明我只需要 set Excluded Architecture而没有从RCTOneSignal子项目构建设置中删除VALID ARCHS 。 🤔

    = = =
    我想,我得到了差异错误。 我已成功存档。 但是,在我选择“自动管理签名”后,我收到了这个错误
    image

    我可以在以前版本的 Xcode 上将应用程序部署到 Appstore,而不会出现任何问题。 以前,我用的是 11.7。 现在,我使用了 12.0,我立即收到了这个错误,而我的 repo 没有任何更改。

    //package.json
    react-native-onesignal: 3.8.1
    
    //Podfile
    pod 'OneSignal', '>= 2.14.2', '< 3.0'
    ...
    target 'OneSignalNotificationServiceExtension' do
      pod 'OneSignal', '>= 2.14.2', '< 3.0'
    end
    

    有什么线索吗? 还是应该创建单独的问题?

    附:
    我还向Apple Developer Forum提交了我的问题,以防万一这不是这个库的问题。

    我在 xcode 12 中发生了同样的问题,你解决了吗? @abdullahizzuddiin或者你只是将 xcode 降级到 11.7

    谢谢你

    要在模拟器中运行,我必须在“排除的架构”中添加“ arm64 ”。
    但是,要在真实设备上运行该应用程序,我必须不进行“排除的架构”修改。
    所以我每次跑步时都必须做出这个改变。

    我希望这有帮助。

    同样的问题,它又回来了。

    相同的

    相同的

    此页面是否有帮助?
    0 / 5 - 0 等级