com.taptap.sdk.cloudsave 4.8.0-beta.1 → 4.8.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Mobile/Editor/NativeDependencies.xml +7 -1
- package/Mobile/Runtime/TapCloudSaveBridge.cs +117 -16
- package/Runtime/Internal/ITapCloudSaveBridge.cs +7 -3
- package/Runtime/Internal/TapCloudSaveInitTask.cs +2 -0
- package/Runtime/Internal/TapTapCloudSaveInternal.cs +9 -3
- package/Runtime/Public/TapTapCloudSave.cs +4 -2
- package/Standalone/Editor/TapCloudSaveStandaloneProcessBuild.cs +26 -0
- package/Standalone/Editor/TapCloudSaveStandaloneProcessBuild.cs.meta +11 -0
- package/Standalone/Editor/TapSDK.CloudSave.Standalone.Editor.asmdef +17 -0
- package/Standalone/Editor/TapSDK.CloudSave.Standalone.Editor.asmdef.meta +7 -0
- package/Standalone/Editor.meta +8 -0
- package/Standalone/Plugins/x86_64/cloudsave_sdk.dll +0 -0
- package/Standalone/Plugins/x86_64/cloudsave_sdk.dll.meta +80 -0
- package/Standalone/Plugins/x86_64.meta +8 -0
- package/Standalone/Plugins.meta +8 -0
- package/Standalone/Runtime/Internal/TapCloudSaveArchiveListResponse.cs +11 -0
- package/Standalone/Runtime/Internal/TapCloudSaveArchiveListResponse.cs.meta +11 -0
- package/Standalone/Runtime/Internal/TapCloudSaveBaseResponse.cs +29 -0
- package/Standalone/Runtime/Internal/TapCloudSaveBaseResponse.cs.meta +11 -0
- package/Standalone/Runtime/Internal/TapCloudSaveTracker.cs +101 -0
- package/Standalone/Runtime/Internal/TapCloudSaveTracker.cs.meta +11 -0
- package/Standalone/Runtime/Internal/TapCloudSaveWrapper.cs +518 -0
- package/Standalone/Runtime/Internal/TapCloudSaveWrapper.cs.meta +11 -0
- package/Standalone/Runtime/Internal.meta +8 -0
- package/Standalone/Runtime/TapCloudSaveResultCode.cs +9 -0
- package/Standalone/Runtime/TapCloudSaveResultCode.cs.meta +11 -0
- package/Standalone/Runtime/TapCloudSaveStandalone.cs +733 -0
- package/Standalone/Runtime/TapCloudSaveStandalone.cs.meta +11 -0
- package/Standalone/Runtime.meta +8 -0
- package/Standalone/TapSDK.CloudSave.Standalone.Runtime.asmdef +22 -0
- package/Standalone/TapSDK.CloudSave.Standalone.Runtime.asmdef.meta +7 -0
- package/Standalone.meta +8 -0
- package/link.xml.meta +1 -1
- package/package.json +10 -10
|
@@ -0,0 +1,733 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Collections.Generic;
|
|
3
|
+
using System.IO;
|
|
4
|
+
using System.Text;
|
|
5
|
+
using System.Threading.Tasks;
|
|
6
|
+
using Newtonsoft.Json;
|
|
7
|
+
using TapSDK.CloudSave.Internal;
|
|
8
|
+
using TapSDK.Core;
|
|
9
|
+
using TapSDK.Core.Internal.Log;
|
|
10
|
+
using TapSDK.Core.Internal.Utils;
|
|
11
|
+
using TapSDK.Core.Standalone;
|
|
12
|
+
using TapSDK.Core.Standalone.Internal;
|
|
13
|
+
using TapSDK.Core.Standalone.Internal.Http;
|
|
14
|
+
using TapSDK.Login;
|
|
15
|
+
using UnityEngine;
|
|
16
|
+
|
|
17
|
+
namespace TapSDK.CloudSave.Standalone
|
|
18
|
+
{
|
|
19
|
+
public class TapCloudSaveStandalone : ITapCloudSaveBridge
|
|
20
|
+
{
|
|
21
|
+
private List<ITapCloudSaveCallback> currentSaveCallback = null;
|
|
22
|
+
private static readonly bool isRND = false;
|
|
23
|
+
private bool _hasInitNative = false;
|
|
24
|
+
private object _lockObj = new object();
|
|
25
|
+
|
|
26
|
+
private TapLog cloudSaveLog;
|
|
27
|
+
|
|
28
|
+
public void Init(TapTapSdkOptions options)
|
|
29
|
+
{
|
|
30
|
+
Log("TapCloudSave start init");
|
|
31
|
+
TapCloudSaveTracker.Instance.TrackInit();
|
|
32
|
+
string cacheDir = Path.Combine(
|
|
33
|
+
Application.persistentDataPath,
|
|
34
|
+
"cloudsave_" + options.clientId
|
|
35
|
+
);
|
|
36
|
+
string deviceID = SystemInfo.deviceUniqueIdentifier;
|
|
37
|
+
Task.Run(async () =>
|
|
38
|
+
{
|
|
39
|
+
TapTapAccount tapAccount = await TapTapLogin.Instance.GetCurrentTapAccount();
|
|
40
|
+
string loginKid = "";
|
|
41
|
+
string loginKey = "";
|
|
42
|
+
if (tapAccount != null && !string.IsNullOrEmpty(tapAccount.openId))
|
|
43
|
+
{
|
|
44
|
+
loginKey = tapAccount.accessToken.macKey;
|
|
45
|
+
loginKid = tapAccount.accessToken.kid;
|
|
46
|
+
}
|
|
47
|
+
Dictionary<string, object> loginData = new Dictionary<string, object>
|
|
48
|
+
{
|
|
49
|
+
{ "kid", loginKid },
|
|
50
|
+
{ "key", loginKey },
|
|
51
|
+
};
|
|
52
|
+
int region = isRND ? 2 : 0;
|
|
53
|
+
try
|
|
54
|
+
{
|
|
55
|
+
Dictionary<string, object> initConfig = new Dictionary<string, object>()
|
|
56
|
+
{
|
|
57
|
+
{ "region", region },
|
|
58
|
+
{ "log_to_console", 1 },
|
|
59
|
+
{ "log_level", 3 },
|
|
60
|
+
{ "data_dir", cacheDir },
|
|
61
|
+
{ "client_id", options.clientId },
|
|
62
|
+
{ "client_token", options.clientToken },
|
|
63
|
+
{ "ua", TapHttpUtils.GenerateUserAgent() },
|
|
64
|
+
{ "lang", Tracker.getServerLanguage() },
|
|
65
|
+
{ "platform", "PC" },
|
|
66
|
+
{ "device_id", deviceID },
|
|
67
|
+
{ "sdk_artifact", "Unity" },
|
|
68
|
+
{ "sdk_module_ver", TapTapCloudSave.Version },
|
|
69
|
+
{ "sdk_token", loginData },
|
|
70
|
+
};
|
|
71
|
+
Log(" start invoke TapSdkCloudSaveInitialize result ");
|
|
72
|
+
string config = JsonConvert.SerializeObject(initConfig);
|
|
73
|
+
int initResult = TapCloudSaveWrapper.TapSdkCloudSaveInitialize(config);
|
|
74
|
+
Log("TapSdkCloudSaveInitialize result = " + initResult);
|
|
75
|
+
if (initResult < 0)
|
|
76
|
+
{
|
|
77
|
+
RunOnMainThread(() =>
|
|
78
|
+
{
|
|
79
|
+
if (currentSaveCallback != null && currentSaveCallback.Count > 0)
|
|
80
|
+
{
|
|
81
|
+
foreach (var callback in currentSaveCallback)
|
|
82
|
+
{
|
|
83
|
+
callback?.OnResult(TapCloudSaveResultCode.INIT_FAIL);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else
|
|
89
|
+
{
|
|
90
|
+
lock (_lockObj)
|
|
91
|
+
{
|
|
92
|
+
_hasInitNative = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (Exception e)
|
|
97
|
+
{
|
|
98
|
+
Log("TapSdkCloudSaveInitialize error " + e.Message);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
EventManager.AddListener(EventManager.OnTapUserChanged, OnLoginInfoChanged);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public void CreateArchive(
|
|
106
|
+
ArchiveMetadata metadata,
|
|
107
|
+
string archiveFilePath,
|
|
108
|
+
string archiveCoverPath,
|
|
109
|
+
ITapCloudSaveRequestCallback callback
|
|
110
|
+
)
|
|
111
|
+
{
|
|
112
|
+
CheckPCLaunchState();
|
|
113
|
+
string seesionId = Guid.NewGuid().ToString();
|
|
114
|
+
const string method = "createArchive";
|
|
115
|
+
Task.Run(async () =>
|
|
116
|
+
{
|
|
117
|
+
bool hasInit = await CheckInitAndLoginState(method, seesionId);
|
|
118
|
+
if (!hasInit)
|
|
119
|
+
{
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
try
|
|
123
|
+
{
|
|
124
|
+
byte[] fileBytes = File.ReadAllBytes(archiveFilePath);
|
|
125
|
+
byte[] coverData = null;
|
|
126
|
+
if (!string.IsNullOrEmpty(archiveCoverPath))
|
|
127
|
+
{
|
|
128
|
+
coverData = File.ReadAllBytes(archiveCoverPath);
|
|
129
|
+
}
|
|
130
|
+
string metaValue = JsonConvert.SerializeObject(metadata);
|
|
131
|
+
string result = TapCloudSaveWrapper.CreateArchive(
|
|
132
|
+
metaValue,
|
|
133
|
+
fileBytes,
|
|
134
|
+
fileBytes.Length,
|
|
135
|
+
coverData,
|
|
136
|
+
coverData?.Length ?? 0
|
|
137
|
+
);
|
|
138
|
+
TapCloudSaveBaseResponse response =
|
|
139
|
+
JsonConvert.DeserializeObject<TapCloudSaveBaseResponse>(result);
|
|
140
|
+
if (response.success)
|
|
141
|
+
{
|
|
142
|
+
ArchiveData data = response.data.ToObject<ArchiveData>();
|
|
143
|
+
TapCloudSaveTracker.Instance.TrackSuccess(method, seesionId);
|
|
144
|
+
RunOnMainThread(() =>
|
|
145
|
+
{
|
|
146
|
+
callback?.OnArchiveCreated(
|
|
147
|
+
new ArchiveData()
|
|
148
|
+
{
|
|
149
|
+
FileId = data.FileId,
|
|
150
|
+
Uuid = data.Uuid,
|
|
151
|
+
Name = metadata.Name,
|
|
152
|
+
Summary = metadata.Summary,
|
|
153
|
+
Extra = metadata.Extra,
|
|
154
|
+
Playtime = metadata.Playtime,
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
else
|
|
159
|
+
{
|
|
160
|
+
try
|
|
161
|
+
{
|
|
162
|
+
TapCloudSaveError error = response.data.ToObject<TapCloudSaveError>();
|
|
163
|
+
Log(
|
|
164
|
+
"createArchive failed error = " + JsonConvert.SerializeObject(error)
|
|
165
|
+
);
|
|
166
|
+
TapCloudSaveTracker.Instance.TrackFailure(
|
|
167
|
+
method,
|
|
168
|
+
seesionId,
|
|
169
|
+
error.code,
|
|
170
|
+
error.msg ?? ""
|
|
171
|
+
);
|
|
172
|
+
RunOnMainThread(() =>
|
|
173
|
+
{
|
|
174
|
+
callback?.OnRequestError(error.code, $"创建存档失败: {error.msg}");
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
catch (Exception e)
|
|
178
|
+
{
|
|
179
|
+
TapCloudSaveTracker.Instance.TrackFailure(
|
|
180
|
+
method,
|
|
181
|
+
seesionId,
|
|
182
|
+
-1,
|
|
183
|
+
"创建存档失败: 数据解析异常"
|
|
184
|
+
);
|
|
185
|
+
RunOnMainThread(() =>
|
|
186
|
+
{
|
|
187
|
+
callback?.OnRequestError(-1, "创建存档失败: 数据解析异常");
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (Exception e)
|
|
193
|
+
{
|
|
194
|
+
string msg = $"创建存档失败: {e.Message}";
|
|
195
|
+
TapCloudSaveTracker.Instance.TrackFailure(method, seesionId, -1, msg);
|
|
196
|
+
RunOnMainThread(() =>
|
|
197
|
+
{
|
|
198
|
+
callback?.OnRequestError(-1, msg);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
public void DeleteArchive(string archiveUuid, ITapCloudSaveRequestCallback callback)
|
|
205
|
+
{
|
|
206
|
+
CheckPCLaunchState();
|
|
207
|
+
string seesionId = Guid.NewGuid().ToString();
|
|
208
|
+
const string method = "deleteArchive";
|
|
209
|
+
Task.Run(async () =>
|
|
210
|
+
{
|
|
211
|
+
bool hasInit = await CheckInitAndLoginState(method, seesionId);
|
|
212
|
+
if (!hasInit)
|
|
213
|
+
{
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
try
|
|
217
|
+
{
|
|
218
|
+
string result = TapCloudSaveWrapper.DeleteArchive(archiveUuid);
|
|
219
|
+
TapCloudSaveBaseResponse response =
|
|
220
|
+
JsonConvert.DeserializeObject<TapCloudSaveBaseResponse>(result);
|
|
221
|
+
if (response.success)
|
|
222
|
+
{
|
|
223
|
+
ArchiveData archiveData = response.data.ToObject<ArchiveData>();
|
|
224
|
+
TapCloudSaveTracker.Instance.TrackSuccess(method, seesionId);
|
|
225
|
+
RunOnMainThread(() =>
|
|
226
|
+
{
|
|
227
|
+
callback?.OnArchiveDeleted(archiveData);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
else
|
|
231
|
+
{
|
|
232
|
+
try
|
|
233
|
+
{
|
|
234
|
+
TapCloudSaveError error = response.data.ToObject<TapCloudSaveError>();
|
|
235
|
+
Log(
|
|
236
|
+
"deleteArchive failed error = " + JsonConvert.SerializeObject(error)
|
|
237
|
+
);
|
|
238
|
+
TapCloudSaveTracker.Instance.TrackFailure(
|
|
239
|
+
method,
|
|
240
|
+
seesionId,
|
|
241
|
+
error.code,
|
|
242
|
+
error.msg ?? ""
|
|
243
|
+
);
|
|
244
|
+
RunOnMainThread(() =>
|
|
245
|
+
{
|
|
246
|
+
callback?.OnRequestError(error.code, $"删除存档失败: {error.msg}");
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
catch (Exception e)
|
|
250
|
+
{
|
|
251
|
+
TapCloudSaveTracker.Instance.TrackFailure(
|
|
252
|
+
method,
|
|
253
|
+
seesionId,
|
|
254
|
+
-1,
|
|
255
|
+
"删除存档失败: 数据解析异常"
|
|
256
|
+
);
|
|
257
|
+
RunOnMainThread(() =>
|
|
258
|
+
{
|
|
259
|
+
callback?.OnRequestError(-1, "删除存档失败: 数据解析异常");
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (Exception e)
|
|
265
|
+
{
|
|
266
|
+
string msg = $"删除失败: {e.Message}";
|
|
267
|
+
TapCloudSaveTracker.Instance.TrackFailure(method, seesionId, -1, msg);
|
|
268
|
+
RunOnMainThread(() =>
|
|
269
|
+
{
|
|
270
|
+
callback?.OnRequestError(-1, msg);
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
public void GetArchiveCover(
|
|
277
|
+
string archiveUuid,
|
|
278
|
+
string archiveFileId,
|
|
279
|
+
ITapCloudSaveRequestCallback callback
|
|
280
|
+
)
|
|
281
|
+
{
|
|
282
|
+
CheckPCLaunchState();
|
|
283
|
+
string seesionId = Guid.NewGuid().ToString();
|
|
284
|
+
const string method = "getArchiveCover";
|
|
285
|
+
Task.Run(async () =>
|
|
286
|
+
{
|
|
287
|
+
bool hasInit = await CheckInitAndLoginState(method, seesionId);
|
|
288
|
+
if (!hasInit)
|
|
289
|
+
{
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
try
|
|
293
|
+
{
|
|
294
|
+
byte[] result = TapCloudSaveWrapper.GetArchiveCover(
|
|
295
|
+
archiveUuid,
|
|
296
|
+
archiveFileId,
|
|
297
|
+
out int coverSize
|
|
298
|
+
);
|
|
299
|
+
if (coverSize >= 0)
|
|
300
|
+
{
|
|
301
|
+
RunOnMainThread(() =>
|
|
302
|
+
{
|
|
303
|
+
callback.OnArchiveCoverResult(result);
|
|
304
|
+
});
|
|
305
|
+
TapCloudSaveTracker.Instance.TrackSuccess(method, seesionId);
|
|
306
|
+
}
|
|
307
|
+
else
|
|
308
|
+
{
|
|
309
|
+
try
|
|
310
|
+
{
|
|
311
|
+
TapCloudSaveBaseResponse response =
|
|
312
|
+
JsonConvert.DeserializeObject<TapCloudSaveBaseResponse>(
|
|
313
|
+
Encoding.UTF8.GetString(result)
|
|
314
|
+
);
|
|
315
|
+
TapCloudSaveError error = response.data.ToObject<TapCloudSaveError>();
|
|
316
|
+
Log(
|
|
317
|
+
"getArchiveCover failed error = " + JsonConvert.SerializeObject(error)
|
|
318
|
+
);
|
|
319
|
+
TapCloudSaveTracker.Instance.TrackFailure(
|
|
320
|
+
method,
|
|
321
|
+
seesionId,
|
|
322
|
+
error.code,
|
|
323
|
+
error.msg ?? ""
|
|
324
|
+
);
|
|
325
|
+
RunOnMainThread(() =>
|
|
326
|
+
{
|
|
327
|
+
callback?.OnRequestError(error.code, $"获取封面失败: {error.msg}");
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
catch (Exception e)
|
|
331
|
+
{
|
|
332
|
+
TapCloudSaveTracker.Instance.TrackFailure(
|
|
333
|
+
method,
|
|
334
|
+
seesionId,
|
|
335
|
+
-1,
|
|
336
|
+
"获取封面失败: 数据解析异常"
|
|
337
|
+
);
|
|
338
|
+
RunOnMainThread(() =>
|
|
339
|
+
{
|
|
340
|
+
callback?.OnRequestError(-1, "获取封面失败: 数据解析异常");
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
catch (Exception e)
|
|
346
|
+
{
|
|
347
|
+
string msg = $"获取封面失败: {e.Message}";
|
|
348
|
+
TapCloudSaveTracker.Instance.TrackFailure(method, seesionId, -1, msg);
|
|
349
|
+
RunOnMainThread(() =>
|
|
350
|
+
{
|
|
351
|
+
callback?.OnRequestError(-1, msg);
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
public void GetArchiveData(
|
|
358
|
+
string archiveUuid,
|
|
359
|
+
string archiveFileId,
|
|
360
|
+
ITapCloudSaveRequestCallback callback
|
|
361
|
+
)
|
|
362
|
+
{
|
|
363
|
+
CheckPCLaunchState();
|
|
364
|
+
string seesionId = Guid.NewGuid().ToString();
|
|
365
|
+
const string method = "getArchiveData";
|
|
366
|
+
Task.Run(async () =>
|
|
367
|
+
{
|
|
368
|
+
bool hasInit = await CheckInitAndLoginState(method, seesionId);
|
|
369
|
+
if (!hasInit)
|
|
370
|
+
{
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
try
|
|
374
|
+
{
|
|
375
|
+
byte[] result = TapCloudSaveWrapper.GetArchiveData(
|
|
376
|
+
archiveUuid,
|
|
377
|
+
archiveFileId,
|
|
378
|
+
out int fileSize
|
|
379
|
+
);
|
|
380
|
+
if (fileSize >= 0)
|
|
381
|
+
{
|
|
382
|
+
RunOnMainThread(() =>
|
|
383
|
+
{
|
|
384
|
+
callback.OnArchiveDataResult(result);
|
|
385
|
+
});
|
|
386
|
+
TapCloudSaveTracker.Instance.TrackSuccess(method, seesionId);
|
|
387
|
+
}
|
|
388
|
+
else
|
|
389
|
+
{
|
|
390
|
+
try
|
|
391
|
+
{
|
|
392
|
+
TapCloudSaveBaseResponse response =
|
|
393
|
+
JsonConvert.DeserializeObject<TapCloudSaveBaseResponse>(
|
|
394
|
+
Encoding.UTF8.GetString(result)
|
|
395
|
+
);
|
|
396
|
+
TapCloudSaveError error = response.data.ToObject<TapCloudSaveError>();
|
|
397
|
+
Log(
|
|
398
|
+
"getArchiveData failed error = " + JsonConvert.SerializeObject(error)
|
|
399
|
+
);
|
|
400
|
+
TapCloudSaveTracker.Instance.TrackFailure(
|
|
401
|
+
method,
|
|
402
|
+
seesionId,
|
|
403
|
+
error.code,
|
|
404
|
+
error.msg ?? ""
|
|
405
|
+
);
|
|
406
|
+
RunOnMainThread(() =>
|
|
407
|
+
{
|
|
408
|
+
callback?.OnRequestError(error.code, $"获取存档失败: {error.msg}");
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
catch (Exception e)
|
|
412
|
+
{
|
|
413
|
+
TapCloudSaveTracker.Instance.TrackFailure(
|
|
414
|
+
method,
|
|
415
|
+
seesionId,
|
|
416
|
+
-1,
|
|
417
|
+
"获取存档失败: 数据解析异常"
|
|
418
|
+
);
|
|
419
|
+
RunOnMainThread(() =>
|
|
420
|
+
{
|
|
421
|
+
callback?.OnRequestError(-1, "获取存档失败: 数据解析异常");
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
catch (Exception e)
|
|
427
|
+
{
|
|
428
|
+
string msg = $"获取存档失败: {e.Message}";
|
|
429
|
+
TapCloudSaveTracker.Instance.TrackFailure(method, seesionId, -1, msg);
|
|
430
|
+
RunOnMainThread(() =>
|
|
431
|
+
{
|
|
432
|
+
callback?.OnRequestError(-1, msg);
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
public void GetArchiveList(ITapCloudSaveRequestCallback callback)
|
|
439
|
+
{
|
|
440
|
+
CheckPCLaunchState();
|
|
441
|
+
string seesionId = Guid.NewGuid().ToString();
|
|
442
|
+
const string method = "getArchiveList";
|
|
443
|
+
Task.Run(async () =>
|
|
444
|
+
{
|
|
445
|
+
bool hasInit = await CheckInitAndLoginState(method, seesionId);
|
|
446
|
+
if (!hasInit)
|
|
447
|
+
{
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
try
|
|
451
|
+
{
|
|
452
|
+
string result = TapCloudSaveWrapper.GetArchiveList();
|
|
453
|
+
TapCloudSaveBaseResponse response =
|
|
454
|
+
JsonConvert.DeserializeObject<TapCloudSaveBaseResponse>(result);
|
|
455
|
+
if (response.success)
|
|
456
|
+
{
|
|
457
|
+
TapCloudSaveArchiveListResponse archiveDatas =
|
|
458
|
+
response.data.ToObject<TapCloudSaveArchiveListResponse>();
|
|
459
|
+
TapCloudSaveTracker.Instance.TrackSuccess(method, seesionId);
|
|
460
|
+
RunOnMainThread(() =>
|
|
461
|
+
{
|
|
462
|
+
callback?.OnArchiveListResult(archiveDatas.saves);
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
else
|
|
466
|
+
{
|
|
467
|
+
try
|
|
468
|
+
{
|
|
469
|
+
TapCloudSaveError error = response.data.ToObject<TapCloudSaveError>();
|
|
470
|
+
Log(
|
|
471
|
+
"getArchiveList failed error = " + JsonConvert.SerializeObject(error)
|
|
472
|
+
);
|
|
473
|
+
TapCloudSaveTracker.Instance.TrackFailure(
|
|
474
|
+
method,
|
|
475
|
+
seesionId,
|
|
476
|
+
error.code,
|
|
477
|
+
error.msg ?? ""
|
|
478
|
+
);
|
|
479
|
+
RunOnMainThread(() =>
|
|
480
|
+
{
|
|
481
|
+
callback?.OnRequestError(
|
|
482
|
+
error.code,
|
|
483
|
+
$"获取存档列表失败: {error.msg}"
|
|
484
|
+
);
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
catch (Exception e)
|
|
488
|
+
{
|
|
489
|
+
TapCloudSaveTracker.Instance.TrackFailure(
|
|
490
|
+
method,
|
|
491
|
+
seesionId,
|
|
492
|
+
-1,
|
|
493
|
+
"获取存档列表失败: 数据解析异常"
|
|
494
|
+
);
|
|
495
|
+
RunOnMainThread(() =>
|
|
496
|
+
{
|
|
497
|
+
callback?.OnRequestError(-1, "获取存档列表失败: 数据解析异常");
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
catch (Exception e)
|
|
503
|
+
{
|
|
504
|
+
string msg = $"获取存档列表失败: {e.Message}";
|
|
505
|
+
TapCloudSaveTracker.Instance.TrackFailure(method, seesionId, -1, msg);
|
|
506
|
+
RunOnMainThread(() =>
|
|
507
|
+
{
|
|
508
|
+
callback?.OnRequestError(-1, msg);
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
public void RegisterCloudSaveCallback(ITapCloudSaveCallback callback)
|
|
515
|
+
{
|
|
516
|
+
currentSaveCallback?.Clear();
|
|
517
|
+
string seesionId = Guid.NewGuid().ToString();
|
|
518
|
+
const string method = "registerCloudSaveCallback";
|
|
519
|
+
TapCloudSaveTracker.Instance.TrackStart(method, seesionId);
|
|
520
|
+
if (currentSaveCallback == null)
|
|
521
|
+
{
|
|
522
|
+
currentSaveCallback = new List<ITapCloudSaveCallback>();
|
|
523
|
+
}
|
|
524
|
+
if (!currentSaveCallback.Contains(callback))
|
|
525
|
+
{
|
|
526
|
+
TapCloudSaveTracker.Instance.TrackSuccess(method, seesionId);
|
|
527
|
+
currentSaveCallback.Add(callback);
|
|
528
|
+
}
|
|
529
|
+
else
|
|
530
|
+
{
|
|
531
|
+
TapCloudSaveTracker.Instance.TrackFailure(
|
|
532
|
+
method,
|
|
533
|
+
seesionId,
|
|
534
|
+
errorMessage: "callback has already registered"
|
|
535
|
+
);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
public void UpdateArchive(
|
|
540
|
+
string archiveUuid,
|
|
541
|
+
ArchiveMetadata metadata,
|
|
542
|
+
string archiveFilePath,
|
|
543
|
+
string archiveCoverPath,
|
|
544
|
+
ITapCloudSaveRequestCallback callback
|
|
545
|
+
)
|
|
546
|
+
{
|
|
547
|
+
CheckPCLaunchState();
|
|
548
|
+
string seesionId = Guid.NewGuid().ToString();
|
|
549
|
+
const string method = "updateArchive";
|
|
550
|
+
Task.Run(async () =>
|
|
551
|
+
{
|
|
552
|
+
bool hasInit = await CheckInitAndLoginState(method, seesionId);
|
|
553
|
+
if (!hasInit)
|
|
554
|
+
{
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
try
|
|
558
|
+
{
|
|
559
|
+
byte[] fileBytes = File.ReadAllBytes(archiveFilePath);
|
|
560
|
+
byte[] coverData = null;
|
|
561
|
+
if (!string.IsNullOrEmpty(archiveCoverPath))
|
|
562
|
+
{
|
|
563
|
+
coverData = File.ReadAllBytes(archiveCoverPath);
|
|
564
|
+
}
|
|
565
|
+
string metaValue = JsonConvert.SerializeObject(metadata);
|
|
566
|
+
string result = TapCloudSaveWrapper.UpdateArchive(
|
|
567
|
+
archiveUuid,
|
|
568
|
+
metaValue,
|
|
569
|
+
fileBytes,
|
|
570
|
+
fileBytes.Length,
|
|
571
|
+
coverData,
|
|
572
|
+
coverData?.Length ?? 0
|
|
573
|
+
);
|
|
574
|
+
TapCloudSaveBaseResponse response =
|
|
575
|
+
JsonConvert.DeserializeObject<TapCloudSaveBaseResponse>(result);
|
|
576
|
+
if (response.success)
|
|
577
|
+
{
|
|
578
|
+
ArchiveData data = response.data.ToObject<ArchiveData>();
|
|
579
|
+
TapCloudSaveTracker.Instance.TrackSuccess(method, seesionId);
|
|
580
|
+
RunOnMainThread(() =>
|
|
581
|
+
{
|
|
582
|
+
callback?.OnArchiveUpdated(data);
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
else
|
|
586
|
+
{
|
|
587
|
+
try
|
|
588
|
+
{
|
|
589
|
+
TapCloudSaveError error = response.data.ToObject<TapCloudSaveError>();
|
|
590
|
+
Log(
|
|
591
|
+
"updateArchive failed error = " + JsonConvert.SerializeObject(error)
|
|
592
|
+
);
|
|
593
|
+
TapCloudSaveTracker.Instance.TrackFailure(
|
|
594
|
+
method,
|
|
595
|
+
seesionId,
|
|
596
|
+
error.code,
|
|
597
|
+
error.msg ?? ""
|
|
598
|
+
);
|
|
599
|
+
RunOnMainThread(() =>
|
|
600
|
+
{
|
|
601
|
+
callback?.OnRequestError(error.code, $"更新存档失败: {error.msg}");
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
catch (Exception e)
|
|
605
|
+
{
|
|
606
|
+
TapCloudSaveTracker.Instance.TrackFailure(
|
|
607
|
+
method,
|
|
608
|
+
seesionId,
|
|
609
|
+
-1,
|
|
610
|
+
"更新存档失败: 数据解析异常"
|
|
611
|
+
);
|
|
612
|
+
RunOnMainThread(() =>
|
|
613
|
+
{
|
|
614
|
+
callback?.OnRequestError(-1, "更新存档失败: 数据解析异常");
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
catch (Exception e)
|
|
620
|
+
{
|
|
621
|
+
string msg = $"更新存档失败: {e.Message}";
|
|
622
|
+
TapCloudSaveTracker.Instance.TrackFailure(method, seesionId, -1, msg);
|
|
623
|
+
RunOnMainThread(() =>
|
|
624
|
+
{
|
|
625
|
+
callback?.OnRequestError(-1, msg);
|
|
626
|
+
});
|
|
627
|
+
}
|
|
628
|
+
});
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
private async Task<bool> CheckInitAndLoginState(string method, string sessionId)
|
|
632
|
+
{
|
|
633
|
+
if (TapCoreStandalone.CheckInitState())
|
|
634
|
+
{
|
|
635
|
+
lock (_lockObj)
|
|
636
|
+
{
|
|
637
|
+
if (!_hasInitNative)
|
|
638
|
+
{
|
|
639
|
+
Log("not init success, so return", true);
|
|
640
|
+
return false;
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
TapCloudSaveTracker.Instance.TrackStart(method, sessionId);
|
|
644
|
+
TapTapAccount tapAccount = await TapTapLogin.Instance.GetCurrentTapAccount();
|
|
645
|
+
if (tapAccount != null && !string.IsNullOrEmpty(tapAccount.openId))
|
|
646
|
+
{
|
|
647
|
+
return true;
|
|
648
|
+
}
|
|
649
|
+
else
|
|
650
|
+
{
|
|
651
|
+
if (currentSaveCallback != null && currentSaveCallback.Count > 0)
|
|
652
|
+
{
|
|
653
|
+
foreach (var callback in currentSaveCallback)
|
|
654
|
+
{
|
|
655
|
+
callback?.OnResult(TapCloudSaveResultCode.NEED_LOGIN);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
TapCloudSaveTracker.Instance.TrackFailure(method, sessionId, -1, "not login");
|
|
659
|
+
return false;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
return false;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/// <summary>
|
|
666
|
+
/// 检查是否通过 PC 启动校验
|
|
667
|
+
/// </summary>
|
|
668
|
+
private void CheckPCLaunchState()
|
|
669
|
+
{
|
|
670
|
+
#if UNITY_STANDALONE_WIN
|
|
671
|
+
if (!TapClientStandalone.isPassedInLaunchedFromTapTapPCCheck())
|
|
672
|
+
{
|
|
673
|
+
throw new Exception("TapCloudSave method must be invoked after isLaunchedFromTapTapPC succeed");
|
|
674
|
+
}
|
|
675
|
+
#endif
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
internal void OnLoginInfoChanged(object data)
|
|
679
|
+
{
|
|
680
|
+
lock (_lockObj)
|
|
681
|
+
{
|
|
682
|
+
if (_hasInitNative)
|
|
683
|
+
{
|
|
684
|
+
Task.Run(async () =>
|
|
685
|
+
{
|
|
686
|
+
TapTapAccount tapAccount =
|
|
687
|
+
await TapTapLogin.Instance.GetCurrentTapAccount();
|
|
688
|
+
string loginKid = "";
|
|
689
|
+
string loginKey = "";
|
|
690
|
+
if (tapAccount != null && !string.IsNullOrEmpty(tapAccount.openId))
|
|
691
|
+
{
|
|
692
|
+
loginKey = tapAccount.accessToken.macKey;
|
|
693
|
+
loginKid = tapAccount.accessToken.kid;
|
|
694
|
+
}
|
|
695
|
+
Dictionary<string, object> loginData = new Dictionary<string, object>
|
|
696
|
+
{
|
|
697
|
+
{ "kid", loginKid },
|
|
698
|
+
{ "key", loginKey },
|
|
699
|
+
};
|
|
700
|
+
int result = TapCloudSaveWrapper.TapSdkCloudSaveUpdateAccessToken(
|
|
701
|
+
JsonConvert.SerializeObject(loginData)
|
|
702
|
+
);
|
|
703
|
+
Log("update login msg result = " + result);
|
|
704
|
+
});
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
private void RunOnMainThread(Action action)
|
|
710
|
+
{
|
|
711
|
+
TapLoom.QueueOnMainThread(action);
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
private void Log(string msg, bool isError = false)
|
|
715
|
+
{
|
|
716
|
+
if (cloudSaveLog == null)
|
|
717
|
+
{
|
|
718
|
+
cloudSaveLog = new TapLog("TapCloudSave");
|
|
719
|
+
}
|
|
720
|
+
if (!string.IsNullOrEmpty(msg))
|
|
721
|
+
{
|
|
722
|
+
if (isError)
|
|
723
|
+
{
|
|
724
|
+
cloudSaveLog.Error(msg);
|
|
725
|
+
}
|
|
726
|
+
else
|
|
727
|
+
{
|
|
728
|
+
cloudSaveLog.Log(msg);
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
}
|