Flutter Facebook Deeplinks集成插件flutter_facebook_deeplinks的使用

Flutter Facebook Deeplinks集成插件flutter_facebook_deeplinks的使用

Flutter插件用于支持Facebook App Links SDK。此插件必须用于捕获从Facebook广告安装应用后发送的延迟深度链接。

开始使用

首先,如果没有现有账户,请先在Facebook开发者平台创建一个应用:https://developers.facebook.com/(网址已去除)

获取您的应用ID(以下用[APP_ID]表示)。

配置Android

对于Android配置,可以遵循与Flutter Facebook App Events插件相同的说明: 阅读"Android App Events入门教程",并特别注意步骤2,通过在/app/res/values/strings.xml(或相应的debugrelease构建版本)中添加以下内容:

<string name="facebook_app_id">[APP_ID]</string>

之后,在主AndroidManifest.xml文件中添加该字符串资源引用:

<meta-data
  android:name="com.facebook.sdk.ApplicationId"
  android:value="@string/facebook_app_id" />

配置iOS

对于iOS配置,可以遵循与Flutter Facebook App Events插件相同的说明: 阅读"iOS App Events入门教程",并特别注意步骤4,通过以源代码形式打开info.plist并添加以下内容:

  • 如果代码中没有CFBundleURLTypes,请在最后的</dict>元素之前添加以下内容:
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>fb[APP_ID]</string>
    </array>
  </dict>
</array>
<key>FacebookAppID</key>
<string>[APP_ID]</string>
<key>FacebookDisplayName</key>
<string>[APP_NAME]</string>
  • 如果代码中已有CFBundleURLTypes,请插入以下内容:
<array>
 <dict>
 <key>CFBundleURLSchemes</key>
 <array>
   <string>fb[APP_ID]</string>
 </array>
 </dict>
</array>
<key>FacebookAppID</key>
<string>[APP_ID]</string>
<key>FacebookDisplayName</key>
<string>[APP_NAME]</string>

关于Facebook App Links

请参考官方SDK文档了解AndroidiOS的相关信息。

重要提示

用户隐私 [切勿忽略]

根据Facebook文档,从SDK v5.0.0开始,他们引入了一个标志来禁用自动SDK初始化以符合GDPR规定。 这意味着您应该在调用此插件的initFBLinks()方法之前收集用户同意,并保存用户的选项。此外,您还应给用户提供在未来撤销其同意的机会。 请注意,此插件默认情况下在Android上使用FacebookSDK.setAutoInitEnabled(true),在iOS上使用Settings.isAutoInitEnabled = true,因此在调用FlutterFacebookAppLinks.initFBLinks()之前,您必须在Dart代码中授予同意。

测试延迟深度链接

为了正确测试延迟深度链接,请勿使用FB广告系列的预览功能。 相反,请使用此工具APP ADS HELPER

在页面底部会找到一个“测试深度链接”按钮, 点击它并输入自定义URL方案(深度链接),例如:myawesomeapp://screen/login

选择第二个复选框(或两者都选)。记住,为了让它工作,您需要在设备上安装Facebook应用(Android或iPhone),并且必须使用与Facebook开发者控制台相同的帐户登录。

您的应用无需发布到商店,只需卸载它,然后使用Android Studio/VSCode或XCode重新安装即可在发送延迟深度链接后运行。

完整示例Demo

以下是一个完整的示例代码,展示如何在Flutter中集成flutter_facebook_deeplinks插件:

import 'package:flutter/material.dart';
import 'package:flutter_facebook_deeplinks/flutter_facebook_deeplinks.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  [@override](/user/override)
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  String _deepLinkUrl = '';

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化Facebook深度链接插件
    initFacebookDeepLinks();
  }

  Future<void> initFacebookDeepLinks() async {
    try {
      // 请求用户同意
      bool consentGranted = await requestUserConsent();

      if (consentGranted) {
        // 初始化Facebook深度链接
        await FlutterFacebookAppLinks.initFBLinks();

        // 监听深度链接事件
        FlutterFacebookAppLinks.onDeepLink.listen((event) {
          setState(() {
            _deepLinkUrl = event.url.toString();
          });
        });
      } else {
        print('用户未同意使用Facebook深度链接');
      }
    } catch (e) {
      print('初始化失败: $e');
    }
  }

  Future<bool> requestUserConsent() async {
    // 模拟请求用户同意(实际应用中可替换为弹窗)
    return true;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Facebook Deep Links Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('接收到的深度链接:'),
            SizedBox(height: 10),
            Text(_deepLinkUrl),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter Facebook Deeplinks集成插件flutter_facebook_deeplinks的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Facebook Deeplinks集成插件flutter_facebook_deeplinks的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_facebook_deeplinks 是一个 Flutter 插件,用于处理 Facebook 的深度链接(Deep Links)。它可以帮助你在应用中处理来自 Facebook 的深度链接,以便在用户点击 Facebook 广告或帖子时,能够直接跳转到应用中的特定页面。

安装插件

首先,你需要在 pubspec.yaml 文件中添加 flutter_facebook_deeplinks 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_facebook_deeplinks: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装插件。

配置 Facebook App Links

在 Facebook 开发者平台上,你需要为你的应用配置 App Links。具体步骤如下:

  1. 登录 Facebook 开发者平台
  2. 选择你的应用。
  3. 在左侧菜单中选择 “App Links”。
  4. 添加你的应用的 App Links URL,并配置相应的路径和参数。

在 Flutter 中使用 flutter_facebook_deeplinks

1. 初始化插件

在你的 main.dart 文件中,初始化 flutter_facebook_deeplinks 插件:

import 'package:flutter/material.dart';
import 'package:flutter_facebook_deeplinks/flutter_facebook_deeplinks.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 Facebook Deep Links
  await FlutterFacebookDeepLinks.init();
  
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Facebook Deep Links',
      home: HomeScreen(),
    );
  }
}

2. 处理深度链接

在你的应用启动时,你可以检查是否有来自 Facebook 的深度链接,并根据链接跳转到相应的页面。

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  String _deepLinkData = 'No deep link data';

  @override
  void initState() {
    super.initState();
    _checkDeepLink();
  }

  Future<void> _checkDeepLink() async {
    final deepLinkData = await FlutterFacebookDeepLinks.getDeepLink();
    if (deepLinkData != null) {
      setState(() {
        _deepLinkData = deepLinkData.toString();
      });
      // 根据 deepLinkData 跳转到相应的页面
      _navigateToPage(deepLinkData);
    }
  }

  void _navigateToPage(Map<String, dynamic> deepLinkData) {
    // 根据 deepLinkData 中的参数跳转到相应的页面
    // 例如:
    // if (deepLinkData['path'] == '/product') {
    //   Navigator.push(context, MaterialPageRoute(builder: (context) => ProductPage(id: deepLinkData['id'])));
    // }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Facebook Deep Links'),
      ),
      body: Center(
        child: Text(_deepLinkData),
      ),
    );
  }
}

3. 监听深度链接

你还可以监听深度链接的变化,以便在应用运行时处理新的深度链接。

@override
void initState() {
  super.initState();
  _checkDeepLink();
  
  // 监听深度链接的变化
  FlutterFacebookDeepLinks.onDeepLink.listen((deepLinkData) {
    setState(() {
      _deepLinkData = deepLinkData.toString();
    });
    _navigateToPage(deepLinkData);
  });
}

处理 iOS 和 Android 的配置

iOS 配置

ios/Runner/Info.plist 文件中,添加以下配置以支持 Facebook 的深度链接:

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>fb{your-app-id}</string>
    </array>
  </dict>
</array>
<key>FacebookAppID</key>
<string>{your-app-id}</string>
<key>FacebookDisplayName</key>
<string>{your-app-name}</string>
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>fbapi</string>
  <string>fb-messenger-share-api</string>
  <string>fbauth2</string>
  <string>fbshareextension</string>
</array>

Android 配置

android/app/src/main/AndroidManifest.xml 文件中,添加以下配置以支持 Facebook 的深度链接:

<application
    android:label="your_app_name"
    android:icon="@mipmap/ic_launcher">
    
    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/facebook_app_id" />
        
    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize">
        
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" android:host="your-domain.com" />
        </intent-filter>
    </activity>
</application>
回到顶部