Flutter社交分享插件appinio_social_share_plus的使用

Flutter社交分享插件appinio_social_share_plus的使用

appinio_social_share_plusappinio_social_share 的一个分叉版本,目的是添加对 LinkedIn 动态和聊天的支持,并增加将任何 HTML 消息自动解析为纯文本的功能。

主要分享功能

  • Facebook 动态
  • Facebook 故事
  • Instagram 聊天
  • Instagram 动态
  • Instagram Reel
  • Instagram 故事
  • Messenger
  • Telegram
  • WhatsApp
  • Twitter
  • TikTok 状态
  • TikTok 视频
  • LinkedIn 动态
  • LinkedIn 聊天
  • 短信
  • 系统分享表
  • 复制到剪贴板
  • 检查这些应用是否已安装

示例预览

Android

iOS

只需使用 AppinioSocialSharePlus 类并调用你想要分享的平台的方法。

Android 配置

AndroidManifest.xml 文件中的 manifest 标签内粘贴以下属性:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="your package...">

例如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="your package...">

AndroidManifest.xml 中添加以下权限和查询:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="your package...">

    <queries>
        <!-- 显式指定已知的应用程序 -->
        <package android:name="com.instagram.android" />
        <package android:name="com.zhiliaoapp.musically" />
        <package android:name="com.facebook.katana" />
        <package android:name="com.facebook.orca" />
        <package android:name="org.telegram.messenger" />
        <package android:name="com.whatsapp" />
        <package android:name="com.twitter.android" />
        <package android:name="com.linkedin.android" />

        <provider android:authorities="com.facebook.katana.provider.PlatformProvider" />
        <provider android:authorities="com.facebook.orca.provider.PlatformProvider" />
    </queries>

    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
          android:maxSdkVersion="29" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

注意事项

MANAGE_EXTERNAL_STORAGE 需要从 Google Play 商店获取额外的权限。创建一个 xml 文件夹并在 android/app/src/main/res 中添加一个名为 provider_paths.xml 的文件,并添加以下行:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_files"
        path="." />
</paths>

创建完自己的文件提供器并定义路径后,将其粘贴到此位置并添加到 AndroidManifest.xml 中:

<provider
    android:name="com.appinio.socialshare.appinio_social_share.AppinioFileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
</provider>

Facebook 应用注册

  1. /android/app/src/main/values 文件夹中创建一个 strings.xml 文件,并添加你的 Facebook 应用 ID 和 Facebook 客户端令牌。
  2. 要获取 Facebook 客户端令牌,请访问 Meta 开发者网站 (链接) 并导航至设置 > 高级 > 安全 > 应用程序代码。
  3. 要获取 Facebook 应用 ID,请遵循上述 Meta 链接并转到你的应用设置 > 基本信息 > 应用 ID。
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="facebook_app_id">[facebook_app_id]</string>
    <string name="facebook_client_token">[facebook_client_token]</string>
</resources>

AndroidManifest.xmlapplication 标签内添加以下内容:

<provider android:name="com.facebook.FacebookContentProvider" android:authorities="com.facebook.app.FacebookContentProvider[facebook_app_id]"
         android:exported="true" />
<metadata android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" />
<metadata android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token" />
<metadata android:name="com.facebook.sdk.ApplicationName" android:value="${applicationName}"/>
<activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:label="${applicationName}" />

完成上述步骤后,在 AndroidManifest.xml 中添加以下 XML 标签。

iOS 配置

打开 Xcode 并将部署目标更改为 iOS 11

Info.plist 文件中添加以下内容:

<dict>
  <key>CFBundleURLTypes</key>
  <array>
  <dict>
      <key>CFBundleURLSchemes</key>
      <array>
          <string>fb[your_facebook_app_id]</string>
      </array>
  </dict>
  </array>

  <key>LSApplicationQueriesSchemes</key>
  <array>
  <string>instagram</string>
  <string>fb</string>
  <string>fbauth2</string>
  <string>fbshareextension</string>
  <string>fbapi</string>
  <string>facebook-reels</string>
  <string>facebook-stories</string>
  <string>fb-messenger-share-api</string>
  <string>fb-messenger</string>
  <string>tg</string>
  <string>whatsapp</string>
  <string>twitter</string>
  <string>linkedin</string>
  </array>

  <key>NSPhotoLibraryUsageDescription</key>
  <string>$(PRODUCT_NAME) 需要访问您的设备上的照片和视频</string>
  <key>NSMicrophoneUsageDescription</key>
  <string>$(PRODUCT_NAME) 不需要访问麦克风。</string>
  <key>NSCameraUsageDescription</key>
  <string>$(PRODUCT_NAME) 需要访问相机。</string>
  <key>NSAppleMusicUsageDescription</key>
  <string>$(PRODUCT_NAME) 需要播放音乐</string>

  <key>FacebookAppID</key>
  <string>[your_facebook_app_id]</string>
  <key>FacebookClientToken</key>
  <string>[your_facebook_client_token]</string>
  <key>FacebookDisplayName</key>
  <string>[your_facebook_app_display_name]</string>

  <key>NSBonjourServices</key>
  <array>
  <string>_dartobservatory._tcp</string>
  </array>
</dict>

Facebook 应用 ID 和 Facebook 客户端令牌可以通过完成 Android 配置中的步骤获得。

AppDelegate.swift 文件中添加以下代码:

import FBSDKCoreKit

// 在 application 函数中添加以下代码
FBSDKCoreKit.ApplicationDelegate.shared.application(
        application,
        didFinishLaunchingWithOptions: launchOptions
)

如果你想要在 iOS 上分享文件到 TikTok,可以按照以下步骤操作。对于 Android 分享,你不需要这些步骤。

步骤 1 - 安装 TikTok SDK

  1. 在 Xcode 中,点击 File -> Add Packages…
  2. 粘贴仓库 URL: https://github.com/tiktok/tiktok-opensdk-ios
  3. 选择依赖规则 -> 至下一个主要版本,并输入你想要的主要版本(例如 2.2.0,你可以在这里找到最新的发布版本)
  4. 选择 Add to Project -> 你的项目
  5. 点击 Copy Dependency 并选择 TikTokOpenShareSDK 和 TiktokOpenCoreSdk 库。

步骤 2 - 配置你的项目

  • 打开你的 Info.plist 文件并添加或更新以下键值对:
  • 添加以下值到 LSApplicationQueriesSchemes
  1. tiktokopensdk 用于登录套件。
  2. tiktoksharesdk 用于分享套件。
  3. snssdk1180snssdk1233 用于检查 TikTok 是否已安装在你的设备上。
  4. 添加 TikTokClientKey 键,并将你的应用客户端密钥作为值。
  5. 将你的应用客户端密钥添加到 CFBundleURLSchemes
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>tiktokopensdk</string>
    <string>tiktoksharesdk</string>
    <string>snssdk1180</string>
    <string>snssdk1233</string>
</array>
<key>TikTokClientKey</key>
<string>$TikTokClientKey</string>
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>$TikTokClientKey</string>
    </array>
  </dict>
</array>

步骤 3 - 在你的应用的 AppDelegate 中添加以下代码:

import UIKit
import Flutter
import TikTokOpenSDKCore
import TikTokOpenShareSDK
import Foundation
import Photos

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {

  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
      let cntrl : FlutterViewController = self.window?.rootViewController as! FlutterViewController
      let tiktok_channel = FlutterMethodChannel(name: "appinio_social_share_tiktok", binaryMessenger: cntrl.binaryMessenger)
          
      tiktok_channel.setMethodCallHandler(
        {
          (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
          if call.method == "tiktok_post" {
              let args = call.arguments as? [String: Any?]
              self.shareVideoToTiktok(args: args!, result: result)
          }else{
               result("Not implemented!")
          }
        })

    GeneratedPluginRegistrant.register(with: self)
    if #available(iOS 10.0, *) {
      UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
    }
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

    
    override func application(_ app: UIApplication,open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
        if (TikTokURLHandler.handleOpenURL(url)) {
            return true
        }
        return false
    }
    
    override func application(_ application: UIApplication,
                     continue userActivity: NSUserActivity,
                     restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        if (TikTokURLHandler.handleOpenURL(userActivity.webpageURL)) {
            return true
        }
        return false
    }
    
    func shareVideoToTiktok(args : [String: Any?],result: @escaping FlutterResult) {
        let videoFile = args["videoFile"] as? String
        let redirectUrl = args["redirectUrl"] as? String
        let fileType = args["fileType"] as? String
        let videoData = try? Data(contentsOf:  URL(fileURLWithPath: videoFile!)) as NSData
        

        PHPhotoLibrary.shared().performChanges({

            let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0];
            let filePath = "\(documentsPath)/\(Date().description)" + (fileType == "image" ? ".jpeg" : ".mp4")

            videoData!.write(toFile: filePath, atomically: true)
            if fileType == "image" {
                PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: URL(fileURLWithPath: filePath))

            }else {
                PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: URL(fileURLWithPath: filePath))

            }
        },
        completionHandler: { success, error in

            if success {

                let fetchOptions = PHFetchOptions()

                fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

                let fetchResult = PHAsset.fetchAssets(with: fileType == "image" ? .image : .video, options: fetchOptions)

                if let lastAsset = fetchResult.firstObject {
                    let localIdentifier = lastAsset.localIdentifier
                    let shareRequest = TikTokShareRequest(localIdentifiers: [localIdentifier], mediaType: fileType == "image" ? .image : .video, redirectURI: redirectUrl!)
                    shareRequest.shareFormat = .normal
                    DispatchQueue.main.async {
                        shareRequest.send()
                        result("success")
                    }
                }
            }
            else if let error = error {

                print(error.localizedDescription)
            }
            else {

                result("Error getting the files!")
            }
        })
    }

}

private func registerPlugins(registry: FlutterPluginRegistry) {
}

步骤 3 - 在 TikTok 开发者门户上创建一个 TikTok 应用并获取客户端密钥,并根据步骤 2 添加到 info.plist 中。

在 TikTok 开发者网站的 Appdetails 部分获取 client_key。然后通过导航到管理应用页面并点击 + 添加产品来向你的应用添加 Share Kit。

完成后,现在 shareToTiktokPost 将在 iOS 上开始工作。

使用示例

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  AppinioSocialSharePlus appinioSocialShare = AppinioSocialSharePlus();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        title: "Share Feature",
        home: Scaffold(
          body: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                child: const Text("ShareToWhatsapp"),
                onPressed: () async {
                  FilePickerResult? result = await FilePicker.platform
                      .pickFiles(type: FileType.image, allowMultiple: false);
                  if (result != null && result.paths.isNotEmpty) {
                    shareToWhatsApp("message", result.paths[0]!);
                  }
                },
              ),
              ElevatedButton(
                child: const Text("ShareToInstagramStory"),
                onPressed: () async {
                  FilePickerResult? result = await FilePicker.platform
                      .pickFiles(type: FileType.image, allowMultiple: false);
                  if (result != null && result.paths.isNotEmpty) {
                    shareToInstagramStory(
                        "yourFacebookAppId", "message", result.paths[0]!);
                  }
                },
              ),
              ElevatedButton(
                child: const Text("ShareToFacebookStory"),
                onPressed: () async {
                  FilePickerResult? result = await FilePicker.platform
                      .pickFiles(type: FileType.image, allowMultiple: false);
                  if (result != null && result.paths.isNotEmpty) {
                    shareToFacebookStory(
                        "yourFacebookAppId", result.paths[0]!);
                  }
                },
              ),
            ],
          ),
        ));
  }

  shareToWhatsApp(String message, String filePath) async {
    await appinioSocialShare.android.shareToSMS(message, filePath);
  }

  shareToInstagramStory(String appId, String message, String filePath) async {
    await appinioSocialShare.android
        .shareToInstagramStory(appId, stickerImage: filePath, message: message);
  }

  shareToFacebookStory(String appId, String filePath) async {
    await appinioSocialShare.android
        .shareToInstagramStory(appId, stickerImage: filePath);
  }
}

更多关于Flutter社交分享插件appinio_social_share_plus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter社交分享插件appinio_social_share_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


appinio_social_share_plus 是一个用于在 Flutter 应用中实现社交分享功能的插件。它支持分享文本、图片、文件等到各种社交平台和应用程序。以下是如何使用 appinio_social_share_plus 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 appinio_social_share_plus 依赖:

dependencies:
  flutter:
    sdk: flutter
  appinio_social_share_plus: ^1.0.0 # 确保使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入包

在需要使用分享功能的 Dart 文件中,导入 appinio_social_share_plus 包:

import 'package:appinio_social_share_plus/appinio_social_share_plus.dart';

3. 初始化插件

在使用插件之前,你需要初始化 AppinioSocialShare 实例:

final socialShare = AppinioSocialShare();

4. 分享文本

你可以使用 shareToInstagramStoryshareToWhatsAppshareToFacebook 等方法来分享文本到不同的社交平台。

socialShare.shareToWhatsApp(
  text: 'Hello, this is a shared text from my Flutter app!',
);

5. 分享图片

你可以分享图片文件到不同的社交平台。首先,确保你有图片文件的路径。

socialShare.shareToInstagramStory(
  imagePath: '/path/to/your/image.png',
);

6. 分享文件

你也可以分享文件(例如 PDF、文档等)到支持的社交平台。

socialShare.shareToWhatsApp(
  filePath: '/path/to/your/document.pdf',
);

7. 处理回调

你可以监听分享操作的回调,以了解分享是否成功。

socialShare.shareToWhatsApp(
  text: 'Hello, this is a shared text from my Flutter app!',
).then((success) {
  if (success) {
    print('Share successful');
  } else {
    print('Share failed');
  }
});

8. 其他功能

appinio_social_share_plus 还支持其他功能,如分享到 Facebook、Twitter、Telegram 等。你可以根据需求选择合适的分享方法。

示例代码

以下是一个完整的示例,展示如何分享文本和图片到 WhatsApp:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Social Share Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () {
                  final socialShare = AppinioSocialShare();
                  socialShare.shareToWhatsApp(
                    text: 'Hello, this is a shared text from my Flutter app!',
                  ).then((success) {
                    if (success) {
                      print('Share successful');
                    } else {
                      print('Share failed');
                    }
                  });
                },
                child: Text('Share Text to WhatsApp'),
              ),
              ElevatedButton(
                onPressed: () {
                  final socialShare = AppinioSocialShare();
                  socialShare.shareToWhatsApp(
                    filePath: '/path/to/your/image.png',
                  ).then((success) {
                    if (success) {
                      print('Share successful');
                    } else {
                      print('Share failed');
                    }
                  });
                },
                child: Text('Share Image to WhatsApp'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
回到顶部