如何使我的 firebase 动态 link 重定向到我在桌面上的网站和我在移动设备上的即时应用程序

How to make my firebase dynamic link redirect to my website on desktop and to my instant app on mobile

我有一个免安装应用和一个重定向到此免安装应用的 Firebase 动态 link。

但是当我在计算机上单击动态 link 时,link 导致我的网站页面不存在。

根据 Google 文档:https://firebase.google.com/docs/dynamic-links/android/create

When users open a Dynamic Link on a desktop web browser, they will load this URL (unless the ofl parameter is specified). If you don't have a web equivalent to the linked content, the URL doesn't need to point to a valid web resource. In this situation, you should set up a redirect from this URL to, for example, your home page.

所以我为我的动态 link 创建了一个重定向 /分享/**到/

它有效,当我在计算机上单击 link 时,我登陆了我网站的主页。 但是我的 Dynamic links 也在我的主页上,并且不再打开我的即时应用程序。

所以我的问题是:如何配置重定向,将桌面用户从 /share/** 重定向到 / 而不会破坏我的即时应用程序?

将 "ofl" 参数添加到 url 以使 FDL 在桌面上重定向另一个 URL。

不幸的是,无法使用 Android 生成器添加此参数。

因此您必须手动创建 link,并使用 "setLongLink" 方法,您可以在页面底部看到:https://firebase.google.com/docs/dynamic-links/android/create#shorten-a-long-dynamic-link

Task<ShortDynamicLink> shortLinkTask = FirebaseDynamicLinks.getInstance().createDynamicLink()
        .setLongLink(Uri.parse("https://example.page.link/?link=https://www.example.com/&apn=com.example.android&ibn=com.example.ios"))
        .buildShortDynamicLink()
        .addOnCompleteListener(this, new OnCompleteListener<ShortDynamicLink>() {
            @Override
            public void onComplete(@NonNull Task<ShortDynamicLink> task) {
                if (task.isSuccessful()) {
                    // Short link created
                    Uri shortLink = task.getResult().getShortLink();
                    Uri flowchartLink = task.getResult().getPreviewLink();
                } else {
                    // Error
                    // ...
                }
            }
        });

我创建了自己的构建器以包含 ofl 参数。如果有帮助:

public class DynamicLinkBuilder {

    private String dynamicLink = "https://example.com/foo"

    public DynamicLinkBuilder(String link) {
        this.dynamicLink += "?link=" + link;
    }

    public DynamicLinkBuilder addMinVersion(int minVersion){
        dynamicLink += "&amv=" + minVersion;
        return this;
    }

    public DynamicLinkBuilder addIosUrl(String iosUrl){
        dynamicLink += "&ifl=" + iosUrl;
        return this;
    }

    public DynamicLinkBuilder addDesktopUrl(String desktopUrl){
        dynamicLink += "&ofl=" + desktopUrl;
        return this;
    }

    public DynamicLinkBuilder addFallbackUrl(String fallbackUrl){
        dynamicLink += "&afl=" + fallbackUrl;
        return this;
    }

    public DynamicLinkBuilder addPackageName(String packageName){
        dynamicLink += "&apn=" + packageName;
        return this;
    }

    public DynamicLinkBuilder addSocialMediaLogo(String logoUrl){
        dynamicLink += "&si=" + logoUrl;
        return this;
    }

    public DynamicLinkBuilder addSocialMediaTitle(String title){
        dynamicLink += "&st=" + Uri.encode(title);
        return this;
    }

    public DynamicLinkBuilder addSocialMediaDescription(String description){
        dynamicLink += "&sd=" + Uri.encode(description);
        return this;
    }

    public String build(){
        return dynamicLink;
    }
}

@西蒙,

无需手动link构建即可实现,只需使用相同的构建器

private static final String OTHER_PLATFORM_LINK_KEY = "ofl";

public static Task<ShortDynamicLink> createShortDynamicLink(Uri deepLink, Uri imageUrl, String title, String description) {
    DynamicLink dynamicLink = createDynamicLink(deepLink, imageUrl, title, description);
    return FirebaseDynamicLinks.getInstance().createDynamicLink()
            .setLongLink(dynamicLink.getUri())
            .buildShortDynamicLink();
}

public static DynamicLink createDynamicLink(Uri deepLink, Uri imageUrl, String title, String description) {
    DynamicLink dynamicLink = getDynamicLinkBuilder(deepLink, imageUrl, title, description)
            .buildDynamicLink();
    String longDynamicLink = String.valueOf(dynamicLink.getUri());
    longDynamicLink += '&' + OTHER_PLATFORM_LINK_KEY + '=' + DomainConstants.OTHER_PLATFORM_LINK;
    return FirebaseDynamicLinks.getInstance().createDynamicLink()
            .setLongLink(Uri.parse(longDynamicLink))
            .buildDynamicLink();
}

public static DynamicLink.Builder getDynamicLinkBuilder(Uri deepLink, Uri imageUrl, String title, String description) {
    return FirebaseDynamicLinks.getInstance().createDynamicLink()
            .setLink(deepLink)
            .setDomainUriPrefix(DomainConstants.DYNAMIC_LINK_DOMAIN_URI_PREFIX)
            .setAndroidParameters(new DynamicLink.AndroidParameters.Builder().build())
            .setIosParameters(new DynamicLink.IosParameters.Builder(DomainConstants.IOS_BUNDLE_ID)
                    .setAppStoreId(DomainConstants.APP_STORE_ID)
                    .setMinimumVersion(DomainConstants.IOS_MINIMUM_VERSION)
                    .build())
            .setSocialMetaTagParameters(
                    new DynamicLink.SocialMetaTagParameters.Builder()
                            .setTitle(title)
                            .setDescription(description)
                            .setImageUrl(imageUrl)
                            .build())
            .setNavigationInfoParameters(new DynamicLink.NavigationInfoParameters.Builder()
                    .setForcedRedirectEnabled(true)
                    .build());
}

我用类似的方法解决了这个问题,但代码更短: 正如其他人提到的,您必须手动将 'ofl' 参数添加到 link。我的方法是:

// Grab link from Firebase builder
guard var longDynamicLink = shareLink.url else { return }
// Parse URL to string
var urlStr = longDynamicLink.absoluteString
// Append the ofl fallback (ofl param specifies a device other than ios or android)
urlStr = urlStr + "&ofl=https://www.meetmaro.com/"
// Convert back to a URL
var urlFinal = URL(string: urlStr)!

// Shorten the url & check for errors
DynamicLinkComponents.shortenURL(urlFinal, options: nil, completion:{ [weak self] url,warnings,error in
        if let _ = error{
            return
        }
        if let warnings = warnings{
            for warning in warnings{
                print("Shorten URL warnings: ", warning)
            }
        }
        guard let shortUrl = url else {return}
        // prompt the user with UIActivityViewController
        self?.showShareSheet(url: shortUrl)
    })

然后可以使用最后的 URL 来呈现具有另一个功能的可共享面板,例如: self.showShareSheet(url: finalUrl) 触发 UIActivityViewController

原始想法归功于 http://ostack.cn/?qa=168161/

关于 ofl 的更多信息:https://firebase.google.com/docs/dynamic-links/create-manually?authuser=3#general-params

基于@Ivan Karpiuk 的回答:

Documentation:

ofl The link to open on platforms beside Android and iOS. This is useful to specify a different behavior on desktop, like displaying a full web page of the app content/payload (as specified by param link) with another dynamic link to install the app.

添加此 DynamicLink.Builder 扩展名:

private fun DynamicLink.Builder.otherPlatformParameters(): DynamicLink.Builder {
    var longDynamicLink = this.buildDynamicLink().uri.toString()
    longDynamicLink += "&ofl=" + YOUR_URL

    longLink = Uri.parse(longDynamicLink)

    return this
}

将 YOUR_URL 替换为您的,然后:

FirebaseDynamicLinks.getInstance().createDynamicLink()
        .setLink(...)
        .setDomainUriPrefix(...)
        .setAndroidParameters(...)
        .setIosParameters(...)
        .setSocialMetaTagParameters(...)
        .otherPlatformParameters()
        .buildShortDynamicLink()

所以我们通过 createDynamicLink() 创建一个长 link,添加 oflotherPlatformParameters() 然后将其转换为短 link buildShortDynamicLink()