From 37085f9cb251b7f6104f1ec244aee55daba44f91 Mon Sep 17 00:00:00 2001 From: ci-gitlab Date: Tue, 1 Nov 2022 10:28: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 -> 15740 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..495c7980ae1934e99cad5187e1687737d6d17e6e GIT binary patch literal 34304 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 Ry 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..756c68f58228298265964fcb5c0d5dea87dbafb4 GIT binary patch literal 15740 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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..cab5635 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "com.taptap.tds.bootstrap", + "displayName": "TapTap Bootstrap", + "description": "TapTap Develop Service", + "version": "3.16.2", + "unity": "2018.3", + "license": "MIT", + "dependencies": { + "com.taptap.tds.common": "https://github.com/TapTap/TapCommon-Unity.git#3.16.2", + "com.taptap.tds.login": "https://github.com/TapTap/TapLogin-Unity.git#3.16.2", + "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: