如何在没有 firebase 的情况下在 flutter 中进行深度链接?

Ami*_*nan 11 share widget package deep-linking flutter

我有一个 Netflix 模型应用程序,我想与其他人分享电影内容,如果接收者有该应用程序,那么内容应该在他/她的应用程序中打开,或者如果应用程序不存在,则访问网站。

我尝试使用 Firebase,但效果不太好,所以我尝试在 flutter 中使用 uni_links,但这是我第一次使用它,没有找到太多关于它的教程。

下面是我的代码,它纯粹是在 flutter 中,并使用共享小部件来共享内容。

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:share/share.dart';
import 'package:uni_links/uni_links.dart';

// Share tab
enum UniLinksType { string, uri }

class SharePage extends StatelessWidget 
{
    SharePage(this.shareType, this.share, this.image);
    final shareType;
    final VideoDataModel share;
    final image;

    String latestLink;
    Uri latestUri;

    StreamSubscription sub;
    UniLinksType type = UniLinksType.string;

    initPlatformState() async
    {

        if(type == UniLinksType.string)
        {
            await initPlatformStateForStringUniLinks();
        }
        else
        {
            await initPlatformStateForUriUniLinks();
        }
    }

    initPlatformStateForStringUniLinks() async
    {
        sub = getLinksStream().listen((String link)
        {
            latestLink = link ?? "Unknown";
            latestUri = null;

            try
            {
                if(link != null)
                {
                    latestUri = Uri.parse(link);
                }
            }
            on FormatException{}
        },
        onError: (err)
        {
            latestLink = "Failed to load latest link: $err";
            latestUri = null;
        });

        getLinksStream().listen((String link)
        {
            print('got link: $link');
        },
        onError: (err)
        {
            print('got err: $err');
        });

        String initialLink;
        Uri initialUri;

        // Platform messages may fail, so we use a try/catch PlatformException.
        try
        {
            initialLink = await getInitialLink();
            print("initial link: $initialLink");

            if (initialLink != null)
            {
                print("in if");
                initialUri = Uri.parse(initialLink);
            }
        }
        on PlatformException
        {
            initialLink = 'Failed to get initial link.';
            initialUri = null;
        }
        on FormatException
        {
            initialLink = 'Failed to parse the initial link as Uri.';
            initialUri = null;
        }
    }

    Future initPlatformStateForUriUniLinks() async
    {
        sub = getUriLinksStream().listen((Uri uri)
        {
            latestUri = uri;
            latestLink = uri?.toString() ?? 'Unknown';
        },
        onError: (err)
        {
            latestUri = null;
            latestLink = 'Failed to get latest link: $err.';
        });

        getUriLinksStream().listen((Uri uri)
        {
            print('got uri: ${uri?.path} ${uri?.queryParametersAll}');
        },
        onError: (err)
        {
            print('got err: $err');
        });

        Uri initialUri;
        String initialLink;

        try
        {
            initialUri = await getInitialUri();
            print('initial uri: ${initialUri?.path}'' ${initialUri?.queryParametersAll}');
            initialLink = initialUri?.toString();
        }
        on PlatformException
        {
            initialUri = null;
            initialLink = 'Failed to get initial uri.';
        }
        on FormatException
        {
            initialUri = null;
            initialLink = 'Bad parse the initial link as Uri.';
        }
        latestUri = initialUri;
        latestLink = initialLink;

        return latestUri;
    }

    Widget shareText()
    {
        return Text
        (
            "Share",
            style: TextStyle
            (
                fontFamily: 'Lato',
                fontSize: 12.0,
                fontWeight: FontWeight.w600,
                letterSpacing: 0.0,
                color: Colors.white
            ),
        );
    }

    Widget shareTabColumn()
    {
        return Column
        (
            mainAxisAlignment:
            MainAxisAlignment.center,
            children: <Widget>
            [
                Icon
                (
                    Icons.share,
                    size: 30.0,
                    color: Colors.white,
                ),
                new Padding
                (
                    padding: const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 10.0),
                ),
                shareText(),
            ],
        );
    }

    @override
    Widget build(BuildContext context) 
    {
        return Expanded
        (
            child: Material
            (
                child:  new InkWell
                (
                    onTap: ()
                    {
                       Share.share('$shareType'+ share.id.toString() + "\n" + share.name);
                       initPlatformState();
                    },
                    child: shareTabColumn(),
                ),
                color: Colors.transparent,
            )
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

在共享内容中,我想获取我的域名(例如www.example.co.in

Ale*_*erg 4

您不需要 firebase 来进行深度链接。您只需要按照官方文档在 iOS 和 Android 上启用深度链接即可深度链接

为了完整起见,这里提供了一个在 Android 和 IOS 上启用深度链接的代码片段。

AndroidManifest.xml

<meta-data android:name="flutter_deeplinking_enabled" android:value="true" />
<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="http" android:host="flutterbooksample.com" />
    <data android:scheme="https" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

iOS 信息.plist

<key>FlutterDeepLinkingEnabled</key>
<true/>
<key>CFBundleURLTypes</key>
<array>
    <dict>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleURLName</key>
    <string>flutterbooksample.com</string>
    <key>CFBundleURLSchemes</key>
    <array>
    <string>customscheme</string>
    </array>
    </dict>
</array>
Run Code Online (Sandbox Code Playgroud)

然后使用url_launcher包打开url。