需要一些关于如何让RNN与react-native-siri-shortcut合作的指导。如果我的帖子过于冗长,请跟我一起,因为我是xCode
和objective C
的菜鸟,所以不要错过任何东西。
所以我在尝试让两个库一起工作时遇到了一些问题/问题:
initialProperties
设置RCTRootView
react-native-siri-shortcuts
在AppDelegate.m
中设置应用程序,如下所示:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
// Check if the app launched with any shortcuts
BOOL launchedFromShortcut = [launchOptions objectForKey:@"UIApplicationLaunchOptionsUserActivityDictionaryKey"] != nil;
//Add a boolean to the initialProperties to let the app know you got the initial shortcut
NSDictionary *initialProperties = @{ @"launchedFromShortcut":@(launchedFromShortcut) };
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"doesthismatter"
initialProperties:initialProperties // Add the initial properties here
launchOptions:launchOptions];
...
}
在RNN的V2中,rootView不再被使用,而只是调用:
[ReactNativeNavigation bootstrap:jsCodeLocation launchOptions:launchOptions];
因此,我们无法将initialProperties
传递给rootView
。
rootView
继续设置react-native-siri-shortcut
:
// This method checks for shortcuts issued to the app
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *restorableObjects))restorationHandler
{
UIViewController *viewController = [self.window rootViewController];
RCTRootView *rootView = (RCTRootView*) [viewController view];
// If the initial properties say the app launched from a shortcut (see above), tell the library about it.
if ([[rootView.appProperties objectForKey:@"launchedFromShortcut"] boolValue]) {
ShortcutsModule.initialUserActivity = userActivity;
rootView.appProperties = @{ @"launchedFromShortcut":@NO };
}
[ShortcutsModule onShortcutReceivedWithUserActivity:userActivity];
return YES;
}
由于RCTRootView
不用于注册我们的应用程序,这部分代码是否有效?
我已经搜索了回购与initialProps
和reactView
有关的问题以及我找到的几个问题,从未得到回答,并且由于不活动而被关闭。
任何帮助将不胜感激。
实际上,在launchedFromShortcut
上搜索github属性我意识到它没有在Javascript方面消耗。因此,它的唯一用途是作为标志告诉应用程序是从快捷方式启动并将其传递给RNN的RNNReactRootViewCreator
似乎是不必要的。
删除了必要性,整合变得非常简单,我们只需要将launchedFromShortcut = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey] != nil;
添加到didFinishLaunchingWithOptions
并检查它在continueUserActivity
上的值。
AppDelegate.m
看起来如下:
#import "AppDelegate.h"
#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <ReactNativeNavigation/ReactNativeNavigation.h>
#import <RNSiriShortcuts/RNSiriShortcuts-Swift.h>
@implementation AppDelegate
BOOL launchedFromShortcut;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
launchedFromShortcut = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey] != nil;
[ReactNativeNavigation bootstrap:jsCodeLocation launchOptions:launchOptions];
//
// Regular RNN bootstrap code omitted for brevity sake
//
return YES;
}
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *restorableObjects))restorationHandler
{
if (launchedFromShortcut) {
ShortcutsModule.initialUserActivity = userActivity;
launchedFromShortcut = NO;
}
[ShortcutsModule onShortcutReceivedWithUserActivity:userActivity];
return YES;
}
@end