Xcode 构建在设备上运行但在模拟器上失败

Posted

技术标签:

【中文标题】Xcode 构建在设备上运行但在模拟器上失败【英文标题】:Xcode build running on device but failing on simultor 【发布时间】:2018-07-11 21:01:19 【问题描述】:

我将 CocoaPods 与 React Native 应用程序一起使用。在 Xcode 模拟器中运行构建时,我遇到了各种错误。我在我的设备上运行它没有问题。这是我启用断点后得到的:

- (void)ensureOnjavascriptThread:(dispatch_block_t)block
    
      RCTAssert(_jsThread, @"This method must not be called before the JS thread is created");

这里的错误是绿色的(但是很糟糕,感谢 Xcode),上面写着 com.facebook.react.JavaScript (9): breakpoint 1.2

禁用断点时出现两个错误,这是一个:

void Instance::loadApplication(std::unique_ptr<RAMBundleRegistry> bundleRegistry,
                                   std::unique_ptr<const JSBigString> string,
                                   std::string sourceURL) 
      callback_->incrementPendingJSCalls();
      SystraceSection s("Instance::loadApplication", "sourceURL",
                        sourceURL);
      nativeToJsBridge_->loadApplication(std::move(bundleRegistry), std::move(string),
                                         std::move(sourceURL));
    

callback_-&gt; 行上的红色错误为 EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

第二个是此代码中的signal SIGABRT 错误:

int main(int argc, char * argv[])  
  @autoreleasepool 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  

我想我之前通过启用僵尸解决了这个问题。当我这样做时,我会在控制台中看到:

2018-07-11 16:56:08.326 [info][tid:main][RCTRootView.m:293] Running application Mapp (
initialProps =     
;
rootTag = 11;
)
=================================================================
Main Thread Checker: UI API called on a background thread: -[UIApplication setNetworkActivityIndicatorVisible:]
PID: 34682, TID: 5546845, Thread name: (none), Queue name: com.mixpanel.20e6d2c2b6c431dfecfdfaa100ec0a11.0x7fa94db06940.network, QoS: 0
Backtrace:
4   Mapp                           0x0000000103a31dd9 -[MPNetwork updateNetworkActivityIndicator:] + 121
5   Mapp                           0x0000000103a2ec09 -[MPNetwork flushQueue:endpoint:] + 985
6   Mapp                           0x0000000103a2e7b0 -[MPNetwork flushEventQueue:] + 64
7   Mapp                           0x0000000103a10418 __32-[Mixpanel flushWithCompletion:]_block_invoke + 312
8   libdispatch.dylib                   0x000000010e3f47ab _dispatch_call_block_and_release + 12
9   libdispatch.dylib                   0x000000010e3f57ec _dispatch_client_callout + 8
10  libdispatch.dylib                   0x000000010e3fdbe5 _dispatch_queue_serial_drain + 1305
11  libdispatch.dylib                   0x000000010e3fe4fa _dispatch_queue_invoke + 328
12  libdispatch.dylib                   0x000000010e3fa344 _dispatch_queue_override_invoke + 726
13  libdispatch.dylib                   0x000000010e40136c _dispatch_root_queue_drain + 664
14  libdispatch.dylib                   0x000000010e401076 _dispatch_worker_thread3 + 132
15  libsystem_pthread.dylib             0x000000010e920169 _pthread_wqthread + 1387
16  libsystem_pthread.dylib             0x000000010e91fbe9 start_wqthread + 13

这对我来说是不可读的。我不明白出了什么问题。提醒:即使启用了断点,此构建也会在我的设备上运行而不会出现重大错误。这是我应该担心的事情吗?请帮忙!

【问题讨论】:

【参考方案1】:

因为在您的代码中UI API called on a background thread。所以请禁用xcode的Main Thread Checker。它会起作用的。

编辑方案--->诊断--->运行时API检查--->主要 线程检查器(取消选中此设置)

注意:始终在后台线程上更新以下方法中的 UI

或者

把你的[UIApplication setNetworkActivityIndicatorVisible:]方法放在DispatchQueue.main.async里面

    DispatchQueue.main.async  // Correct
        UIApplication.shared.isNetworkActivityIndicatorVisible = true // in swift 4
       [UIApplication setNetworkActivityIndicatorVisible:]// in objective-C
 

https://developer.apple.com/documentation/code_diagnostics/main_thread_checker

【讨论】:

感谢马希帕尔!一旦我这样做,我就再也看不到错误了。不过,这可能仍然是我需要处理的事情,对吧?或者它可以在我的实际设备上运行正常吗? 实际上这是 xcode 9.0 中提供的 xcode 的附加组件,用于在仅通过模拟器进行调试时在后台跟踪 UI API。 所以我不必修复它,因为它可以在我的设备上运行? 我们有两个选项可以修复,要么通过设置,要么使用代码。我都在答案中添加了......如果你通过设置修复了......那么没关系,它不会产生任何问题。

以上是关于Xcode 构建在设备上运行但在模拟器上失败的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 5 项目在模拟器 3.5 上运行,但在设备上出现链接器错误

Xcode 12 beta 4:为 iOS 模拟器构建,但在为独立构建的目标文件中链接

Xcode 8 构建失败仅适用于模拟器

xcode UI 自动化脚本在 iPhone 上运行良好,但在 iPad 上失败

Xcode 构建因并发构建失败,将在 Flutter 中重试 2 秒

截图在模拟器中有效,但在真实设备上失败