From 17d28f95dfcd53a727e87aeb586420c7003d97ce Mon Sep 17 00:00:00 2001 From: ci-gitlab Date: Mon, 25 Jul 2022 16:02:40 +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 -> 32768 bytes Plugins/TapTap.Bootstrap.dll.meta | 33 +++ Plugins/TapTap.Bootstrap.pdb | Bin 0 -> 15412 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..e6ea3e9276d4a0a55e7588290786802d040c9ab3 GIT binary patch literal 32768 zcmeHwdwg6~wf{Qj%$%9bWG3@S`b^vO$stM8rY~9uC2871py?}Vc@@)XGEIk0X408S zAx(oR1*BMc$m3EFEJ(SaD55A2MOzUsctJ(wUg1IoMU<=jkgNO@ANBWLYo9YSNm|g) z@ACQFKklSw?Y-7sd+oK?UVHDg&p9(~z2JH>h{%QOZ+|0t6e)ii1-?HRLUC})<3W13 zq>7Xu>SIS6%cg(7_|9H zX61i{)JB3FR-_3@k@OFLijYk zC*uCjM+zOn5wa$OeGoET5z+@y7pXA_BGQUMXoqySDz-2RHPxtZ5cbVx8T@$`jip$^aAiy{R$JU-k*`eg{l(f zlR4X;nN!4%nP$RUE<<-*IVsh&dti8M8s=F&v!du_9YoQEF_=f{h`CWx$1a|6v*ME#Dv}uhhki=DG^C&>61F zm~{r%ohRCqXB!#edCLBU#rq!1*p`at|PuVktuE8pL9R zv|JVG|j!G0RY73o91OV5~?6+rF$w27F#*!0VA3gXc)<8ia?7 zOiUk^sn|GJWSNW=$%O0jv4F=@`UG5L!plS^Tnedc5MG1SJqTApS~0j<(%p*P@+sMj z70I3h+2JDDjdoqEu#mA^p%y%x^G#80?gEw_>v}>MWnJBHg%uSSDF!jCI5MDg9e+%fJr8Ix4bNrerW?LAtN{UZXZ( zq#@JiY~Me{e7Co6Rp7Ed!t*v|I2>iB!(q5A=t#+4ujMy5~Q;m^f5Dia>moWgHyn*tCOBCVQtOPls>@JQhhfk$0{(66ZHza3WW4S z$gE6>2abqwF|A#|Gt(J`M=JE_*nmFem}*0WmskVfIvO2LwRVG8jQ|Zz@aliVr)ex~ zt}Rj;8P*_|UnSFKW@aIpkoht*)8b@@s-PlbD1*uoBUOrBrh?=%Ya7k6r+pS;t;--J z{ZW9ZE8?<-keS^iCSXQA>>8ZTsfu(FgkvGAdF2^Y)CagAiXu*rRlrY_9k?DOT@Fcs zl2R|0hz{=kUf{dD)=W0|709O%p7^3>#I&wLX7*BjENrOSGzVuC+B9_w3ti38^Yj6x zMooP;r^hOwNl}BQ^)Z&`4!iwF$45PENf9QBhdtKSC_P#}ob0jofm*HX>!F{%LE~-v zViLIw>l!XaE3n^n8WCIxeuWOOU!8;me#K@SkFp{&a+iwC$ozWP9JDx9hYfUT44V-r zdYF+5xL2GOnUU*35}T2G6(|{INRL$oLuU7LsVnR%8JqqDvXZ$L8Bf?{UB_t&-}x{- za(1enq|&e}EoDN?WZ7A+XI{REV&)4ODJmROZruQ;^d|wL-iX(_5gB{bR2RL2Cl|Wt z)h#TEHAgSf`4)mJ>eY91daME+SEDBV^IA8tJWp7HN4*q7SHfc?62(~I66VARjvF-pBeQ|tu$EA7S zt%FFzx|7RsFqjWa&JvOVVSz)C3SVzuQc(pbsz=~T2*Md-@{3!&n1M}!$LB2Ap^ZUl^AL?+rJ!c>e1Cq*6MDkm5bktSk>jYxr< z??%2KUEA~h;O2|^;i7dq5%x&<*D@6O%oPSY25snzxW;O{2P{Xy?1c3IcklB6QFp{` zeE}JJFXoDR*gd$CQx(;_bzZM)UirTwfD58-eK)7aDo~)77p@0MXb9T`kM#-=YI;U_;o=>9LB*!+KR>eT7AO!`{;DSCN~U`51OGeSn)Bcm#y> zqe8u|Kz*!0y}v+xyg>bCf%>%q_4@_t*9+8NgX$f4qCnug(B6S>6bSDL$2SWEkC!

IMqTX?p6ZB4`iI`!%E0CSu754Dmd-MHU1Hnc8 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 XgFn}+-zNU?qW{4<{;z5ung#wJ^+(+P literal 0 HcmV?d00001 diff --git a/Plugins/TapTap.Bootstrap.dll.meta b/Plugins/TapTap.Bootstrap.dll.meta new file mode 100644 index 0000000..6dcd382 --- /dev/null +++ b/Plugins/TapTap.Bootstrap.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 03acb073a9f88474581401ef1020c1c4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/TapTap.Bootstrap.pdb b/Plugins/TapTap.Bootstrap.pdb new file mode 100644 index 0000000000000000000000000000000000000000..cf1a5ef73d0fb613d6987800508543cd02436f7f GIT binary patch literal 15412 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 R!;L?l_&o*mmSanw{2!{XhM@oe 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..1f36d29 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "com.taptap.tds.bootstrap", + "displayName": "TapTap Bootstrap", + "description": "TapTap Develop Service", + "version": "3.11.1", + "unity": "2018.3", + "license": "MIT", + "dependencies": { + "com.taptap.tds.common": "https://github.com/TapTap/TapCommon-Unity.git#3.11.0", + "com.taptap.tds.login": "https://github.com/TapTap/TapLogin-Unity.git#3.11.0", + "com.leancloud.realtime": "https://github.com/leancloud/csharp-sdk-upm.git#realtime-0.10.11", + "com.leancloud.storage": "https://github.com/leancloud/csharp-sdk-upm.git#storage-0.10.11" + } +} 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: