ios - 带有奇怪的长动态链接 url 格式问题的 iOS Firebase 动态链接
问题描述
我遇到了一个基于 FirebaseDynamicLinks (4.0.8) 的长动态链接的奇怪问题:
已尝试参考类似问题firebase/quickstart-ios/issues/380#issuecomment-343255857和DynamicLinks.dynamicLinks().handleUniversalLink 返回 false
我的长动态链接格式是这样的:
并且已经通过appsearch-validation-tool确认我的真实链接是正常的
但是,我在 AppDelegate 中的 handleUniversalLink 实现没有回调,导致处理的返回 NO....
- (BOOL)application:(UIApplication *)application
continueUserActivity:(nonnull NSUserActivity *)userActivity
restorationHandler:
#if defined(__IPHONE_12_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0)
(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
#else
(nonnull void (^)(NSArray *_Nullable))restorationHandler {
#endif // __IPHONE_12_0
if ([userActivity webpageURL] != nil) {
NSString *incomingURL = [userActivity webpageURL].absoluteString;
NSLog(@"Incoming URL is %@", incomingURL);
BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL
completion:^(FIRDynamicLink * _Nullable dynamicLink,
NSError * _Nullable error) {
if (error != nil) {
return NSLog(@"Found an error! %@", error.localizedDescription);
}
if (dynamicLink != nil && dynamicLink.url != nil) {
[self handleIncomingDynamicLink:dynamicLink]; // additional declare
} else {
NSLog(@"This's weird. Dynamic link object has no url");
}
}];
if (handled) {
return YES;
} else {
// may do other things with incoming URL
return NO;
}
} else { return NO; }
}
解决方案
NSDictionary *FIRDLDictionaryFromQuery(NSString *queryString) {
NSArray<NSString *> *keyValuePairs = [queryString componentsSeparatedByString:@"&"];
NSMutableDictionary *queryDictionary = [NSMutableDictionary dictionaryWithCapacity:keyValuePairs.count];
for (NSString *pair in keyValuePairs) {
NSArray *keyValuePair = [pair componentsSeparatedByString:@"="];
if (keyValuePair.count == 2) {
NSString *key = keyValuePair[0];
NSString *value = [keyValuePair[1] stringByRemovingPercentEncoding];
[queryDictionary setObject:value forKey:key];
}
}
}
然后我跟踪 FIRDynamicLinks 并找到了根本原因。
iOS 的动态链接,过滤器字符为 @"&" 和 @"=" ,根据keyValuePair.count == 2
,我的参数将被删除 [link] 的关键字。
由于我的长动态链接在第一个 [&] 符号之前有两个 [=] 符号,因此 keyValuePair.count 为 3。
这样我的动态链接对象没有链接参数并返回 nil
我认为 url 必须参考Manually construction a Dynamic Link URL,并尽量保持相同。
最后,我发现类似的症状Deep Link 不包含有效的必需参数,链接值必须以百分比编码,解决了我的困惑和我的问题。
不过有趣的是,Android平台没有这个症状,同样长的动态链接也是可行的。
推荐阅读
- .net-core - Azure Functions:现有连接被远程主机强行关闭。已经在使用静态 HttpClient
- json - Jsonpath:无法使用表达式获得所需的值
- reactjs - 使用 React/Typescript 在 test-utils 中扩展 React 测试库的自定义渲染的返回类型是什么?
- python - 每次在新笔记本上使用 vs 代码中的“基础”环境
- r - 读取数据文件 - 类似结构的数组 - 数据在一定数量的行之后开始
- python - 为什么一个额外的无类型 str 正在返回?
- networking - 如何让多台服务器来分配网络上的工作负载?Opnet 问题
- oracle - PLS-00103:在预期以下情况之一时遇到符号“DELETE”:(-+ case mod new not null select with
- javascript - 从 .load jquery 返回到我的 div 框的“主页”内容
- javascript - HTML页面和Flask Python App之间的异步通信