From 8844fb6ad27f9d58db9207949a4dee86c41c9b3a Mon Sep 17 00:00:00 2001 From: ci-gitlab Date: Thu, 20 Apr 2023 13:04:38 +0800 Subject: [PATCH] feat:update upm --- CHANGELOG.md | 260 ++++++++++++++++++++++++ CHANGELOG.md.meta | 3 + Documentation.meta | 8 + Documentation/README.md | 257 +++++++++++++++++++++++ Documentation/README.md.meta | 7 + Plugins.meta | 8 + Plugins/TapTap.Bootstrap.deps.json | 233 +++++++++++++++++++++ Plugins/TapTap.Bootstrap.deps.json.meta | 7 + Plugins/TapTap.Bootstrap.dll | Bin 0 -> 35328 bytes Plugins/TapTap.Bootstrap.dll.meta | 33 +++ Plugins/TapTap.Bootstrap.pdb | Bin 0 -> 16316 bytes Plugins/TapTap.Bootstrap.pdb.meta | 7 + README.md | 254 +++++++++++++++++++++++ README.md.meta | 3 + VERSIONNOTE.md | 0 VERSIONNOTE.md.meta | 7 + package.json | 14 ++ package.json.meta | 7 + 18 files changed, 1108 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 CHANGELOG.md.meta create mode 100644 Documentation.meta create mode 100644 Documentation/README.md create mode 100644 Documentation/README.md.meta create mode 100644 Plugins.meta create mode 100644 Plugins/TapTap.Bootstrap.deps.json create mode 100644 Plugins/TapTap.Bootstrap.deps.json.meta create mode 100644 Plugins/TapTap.Bootstrap.dll create mode 100644 Plugins/TapTap.Bootstrap.dll.meta create mode 100644 Plugins/TapTap.Bootstrap.pdb create mode 100644 Plugins/TapTap.Bootstrap.pdb.meta create mode 100644 README.md create mode 100644 README.md.meta create mode 100644 VERSIONNOTE.md create mode 100644 VERSIONNOTE.md.meta create mode 100644 package.json create mode 100644 package.json.meta diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9fea556 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,260 @@ +# ChangeLog +## 3.11.1 +- TapTap.Login v3.11.1 +- TapTap.Common v3.11.1 +- LeanCloud.Realtime v0.10.11 +- LeanCloud.Storage v0.10.11 + +## 3.11.0 + +### Dependencies + +- TapTap.Login v3.11.0 +- TapTap.Common v3.11.0 +- LeanCloud.Realtime v0.10.11 +- LeanCloud.Storage v0.10.11 + +## 3.10.0 + +### New Feature +- 支持排行榜 + +### Dependencies + +- TapTap.Login v3.10.0 +- TapTap.Common v3.10.0 +- LeanCloud.Realtime v0.10.11 +- LeanCloud.Storage v0.10.11 + +## 3.9.0 + +### Dependencies + +- TapTap.Login v3.9.0 +- TapTap.Common v3.9.0 +- LeanCloud.Realtime v0.10.11 +- LeanCloud.Storage v0.10.11 + +## 3.8.0 + +### Dependencies + +- TapTap.Login v3.8.0 +- TapTap.Common v3.8.0 +- LeanCloud.Realtime v0.10.10 +- LeanCloud.Storage v0.10.10 + +## 3.7.1 + +### Dependencies + +- TapTap.Login v3.7.1 +- TapTap.Common v3.7.1 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.7.0 + +### Dependencies + +- TapTap.Login v3.7.0 +- TapTap.Common v3.7.0 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + + +## 3.6.3 + +### Dependencies + +- TapTap.Login v3.6.3 +- TapTap.Common v3.6.3 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.6.1 + +### Dependencies + +- TapTap.Login v3.6.1 +- TapTap.Common v3.6.1 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.6.0 + +### Dependencies + +- TapTap.Login v3.6.0 +- TapTap.Common v3.6.0 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.5.0 + +### Dependencies + +- TapTap.Login v3.5.0 +- TapTap.Common v3.5.0 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.4.0 + +### Dependencies + +- TapTap.Login v3.4.0 +- TapTap.Common v3.4.0 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.3.0 + +### Dependencies + +- TapTap.Login v3.3.0 +- TapTap.Common v3.3.0 +- LeanCloud.Realtime v0.9.11 +- LeanCloud.Storage v0.9.11 + +## 3.2.0 + +### New Feature + +- 支持云存档 + +### Dependencies + +- TapTap.Login v3.2.0 +- TapTap.Common v3.2.0 +- LeanCloud.Storage v0.9.5 +- LeanCloud.Realtime v0.9.5 + +## 3.1.0 + +### New Feature + +- `TDSUser` 新增好友系统操作 + +### Dependencies + +- TapTap.Login v3.1.0 +- TapTap.Common v3.1.0 +- LeanCloud.Storage v0.9.2 +- LeanCloud.Realtime v0.9.2 + +## 3.0.0 + +TapSDK 3.0 开始,我们在单纯的 TapTap 登录之外,还提供了一个内建账户系统供游戏使用:开发者可以直接用 TapTap OAuth +授权的结果生成一个游戏内的账号(TDSUser),然后用该账号保存更多玩家数据。同时,我们也支持将更多第三方认证登录的结果绑定到这一账号上来(以及后续的解绑操作)。 + +### New Feature + +- 新增 `TDSUser` 用于内建账户系统操作 + +### BreakingChange + +- `TapBootstrap` 接口仅保留 `TapBootstrap.Init(tapConfig)` 接口 + +### Dependencies + +- LeanCloud.Storage v0.8.2 +- TapTap.Login v3.0.0 +- TapTap.Common v3.0.0 + +## 2.1.7 + +### Dependencies + +- TapTap.Common v2.1.7 + +## 2.1.6 + +### Dependencies + +- TapTap.Common v2.1.6 + +## 2.1.5 + +### Dependencies + +- TapTap.Common v2.1.5 + +## 2.1.4 + +### Optimization and fixed bugs + +- 优化多语言相关 + +### Dependencies + +- TapTap.Common v2.1.4 + +## 2.1.3 + +### Feature + +* 新增繁中、日文、韩文、泰文和印尼语多语言配置 + +## 2.1.2 + +### BreakingChange + +* 废弃 OpenUserCenter 接口 + +### Dependencies + +* TapTap.Common v2.1.2 + +## 2.1.1 + +### Feature + +* 新增篝火测试资格校验 + ``` + TapBootstrap.GetTestQualification((bool, error)=>{ }): + ``` +* 通过 TapConfig 进行初始化配置 + * 新增 TapDBConfig 用于 TapDB 初始化配置 + * 新增 ClientSecret 用于 TapSDK 初始化 + ```c# + //建议使用以下 TapConfig 构造方法进行初始化 + var config = new TapConfig.Builder() + .ClientID("client_id") + .ClientSecret("client_secret") + .RegionType(RegionType.CN) + .TapDBConfig(true, "gameChannel", "gameVersion", true) + .ConfigBuilder(); + TapBootstrap.Init(config); + ``` + +### Breaking changes + +* LoginType 删除 Apple、Guest 登陆方式 +* TDS-Info.plist 删除 Apple_SignIn_Enable 配置 +* 废弃 Bind 接口 +* TapConfig 构造方法参数修改 + +### Dependencies + +* TapTap.Common v2.1.1 + +## 2.1.0 + +### Feature + +* 支持性改动用于 TapTap.Friends + +### Dependencies + +* TapTap.Common v2.1.0 + +## 2.0.0 + +### Feature + +* TapTap Bootstrap + +### Dependencies + +* TapTap.Common v2.0.0 \ No newline at end of file diff --git a/CHANGELOG.md.meta b/CHANGELOG.md.meta new file mode 100644 index 0000000..419383c --- /dev/null +++ b/CHANGELOG.md.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7388165be5344a9682382768c5fce466 +timeCreated: 1616755935 \ No newline at end of file diff --git a/Documentation.meta b/Documentation.meta new file mode 100644 index 0000000..1130a03 --- /dev/null +++ b/Documentation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bd03b50332353477c899419b5b455fb0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/README.md b/Documentation/README.md new file mode 100644 index 0000000..2564c0c --- /dev/null +++ b/Documentation/README.md @@ -0,0 +1,257 @@ +# 使用 TapTap.Bootstrap + +## 使用前提 + +使用 TapTap.Bootstrap 前提是必须依赖以下库: +* [TapTap.Common](https://github.com/TapTap/TapCommon-Unity.git) +* [TapTap.Login](https://github.com/TapTap/TapLogin-Unity.git) +* [LeanCloud.Storage](https://github.com/leancloud/csharp-sdk) +* [LeanCloud.RealTime](https://github.com/leancloud/csharp-sdk) + +## 命名空间 + +```c# +using TapTap.Bootstrap; +``` + +## 接口描述 + +## 1.初始化 + +TapBootstrap 会根据 TapConfig 中的 TapDBConfig 配置来进行 TapDB 的自动初始化。 + +### 开启 TapDB +```c# +var config = new TapConfig.Builder() + .ClientID("client_id") + .ClientToken("client_token") + .ServerURL("https://ikggdre2.lc-cn-n1-shared.com") + .RegionType(RegionType.CN) + .TapDBConfig(true,"channel","gameVersion",true) + .Builder(); +``` +### 关闭 TapDB +```c# +var config = new TapConfig.Builder() + .ClientID("client_id") + .ClientToken("client_token") + .ServerURL("https://ikggdre2.lc-cn-n1-shared.com") + .RegionType(RegionType.CN) +//# .TapDBConfig(false,null,null,false) + .EnableTapDB(false) + .Builder(); +``` +### 初始化 +```c# +TapBootstrap.Init(config); +``` + +## 2.账户系统 + +> 登陆成功之后,都会得到一个 `TDSUser` 实例 + +### 使用 TapTap OAuth 授权结果直接登陆/注册账户系统 + +```c# +var tdsUser = await TDSUser.LoginWithTapTap(); +``` + +### 游客登陆 + +```c# +var tdsUser = await TDSUser.LoginAnonymously(); +``` + +### 使用第三方平台授权登录/注册账户 + +```c# +var tdsUser = await TDSUser.LoginWithAuthData(Dictionary authData, string platform, +LCUserAuthDataLoginOption option = null); +``` + +### 绑定第三方平台授权 + +```c# +await TDSUser.AssociateAuthData(Dictionary authData, string platform); +``` + +### 退出登陆 + +```c# +TDSUser.Logout(); +``` + +## 3.好友系统 + +### 申请成为好友 + +```c# +TDSUser tom, jerry; +await tom.ApplyFriendship(jerry); +``` +申请成功的回调中,我们会得到一个 LCFriendshipRequest 的实例,这个实例中包含了两个用户: +- sourceUser,指请求的发起方,上面的例子中就是 `tom`。 +- friend,指请求的目的方,上面的例子中就是 `jerry`。 + +tom 也可以在申请好友的时候,添加更多的属性,例如 tom 希望加 jerry 为好友的时候,也设定一个名为 cat 的圈子,可以这样操作: + +```cs +Dictionary attrs = new Dictionary { + { "group", "cat" } +}; +await tom.ApplyFriendship(jerry, attrs); +``` + +### 获取好友申请列表 +好友申请有三种状态: + +- `pending`,对方没有回应,还处于等待中。 +- `accepted`,对方已经接受,现在双方成为好友。 +- `declined`,对方已经拒绝。 + +好友请求创建之后默认是 `pending` 状态。 + +jerry 这里可以通过 `friendshipRequestQuery` 来查找不同状态的请求。例如 jerry 想看看新的好友请求,可以这样操作: + +```cs +LCQuery query = jerry.GetFriendshipRequestQuery(LCFriendshipRequest.STATUS_PENDING, false, true); +ReadOnlyCollection reqs = await query.Find(); +foreach (LCFriendshipRequest req in reqs) { + Console.WriteLine(req); +} +``` + +### 处理好友申请 + +jerry 对于新的好友请求,可以同意或者拒绝,也可以什么都不做,无视这些请求,甚至直接删除。这些操作我们都是支持的,请看下面的示例: + +```cs +LCFriendshipRequest tomRequest, tuffyRequest, otherRequest; +await jerry.AcceptFriendshipRequest(tomRequest); +await jerry.DeclineFriendshipRequest(tuffyRequest); +await jerry.DeleteFriendshipRequest(otherRequest); +``` + +注意: +* 在 jerry 拒绝了 tom 的好友请求之后,如果 tom 再次请求成为 jerry 的好友,tom 在执行 applyFriendshipInBackground 时会直接得到错误的应答,表明 jerry 不想和 ta 成为好友。 +* jerry 同意了 tuffy 的好友请求之后,它们就成为了好友,之后两个人中任何一人再次调用 applyFriendshipInBackground 申请横位好友时,也会直接得到错误的应答,表明它们已经是好友无需再次申请。 +* jerry 删除陌生人的好友请求后,对方还可以再次发起请求。 + +### 响应好友变化通知 + +TDS 好友模块支持客户端监听好友状态变化,在游戏中实时给玩家提示。好友状态变化的接口包括 + +```cs +public class FriendshipNotification { + public Action OnNewRequestComing { get; set; } + public Action OnRequestAccepted { get; set; } + public Action OnRequestDeclined { get; set; } +} +``` + +其中: +- onNewRequestComing 表示有其他人申请成为当前用户的好友,通过调用 `LCFriendshipRequest#getSourceUser()` 方法可以获得发起方用户信息。 +- onRequestAccepted 表示当前用户的好友申请被对方通过,通过调用 `LCFriendshipRequest#getFriend()` 方法可以获得对方用户信息。 +- onRequestDeclined 表示当前用户的好友申请被对方拒绝,通过调用 `LCFriendshipRequest#getFriend()` 方法可以获得对方用户信息。 + +开发者可以通过 `TDSUser#registerFriendshipNotification` 来注册通知接收器,通过调用 `TDSUser#unregisterFriendshipNotification` 来取消通知接收器。 + +### 获取好友列表 + +调用 `TDSUser#friendshipQuery()` 可以得到查询好友的 `LCQuery` 实例,之后调用 `LCQuery#findInBackground()` 方法就可以得到好友列表。示例如下: + +```cs +LCQuery query = jerry.GetFirendshipQuery(); +``` + +LCFriendship 里面会包含两个用户: + +- `LCFriendship#getLCUser(LCFriendship.ATTR_USER)` 得到的是 jerry 自己; +- `LCFriendship#getLCUser(LCFriendship.ATTR_FOLLOWEE)` 得到的就是另一方的用户信息。 + +### 删除好友 + +成为好友关系的两个用户,之后也可以单方面删除好友。例如 jerry 不想再和 tom 成为好友,那只需要在自己的好友列表中删除包含 tom 的那条 LCFriendship 记录即可: + +```cs +await friendship.Delete(); +``` + +### 查询好友关系 + +我们使用 LCQuery 可以单独查询两个用户是否为好友关系。 + +```cs +LCQuery query = jerry.GetFirendshipQuery(); +query.whereEqualTo("followee", tom); +int count = await query.Count(); +if (count > 0) { + // tom is a friend of jerry. +} else { + // tom isn't a friend of jerry. +} +``` + +这一查询是通过网络发送到服务端执行的,一般情况下,我们推荐开发者在游戏启动时拉取一次当前登录用户的好友列表,然后缓存在本地,以后需要检查另外玩家是否为当前用户的好友时,直接从缓存中查询即可。如果担心好友数据变化,缓存没有得到及时更新,可以调用前面「响应好友变化通知」的方法,对好友数据更新进行监听,这样在绝大部分时候数据同步都是可以保证的。 + +## 4.云存档 + +### 构建云存档元数据 + +```c# +var gameSave = new TapGameSave +{ + Name = "GameSave_Name",// 存档名称 + Summary = "GameSave_Description", // 该字段会作为展示给用户的实际存档名 + ModifiedAt = DateTime.Now.ToLocalTime(), // 原文件修改时间 + PlayedTime = 1000L, // 游戏时长,单位 ms (非必填) + ProgressValue = 100, // 游戏进度 ,单位 int (非必填) + CoverFilePath = pic, // 游戏封面,可以传入一个本地文件路径,SDK 限制为 png/jpeg 格式 + GameFilePath = dll // 存档源文件,可以传入一个本地文件路径 +}; + +``` +### 保存存档 + +保存存档时,会去检查当前`TDSUser`是否已经登录以及元数据。 + +同时 SDK 在上传时会去限制存档本身以及相关联的两个文件( Cover 以及 GameFile )的权限为当前用户本身。 +```c# +await gameSave.Save(); +``` + +### 查询当前用户的所有存档 + +```c# +var collection = await TapGameSave.GetCurrentUserGameSaves(); + +foreach(var gameSave in collection){ + // 存档概览 + var name = gameSave.Summary; + // 原文件修改时间 + var modifiedAt = gameSave.ModifiedAt; + // 游戏时长 + var playedTime = gameSave.PlayedTime; + // 游戏进度 + var progressValue = gameSave.ProgressValue; + // 游戏封面 + var coverFile = gameSave.CoverFile; + // 存档源文件 + var gameFile = gameSave.GameFile; + // 源文件下载地址 + var gameFileUrl = gameFile.Url; +} +``` + +### 查询当前用户存档 + +我们使用 `LCQuery` 来查询当前用户的云存档。 + +SDK 查询封装了一个限定方法用于查询当前`TDSUser`的云存档。 +```c# +TDSUser user = await TDSUser.GetCurrent(); +LCQuery gameSaveQuery = TapGameSave.GetQueryWithUser(user); +// 查询 Name 为 TDSUser_GameSave_Name 的云存档 +gameSaveQuery.WhereEqualTo("name","TDSUser_GameSave_Name"); +var collection = await gameSaveQuery.Find(); +``` \ No newline at end of file diff --git a/Documentation/README.md.meta b/Documentation/README.md.meta new file mode 100644 index 0000000..125a6de --- /dev/null +++ b/Documentation/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 17ed6166c017a4fcda77ff618f2703db +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins.meta b/Plugins.meta new file mode 100644 index 0000000..bbcf194 --- /dev/null +++ b/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dc389bcfbbddc4d35a997cbc06799975 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/TapTap.Bootstrap.deps.json b/Plugins/TapTap.Bootstrap.deps.json new file mode 100644 index 0000000..1229ab6 --- /dev/null +++ b/Plugins/TapTap.Bootstrap.deps.json @@ -0,0 +1,233 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "TapTap.Bootstrap/1.0.0": { + "dependencies": { + "NETStandard.Library": "2.0.3", + "TapTap.Common": "1.0.0", + "TapTap.Login": "1.0.0", + "Common": "1.0.0.0", + "LiveQuery": "1.0.0.0", + "Storage": "1.0.0.0", + "Storage.Unity": "1.0.0.0", + "UnityEngine": "0.0.0.0" + }, + "runtime": { + "TapTap.Bootstrap.dll": {} + } + }, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "TapTap.Common/1.0.0": { + "runtime": { + "TapTap.Common.dll": {} + } + }, + "TapTap.Login/1.0.0": { + "dependencies": { + "TapTap.Common": "1.0.0" + }, + "runtime": { + "TapTap.Login.dll": {} + } + }, + "Common/1.0.0.0": { + "runtime": { + "Common.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "LiveQuery/1.0.0.0": { + "runtime": { + "LiveQuery.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Storage/1.0.0.0": { + "runtime": { + "Storage.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Storage.Unity/1.0.0.0": { + "runtime": { + "Storage.Unity.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "UnityEngine/0.0.0.0": { + "runtime": { + "UnityEngine.dll": { + "assemblyVersion": "0.0.0.0", + "fileVersion": "0.0.0.0" + } + } + }, + "LC.Newtonsoft.Json/11.0.0.0": { + "runtime": { + "LC.Newtonsoft.Json.dll": { + "assemblyVersion": "11.0.0.0", + "fileVersion": "11.0.1.0" + } + } + }, + "Realtime/1.0.0.0": { + "runtime": { + "Realtime.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "LC.Google.Protobuf/3.14.0.0": { + "runtime": { + "LC.Google.Protobuf.dll": { + "assemblyVersion": "3.14.0.0", + "fileVersion": "3.14.0.0" + } + } + }, + "System.Memory/4.0.1.1": { + "runtime": { + "System.Memory.dll": { + "assemblyVersion": "4.0.1.1", + "fileVersion": "4.6.27617.2" + } + } + }, + "System.Runtime.CompilerServices.Unsafe/4.0.4.1": { + "runtime": { + "System.Runtime.CompilerServices.Unsafe.dll": { + "assemblyVersion": "4.0.4.1", + "fileVersion": "4.0.0.0" + } + } + }, + "System.Buffers/4.0.2.0": { + "runtime": { + "System.Buffers.dll": { + "assemblyVersion": "4.0.2.0", + "fileVersion": "4.6.25519.3" + } + } + }, + "System.Numerics.Vectors/4.1.3.0": { + "runtime": { + "System.Numerics.Vectors.dll": { + "assemblyVersion": "4.1.3.0", + "fileVersion": "4.6.25519.3" + } + } + } + } + }, + "libraries": { + "TapTap.Bootstrap/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "TapTap.Common/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "TapTap.Login/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Common/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "LiveQuery/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "Storage/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "Storage.Unity/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "UnityEngine/0.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "LC.Newtonsoft.Json/11.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "Realtime/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "LC.Google.Protobuf/3.14.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "System.Memory/4.0.1.1": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "System.Runtime.CompilerServices.Unsafe/4.0.4.1": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "System.Buffers/4.0.2.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "System.Numerics.Vectors/4.1.3.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/Plugins/TapTap.Bootstrap.deps.json.meta b/Plugins/TapTap.Bootstrap.deps.json.meta new file mode 100644 index 0000000..92c4277 --- /dev/null +++ b/Plugins/TapTap.Bootstrap.deps.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 31cab863b627d4a509bd0f259bcf6a31 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/TapTap.Bootstrap.dll b/Plugins/TapTap.Bootstrap.dll new file mode 100644 index 0000000000000000000000000000000000000000..9eea61054575568752f2828500a19ea0a809501a GIT binary patch literal 35328 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 登陆成功之后,都会得到一个 `TDSUser` 实例 + +### 使用 TapTap OAuth 授权结果直接登陆/注册账户系统 + +```c# +var tdsUser = await TDSUser.LoginWithTapTap(); +``` + +### 游客登陆 + +```c# +var tdsUser = await TDSUser.LoginAnonymously(); +``` + +### 使用第三方平台授权登录/注册账户 + +```c# +var tdsUser = await TDSUser.LoginWithAuthData(Dictionary authData, string platform, +LCUserAuthDataLoginOption option = null); +``` + +### 绑定第三方平台授权 + +```c# +await TDSUser.AssociateAuthData(Dictionary authData, string platform); +``` + +### 退出登陆 + +```c# +TDSUser.Logout(); +``` + +## 3.好友系统 + +### 申请成为好友 + +```c# +TDSUser tom, jerry; +await tom.ApplyFriendship(jerry); +``` +申请成功的回调中,我们会得到一个 LCFriendshipRequest 的实例,这个实例中包含了两个用户: +- sourceUser,指请求的发起方,上面的例子中就是 `tom`。 +- friend,指请求的目的方,上面的例子中就是 `jerry`。 + +tom 也可以在申请好友的时候,添加更多的属性,例如 tom 希望加 jerry 为好友的时候,也设定一个名为 cat 的圈子,可以这样操作: + +```cs +Dictionary attrs = new Dictionary { + { "group", "cat" } +}; +await tom.ApplyFriendship(jerry, attrs); +``` + +### 获取好友申请列表 +好友申请有三种状态: + +- `pending`,对方没有回应,还处于等待中。 +- `accepted`,对方已经接受,现在双方成为好友。 +- `declined`,对方已经拒绝。 + +好友请求创建之后默认是 `pending` 状态。 + +jerry 这里可以通过 `friendshipRequestQuery` 来查找不同状态的请求。例如 jerry 想看看新的好友请求,可以这样操作: + +```cs +LCQuery query = jerry.GetFriendshipRequestQuery(LCFriendshipRequest.STATUS_PENDING, false, true); +ReadOnlyCollection reqs = await query.Find(); +foreach (LCFriendshipRequest req in reqs) { + Console.WriteLine(req); +} +``` + +### 处理好友申请 + +jerry 对于新的好友请求,可以同意或者拒绝,也可以什么都不做,无视这些请求,甚至直接删除。这些操作我们都是支持的,请看下面的示例: + +```cs +LCFriendshipRequest tomRequest, tuffyRequest, otherRequest; +await jerry.AcceptFriendshipRequest(tomRequest); +await jerry.DeclineFriendshipRequest(tuffyRequest); +await jerry.DeleteFriendshipRequest(otherRequest); +``` + +注意: +* 在 jerry 拒绝了 tom 的好友请求之后,如果 tom 再次请求成为 jerry 的好友,tom 在执行 applyFriendshipInBackground 时会直接得到错误的应答,表明 jerry 不想和 ta 成为好友。 +* jerry 同意了 tuffy 的好友请求之后,它们就成为了好友,之后两个人中任何一人再次调用 applyFriendshipInBackground 申请横位好友时,也会直接得到错误的应答,表明它们已经是好友无需再次申请。 +* jerry 删除陌生人的好友请求后,对方还可以再次发起请求。 + +### 响应好友变化通知 + +TDS 好友模块支持客户端监听好友状态变化,在游戏中实时给玩家提示。好友状态变化的接口包括 + +```cs +public class FriendshipNotification { + public Action OnNewRequestComing { get; set; } + public Action OnRequestAccepted { get; set; } + public Action OnRequestDeclined { get; set; } +} +``` + +其中: +- onNewRequestComing 表示有其他人申请成为当前用户的好友,通过调用 `LCFriendshipRequest#getSourceUser()` 方法可以获得发起方用户信息。 +- onRequestAccepted 表示当前用户的好友申请被对方通过,通过调用 `LCFriendshipRequest#getFriend()` 方法可以获得对方用户信息。 +- onRequestDeclined 表示当前用户的好友申请被对方拒绝,通过调用 `LCFriendshipRequest#getFriend()` 方法可以获得对方用户信息。 + +开发者可以通过 `TDSUser#registerFriendshipNotification` 来注册通知接收器,通过调用 `TDSUser#unregisterFriendshipNotification` 来取消通知接收器。 + +### 获取好友列表 + +调用 `TDSUser#friendshipQuery()` 可以得到查询好友的 `LCQuery` 实例,之后调用 `LCQuery#findInBackground()` 方法就可以得到好友列表。示例如下: + +```cs +LCQuery query = jerry.GetFirendshipQuery(); +``` + +LCFriendship 里面会包含两个用户: + +- `LCFriendship#getLCUser(LCFriendship.ATTR_USER)` 得到的是 jerry 自己; +- `LCFriendship#getLCUser(LCFriendship.ATTR_FOLLOWEE)` 得到的就是另一方的用户信息。 + +### 删除好友 + +成为好友关系的两个用户,之后也可以单方面删除好友。例如 jerry 不想再和 tom 成为好友,那只需要在自己的好友列表中删除包含 tom 的那条 LCFriendship 记录即可: + +```cs +await friendship.Delete(); +``` + +### 查询好友关系 + +我们使用 LCQuery 可以单独查询两个用户是否为好友关系。 + +```cs +LCQuery query = jerry.GetFirendshipQuery(); +query.whereEqualTo("followee", tom); +int count = await query.Count(); +if (count > 0) { + // tom is a friend of jerry. +} else { + // tom isn't a friend of jerry. +} +``` + +这一查询是通过网络发送到服务端执行的,一般情况下,我们推荐开发者在游戏启动时拉取一次当前登录用户的好友列表,然后缓存在本地,以后需要检查另外玩家是否为当前用户的好友时,直接从缓存中查询即可。如果担心好友数据变化,缓存没有得到及时更新,可以调用前面「响应好友变化通知」的方法,对好友数据更新进行监听,这样在绝大部分时候数据同步都是可以保证的。 + +## 4.云存档 + +### 构建云存档元数据 + +```c# +var gameSave = new TapGameSave +{ + Name = "GameSave_Name",// 存档名称 + Summary = "GameSave_Description", // 该字段会作为展示给用户的实际存档名 + ModifiedAt = DateTime.Now.ToLocalTime(), // 原文件修改时间 + PlayedTime = 1000L, // 游戏时长,单位 ms (非必填) + ProgressValue = 100, // 游戏进度 ,单位 int (非必填) + CoverFilePath = pic, // 游戏封面,可以传入一个本地文件路径,SDK 限制为 png/jpeg 格式 + GameFilePath = dll // 存档源文件,可以传入一个本地文件路径 +}; + +``` +### 保存存档 + +保存存档时,会去检查当前`TDSUser`是否已经登录以及元数据。 + +同时 SDK 在上传时会去限制存档本身以及相关联的两个文件( Cover 以及 GameFile )的权限为当前用户本身。 +```c# +await gameSave.Save(); +``` + +### 查询当前用户的所有存档 + +```c# +var collection = await TapGameSave.GetCurrentUserGameSaves(); + +foreach(var gameSave in collection){ + // 存档概览 + var name = gameSave.Summary; + // 原文件修改时间 + var modifiedAt = gameSave.ModifiedAt; + // 游戏时长 + var playedTime = gameSave.PlayedTime; + // 游戏进度 + var progressValue = gameSave.ProgressValue; + // 游戏封面 + var coverFile = gameSave.CoverFile; + // 存档源文件 + var gameFile = gameSave.GameFile; + // 源文件下载地址 + var gameFileUrl = gameFile.Url; +} +``` + +### 查询云存档 +云存档只能查询当前用户的所有存档,需要查询该用户的特定存档时,可以增加相应过滤,可参考 [查询条件](https://developer.taptap.com/docs/sdk/storage/guide/objc/#%E6%9F%A5%E8%AF%A2%E6%9D%A1%E4%BB%B6) +```c# +TDSUser user = await TDSUser.GetCurrent(); +LCQuery gameSaveQuery = TapGameSave.GetQueryWithUser(user); +// 查询 Name 为 TDSUser_GameSave_Name 的云存档 +gameSaveQuery.WhereEqualTo("name","TDSUser_GameSave_Name"); +var collection = await gameSaveQuery.Find(); +``` diff --git a/README.md.meta b/README.md.meta new file mode 100644 index 0000000..74191cc --- /dev/null +++ b/README.md.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c5330aab2c6a41699a1601f1af6b27d9 +timeCreated: 1616755935 \ No newline at end of file diff --git a/VERSIONNOTE.md b/VERSIONNOTE.md new file mode 100644 index 0000000..e69de29 diff --git a/VERSIONNOTE.md.meta b/VERSIONNOTE.md.meta new file mode 100644 index 0000000..4bb7039 --- /dev/null +++ b/VERSIONNOTE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d5391b17003874fb2afc3e309a3f63ef +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package.json b/package.json new file mode 100644 index 0000000..33569f6 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "com.taptap.tds.bootstrap", + "displayName": "TapTap Bootstrap", + "description": "TapTap Develop Service", + "version": "3.18.5-1", + "unity": "2018.3", + "license": "MIT", + "dependencies": { + "com.taptap.tds.common": "https://github.com/TapTap/TapCommon-Unity.git#3.18.5-1", + "com.taptap.tds.login": "https://github.com/TapTap/TapLogin-Unity.git#3.18.5-1", + "com.leancloud.realtime": "https://github.com/leancloud/csharp-sdk-upm.git#realtime-0.10.14", + "com.leancloud.storage": "https://github.com/leancloud/csharp-sdk-upm.git#storage-0.10.14" + } +} diff --git a/package.json.meta b/package.json.meta new file mode 100644 index 0000000..a42bf59 --- /dev/null +++ b/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e618b9375caf846708cffea428908521 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: