Firebase Dynamic Link 无法直接打开应用
Firebase Dynamic Link can’t open app directly
根据 Firebase 文档,我在 Firebase 控制台中创建 Dynamic Link,然后将 Dynamic Links SDK 添加到我的应用程序中。
一切都很好,但是当我从 facebook 或 Messenger 单击分享 link(这是我的动态 link)时,它会弹出一个带有打开应用程序按钮的页面并询问我是否我要不要打开我的应用程序。
我没有制作此页面。我想删除它。
但是我点击备忘录中的link,它会打开我的应用程序并直接转到正确的页面。我想要与共享 links 相同的方式。
这是我的代码,我使用 Xcode 和 Objective-c 来开发 iOS 应用程序。谢谢!
Appdelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
[FIROptions defaultOptions].deepLinkURLScheme = @"com.levooya.LeVooya";
[FIRApp configure];
return YES;
}
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray * _Nullable))restorationHandler{
NSURL *url = userActivity.webpageURL;
NSLog(@"continueUserActivity url.absoluteString:%@",url.absoluteString);
BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL completion:^(FIRDynamicLink *dynamicLink, NSError *error){
if(dynamicLink.url){
NSLog(@"okokokokokok");
NSLog(@"dynamicLink.url:%@",dynamicLink.url);
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:dynamicLink.url
resolvingAgainstBaseURL:NO];
for(NSURLQueryItem *item in urlComponents.queryItems){
if([item.name isEqualToString:@"product_id"]){
NSLog(@"item.value:%@",item.value);
NSString *productID = item.value;
NSDictionary *urlSchemeDict = [[NSDictionary alloc] init];
urlSchemeDict = [NSDictionary dictionaryWithObject:productID forKey:@"product_id"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"URLSchemeShowProduct" object:nil userInfo:urlSchemeDict];
leData = [LevooyaData getInstance];
leData.urlSchemeDict = nil;
leData.urlSchemeDict = urlSchemeDict;
}
}
}
}];
return YES;
}
ProductView.m
(这是在我的应用程序中显示产品的页面,这是我点击分享按钮生成动态的功能link。)
- (void)share{
NSString *originalLink = [NSString stringWithFormat:@"https://pbu3y.app.goo.gl/?link=https://levooya.com/product?product_id=%u&isi=1221262097&ibi=com.levooya.LeVooya&product_id=%u", productID, productID];
NSURL *link = [NSURL URLWithString:originalLink];
FIRDynamicLinkComponents *components =
[FIRDynamicLinkComponents componentsWithLink:link
domain:@"pbu3y.app.goo.gl"];
FIRDynamicLinkSocialMetaTagParameters *socialParams = [FIRDynamicLinkSocialMetaTagParameters parameters];
socialParams.title = product.brand;
socialParams.descriptionText = product.product;
components.socialMetaTagParameters = socialParams;
FIRDynamicLinkNavigationInfoParameters *navigationInfoParameters = [FIRDynamicLinkNavigationInfoParameters parameters];
navigationInfoParameters.forcedRedirectEnabled = 0;
components.navigationInfoParameters = navigationInfoParameters;
[components shortenWithCompletion:^(NSURL *_Nullable shortURL,
NSArray *_Nullable warnings,
NSError *_Nullable error) {
// Handle shortURL or error.
if (error) {
NSLog(@"Error generating short link: %@", error.description);
return;
}
shortenURL = shortURL;
NSString *noteStr = [NSString stringWithFormat:NSLocalizedString(@"Check out %@ %@ on Levooya ! %@", nil), product.brand, product.product, shortenURL];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[noteStr] applicationActivities:nil];
[self presentViewController:activityVC animated:YES completion:nil];
}];
}
您提到的页面是应用预览页面,请参见https://firebase.google.com/docs/dynamic-links/link-previews。
您可以通过指定动态 link 参数 efr=1
来禁用此页面。在控制台中创建 link 时也有一个复选框可以禁用此页面。在您的代码中使用 navigationInfoParameters.forcedRedirectEnabled = YES;
.
需要注意的事项:如果您在 iPhone 上安装了您的应用程序时看到应用程序预览页面,这意味着通用链接无法使用。当动态 links 被粘贴到浏览器地址栏时,可能会发生这种情况。或者点击非合作应用程序中发生的 link(某些应用程序不允许使用通用链接)。确保您在禁用 App 预览的情况下测试了 link 行为并且对此感到满意。
编辑:
刚刚意识到你的 deep link 是不正确的。
而不是
NSString *originalLink = [NSString stringWithFormat:@"https://pbu3y.app.goo.gl/?link=https://levooya.com/product?product_id=%u&isi=1221262097&ibi=com.levooya.LeVooya&product_id=%u", productID, productID];
你应该使用你的深度 link,像这样:
NSString *originalLink = [NSString stringWithFormat:@"https://levooya.com/product?product_id=%u", productID];
根据 Firebase 文档,我在 Firebase 控制台中创建 Dynamic Link,然后将 Dynamic Links SDK 添加到我的应用程序中。
一切都很好,但是当我从 facebook 或 Messenger 单击分享 link(这是我的动态 link)时,它会弹出一个带有打开应用程序按钮的页面并询问我是否我要不要打开我的应用程序。
但是我点击备忘录中的link,它会打开我的应用程序并直接转到正确的页面。我想要与共享 links 相同的方式。
这是我的代码,我使用 Xcode 和 Objective-c 来开发 iOS 应用程序。谢谢!
Appdelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
[FIROptions defaultOptions].deepLinkURLScheme = @"com.levooya.LeVooya";
[FIRApp configure];
return YES;
}
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray * _Nullable))restorationHandler{
NSURL *url = userActivity.webpageURL;
NSLog(@"continueUserActivity url.absoluteString:%@",url.absoluteString);
BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL completion:^(FIRDynamicLink *dynamicLink, NSError *error){
if(dynamicLink.url){
NSLog(@"okokokokokok");
NSLog(@"dynamicLink.url:%@",dynamicLink.url);
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:dynamicLink.url
resolvingAgainstBaseURL:NO];
for(NSURLQueryItem *item in urlComponents.queryItems){
if([item.name isEqualToString:@"product_id"]){
NSLog(@"item.value:%@",item.value);
NSString *productID = item.value;
NSDictionary *urlSchemeDict = [[NSDictionary alloc] init];
urlSchemeDict = [NSDictionary dictionaryWithObject:productID forKey:@"product_id"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"URLSchemeShowProduct" object:nil userInfo:urlSchemeDict];
leData = [LevooyaData getInstance];
leData.urlSchemeDict = nil;
leData.urlSchemeDict = urlSchemeDict;
}
}
}
}];
return YES;
}
ProductView.m
(这是在我的应用程序中显示产品的页面,这是我点击分享按钮生成动态的功能link。)
- (void)share{
NSString *originalLink = [NSString stringWithFormat:@"https://pbu3y.app.goo.gl/?link=https://levooya.com/product?product_id=%u&isi=1221262097&ibi=com.levooya.LeVooya&product_id=%u", productID, productID];
NSURL *link = [NSURL URLWithString:originalLink];
FIRDynamicLinkComponents *components =
[FIRDynamicLinkComponents componentsWithLink:link
domain:@"pbu3y.app.goo.gl"];
FIRDynamicLinkSocialMetaTagParameters *socialParams = [FIRDynamicLinkSocialMetaTagParameters parameters];
socialParams.title = product.brand;
socialParams.descriptionText = product.product;
components.socialMetaTagParameters = socialParams;
FIRDynamicLinkNavigationInfoParameters *navigationInfoParameters = [FIRDynamicLinkNavigationInfoParameters parameters];
navigationInfoParameters.forcedRedirectEnabled = 0;
components.navigationInfoParameters = navigationInfoParameters;
[components shortenWithCompletion:^(NSURL *_Nullable shortURL,
NSArray *_Nullable warnings,
NSError *_Nullable error) {
// Handle shortURL or error.
if (error) {
NSLog(@"Error generating short link: %@", error.description);
return;
}
shortenURL = shortURL;
NSString *noteStr = [NSString stringWithFormat:NSLocalizedString(@"Check out %@ %@ on Levooya ! %@", nil), product.brand, product.product, shortenURL];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[noteStr] applicationActivities:nil];
[self presentViewController:activityVC animated:YES completion:nil];
}];
}
您提到的页面是应用预览页面,请参见https://firebase.google.com/docs/dynamic-links/link-previews。
您可以通过指定动态 link 参数 efr=1
来禁用此页面。在控制台中创建 link 时也有一个复选框可以禁用此页面。在您的代码中使用 navigationInfoParameters.forcedRedirectEnabled = YES;
.
需要注意的事项:如果您在 iPhone 上安装了您的应用程序时看到应用程序预览页面,这意味着通用链接无法使用。当动态 links 被粘贴到浏览器地址栏时,可能会发生这种情况。或者点击非合作应用程序中发生的 link(某些应用程序不允许使用通用链接)。确保您在禁用 App 预览的情况下测试了 link 行为并且对此感到满意。
编辑: 刚刚意识到你的 deep link 是不正确的。 而不是
NSString *originalLink = [NSString stringWithFormat:@"https://pbu3y.app.goo.gl/?link=https://levooya.com/product?product_id=%u&isi=1221262097&ibi=com.levooya.LeVooya&product_id=%u", productID, productID];
你应该使用你的深度 link,像这样:
NSString *originalLink = [NSString stringWithFormat:@"https://levooya.com/product?product_id=%u", productID];