如何使用react-native-siri-shortcut(rootView问题)设置react-native-navigation

问题描述 投票:1回答:1

需要一些关于如何让RNNreact-native-siri-shortcut合作的指导。如果我的帖子过于冗长,请跟我一起,因为我是xCodeobjective C的菜鸟,所以不要错过任何东西。

所以我在尝试让两个库一起工作时遇到了一些问题/问题:

1.用initialProperties设置RCTRootView

react-native-siri-shortcutsAppDelegate.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

2.在代码的其他部分访问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不用于注册我们的应用程序,这部分代码是否有效?

我已经搜索了回购与initialPropsreactView有关的问题以及我找到的几个问题,从未得到回答,并且由于不活动而被关闭。

任何帮助将不胜感激。

react-native-navigation
1个回答
0
投票

实际上,在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
© www.soinside.com 2019 - 2024. All rights reserved.