iOS 14 Widget Deep Link 到 React-Native 应用失败

iOS 14 Widget Deep Link to React-Native app failing

我有一个 iOS14 小部件,我想将其深入 link 到我的 (React-Native) 应用程序的屏幕上。

我已经在应用程序端设置了深度 link,测试时我可以从 safari 打开所需的屏幕。

示例link:myapp://detail/123

AppDelegate.m 设置如下:

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
  
  if([url.scheme hasPrefix:@"myapp"]) {
    return [RCTLinkingManager application:application openURL:url options:options];
  }
  ...
}

...然后我在 RN 代码中有一个工作接收器,它使用 Linking 来处理 URL。一切顺利。

问题是,当我在我的小部件上触发 link 时,它会打开应用程序但不会通过 AppDelegate,因此 link 不会被处理。

var body: some View {
    ZStack(alignment: .topLeading) {
        ...
    }
    .widgetURL(URL(string: "myapp://detail/\(myIdValue)"))
}

我已将值 myapp 添加到主应用程序 info.plist 中的 URLScheme 值,然后在我的应用程序中添加 URL Types > URL Identifier 值小部件的 info.plist.

我可能在这里遗漏了一些明显的东西,但有人知道我哪里出错了吗?

你的应用支持多场景吗?如果是这样,您需要在场景委托而不是应用程序委托中实施 scene(_:openURLContexts:)

不要将直接小部件 URL 提供给父视图。使用子视图。像这样。

var body: some View {

 ZStack(alignment: .topLeading) {
    ZStack(alignment: .topLeading) {
        
    }
    .widgetURL(URL(string: "myapp://detail/\(myIdValue)"))
}
}

此外,对中型和大型小部件使用 Link。

var body: some View { 
    Link(destination: "myapp://detail/(myIdValue)") { 
       ZStack(alignment: .topLeading) { ... } 
  } 
}