使用静态jsbundle为iOS设备构建时,“不变违反:应用程序AwesomeProject未注册”


68

首先,我不知道该如何反应,但是我认为部署到iOS设备而不是模拟器并不难于使用文档。他们有点稀疏,但是我到了某个地方,现在我被卡住了。我创建了一个main.jsbundle并将其添加到Xcode项目中,并在AppDelegate.m中取消注释该行。

部署它时,出现以下错误:

2015-03-26 16:13:08.538 AwesomeProject[4753:2477032] >
  RCTJSLog> "Running application "AwesomeProject" with appParams: {"rootTag":1,"initialProps":{}}. __DEV__ === true, development-level warning are ON, performance optimizations are OFF"
2015-03-26 16:13:08.547 AwesomeProject[4753:2477032] >
  RCTJSLog> "Error: 
 stack: 
  runApplication                  main.jsbundle:33769
  jsCall                          main.jsbundle:7157
  _callFunction                   main.jsbundle:7404
  applyWithGuard                  main.jsbundle:877
  guardReturn                     main.jsbundle:7206
  callFunctionReturnFlushedQueue  main.jsbundle:7413
 URL: file:///private/var/mobile/Containers/Bundle/Application/DBC0DAF4-B568-4CF5-B156-9EFEE4E7FF4A/AwesomeProject.app/main.jsbundle
 line: 1536
 message: Invariant Violation: Application AwesomeProject has not been registered."
2015-03-26 16:13:08.723 AwesomeProject[4753:2477032] >
  RCTJSLog> "#CLOWNTOWN (error while displaying error): Network request failed"

Answers:


140

我很确定@krazyeom的修复与此错误无关。就我而言,我通过退出从以前运行的测试应用程序运行的终端来解决此问题。似乎终端感到困惑,并且仍然迷上了一个不再在XCode中加载项目的进程。请尝试以下操作:

  1. 关闭由React Native生成的终端。
  2. 完全关闭XCode(可能没有必要)。
  3. 重新打开所有内容,然后重新运行。

3
我认为这与重新启动Xcode或Terminal无关。
Alexsander Akers,2015年

1
我也尝试过这个,所以我也不认为是这个。
cmp

这当然解决了我的问题,遇到此错误消息时,我也在运行我的第二个测试React Native应用程序。在二读时,我认为这不是您遇到的同样问题……
Pete Thorne

4
我不需要重新启动xcode。只需关闭终端,然后再次运行即可。已从另一个react native项目使终端保持打开状态
MattoTodd

这对我来说是成功的窍门(退出Xcode除外)。最初的构建始终会花费太多时间,从而导致错误。到那时,仅在Xcode中停止和启动还不够,终端也必须停止。
Marius Soutier

67

您的问题应该与控制台无关,如果您将javascript正确绑定到ios应用中,它将不会尝试与开发服务器通信,而只是从绑定中获取javascript。

从错误消息中,我猜您可能已重命名了主要组件。确保'AppName'您通过了

AppRegistry.registerComponent('AppName' /* <- */, ... )

@"AppName"AppDelegate.m在通话中匹配

[[RCTRootView alloc] initWithBundleUrl:...
                            moduleName:@"AppName" // <-
                         launchOptions:...

2
如果更改正在运行的应用程序,则必须重新启动程序包管理器。
GreenAsJade 2015年

2
最好的解释。主要组件的名称必须与您在AppDelegate.m中具有的模块名称匹配的事实
CarmenA 2016年

非常感谢你!我重命名了项目,并且遇到了这个问题。很高兴注意到这一点。现在,我必须发现旧方法使用AsyncStorage和NetInfo的库是什么,并且我的应用程序崩溃了,因为我没有直接使用。
法比亚诺·纽曼

30

这是因为本机服务器仍在监视旧服务器。您需要先关闭服务器。

您可以终止该过程。

在终端

ps aux | grep react

杀死或杀死该过程,然后

npm start

2
这是我的问题。如果您已经启动了多个项目,请小心!您需要意识到,对于您启动的第一个项目,反应服务器可能仍在后台运行。一旦我杀死了默认的“ awesomeproject”,我的新应用便启动并运行良好。
program247365

23

AppRegistry定义应用程序的入口点并提供根组件。

您的第一个参数与您的项目名称不匹配。

AppRegistry.registerComponent('AwesomeProject', () => YourMainComponent);

第一个参数registerComponent必须是您的项目名称,第二个参数是匿名函数,它将返回您的根反应组件。

如果第一个参数与xcode项目名称不匹配,则会出现该错误,表明您的应用程序尚未注册。

如果您在范围内没有AppRegistry,可以这样称呼它 React.AppRegistry.registerComponent,也可以将其分配给AppRegistryvar

var {
  AppRegistry
} = React;

这对我有帮助。谢谢。
Sushruth '02

通过他们的“入门”指令创建项目后,当我做本机教程时,这对我有帮助react-native init AwesomeProject
jacks205

16
AppRegistry.registerComponent('abc',() => ***); 

'abc'必须相同moduleName:@'abc'的文件名AppDelegate.m


1
我不小心搞砸了。您的回答为我解决了我,谢谢。
SudoPlz

14

我遇到过同样的问题。我通过给AppDelegate的moduleNameAppRegistry.registerComponent赋予相同的名称来解决它

如果您与一起运行应用程序,$ react-native run-ios则需要在其中重命名moduleName字段./ios/[project name]/AppDelegate.m以匹配项目的新名称。刷新电话模拟器,它应该显示新代码。


这是正确的答案
ed_is_my_name

同意,其他答案对我没有帮助,我添加了一些有关如何修复它的详细信息
jcollum

2
区分大小写!
弗拉德·文尼科夫

6

您是否更改了正在注册的应用程序的名称?我使用名称“ tricky”启动了应用程序,然后在此行中更改了名称:

AppRegistry.registerComponent('MyNewApp', () => MyNewApp);

我开始得到不变的错误。


在这种情况下,也请更改目标名称,或在Info.plist中硬编码新名称。
Marius Soutier

2

这很晚了,但是我仍然遇到同样的问题。我尝试遵循重新启动所有内容的路径,但没有解决。最终为我解决此问题的是确保我的app.json“名称”字段(在“ displayName”字段中使用了相同的值)与我的RCTRootView中的“ moduleName”字段匹配。匹配那些,一切都很古怪。希望这可以帮助某人。


2

重命名项目名称和几个文件后,出现此问题。要解决该问题,只需确保应用程序的名称在index.js app.json,MainActivity.java和AppDelegate.m中相同。

app.json

{ "name": "MyNewApp", "displayName": "MyNewApp" }

index.js

AppRegistry.registerComponent('MyNewApp', () => MyNewApp);

MainActivity.java

`@Override protected String getMainComponentName() {
return "MyNewApp"; }

1

我不喜欢关闭所有内容,因此我将对此进行深入研究。

我要做的就是在终端窗口中运行以下命令:

../lala/node_modules/react-native/packager/launchPackager.command ; exit; 

我的项目名称是“ lala”,因此请发现您的项目中也有node_modules。

将lala替换为您的项目名称即可。

如果出现错误,则表明端口已在使用中:

 ERROR  Packager can't listen on port 8081

然后,您有两种选择:

  • 杀死已经运行的程序。
  • 或通过进入来更改端口:../lala/node_modules/react-native/packager/packager.js然后找到您的端口号,例如8081,并替换为未使用的端口号。
 var options = parseCommandLine([{
          command: 'port',
          default: 8082,
        }, {

保存此文件,然后再次运行上述命令。

这样,我可以运行多个react(or)。


1

遇到了同样的错误,重新启动了包括xcode和terminal在内的所有功能。


1

引用一个无名的人。

这个对我有用。


我几天前遇到的问题几乎与您相同。对我来说,这是一个真实的装置。

根据我的所有研究,对我有用的解决方案如下:

  1. 当您通过键入react-native run-android启动应用程序时,将出现错误。
  2. 因此,进入包含“ adb.exe”的目录(对我来说是
    C:\Users\username\AppData\Local\Android\Sdk\platform-tools\
  3. 从这里打开一个终端。然后输入adb reverse tcp:8081 tcp:8081
  4. 然后,通过在手机上重新加载应用程序,它应该可以工作。

0

我在控制台中收到了类似的消息。

消息:永久违反:应用程序AwesomeProject尚未注册。”

我只是添加REACT_EDITOR=atom了〜/ .bashrc文件。


0

通常,Error如今这与react-navigation所使用的不同版本有关。

如果您使用的是react-navigation 4.0

"react-navigation": "^4.1.0",

您必须确保从正确的位置导入正确的元素

在你的 app.js

import { createAppContainer, createSwitchNavigator } from 'react-navigation'
import { createStackNavigator } from 'react-navigation-stack'
import { createBottomTabNavigator } from 'react-navigation-tabs'

这帮助我解决了问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.