【问题标题】:iOS - Deeplink doesn't work if app is inactiveiOS - 如果应用程序处于非活动状态,Deeplink 将不起作用
【发布时间】:2021-06-18 23:10:39
【问题描述】:

我正在为 ios 实现深层链接 -> 反应原生。

我知道如果应用处于非活动状态,将触发 didFinishLaunchingWithOptions 方法。 但是放置这些代码无助于在应用内传递深层链接

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  ...
  if(launchOptions) {
    NSDictionary *userInfo = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    NSURL *siteURL = [NSURL URLWithString:[userInfo objectForKey:@"url"]];
    if(siteURL) {
//      [self application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:^(UIBackgroundFetchResult result){}];
//      return [self application:application openURL:siteURL options:launchOptions];
      return [RCTLinkingManager application:application openURL:siteURL options:launchOptions];
    }
  }
  return Yes;
}

siteURL 是有效的,但我已经尝试了上述方法,但没有一个有效。

这是 openURL 方法,如果应用处于非活动状态,则永远不会调用该方法

- (BOOL)application:(UIApplication *)application
   openURL:(NSURL *)url
   options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
  NSLog(@"123456xx %@",url.absoluteString);
  NSString *myUrl = url.absoluteString;
  if ([myUrl containsString:@"fb***"]) {
      return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                                  openURL:url
                                                        sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                                               annotation:options[UIApplicationOpenURLOptionsAnnotationKey]
                    ];
    } else {
      return [RCTLinkingManager application:application openURL:url options:options];
    }
//  return [RCTLinkingManager application:application openURL:url options:options];
}

还有didReceiveRemoteNotification方法

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
  NSLog(@"123456 did receive");
  // redirect while got url from notif
  NSString *urlstr = (NSString*)[userInfo objectForKey:@"url"];
  if(urlstr) {
    NSLog(@"123456 did receive url %@", urlstr);
    NSURL *url = [NSURL URLWithString:urlstr];
    [RCTLinkingManager application:application openURL:url options:@{}];
  }


  [RNCPushNotificationIOS didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}

【问题讨论】:

    标签: ios react-native push-notification deep-linking


    【解决方案1】:

    您还需要像这样实现openURL 委托方法:

    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
        // handle deeplinks here.
    }
    

    即使您的应用如您所说的那样处于“非活动”状态,您也可以从那里处理 URL 的打开。

    【讨论】:

    • 我已经有了,更新了问题,如果应用处于非活动状态,则永远不会调用 openURL
    • 不确定您还缺少什么,但您可以尝试applicationDidBecomeActive。因为无论您的应用程序状态如何,都会调用此方法。请参阅其文档。也许你正在重新调整 willFinish 或 didFinishLaunchingWithOptions 中的 NO
    • 我注意到日志中有错误:finished with error [-1101] Error Domain=NSURLErrorDomain Code=-1101 "file is directory" UserInfo={NSLocalizedDescription=file is directory, NSErrorFailingURLStringKey=&lt;private&gt;, NSErrorFailingURLKey=&lt;private&gt;, _NSURLErrorRelatedURLSessionTaskErrorKey=&lt;private&gt;,但由于 url 对活动应用程序有效。
    • 经过一段时间的调查,我意识到这是 ios 错误,关闭/杀死的应用程序不会收到深度链接:github.com/OneSignal/react-native-onesignal/issues/1016
    • 我明白了。感谢分享。我没有注意到标签反应原生。并且不确定它是如何工作的,但理想情况下,即使处于关闭/终止状态,深度链接也应该可以工作。
    猜你喜欢
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多