From e87af7f0761b127bd1f64ef902bcb7e2a3daaa9b Mon Sep 17 00:00:00 2001 From: ci-gitlab Date: Thu, 25 Aug 2022 17:49:56 +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 -> 34304 bytes Plugins/TapTap.Bootstrap.dll.meta | 33 +++ Plugins/TapTap.Bootstrap.pdb | Bin 0 -> 15700 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..393f3019185d501db70e1bb31a2468409cf6f7b9 GIT binary patch literal 34304 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 Qc*dBiAh!f-T8YsA11f^fW&i*H literal 0 HcmV?d00001 diff --git a/Plugins/TapTap.Bootstrap.pdb.meta b/Plugins/TapTap.Bootstrap.pdb.meta new file mode 100644 index 0000000..1456e1e --- /dev/null +++ b/Plugins/TapTap.Bootstrap.pdb.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b3d6c5154fb9d4319a2a32e6fde07f63 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/README.md b/README.md new file mode 100644 index 0000000..ac2eea9 --- /dev/null +++ b/README.md @@ -0,0 +1,254 @@ +# [使用 TapTap.Bootstrap ](./Documentation/README.md) + +## 使用前提 + +使用 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; +} +``` + +### 查询云存档 +云存档只能查询当前用户的所有存档,需要查询该用户的特定存档时,可以增加相应过滤,可参考 [查询条件](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..f46448a --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "com.taptap.tds.bootstrap", + "displayName": "TapTap Bootstrap", + "description": "TapTap Develop Service", + "version": "3.13.0", + "unity": "2018.3", + "license": "MIT", + "dependencies": { + "com.taptap.tds.common": "https://github.com/TapTap/TapCommon-Unity.git#3.13.0", + "com.taptap.tds.login": "https://github.com/TapTap/TapLogin-Unity.git#3.13.0", + "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: