Go to file
oneRain fef8f0c18c * LCLiveQueryHeartBeat.cs:
* LCLiveQueryConnection.cs:
* LCConnection.cs:

* LCHeartBeat.cs: chore: 重构 ping/pong 机制
2020-06-11 11:33:11 +08:00
.vscode chore 2020-05-06 17:33:37 +08:00
Common chore: 将 LCException 提到 LeanCloud 命名空间下,并增加 ToString() 2020-05-21 10:41:58 +08:00
LiveQuery * LCLiveQueryHeartBeat.cs: 2020-06-11 11:33:11 +08:00
Realtime * LCLiveQueryHeartBeat.cs: 2020-06-11 11:33:11 +08:00
Sample chore: 工程版本号 2020-05-18 10:36:38 +08:00
Storage release 2020-05-28 16:28:29 +08:00
UnityLibs chore: 整理工程目录 2020-04-30 15:36:06 +08:00
assets chore: 整理工程目录 2020-04-30 15:36:06 +08:00
script chore: LiveQuery 打包 2020-05-13 17:38:33 +08:00
.gitignore chore: Log code 2020-04-30 16:03:45 +08:00
.travis.yml release 2020-05-13 18:02:52 +08:00
Doxyfile doc: api 2020-05-14 10:17:15 +08:00
LICENSE Initial commit 2019-07-18 11:02:59 +08:00
README.md readme 2020-06-02 10:19:33 +08:00
csharp-sdk.sln chore: 工程版本号 2020-05-18 10:36:38 +08:00

README.md

csharp-sdk

LeanCloud C# SDK基于 .Net Standard 2.0 标准开发,包括服务如下:

  • 存储
  • 排行榜
  • 即时通讯
  • Live Query

参考:Unity Demo

安装

Release 下载指定版本 SDK暂不支持 Nuget 方式。

编译

Repo clone 仓库,使用 Visual Studio 打开 csharp-sdk.sln 编译。 Unity 用户在编译完成后,请将 XX-Unity 工程中 Debug/Release 的 dlls 拷贝至 Unity 工程下的 Plugins 目录中即可使用。 其他 .Net 平台用户使用 XX 工程即可。 XX 指 StorageRealtimeLiveQuery 等)

项目结构

由于 Unity 平台并不是标准的 .Net Standard 2.0,所以在每个服务下单独拆分出了 XX-Unity 工程,源码和主工程是一致的,只是在依赖库方面有些区别。后面也可能针对 Unity 平台做些相关支持。

├── csharp-sdk.sln              // 项目配置
├── Common                      // 公共库,包含基础功能
├── Storage                     // 存储服务
│   ├── Storage                 // .Net Standard 2.0 工程
│   ├── Storage-Unity           // Unity 工程
│   └── Storage.Test            // 单元测试
├── Realtime                    // 即时通讯服务
│   ├── Realtime                // .Net Standard 2.0 工程
│   ├── Realtime-Unity          // Unity 工程
│   └── Realtime.Test           // 单元测试
├── LiveQuery                   // LiveQuery 服务
│   ├── LiveQuery               // .Net Standard 2.0 工程
│   ├── LiveQuery-Unity         // Unity 工程
│   └── LiveQuery.Test          // 单元测试
├── Sample                      // 示例
│   ├── RealtimeApp             // 即时通讯应用,主要测试断线重连
│   └── LiveQueryApp            // LiveQuery 应用,主要测试断线重连
└── UnityLibs                   // Unity 依赖
    └── Newtonsoft.Json.dll     // Json 库,由于 Unity iOS AOT 的原因,不能使用 .Net Standard 2.0 版本

导入

using LeanCloud;
// 数据存储
using LeanCloud.Storage;
// 即时通讯
using LeanCloud.Realtime;

初始化

LCApplication.Initialize("ikGGdRE2YcVOemAaRbgp1xGJ-gzGzoHsz", "NUKmuRbdAhg1vrb2wexYo1jo", "https://ikggdre2.lc-cn-n1-shared.com");

调试

开启调试日志

LCLogger.LogDelegate += (level, info) => {
    switch (level) {
        case LCLogLevel.Debug:
            WriteLine($"[DEBUG] {DateTime.Now} {info}\n");
            break;
        case LCLogLevel.Warn:
            WriteLine($"[WARNING] {DateTime.Now} {info}\n");
            break;
        case LCLogLevel.Error:
            WriteLine($"[ERROR] {DateTime.Now} {info}\n");
            break;
        default:
            WriteLine(info);
            break;
    }
}

数据存储

对象

LCObject obj = new LCObject("Hello");
obj["intValue"] = 123;
await obj.Save();

更多关于对象用法:参考

查询

LCQuery<LCObject> query = new LCQuery<LCObject>("Hello");
query.Limit(2);
List<LCObject> list = await query.Find();

更多关于查询用法:参考

文件

LCFile file = new LCFile("avatar", AvatarFilePath);
await file.Save((count, total) => {
    TestContext.WriteLine($"progress: {count}/{total}");
});

更多关于文件用法:参考

用户

await LCUser.Login("hello", "world");

更多关于用户用法:参考

GeoPoint

LCGeoPoint p1 = new LCGeoPoint(20.0059, 110.3665);

更多关于 GeoPoint 用法:参考

即时通讯

用户

LCIMClient client = new LCIMClient("c1");
// 登录
await client.Open();
// 注销
await client.Close();

更多关于用户用法:参考

对话

// 创建普通对话
LCIMConversation conversation = await client.CreateConversation(new string[] { "world" }, name: name, unique: false);
// 创建聊天室
LCIMConversation chatroom = await client.CreateChatRoom(name);
// 创建临时对话
LCIMConversation tempConversation = await client.CreateTemporaryConversation(new string[] { "world" });

更多关于对话用法:参考

消息

// 发送消息
LCIMTextMessage textMessage = new LCIMTextMessage("hello, world");
await conversation.Send(textMessage);
// 接收消息
m2.OnMessage = (conv, msg) => {
    if (msg is LCIMTextMessage textMsg) {
        WriteLine($"text: {textMsg.Text}");
    }
};

更多关于对话用法:参考

排行榜

创建排行榜

LCLeaderboard leaderboard = await LCLeaderboard.CreateLeaderboard(leaderboardName);

更新成绩

await LCLeaderboard.UpdateStatistics(user, new Dictionary<string, double> {
    { leaderboardName, 100 }
});

获取成绩

LCUser user = await LCUser.Login(username, password);
ReadOnlyCollection<LCStatistic> statistics = await LCLeaderboard.GetStatistics(user);
foreach (LCStatistic statistic in statistics) {
    WriteLine($"{statistic.Name} : {statistic.Value}");
}

获取我附近的成绩

await LCUser.Login(username, password);
LCLeaderboard leaderboard = LCLeaderboard.CreateWithoutData(leaderboardName);
ReadOnlyCollection<LCRanking> rankings = await leaderboard.GetResultsAroundUser(limit: 5);
foreach (LCRanking ranking in rankings) {
    WriteLine($"{ranking.Rank} : {ranking.User.ObjectId}, {ranking.Value}");
}

获取榜单

LCLeaderboard leaderboard = LCLeaderboard.CreateWithoutData(leaderboardName);
ReadOnlyCollection<LCRanking> rankings = await leaderboard.GetResults();
foreach (LCRanking ranking in rankings) {
    WriteLine($"{ranking.Rank} : {ranking.User.ObjectId}, {ranking.Value}");
}

LiveQuery

订阅

LCQuery<LCObject> query = new LCQuery<LCObject>("Account");
query.WhereGreaterThan("balance", 100);
liveQuery = await query.Subscribe();

事件

// 新建符合条件对象的事件
liveQuery.OnCreate = (obj) => {
    WriteLine($"create: {obj}");
};

// 符合条件对象更新事件
liveQuery.OnUpdate = (obj, updatedKeys) => {
    WriteLine($"update: {obj}");
};

// 符合条件对象被删除事件
liveQuery.OnDelete = (objId) => {
    WriteLine($"delete: {objId}");
};

// 有新的符合条件的对象事件
liveQuery.OnEnter = (obj, updatedKeys) => {
    WriteLine($"enter: {obj}");
};

// 有符合条件的对象不再满足条件事件
liveQuery.OnLeave = (obj, updatedKeys) => {
    WriteLine($"level: {obj}");
};

特殊事件

当一个用户成功登录应用OnLogin 事件会被触发。下面的 user 就是登录的 LCUser:

await LCUser.Login("hello", "world");
LCQuery<LCUser> userQuery = LCUser.GetQuery();
userQuery.WhereEqualTo("username", "hello");
LCLiveQuery userLiveQuery = await userQuery.Subscribe();
userLiveQuery.OnLogin = (user) => {
    WriteLine($"login: {user}");
};

文档

API 文档