代号:通过 applink 打开应用时,iOS 上的 AppArg 为空

Posted

技术标签:

【中文标题】代号:通过 applink 打开应用时,iOS 上的 AppArg 为空【英文标题】:Codenameone: AppArg is null on ios when app open via applink 【发布时间】:2021-12-27 12:44:48 【问题描述】:

当通过 applink 打开我的 ios 应用程序时,由关联域功能指定,AppArg 为空。

start() 方法的连续调用(如this issue 中所述)不会发生。 在我的例子中,start() 只被调用一次,AppArg 为空,仅此而已。

start() 方法中,首先要做的是调用

Display.getInstance().getProperty("AppArg",null);

这在通过自定义方案打开应用时可以正常工作,但在通过应用链接打开时则不行。

注意:我使用ios.glAppDelegateBodyios.afterFinishLaunching 构建提示来处理通过推送通知打开的应用程序。我认为这可能会干扰 AppArg 的读取,因此我暂时删除了这些内容并再次尝试,但无济于事。

目前,我看到的唯一解决方案是编写一些本机代码并尝试以这种方式获取打开的 url,但我非常希望 AppArg 能够按照它所说的那样工作。

我已经在 iphone 6s 和 ios 15.1 上进行了测试。

更新 3:

这个问题是由于在didFinishLaunchingWithOptions 中调用facebook sdk 导致该方法返回NO,并阻止 continueUserActivity 执行和检索启动 url。有问题的代码是这样的:

return [[FBSDKApplicationDelegate sharedInstance] application:application
                                didFinishLaunchingWithOptions:launchOptions];

如果代号设置中存在facebook.appIdbuild 提示,则会执行此代码。

在我删除它之后,事情开始起作用了。

但是,如果您实际使用 facebook connect,您将无法执行此操作。

更新 2

根据文档here,我将以下 sn-p 添加到托管在我的域上的 apple-app-site-association 文件中。

"activitycontinuation": 

"apps": [ <id of my app> ]


还是不行。

相同的文档还说明了相关的域权利,如下所示:应添加activitycontinuation:example.com。所以我将它与应用链接一起添加到 ios.associatedDomains 构建提示中,如下所示:

ios.associatedDomains=applinks:mydomain.com,activitycontinuation:mydomain.com

还是不行。构建成功,但我不确定代号 one 是否真的在使用 activitycontinuation 服务。

所以,问题还是没有解决!

更新:

因此,流程启动、停止、启动仅在应用程序处于后台并通过应用程序链接单击打开时发生,并且两次启动都使用填充了应用程序链接的 AppArg 调用。在这种情况下一切顺利。

但是,如果应用程序已关闭,并通过单击应用链接打开,则仅调用一次 start 并且 AppArg 为空。问题!

永远不会调用方法shouldApplicationHandleURL。我在主应用程序类上实现了它,返回 true。

我还尝试添加本机代码以尝试获取应用链接,以应对应用先前关闭的情况。我尝试将下面的代码添加到glAppDelegateBody 构建提示中,但构建失败并抱怨continueUserActivity 是重复的。使用的代码是这样的:

- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
  restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler 

    NSURL *url = userActivity.webpageURL;
    // Handle url
  
  return YES;

目前,我的想法不多了。所以,请帮忙。谢谢。

【问题讨论】:

您是否可以访问较旧的操作系统版本来查看这是否是回归? @ShaiAlmog,不幸的是我没有。 :( 【参考方案1】:

iOS 使用与自定义应用 URL 方案不同的机制来处理应用链接,因此这里可能存在竞争条件 - 在将 URL 提供给应用之前调用 start()。

尝试在主生命周期类中实现 com.codename1.system.URLCallback 接口并实现shouldApplicationHandleURL 方法。这应该在处理应用链接时调用。

【讨论】:

从不调用方法 shouldApplicationHandleURL。请参阅更新后的帖子。谢谢。 显然解决方案似乎是在 didFinishLaunchingWithOptions 方法中使用 launchOption UIApplicationLaunchOptionsUserActivityKey 。我已经记录了这个问题的所有内容:github.com/codenameone/CodenameOne/issues/3529【参考方案2】:

就我而言,解决方案是从condenameone_settings.properties 中删除facebook.appId 构建提示。我不再使用 facebook,但忘记了构建提示。删除它后,事情开始工作了。

发现了这个here。

【讨论】:

【参考方案3】:

通过将以下代码添加到 ios.afterFinishLaunching 构建提示中,AppArg 将在应用程序 launchUrl(如果有)开始填充,无论是否使用 facebook sdk:

NSDictionary *activityDictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];
if (activityDictionary) 
    NSUserActivity *userActivity = [activityDictionary valueForKey:@"UIApplicationLaunchOptionsUserActivityKey"];
    if (userActivity != nil) 
           if ([NSUserActivityTypeBrowsingWeb isEqualToString:userActivity.activityType] && userActivity.webpageURL != nil) 
        JAVA_OBJECT launchUrlStr = fromNSString(CN1_THREAD_GET_STATE_PASS_ARG [userActivity.webpageURL absoluteString]);
        JAVA_OBJECT appArgKey = fromNSString(CN1_THREAD_GET_STATE_PASS_ARG @"AppArg");
        JAVA_OBJECT displayInstObj = com_codename1_ui_Display_getInstance__(CN1_THREAD_GET_STATE_PASS_SINGLE_ARG);
        
        com_codename1_ui_Display_setProperty___java_lang_String_java_lang_String(CN1_THREAD_GET_STATE_PASS_ARG displayInstObj, appArgKey, launchUrlStr);
        
    

【讨论】:

以上是关于代号:通过 applink 打开应用时,iOS 上的 AppArg 为空的主要内容,如果未能解决你的问题,请参考以下文章

为移动应用创建深层链接

iOS AppLinks 仅不适用于邮件应用程序

如何获取 AppLinks/通用链接的任何应用程序的 URI 方案?

与“applinks:”相关的域在开发中不起作用

为啥这个由 facebook 生成的深层链接(applink)不起作用?

iOS Universal Link问题