
Die offizielle Einheit SDK für Stream Chat.
Website | Tutorial | SDK -Dokumentation | Registrieren Sie sich für den API -Schlüssel

Der Stream -Chat -SDK ist der offizielle SDK für Stream -Chat, ein Dienst für die Erstellung von Chat- und Messaging -Spielen und -Anwendungen.
IL2CPP wird unterstützt
WebGL wird unterstützt
Stream ist für die meisten Seiten- und Hobbyprojekte kostenlos. Sie können Stream Chat kostenlos mit weniger als fünf Teammitgliedern und monatlichen Einnahmen in Höhe von nicht mehr als 10.000 US -Dollar verwenden. Besuchen Sie unsere Website und beantragen Sie das Macher -Konto.
.unitypackageSchauen Sie sich unser Tutorial zum Einrichten Ihres Projekts an und können Sie grundlegende Vorgänge ausführen.
Im Ordner StreamChat/SampleProject finden Sie ein vollständig funktionierendes Chat -Beispiel mit:

Erstellt mit UGUI UI -System von Unity und unterstützt sowohl das Legacy als auch das Eingabesystem der neuen Einheit.
StreamChat/SampleProject/Config/DemoCredentials.assetStreamChat/SampleProject/Scenes/ChatDemo.scene und klicken Sie auf das SpielenSo aktivieren Sie das neue Eingabesystem von 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.
Sie können die [email protected] entfernen. Bitte beachten Sie jedoch, dass das Unity -Paket für Newtonsoft JSON IL2CPP -Unterstützung hat. Wenn Sie es ersetzen möchten und dennoch IL2CPP verwenden möchten, stellen Sie sicher, dass die JSON -Implementierung Ihrer Wahl auch IL2CPP unterstützt.
Hier sind einige schnelle Code -Beispiele, mit denen Sie den Einstieg erleichtern. Ausführliche Informationen finden Sie in unserer Dokumentation
StreamChatClient - Der Haupt -Chat -Manager, mit dem Sie sich mit dem Stream -Chat -Server verbinden, Kanäle, Abfragelanäle, Benutzer und Mitglieder basierend auf den bereitgestellten Kriterien erstellen könnenStreamChannel - Kanäle gruppieren Benutzer in einer Konversation. Abhängig von Ihren Einstellungen müssen Benutzer möglicherweise Kanäle als Mitglieder verbinden, um Nachrichten zu sendenStreamUser - Stellen Sie einen einzelnen Benutzer in Ihrer Anwendung darStreamChannelMember - Objekt, das einen Benutzer darstellt, der Mitglied eines bestimmten Kanals ist. Dieses Objekt enthält Property member.User um auf das Benutzerobjekt zuzugreifenStreamMessage - repräsentiert eine einzige Nachricht in einem Kanal Benutzer der StreamChatClient.CreateDefaultClient(); Fabrikmethode zum Erstellen einer Instanz von IStreamChatClient :
public class ChatManager : MonoBehaviour
{
public IStreamChatClient Client { get ; private set ; }
protected void Awake ( )
{
Client = StreamChatClient . CreateDefaultClient ( ) ;
}
}Der einfachste Weg zum Starten besteht darin, die Entwicklerautorisierung zu ermöglichen und sich mit clientseitig generierten Auth-Token zu verbinden:
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 ) ; Jede Funktion, die auf eine Antwort vom Server wartet, können Sie entweder mit der C# Modern Async/Wartedsyntax aufrufen oder die .AsCallback() als klassische Rückrufe wie folgt anhängen:
Client . ConnectUserAsync ( "API_KEY" , userId , userToken )
. AsCallback ( onSuccess : result =>
{
var localUserData = result ;
} , onFailure : exception =>
{
Debug . LogException ( exception ) ;
} ) ; Die .AsCallback() -Methode akzeptiert zwei Delegierte: Action<TResponse> onSuccess und die Action<Exception> onFailure , mit der Sie sowohl auf erfolgreiche als auch auf Fehlerantwortverfahren reagieren können. Stattdessen können Sie Methoden auch mit der gleichen Signatur wie im folgenden Beispiel Methoden zur Verfügung stellen:
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 ) ;
} Wir raten uns dringend mit der async/await -Syntax, die, wie Sie in den folgenden Beispielen bemerken werden, den Code viel einfacher und leichter zu lesen und zu warten.
Sobald Sie verbunden sind, können Sie Kanäle verwenden, damit Benutzer Nachrichten senden können.
Es gibt 2 Möglichkeiten, Kanäle zu erstellen:
Für vordefinierte Kanäle, denen Benutzer beitreten können. Dies eignet sich hervorragend für allgemeine Kanäle oder Clans, Clubs und Gruppen, denen Benutzer beitreten oder gehen können.
var channel = await Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" ) ;oder mit einem Rückruf:
Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" )
. AsCallback ( channel =>
{
Debug . Log ( $ "Channel { channel . Id } created successfully" ) ;
} , exception =>
{
Debug . LogException ( exception ) ;
} ) ; Ideal für öffentliche oder private Gruppennachrichten spielt die Reihenfolge der Benutzer in der Gruppe keine Rolle. Wenn die Benutzer mit dieser Methode verbunden sind, sehen sie immer ihren Chat -Historie:
var channel = await Client . GetOrCreateChannelWithMembersAsync ( ChannelType . Messaging , users ) ; Um alle Kanäle oder Kanäle zu durchsuchen, Client.QueryChannelsAsync durch einige Kriterien gefiltert werden
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 ) ;Der Filtermechanismus ist sehr leistungsfähig und ermöglicht es Ihnen, mehrere Regeln zu kombinieren. Sie können die vollständige Liste der verfügbaren Felder und Operatoren überprüfen, die Sie hier für Kanalabfragen verwenden können.
// 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 )
} ; Nachrichten sind über channel.Messages -Eigenschaft zugegriffen, die die Sammlung der neuesten Nachrichten enthält. Da es in einem Kanalverlauf tausende Nachrichten in einem channel.Messages gibt, enthält die Sammlung von Messages nur die neuesten Nachrichten. Sie können ältere Nachrichten laden, indem Sie den channel.LoadOlderMessagesAsync() aufrufen. Ein allgemeiner Ansatz besteht darin, channel.LoadOlderMessagesAsync() Wenn Benutzer das Ende Ihrer Nachrichten -Scroll -Ansicht treffen. Auf diese Weise laden Sie nur ältere Nachrichten, wenn der Benutzer sie tatsächlich anzeigen möchte. Sie können ein Beispiel für diesen Ansatz in MessagelistView.cs von Sample Project sehen
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" ,
} ) ;Stille Nachrichten auslösen keine Ereignisse für Kanalmitglieder. Häufig für Systemnachrichten verwendet
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" } }
}
} ) ;Löscht nur den Text, verlässt aber andere verwandte Daten, Reaktionen, Thread-Unterbereitungen usw. intakt
await message . SoftDeleteAsync ( ) ; Entfernt eine Nachricht vollständig und entfernt alle Daten, die sich auf diese Nachricht beziehen
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" ) ; Kanalobjekte werden automatisch aktualisiert, wenn Änderungen auftreten (neue Nachrichten, Reaktionen usw.). Sie können auf diese Änderungen reagieren, indem Sie sich auf IStreamChannel -exponierte Ereignisse abonnieren:
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 der den Benutzer auf dem lokalen Gerät darstellt 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 ) ;Lesen Sie mehr über unterstützte Abfrageparameter und -operatoren
Abhängig von Ihrer App -Konfiguration müssen Benutzer möglicherweise Kanäle als Mitglieder verbinden, um Nachrichten zu senden oder andere Benutzer -Nachrichten anzusehen
// 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 bietet alle erforderlichen Werkzeuge und Funktionen, um eine große Gemeinschaft ordnungsgemäß zu verwalten.
Das Markieren bedeutet, dass dieser Benutzer oder eine Nachricht in der Chat -Moderation gemeldet wird. Chat -Administratoren und Moderatoren können gemeldete Benutzer und Nachrichten im Dashboard anzeigen.
await user . FlagAsync ( ) ; await message . FlagAsync ( ) ; await channel . BanUserAsync ( user ) ; await channel . BanUserAsync ( user , "You got banned for 2 hours for toxic behaviour." , 120 ) ; Das Verbot von IP hilft, den Fall zu verhindern, wenn der Benutzer ein neues Konto erstellt, um das Verbot zu umgehen.
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 ) ;Der von Shadow verbotene Benutzer weiß nicht, dass er verboten wird. Dies ist manchmal hilfreich, da ein Benutzer zusätzliche Zeit dauert, um zu erkennen, dass er verboten ist.
StreamUser await channel . ShadowBanUserAsync ( user ) ; StreamChannelMember await channel . ShadowBanMemberAsync ( channelMember ) ; await user . MuteAsync ( ) ; await user . UnmuteAsync ( ) ; await channel . MuteChannelAsync ( ) ; await channel . UnmuteChannelAsync ( ) ;Die obigen Beispiele sind nur einige von vielen - finden Sie in unserer vollständigen Dokumentation weitere Einblicke und Beispiele
Gehen Sie voran und öffnen Sie das Github -Problem mit Ihrer Anfrage und wir werden so schnell wie möglich antworten.
Wenden Sie sich an unsere Unterstützung.
Wir haben kürzlich eine Finanzierungsrunde der Serie B der Serie B in Höhe von 38 Millionen US -Dollar abgeschlossen und wachsen weiter aktiv. Unsere APIs werden von mehr als einer Milliarde Endbenutzern verwendet, und Sie haben die Möglichkeit, einen großen Einfluss auf das Produkt innerhalb eines Teams der stärksten Ingenieure auf der ganzen Welt zu haben. Schauen Sie sich unsere aktuellen Öffnungen an und bewerben Sie sich über die Website von Stream.