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) { ... }
}
}
我有一个 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) { ... }
}
}