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
相关产品推荐
相关产品推荐

