
官方的團結SDK進行流聊天。
網站|教程| SDK文檔|註冊API密鑰

Stream Chat SDK是官方的統一SDK,用於流聊天,這是用於構建聊天以及消息傳遞遊戲和應用程序的服務。
支持IL2CPP
支持WebGL
大多數方面和愛好項目都是免費的。您可以免費使用少於五個團隊成員的流聊天聊天,每月收入不超過10,000美元。訪問我們的網站併申請製造商帳戶。
.unitypackage查看我們有關如何設置項目並執行基本操作的教程。
在StreamChat/SampleProject文件夾中,您會找到一個完整工作的聊天示例:

由Unity的UGUI UI系統創建,並支持舊版和新Unity的輸入系統。
StreamChat/SampleProject/Config/DemoCredentials.assetStreamChat/SampleProject/Scenes/ChatDemo.scene和hit Play如何啟用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.
您可以刪除[email protected]目錄。但是請注意,Unity的紐頓夫人的包裹具有IL2CPP支持。如果您想替換它並仍然使用IL2CPP,請確保您選擇的JSON實施也支持IL2CPP。
這裡有一些快速的代碼示例可以讓您入門。有關詳細信息,請查看我們的文檔
StreamChatClient允許您根據提供的條件與流聊天服務器,創建頻道,查詢頻道,用戶和成員連接的主要聊天管理器StreamChannel - 對話中的頻道組用戶。根據您的設置,用戶可能需要加入頻道作為會員以發送消息StreamUser代表應用程序中的一個用戶StreamChannelMember代表特定頻道成員的用戶的對象。此對象包含屬性member.User可以訪問用戶對象StreamMessage - 表示通道內的一條消息用戶the StreamChatClient.CreateDefaultClient();創建IStreamChatClient實例的工廠方法:
public class ChatManager : MonoBehaviour
{
public IStreamChatClient Client { get ; private set ; }
protected void Awake ( )
{
Client = StreamChatClient . CreateDefaultClient ( ) ;
}
}最簡單的啟動方法是啟用開發人員授權並與客戶端生成的auth令牌建立聯繫:
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 ) ;等待服務器響應的每個功能您都可以使用C#Modern async/等待語法來調用或附加.AsCallback() ,並用作經典回調,如下所示:
Client . ConnectUserAsync ( "API_KEY" , userId , userToken )
. AsCallback ( onSuccess : result =>
{
var localUserData = result ;
} , onFailure : exception =>
{
Debug . LogException ( exception ) ;
} ) ; .AsCallback()方法接受兩個委託: Action<TResponse> onSuccess和Action<Exception> onFailure ,您可以用來對成功和錯誤響應案例做出反應。相反,Lambda回調您還可以提供與下面示例相同的簽名的方法:
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 ) ;
}我們強烈建議使用async/await語法建議,如以下示例,您會注意到,該代碼使代碼更加簡單,更易於閱讀和維護。
連接後,您可以開始使用頻道,以便用戶可以發送消息。
有兩種創建渠道的方法:
有關用戶可以加入的預定義渠道。這對於用戶可以加入或離開的任何通用渠道或氏族,俱樂部和團體都非常有用。
var channel = await Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" ) ;或帶回調:
Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" )
. AsCallback ( channel =>
{
Debug . Log ( $ "Channel { channel . Id } created successfully" ) ;
} , exception =>
{
Debug . LogException ( exception ) ;
} ) ; 非常適合公共或私人組消息,組中的用戶順序無關緊要,因此每當用戶使用此方法連接用戶時,他們將始終看到他們的聊天歷史記錄:
var channel = await Client . GetOrCreateChannelWithMembersAsync ( ChannelType . Messaging , users ) ;瀏覽通過某些條件過濾的所有通道或通道使用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 ) ;過濾機制非常強大,可以使您合併多個規則。您可以在此處查看可用於頻道查詢的可用字段和操作員的完整列表。
// 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 )
} ;消息可通過channel.Messages屬性訪問,其中包含最新消息的收集。因為在頻道歷史記錄中可能會有數千條消息, channel.Messages集合只包含最新消息。您可以通過調用channel.LoadOlderMessagesAsync()來加載舊消息,該消息將加載歷史記錄的其他部分。一種常見的方法是調用channel.LoadOlderMessagesAsync() ,每當用戶擊中消息的末尾滾動視圖時,只有在用戶實際想查看它們時,您才會加載較舊的消息。您可以在示例項目的messagelistview.cs中看到此方法的示例
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" ,
} ) ;無聲消息不會觸發頻道成員的事件。通常用於系統消息
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" } }
}
} ) ;僅清除文本,但留下其他相關數據,反應,線程子消息等。完整
await message . SoftDeleteAsync ( ) ; 完全刪除消息並刪除與此消息有關的所有數據
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" ) ;每當發生任何更改(新消息,反應等)時,頻道對象將自動更新。您可以通過訂閱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的實例 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 ) ;在支持的查詢參數和操作員上了解更多信息
根據您的應用程序配置,用戶可能需要以成員的身份加入頻道,以發送消息或查看其他用戶消息
// 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提供了所有必要的工具和功能,以正確管理大型社區。
標記意味著將將此用戶或消息報告給聊天適度。聊天管理員和主持人可以在儀表板中查看報告的用戶和消息。
await user . FlagAsync ( ) ; await message . FlagAsync ( ) ; await channel . BanUserAsync ( user ) ; await channel . BanUserAsync ( user , "You got banned for 2 hours for toxic behaviour." , 120 ) ; 禁止IP有助於防止用戶創建一個新帳戶以繞過禁令的情況。
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禁止的用戶不知道他被禁止。有時這很有用,因為用戶需要更多時間才能意識到他被禁止的。
StreamUser await channel . ShadowBanUserAsync ( user ) ; StreamChannelMember await channel . ShadowBanMemberAsync ( channelMember ) ; await user . MuteAsync ( ) ; await user . UnmuteAsync ( ) ; await channel . MuteChannelAsync ( ) ; await channel . UnmuteChannelAsync ( ) ;上面的示例只有許多示例 - 查看我們的完整文檔,以獲取更多洞察力和示例
繼續並向您的請求打開GitHub問題,我們將盡快做出回應。
接觸我們的支持。
我們最近關閉了3800萬美元的B系列資金回合,我們一直在積極發展。我們的API被超過十億的最終用戶使用,您將有機會對全球最強大的工程師團隊中的產品產生巨大影響。查看我們當前的開口,並通過Stream的網站申請。