我被委派来探索将React Native集成到Xamarin.Forms项目中的可能性。
我认为我已经接近实现它了,但我不能确定。我知道这有点奇怪/反向的解决方案,但无论如何我想试一试看我能否做到...
介绍
我的雇主希望看看是否可以使用React Native进行UI设计,并使用C#进行业务逻辑。正在探索这种解决方案,以便UI / UX团队可以使用RN生成工作,我们(开发团队)可以将其链接到逻辑中。
到目前为止我尝试过的方法
我接着拿到React Native输出的Xcode项目开始,通过在终端中cd到项目目录并运行react-native bundle --entry-file index.ios.js --platform ios --dev false --bundle-output ios/main.jsbundle --assets-dest ios
(摘自这篇博客文章)来删除本地Node服务的依赖项。然后我更改AppDelegate
代码行寻找main.jsbundle文件。
然后,我添加了一个静态库作为项目的目标。与应用程序的构建阶段进行比较后,我添加了所有相同的链接库
之后,我创建了一个Xamarin.Forms解决方案。由于我只创建了iOS库,所以我创建了一个iOS.Binding项目。我将Xcode .a lib作为本机引用添加到项目中。在ApiDefinition.cs
文件中,我创建了以下代码的接口:
BaseType(typeof(NSObject))]
interface TheViewController
{
[Export("setMainViewController:")]
void SetTheMainViewController(UIViewController viewController);
}
因此,在Xcode工程中创建了一个TheViewController
类。 setMainViewController:
的实现如下:
-(void)setMainViewController:(UIViewController *)viewController{
AppDelegate * ad = (AppDelegate*)[UIApplication sharedApplication].delegate;
NSURL * jsCodeLocation = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"main" ofType:@"jsbundle"]];
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"prototyper"
initialProperties:nil
launchOptions:ad.savedLaunchOptions];
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
ad.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
viewController.view = rootView;
ad.window.rootViewController = viewController;
[ad.window makeKeyAndVisible];
}
我正在尝试从 Xamarin 中传递一个 UIViewController
给 React Native,以便它能够将自己添加到其中。
我是通过以下方式在 Xamarin.iOS 中进行调用的:
private Binding.TheViewController _theViewController;
public override void ViewDidLoad()
{
base.ViewDidLoad();
_theViewController = new TheViewController();
_theViewController.SetTheMainViewController(this);
}
这个类正在实现PageRenderer
,覆盖了Xamarin.Forms的ContentPage
。
[assembly:ExportRenderer(typeof(RNTest.MainViewController), typeof(RNTest.iOS.MainViewController))]
经过这一切,我尝试部署到设备上,但是预料之中,遇到了一系列错误。AOT编译器进入我的库并尝试进行魔法操作,在React Native项目中引发了一系列链接错误,如下图所示:
我本意是在绑定中设置更多方法以设置回调等,以开始构建关于通过Objective-C来回传递信息的功能,我将通过一些本地代码链接将其传递到React Native中。
总结
我知道讲得挺长,但如果我们能启动这个项目,那么基本上可以使用C#完成所有复杂的业务逻辑,并将所有UI变化留给专门的UI团队,他们强烈倾向于React Native(因为他们的原型设计非常好)。实际上,这只是我正在准备下一个主要版本的应用程序的另一个POC而已。
如果有人能想到更好的方法,请告诉我。当然,我已经忽略了一些细节,如果需要澄清任何内容,请问我并进行修改。
非常感谢。
Luke