从未触发React本机链接url事件

0yg35tkg  于 2022-11-25  发布在  React
关注(0)|答案(1)|浏览(102)

当通过深层链接在模拟器中打开我的应用程序时,url事件从未触发。
请注意,如果应用程序关闭,getInitialurl可以工作。但如果应用程序已经打开,我运行npx uri-scheme open "mychat://bar" --ios,应用程序聚焦,但没有url事件触发...
有人遇到过这种问题吗?
我正在运行XCode 13.4.1 MacOS 12.5.1React原生0.70
repo to reproduce bug

xnifntxz

xnifntxz1#

此事件需要在AppDelegate. m文件中进行一些额外的配置,以便发出文档中提到的事件。从XCode打开您的项目并编辑AppDelegate. m,或者打开./ios/{YOUR_PROJECT_NAME}/AppDelegate. m(或AppDelegate. mm)文件并在@end标记之前的文件末尾添加以下行:

// Add this inside `@implementation AppDelegate` above `@end`:
- (BOOL)application:(UIApplication *)application
   openURL:(NSURL *)url
   options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
  return [RCTLinkingManager application:application openURL:url options:options];
}

// Add this inside `@implementation AppDelegate` above `@end`:
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity
 restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler
{
 return [RCTLinkingManager application:application
                  continueUserActivity:userActivity
                    restorationHandler:restorationHandler];
}

@end
    • 重要提示:**如果您可以使用此功能,则有两种方法来处理deeplink事件,您必须分别处理它们!我认为第二种方法可以帮助您解决问题。
  • 1-应用程序已关闭,将通过深层链接打开:*
Linking.getInitialURL().then(url => { 
   if(url != null) {
       //DoSomethingWithUrl
   }
});
  • 2-应用程序已在运行,将使用深层链接聚焦:*
Linking.addEventListener('url',(url)=>{ 
   if(url != null) {
       //DoSomethingWithUrl
   }
});

把这些行放到你的app视图中,假设你的app有某种状态(例如使用useState钩子或redux),它会在每次状态改变时被调用,因为除了状态本身之外的所有东西都会在状态改变时被重新呈现。因此我建议你在app启动时只调用这两个方法一次,这样你就可以做到:

const [isInitialStart, setInitialStart] = useState(true);
if(isInitialStart){
    Linking.getInitialURL().then(url => { 
        if(url != null) {
            //DoSomethingWithUrl
        }
    });
    Linking.addEventListener('url',(url)=>{ 
        if(url != null) {
            //DoSomethingWithUrl
        }
    });
    setInitialStart(false); 
}

我希望这能帮助你解决你的问题。

相关问题