【问题标题】:Xamarin.iOS - Deep link doesn't work when app is closedXamarin.iOS - 关闭应用程序时深层链接不起作用
【发布时间】:2018-05-28 21:01:07
【问题描述】:

我不明白,当应用程序处于后台时,深层链接工作正常,但当它关闭时,应用程序刚刚启动,没有任何反应.. 另外,由于应用程序一开始是关闭的,所以我无法调试它(至少我不知道该怎么做)。

你知道为什么它不起作用吗?

最好的,

最大

【问题讨论】:

  • 你是使用Url Scheme还是第三方库来实现deep link?无论应用程序处于后台还是终止状态,OpenUrl(UIApplication app, NSUrl url, NSDictionary options) 都将始终触发。您可以处理此事件来进行配置。
  • 我正在使用您刚刚提供的 OpenUrl.. 问题是,由于我无法调试,我不确定为什么它似乎不起作用..
  • 当应用程序关闭时,您确定它对您有用吗? (甚至不在后台运行)
  • 是的。您可以尝试使用 NSUserDefaults 显示警报或存储字符串以确认是否调用了此事件。也尝试在本次活动中分享您的代码,它可以帮助我们了解您想要达到的效果。
  • 很难共享代码,因为该应用程序已经很复杂,而且由于机密性...我知道它使它变得复杂..您知道什么时候会调用 OpenUrl 吗?喜欢在FinishedLaunching 之前还是之后?

标签: xamarin.ios deep-linking


【解决方案1】:

所以我终于在一段时间后发现了!

实际上,在应用尚未启动时未调用 OpenUrl 的事实是非常合乎逻辑的。

示例: my_app://query?id=azerty

  • 应用已经在后台#launched

    • OpenUrl(UIApplication app, NSUrl url, NSDictionary options) 将被调用,在 url 中,您可以找到启动应用程序的链接。
  • 应用程序未在后台运行#not_launched

    • FinishedLaunching(UIApplication application, NSDictionary launchOptions) 实际上会在launchOptions 中有url 参数。密钥UIApplicationLaunchOptionsURLKey 就是您要查找的那个。

代码示例:

public class AppDelegate : UIApplicationDelegate
{
    public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
    {
        /* ... */

        if (launchOptions != null && launchOptions.Count > 0)
        {
            try
            {
                var url = launchOptions["UIApplicationLaunchOptionsURLKey"] as NSUrl;
                var result = AppDeepLinksEntry(url);
            }
            catch (Exception ex) { /* ... */ }
        }

        /* ... */
    }

    #region OpenUrl

    public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
    {
        return AppDeepLinksEntry(url);
    }

    public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
    {
        return AppDeepLinksEntry(url);
    }

    #endregion OpenUrl

    private bool AppDeepLinksEntry(NSUrl url)
    {
        Debug.WriteLine($"OpenUrl Url : {url}");
        Debug.WriteLine($"OpenUrl Url Query: {url.Query}");
        Debug.WriteLine($"OpenUrl Url Host: {url.Host}");
        Debug.WriteLine($"OpenUrl Url Path: {url.Path}");

        return true;
    }
}

我希望上面的解释和代码示例可以帮助您理解和/或解决您未来的问题!

最大

【讨论】:

  • 我不完全同意这一点。我们可以从 launchOptions 获取 url,因为当应用程序终止时,如果我们打开应用程序,将调用事件 FinishedLaunching。但是正如我在上面所说的,OpenUrl() 将始终被触发,从documentation 我们可以知道,如果在您的应用程序暂停或在后台运行时到达一个 URL,系统会在调用此之前将您的应用程序移动到前台方法。
  • 也许你是对的,但我确实按照你说的去做了......当应用程序关闭时,我似乎没有通过OpenUrl。另外,我尝试只在 AppDelegate 中编辑调试变量的值,但仍然没有。也许只是我们的应用程序创建了这种行为?
猜你喜欢
  • 2014-09-18
  • 2021-08-19
  • 2016-06-26
  • 2022-12-11
  • 2019-07-21
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 2018-04-11
相关资源
最近更新 更多