You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter应用中如何无需用户交互动态发送Viber消息

Flutter实现自动向Viber群组发送消息(无需手动跳转)

url_launcher只能唤起Viber应用,无法实现自动发送消息的需求。要直接调用设备已登录的Viber账户发送群组消息,需要通过Flutter平台通道(MethodChannel)对接Viber原生SDK实现,具体步骤如下:

核心思路

Flutter本身没有原生Viber交互的官方插件,因此需要自己搭建Flutter与Android/iOS原生代码的通信桥接,通过Viber官方SDK调用已登录账户的消息发送能力。

步骤1:准备Viber开发者资源

前往Viber开发者平台注册应用,获取专属API密钥,后续需要在原生项目中配置该密钥。

步骤2:Flutter端实现通信通道

定义MethodChannel,封装调用原生发送消息的方法:

import 'package:flutter/services.dart';

class ViberMessaging {
  static const MethodChannel _viberChannel = MethodChannel('com.yourapp.viber/messaging');

  // 发送群组消息:groupId为Viber群组ID,message为待发送文本
  static Future<bool> sendGroupMessage(String groupId, String message) async {
    try {
      final bool result = await _viberChannel.invokeMethod(
        'sendGroupMessage',
        {'groupId': groupId, 'message': message},
      );
      return result;
    } on PlatformException catch (e) {
      print('Viber发送失败: ${e.message}');
      return false;
    }
  }
}

步骤3:Android端原生实现

配置依赖与权限

在app/build.gradle中添加Viber SDK依赖:

dependencies {
    implementation "com.viber:messaging:9.0.0"
}

在AndroidManifest.xml中添加权限与服务:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

<service android:name="com.viber.messaging.ui.MediaDownloadService" />

实现MethodChannel与Viber逻辑

修改MainActivity.kt:

import com.viber.messaging.*
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity(), ViberDelegate {
    private lateinit var viberApi: ViberApi
    private val CHANNEL = "com.yourapp.viber/messaging"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        // 初始化Viber SDK,替换为你的API密钥
        ViberApi.init(this, "YOUR_VIBER_API_KEY", this)
        viberApi = ViberApi.getInstance()

        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            when (call.method) {
                "sendGroupMessage" -> {
                    val groupId = call.argument<String>("groupId")
                    val message = call.argument<String>("message")
                    if (groupId != null && message != null) {
                        sendViberGroupMessage(groupId, message, result)
                    } else {
                        result.error("INVALID_ARGUMENTS", "缺少groupId或message", null)
                    }
                }
                else -> result.notImplemented()
            }
        }
    }

    private fun sendViberGroupMessage(groupId: String, message: String, result: MethodChannel.Result) {
        if (!viberApi.isLoggedIn) {
            result.error("NOT_LOGGED_IN", "Viber未登录", null)
            return
        }

        // 获取目标群组会话
        val groupConversation = viberApi.conversations.getConversationById(groupId)
        if (groupConversation == null) {
            result.error("GROUP_NOT_FOUND", "未找到目标群组", null)
            return
        }

        // 发送文本消息
        val textMessage = TextMessage(message)
        groupConversation.sendMessage(textMessage, object : MessageSentListener {
            override fun onMessageSent(messageId: String, status: Int) {
                result.success(status == Status.STATUS_SUCCEEDED)
            }

            override fun onMessageFailed(messageId: String, errorCode: Int, errorMessage: String) {
                result.error("SEND_FAILED", errorMessage, null)
            }
        })
    }

    // 实现ViberDelegate的必要空方法
    override fun onViberRegistered(userProfile: UserProfile?) {}
    override fun onViberUnregistered(errorCode: Int) {}
    override fun onConversationListUpdated(conversations: MutableList<Conversation>?) {}
    override fun onConversation(conversation: Conversation?) {}
    override fun onMessageReceived(message: Message?) {}
    override fun onFailedToReceiveMessage(messageId: String?, errorCode: Int, errorMessage: String?) {}
    override fun onMessageSeen(messageIds: MutableList<String>?, userId: String?) {}
    override fun onMessageDelivered(messageIds: MutableList<String>?, userId: String?) {}
    override fun onParticipantJoined(conversationId: String?, userProfile: UserProfile?) {}
    override fun onParticipantLeft(conversationId: String?, userId: String?) {}
    override fun onConversationParticipantRemoved(conversationId: String?, userId: String?) {}
    override fun onConversationParticipantAdded(conversationId: String?, userProfile: UserProfile?) {}
    override fun onConversationStarted(conversation: Conversation?) {}
}

步骤4:iOS端原生实现

配置依赖与权限

在Podfile中添加Viber SDK依赖:

pod 'ViberMessaging'

执行pod install安装依赖。

在Info.plist中添加配置:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>viber</string>
</array>
<key>NSContactsUsageDescription</key>
<string>需要访问联系人以获取Viber群组信息</string>

实现MethodChannel与Viber逻辑

修改AppDelegate.swift:

import UIKit
import Flutter
import ViberMessaging

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate, ViberDelegate {
    private let CHANNEL = "com.yourapp.viber/messaging"
    private var viberApi: ViberMessagingApi?

    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        // 初始化Viber SDK,替换为你的API密钥
        ViberMessagingApi.initialize(withAppKey: "YOUR_VIBER_API_KEY", delegate: self)
        viberApi = ViberMessagingApi.sharedInstance()

        let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
        let channel = FlutterMethodChannel(name: CHANNEL, binaryMessenger: controller.binaryMessenger)
        channel.setMethodCallHandler({ [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
            guard let self = self else { return }
            switch call.method {
            case "sendGroupMessage":
                guard let args = call.arguments as? [String: Any],
                      let groupId = args["groupId"] as? String,
                      let message = args["message"] as? String else {
                    result(FlutterError(code: "INVALID_ARGUMENTS", message: "缺少groupId或message", details: nil))
                    return
                }
                self.sendViberGroupMessage(groupId: groupId, message: message, result: result)
            default:
                result(FlutterMethodNotImplemented)
            }
        })

        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }

    private func sendViberGroupMessage(groupId: String, message: String, result: FlutterResult) {
        guard let viberApi = viberApi else {
            result(FlutterError(code: "NOT_INITIALIZED", message: "Viber SDK未初始化", details: nil))
            return
        }

        if !viberApi.isLoggedIn() {
            result(FlutterError(code: "NOT_LOGGED_IN", message: "Viber未登录", details: nil))
            return
        }

        // 获取目标群组会话
        guard let conversation = viberApi.conversation(withId: groupId) else {
            result(FlutterError(code: "GROUP_NOT_FOUND", message: "未找到目标群组", details: nil))
            return
        }

        // 发送文本消息
        let textMessage = ViberTextMessage(text: message)
        conversation.send(textMessage, completion: { (messageId, error) in
            if let error = error {
                result(FlutterError(code: "SEND_FAILED", message: error.localizedDescription, details: nil))
            } else {
                result(true)
            }
        })
    }

    // 实现ViberDelegate的必要空方法
    func viberRegistered(withUserProfile userProfile: ViberUserProfile?) {}
    func viberUnregistered(withError errorCode: Int32) {}
    func viberConversationListUpdated(withConversations conversations: [ViberConversation]?) {}
    func viberConversationUpdated(_ conversation: ViberConversation?) {}
    func viberMessageReceived(_ message: ViberMessage?) {}
    func viberFailedToReceiveMessage(withId messageId: String?, errorCode: Int32, errorMessage: String?) {}
    func viberMessageSeen(withIds messageIds: [String]?, userId: String?) {}
    func viberMessageDelivered(withIds messageIds: [String]?, userId: String?) {}
    func viberParticipantJoined(_ conversationId: String?, userProfile: ViberUserProfile?) {}
    func viberParticipantLeft(_ conversationId: String?, userId: String?) {}
    func viberConversationParticipantRemoved(_ conversationId: String?, userId: String?) {}
    func viberConversationParticipantAdded(_ conversationId: String?, userProfile: ViberUserProfile?) {}
    func viberConversationStarted(_ conversation: ViberConversation?) {}
}

注意事项

  • 确保测试设备安装了最新版Viber且用户已登录账户
  • Viber SDK部分功能需要平台审核,上线前需确认合规性
  • 群组ID可通过Viber SDK的会话列表接口获取

内容的提问来源于stack exchange,提问作者Mary Mery

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:35:15