
SDK Persatuan Resmi untuk Obrolan Streaming.
Situs web | Tutorial | Dokumentasi SDK | Daftar untuk Kunci API

Obrolan Stream SDK adalah SDK Unity resmi untuk obrolan stream, layanan untuk membangun obrolan dan permainan pesan dan aplikasi.
IL2CPP didukung
WebGL didukung
Stream gratis untuk sebagian besar proyek sisi dan hobi. Anda dapat menggunakan obrolan stream secara gratis dengan kurang dari lima anggota tim dan tidak lebih dari $ 10.000 dalam pendapatan bulanan. Kunjungi situs web kami dan ajukan akun Makers.
.unitypackage yang diunduhLihat tutorial kami tentang cara mengatur proyek Anda dan melakukan operasi dasar.
Di folder StreamChat/SampleProject Anda akan menemukan contoh obrolan yang berfungsi sepenuhnya:

Dibuat dengan sistem UGUI UI Unity dan mendukung baik Legacy dan sistem input Unity yang baru.
StreamChat/SampleProject/Config/DemoCredentials.assetStreamChat/SampleProject/Scenes/ChatDemo.scene dan tekan PlayBagaimana cara mengaktifkan sistem input baru Unity?:
Multiple precompiled assemblies with the same name Newtonsoft.Json.dll included or the current platform. Only one assembly with the same name is allowed per platform.
Anda dapat menghapus [email protected] direktori. Namun harap dicatat, paket Unity untuk NewTonsoft JSON memiliki dukungan IL2CPP. Jika Anda ingin menggantinya dan tetap menggunakan IL2CPP, pastikan bahwa JSON Implement dari pilihan Anda juga mendukung IL2CPP.
Berikut adalah beberapa sampel kode cepat untuk Anda mulai. Untuk informasi terperinci, silakan lihat dokumentasi kami
StreamChatClient - Manajer Obrolan Utama yang memungkinkan Anda untuk terhubung dengan Server Obrolan Stream, membuat saluran, saluran kueri, pengguna, dan anggota berdasarkan kriteria yang disediakanStreamChannel - menyalurkan pengguna grup dalam percakapan. Tergantung pada pengaturan Anda, pengguna mungkin perlu bergabung dengan saluran sebagai anggota untuk mengirim pesanStreamUser - mewakili satu pengguna dalam aplikasi AndaStreamChannelMember - Objek yang mewakili pengguna yang merupakan anggota saluran tertentu. Objek ini berisi member.User properti. Pengguna untuk mengakses objek penggunaStreamMessage - mewakili satu pesan dalam saluran Pengguna StreamChatClient.CreateDefaultClient(); Metode pabrik untuk membuat instance IStreamChatClient :
public class ChatManager : MonoBehaviour
{
public IStreamChatClient Client { get ; private set ; }
protected void Awake ( )
{
Client = StreamChatClient . CreateDefaultClient ( ) ;
}
}Cara termudah untuk memulai adalah dengan memungkinkan otorisasi pengembang dan terhubung dengan token auth yang dihasilkan di sisi klien:
var userId = StreamChatClient . SanitizeUserId ( "user-name" ) ;
var userToken = StreamChatClient . CreateDeveloperAuthToken ( userId ) ;
// Replace API_KEY with your Api Key from the Stream Dashboard
var localUserData = await Client . ConnectUserAsync ( "API_KEY" , userId , userToken ) ; Setiap fungsi yang menunggu respons dari server yang dapat Anda hubungi menggunakan sintaks C# Modern Async/Await atau tambahkan .AsCallback() dan gunakan sebagai panggilan balik klasik sebagai berikut:
Client . ConnectUserAsync ( "API_KEY" , userId , userToken )
. AsCallback ( onSuccess : result =>
{
var localUserData = result ;
} , onFailure : exception =>
{
Debug . LogException ( exception ) ;
} ) ; Metode .AsCallback() menerima dua delegasi: Action<TResponse> onSuccess dan Action<Exception> onFailure yang dapat Anda gunakan untuk bereaksi terhadap kasus respons sukses dan kesalahan. Alih -alih panggilan balik lambda, Anda juga dapat memberikan metode dengan tanda tangan yang sama seperti pada contoh di bawah ini:
public void ConnectUser ( )
{
var userId = StreamChatClient . SanitizeUserId ( "user-name" ) ;
var userToken = StreamChatClient . CreateDeveloperAuthToken ( userId ) ;
Client . ConnectUserAsync ( "API_KEY" , userId , userToken )
. AsCallback ( OnUserConnected , OnUserConnectionFailed ) ;
}
private void OnUserConnected ( IStreamLocalUserData localUserData )
{
Debug . Log ( "User connected: " + localUserData . User . Name ) ;
}
private void OnUserConnectionFailed ( Exception exception )
{
Debug . LogException ( exception ) ;
} Kami sangat menyarankan menggunakan sintaks async/await yang, seperti yang akan Anda perhatikan dalam contoh -contoh berikut, membuat kode ini lebih sederhana dan lebih mudah dibaca dan dipelihara.
Setelah Anda terhubung, Anda dapat mulai menggunakan saluran sehingga pengguna dapat mengirim pesan.
Ada 2 cara untuk membuat saluran:
Untuk saluran yang telah ditentukan sebelumnya yang dapat bergabung dengan pengguna. Ini bagus untuk setiap saluran atau klan tujuan umum, klub, grup yang dapat digabungkan atau ditinggalkan pengguna.
var channel = await Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" ) ;atau dengan panggilan balik:
Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" )
. AsCallback ( channel =>
{
Debug . Log ( $ "Channel { channel . Id } created successfully" ) ;
} , exception =>
{
Debug . LogException ( exception ) ;
} ) ; Bagus untuk pesan grup publik atau pribadi, urutan pengguna dalam grup tidak masalah jadi setiap kali pengguna terhubung menggunakan metode ini mereka akan selalu melihat riwayat obrolan mereka:
var channel = await Client . GetOrCreateChannelWithMembersAsync ( ChannelType . Messaging , users ) ; Untuk menelusuri semua saluran atau saluran yang disaring oleh beberapa kriteria Gunakan Client.QueryChannelsAsync
var filters = new IFieldFilterRule [ ]
{
ChannelFilter . Cid . In ( "channel-cid" , "channel-2-cid" , "channel-3-cid" )
} ;
var sort = ChannelSort . OrderByAscending ( ChannelSortFieldName . CreatedAt ) ;
var channels = await Client . QueryChannelsAsync ( filters , sort ) ;Mekanisme penyaringan sangat kuat dan memungkinkan Anda untuk menggabungkan banyak aturan. Anda dapat memeriksa daftar lengkap bidang dan operator yang dapat Anda gunakan untuk kueri saluran di sini.
// Each operator usually supports multiple argument types to match your needs
ChannelFilter . Cid . EqualsTo ( "channel-cid" ) ; // string
ChannelFilter . Cid . EqualsTo ( channel ) ; // IStreamChannel
ChannelFilter . Cid . In ( "channel-cid" , "channel-2-cid" , "channel-3-cid" ) ; // Comma separated strings
var channelCids = new List < string > { "channel-1-cid" , "channel-2-cid" } ;
ChannelFilter . Cid . In ( channelCids ) ; // Any collection of string var filters = new IFieldFilterRule [ ]
{
ChannelFilter . CreatedById . EqualsTo ( Client . LocalUserData . User )
} ; var filters = new IFieldFilterRule [ ]
{
ChannelFilter . MembersCount . GreaterThan ( 10 )
} ; var weekAgo = DateTime . Now . AddDays ( - 7 ) . Date ;
var filters = new IFieldFilterRule [ ]
{
ChannelFilter . CreatedAt . GreaterThan ( weekAgo )
} ; var dayAgo = DateTime . Now . AddHours ( - 24 ) ;
var filters = new IFieldFilterRule [ ]
{
ChannelFilter . UpdatedAt . GreaterThan ( dayAgo )
} ; Pesan dapat diakses melalui properti channel.Messages yang berisi koleksi pesan terbaru. Karena mungkin ada potensi ribuan pesan dalam riwayat saluran channel.Messages Koleksi Tekan hanya berisi pesan terbaru. Anda dapat memuat pesan yang lebih lama dengan menelepon channel.LoadOlderMessagesAsync() yang akan memuat bagian tambahan dari riwayat. Pendekatan yang umum adalah menelepon channel.LoadOlderMessagesAsync() setiap kali pengguna mencapai akhir dari tampilan gulir pesan Anda, dengan cara ini Anda hanya memuat pesan lama ketika pengguna benar -benar ingin melihatnya. Anda dapat melihat contoh pendekatan ini dalam messagelistview.cs proyek sampel
var sentMessage = await channel . SendNewMessageAsync ( "Hello" ) ; var messageInThread = await channel . SendNewMessageAsync ( new StreamSendMessageRequest
{
ParentId = parentMessage . Id , // Write in thread
ShowInChannel = false , // Optionally send to both thread and the main channel like in Slack
Text = "Hello" ,
} ) ; var messageWithQuote = await channel . SendNewMessageAsync ( new StreamSendMessageRequest
{
QuotedMessage = quotedMessage , // Reference to IStreamMessage
Text = "Hello" ,
} ) ;Pesan diam tidak memicu acara untuk anggota saluran. Sering digunakan untuk pesan sistem
var silentMessage = await channel . SendNewMessageAsync ( new StreamSendMessageRequest
{
Text = "System message" ,
Silent = true
} ) ; await message . PinAsync ( ) ; await message . PinAsync ( new DateTime ( ) . AddDays ( 7 ) ) ; // Pin for 7 days await message . UnpinAsync ( ) ; await message . UpdateAsync ( new StreamUpdateMessageRequest
{
Text = "New changed message" ,
} ) ; await message . UpdateAsync ( new StreamUpdateMessageRequest
{
CustomData = new StreamCustomDataRequest
{
{ "CategoryId" , 12 } ,
{ "Awards" , new string [ ] { "Funny" , "Inspirational" } }
}
} ) ;Hanya menghapus teks tetapi meninggalkan data terkait, reaksi, sub-pesan utas lainnya
await message . SoftDeleteAsync ( ) ; Menghapus pesan sepenuhnya dan menghapus semua data yang terkait dengan pesan ini
await messageInChannel . HardDeleteAsync ( ) ; await message . SendReactionAsync ( "like" ) ; await message . SendReactionAsync ( "clap" , 10 ) ; await message . SendReactionAsync ( "love" , enforceUnique : true ) ; await message . DeleteReactionAsync ( "like" ) ; // Get file byte array however you want e.g. Addressables.LoadAsset, Resources.Load, etc.
var sampleFile = File . ReadAllBytes ( "path/to/file" ) ;
var fileUploadResponse = await channel . UploadFileAsync ( sampleFile , "my-file-name" ) ;
var fileWebUrl = fileUploadResponse . FileUrl ; var sampleImage = File . ReadAllBytes ( "path/to/file" ) ;
var imageUploadResponse = await channel . UploadImageAsync ( sampleFile , "my-image-name" ) ;
var imageWebUrl = imageUploadResponse . FileUrl ; var channel = await Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , channelId : "my-channel-id" ) ;
await channel . DeleteFileOrImageAsync ( "file-url" ) ; Objek saluran sedang diperbarui secara otomatis setiap kali perubahan terjadi (pesan baru, reaksi, dll.). Anda dapat bereaksi terhadap perubahan ini dengan berlangganan peristiwa yang terbuka IStreamChannel :
channel . MessageReceived += OnMessageReceived ;
channel . MessageUpdated += OnMessageUpdated ;
channel . MessageDeleted += OnMessageDeleted ;
channel . ReactionAdded += OnReactionAdded ;
channel . ReactionUpdated += OnReactionUpdated ;
channel . ReactionRemoved += OnReactionRemoved ; var localUserData = Client . LocalUserData ;
var localUser = localUserData . User ;StreamUser yang mewakili pengguna di perangkat lokal var users = await Client . QueryUsersAsync ( ) ; var users = await Client . QueryUsersAsync ( new Dictionary < string , object > ( )
{
{
"id" , new Dictionary < string , object >
{
{ "$eq" , otherUserId }
}
}
} ) ;
var otherUser = users . First ( ) ; var filters = new Dictionary < string , object >
{
{
"id" , new Dictionary < string , object >
{
{
"$in" , listOfUserIds
}
}
}
} ;
var users = await Client . QueryUsersAsync ( filters ) ;Baca lebih lanjut tentang parameter dan operator kueri yang didukung
Tergantung pada konfigurasi aplikasi Anda, pengguna mungkin perlu bergabung dengan saluran sebagai anggota untuk mengirim pesan atau melihat pesan pengguna lain
// Multiple overloads available depending on your needs
await channel . AddMembersAsync ( user ) ; // instance of IStreamUser
await channel . AddMembersAsync ( user1 , user1 ) ; // Multiple instances of IStreamUser
await channel . AddMembersAsync ( listOfUsers ) ; // List<IStreamUser>
await channel . AddMembersAsync ( "user-id" ) ; // string ID
await channel . AddMembersAsync ( listOfUserIds ) ; // List<string> that contains IDs // Multiple overloads available depending on your needs
await channel . RemoveMembersAsync ( member ) ; // instance of IStreamChannelMember
await channel . RemoveMembersAsync ( member1 , member2 ) ; // Multiple instances of IStreamChannelMember
await channel . RemoveMembersAsync ( listOfMembers ) ; // List<IStreamChannelMember>
await channel . RemoveMembersAsync ( user ) ; // instance of IStreamUser
await channel . RemoveMembersAsync ( user1 , user1 ) ; // Multiple instances of IStreamUser
await channel . RemoveMembersAsync ( listOfUsers ) ; // List<IStreamUser>
await channel . RemoveMembersAsync ( "user-id" ) ; // string ID
await channel . RemoveMembersAsync ( listOfUserIds ) ; // List<string> that contains IDsStream menyediakan semua alat dan fitur yang diperlukan untuk mengelola komunitas besar dengan benar.
Penandaan berarti bahwa pengguna atau pesan ini akan dilaporkan ke moderasi obrolan. Admin dan moderator obrolan dapat melihat pengguna dan pesan yang dilaporkan di dasbor.
await user . FlagAsync ( ) ; await message . FlagAsync ( ) ; await channel . BanUserAsync ( user ) ; await channel . BanUserAsync ( user , "You got banned for 2 hours for toxic behaviour." , 120 ) ; Banning IP membantu mencegah kasus di mana pengguna membuat akun baru untuk memotong larangan.
await channel . BanUserAsync ( user , timeoutMinutes : 120 , isIpBan : true ) ; await channel . BanUserAsync ( user , "You got banned for 2 hours for toxic behaviour." , 120 ) ; var request = new StreamQueryBannedUsersRequest
{
CreatedAtAfterOrEqual = new DateTimeOffset ( ) . AddHours ( - 24 ) ,
Limit = 30 ,
Offset = 0 ,
} ;
var bannedUsersInfo = await Client . QueryBannedUsersAsync ( request ) ;Shadow Banned User tidak tahu dia dilarang. Ini terkadang membantu karena butuh waktu tambahan bagi pengguna untuk menyadari bahwa dia dilarang.
StreamUser await channel . ShadowBanUserAsync ( user ) ; StreamChannelMember await channel . ShadowBanMemberAsync ( channelMember ) ; await user . MuteAsync ( ) ; await user . UnmuteAsync ( ) ; await channel . MuteChannelAsync ( ) ; await channel . UnmuteChannelAsync ( ) ;Contoh -contoh di atas hanya beberapa dari banyak - lihat dokumentasi lengkap kami untuk lebih banyak wawasan dan contoh
Silakan dan buka masalah GitHub dengan permintaan Anda dan kami akan menanggapi sesegera mungkin.
Jangkau dukungan kami.
Kami baru -baru ini menutup putaran pendanaan Seri B $ 38 juta dan kami terus tumbuh secara aktif. API kami digunakan oleh lebih dari satu miliar pengguna akhir, dan Anda akan memiliki kesempatan untuk membuat dampak besar pada produk dalam tim insinyur terkuat di seluruh dunia. Lihatlah pembukaan kami saat ini dan terapkan melalui situs web Stream.