【问题标题】:Handle URL scheme react-native and Swift处理 URL 方案 react-native 和 Swift
【发布时间】:2019-07-28 16:50:11
【问题描述】:

我想在我的 react-native 应用程序中处理自定义 URL 方案。因此,我首先在我的根组件内的 JS 代码中添加了一个 eventListener:

componentDidMount() {
    Linking.addEventListener('url', this.handleOpenURL);
}

componentWillUnmount() {
    Linking.removeEventListener('url', this.handleOpenURL);
}

handleOpenURL = event => {
    console.log('event', event);
};

在我的 Xcode 应用程序中,我添加了一个自定义 URL 方案“com.myScheme”。

当我尝试在我的 AppDelegate.swift 中添加函数来处理深度链接时,我的问题出现了。

这是我的功能:

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
    print(url)
    return true
}

似乎返回 true 不足以在我的应用程序中触发我的侦听器......

我知道 react-native 文档中有一个 Objective-C 方法:

#import <React/RCTLinkingManager.h>

- (BOOL)application:(UIApplication *)application
   openURL:(NSURL *)url
   options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
  return [RCTLinkingManager application:application openURL:url options:options];
}

但我想在我的项目中只使用 Swift,以提高我在这门语言方面的技能。问题是我找不到任何使用 Swift 实现的函数的示例。

这就是为什么我需要一些帮助来实现这个方法,然后在我的 RN 应用程序中触发我的事件。

感谢您的理解:)

【问题讨论】:

  • 如何在swift中导入RCTLinkingManager?

标签: javascript ios swift xcode react-native


【解决方案1】:

关于您的 AppDelegate 方法,swift 版本应该是:

public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return RCTLinkingManager.application(app, open: url, options: options)
}

【讨论】:

  • 谢谢你,这正是我想要的!它就像一个魅力;)
  • 如何在swift中导入RCTLinkingManager
  • 只需导入 React
  • @Hurobaki 你的意思是这个 import React 吗?你能在这里分享你的 swift 文件代码吗?
  • 我的意思是你应该已经在你的顶级文件中导入了 import React 的 React 包。并且不要忘记您在 Bridging-Header.h `#import « React/RCTLinkingManager.h » 中的导入。
【解决方案2】:

Ro22e0 的回答对我很有帮助。我的应用也支持通用链接,所以我还需要一个快速等效的 React Native docs 中提供的以下功能:

- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity
 restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler
{
 return [RCTLinkingManager application:application
                  continueUserActivity:userActivity
                    restorationHandler:restorationHandler];
}

我对 Swift 不太满意,但我最终通过反复试验获得了可行的解决方案:

func application(
    _ application: UIApplication,
    continue userActivity: NSUserActivity,
    restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
) -> Bool {
    return RCTLinkingManager.application(application, continue: userActivity, restorationHandler: restorationHandler)
}

【讨论】:

    猜你喜欢
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2020-09-03
    • 2017-04-23
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多