Codenameone:当通过应用链接打开应用时,ios 上的 AppArg 为空
Codenameone: AppArg is null on ios when app open via applink
通过关联域功能指定的应用链接打开我的 ios 应用时,AppArg 为空。
start()
方法的连续调用,如 this issue 中所述,不会发生。
在我的例子中,start()
只被调用一次,AppArg 为空,仅此而已。
在 start()
方法中,a 做的第一件事是调用
Display.getInstance().getProperty("AppArg",null);
这在通过自定义方案打开应用程序时工作正常,但在通过应用程序链接打开时却不行。
注意:我使用 ios.glAppDelegateBody
和 ios.afterFinishLaunching
构建提示来处理通过推送通知打开的应用程序。我认为这可能会干扰 AppArg 读取,所以我暂时删除了它们并再次尝试,但无济于事。
目前,我看到的唯一解决方案是编写一些本机代码并尝试以这种方式打开 url,但我非常希望 AppArg 能够像它所说的那样工作。
我在 iphone 6s 上测试过 ios 15.1.
更新 3:
此问题是由于在 didFinishLaunchingWithOptions
中调用 facebook sdk 导致方法 return NO,并阻止 continueUserActivity 执行和检索启动 url .违规代码是这样的:
return [[FBSDKApplicationDelegate sharedInstance] application:application
didFinishLaunchingWithOptions:launchOptions];
如果 codenameone 设置中存在 facebook.appId
构建提示,则执行此代码。
我删除它后,一切开始正常工作。
但是,如果您实际使用 facebook 连接,则无法执行此操作。
更新 2
我根据文档 here.
将以下代码片段添加到托管在我域中的 apple-app-site-association
文件中
"activitycontinuation": {
"apps": [ <id of my app> ]
}
还是不行。
同一文档还说明了关联的域权利,如下所示:activitycontinuation:example.com
应添加。所以我将它添加到 ios.associatedDomains 构建提示中,连同应用程序链接,如下所示:
ios.associatedDomains=applinks:mydomain.com,activitycontinuation:mydomain.com
还是不行。构建成功,但我不确定代号一是否真的在使用 activitycontinuation
服务做某事。
所以,问题还是没有解决!
更新:
因此,流程启动、停止、启动仅在应用程序处于后台并通过应用程序链接单击打开时发生,并且两次启动都是通过填充有应用程序链接的 AppArg 调用的。在这种情况下一切都很好。
但是,如果应用已关闭,并通过点击应用链接打开,则仅调用一次启动且 AppArg 为空。问题!
从未调用方法 shouldApplicationHandleURL
。我在主应用程序 class 上实现了它,return 是真的。
我还尝试添加本机代码来尝试获取应用程序链接,以应对应用程序之前关闭的情况。我尝试将下面的代码添加到 glAppDelegateBody
构建提示中,但构建失败并抱怨 continueUserActivity
重复。使用的代码是这样的:
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
NSURL *url = userActivity.webpageURL;
// Handle url
return YES;
}
目前,我 运行 没主意了。所以,请帮忙。谢谢。
iOS 使用与处理自定义应用 URL 方案不同的机制来处理应用链接,因此这里很可能存在竞争条件 - 调用 start() 的地方在 URL 提供给应用程序之前。
尝试在主生命周期 class 中实现 com.codename1.system.URLCallback 接口并实现 shouldApplicationHandleURL
方法。这应该在处理应用链接时调用。
就我而言,解决方案是从 condenameone_settings.properties
中删除 facebook.appId
构建提示。我不再使用 facebook,但忘记了构建提示。删除它后,一切开始工作。
找到关于这个 。
通过将以下代码添加到 ios.afterFinishLaunching
构建提示,无论是否使用 facebook sdk,AppArg 都将在启动时使用应用程序 launchUrl(如果有)进行填充:
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);
}
}
}
通过关联域功能指定的应用链接打开我的 ios 应用时,AppArg 为空。
start()
方法的连续调用,如 this issue 中所述,不会发生。
在我的例子中,start()
只被调用一次,AppArg 为空,仅此而已。
在 start()
方法中,a 做的第一件事是调用
Display.getInstance().getProperty("AppArg",null);
这在通过自定义方案打开应用程序时工作正常,但在通过应用程序链接打开时却不行。
注意:我使用 ios.glAppDelegateBody
和 ios.afterFinishLaunching
构建提示来处理通过推送通知打开的应用程序。我认为这可能会干扰 AppArg 读取,所以我暂时删除了它们并再次尝试,但无济于事。
目前,我看到的唯一解决方案是编写一些本机代码并尝试以这种方式打开 url,但我非常希望 AppArg 能够像它所说的那样工作。
我在 iphone 6s 上测试过 ios 15.1.
更新 3:
此问题是由于在 didFinishLaunchingWithOptions
中调用 facebook sdk 导致方法 return NO,并阻止 continueUserActivity 执行和检索启动 url .违规代码是这样的:
return [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
如果 codenameone 设置中存在 facebook.appId
构建提示,则执行此代码。
我删除它后,一切开始正常工作。
但是,如果您实际使用 facebook 连接,则无法执行此操作。
更新 2
我根据文档 here.
将以下代码片段添加到托管在我域中的apple-app-site-association
文件中
"activitycontinuation": { "apps": [ <id of my app> ] }
还是不行。
同一文档还说明了关联的域权利,如下所示:activitycontinuation:example.com
应添加。所以我将它添加到 ios.associatedDomains 构建提示中,连同应用程序链接,如下所示:
ios.associatedDomains=applinks:mydomain.com,activitycontinuation:mydomain.com
还是不行。构建成功,但我不确定代号一是否真的在使用 activitycontinuation
服务做某事。
所以,问题还是没有解决!
更新:
因此,流程启动、停止、启动仅在应用程序处于后台并通过应用程序链接单击打开时发生,并且两次启动都是通过填充有应用程序链接的 AppArg 调用的。在这种情况下一切都很好。
但是,如果应用已关闭,并通过点击应用链接打开,则仅调用一次启动且 AppArg 为空。问题!
从未调用方法 shouldApplicationHandleURL
。我在主应用程序 class 上实现了它,return 是真的。
我还尝试添加本机代码来尝试获取应用程序链接,以应对应用程序之前关闭的情况。我尝试将下面的代码添加到 glAppDelegateBody
构建提示中,但构建失败并抱怨 continueUserActivity
重复。使用的代码是这样的:
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
NSURL *url = userActivity.webpageURL;
// Handle url
return YES;
}
目前,我 运行 没主意了。所以,请帮忙。谢谢。
iOS 使用与处理自定义应用 URL 方案不同的机制来处理应用链接,因此这里很可能存在竞争条件 - 调用 start() 的地方在 URL 提供给应用程序之前。
尝试在主生命周期 class 中实现 com.codename1.system.URLCallback 接口并实现 shouldApplicationHandleURL
方法。这应该在处理应用链接时调用。
就我而言,解决方案是从 condenameone_settings.properties
中删除 facebook.appId
构建提示。我不再使用 facebook,但忘记了构建提示。删除它后,一切开始工作。
找到关于这个
通过将以下代码添加到 ios.afterFinishLaunching
构建提示,无论是否使用 facebook sdk,AppArg 都将在启动时使用应用程序 launchUrl(如果有)进行填充:
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);
}
}
}