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.
Files changed (34) hide show
  1. package/Mobile/Editor/NativeDependencies.xml +7 -1
  2. package/Mobile/Runtime/TapCloudSaveBridge.cs +117 -16
  3. package/Runtime/Internal/ITapCloudSaveBridge.cs +7 -3
  4. package/Runtime/Internal/TapCloudSaveInitTask.cs +2 -0
  5. package/Runtime/Internal/TapTapCloudSaveInternal.cs +9 -3
  6. package/Runtime/Public/TapTapCloudSave.cs +4 -2
  7. package/Standalone/Editor/TapCloudSaveStandaloneProcessBuild.cs +26 -0
  8. package/Standalone/Editor/TapCloudSaveStandaloneProcessBuild.cs.meta +11 -0
  9. package/Standalone/Editor/TapSDK.CloudSave.Standalone.Editor.asmdef +17 -0
  10. package/Standalone/Editor/TapSDK.CloudSave.Standalone.Editor.asmdef.meta +7 -0
  11. package/Standalone/Editor.meta +8 -0
  12. package/Standalone/Plugins/x86_64/cloudsave_sdk.dll +0 -0
  13. package/Standalone/Plugins/x86_64/cloudsave_sdk.dll.meta +80 -0
  14. package/Standalone/Plugins/x86_64.meta +8 -0
  15. package/Standalone/Plugins.meta +8 -0
  16. package/Standalone/Runtime/Internal/TapCloudSaveArchiveListResponse.cs +11 -0
  17. package/Standalone/Runtime/Internal/TapCloudSaveArchiveListResponse.cs.meta +11 -0
  18. package/Standalone/Runtime/Internal/TapCloudSaveBaseResponse.cs +29 -0
  19. package/Standalone/Runtime/Internal/TapCloudSaveBaseResponse.cs.meta +11 -0
  20. package/Standalone/Runtime/Internal/TapCloudSaveTracker.cs +101 -0
  21. package/Standalone/Runtime/Internal/TapCloudSaveTracker.cs.meta +11 -0
  22. package/Standalone/Runtime/Internal/TapCloudSaveWrapper.cs +518 -0
  23. package/Standalone/Runtime/Internal/TapCloudSaveWrapper.cs.meta +11 -0
  24. package/Standalone/Runtime/Internal.meta +8 -0
  25. package/Standalone/Runtime/TapCloudSaveResultCode.cs +9 -0
  26. package/Standalone/Runtime/TapCloudSaveResultCode.cs.meta +11 -0
  27. package/Standalone/Runtime/TapCloudSaveStandalone.cs +733 -0
  28. package/Standalone/Runtime/TapCloudSaveStandalone.cs.meta +11 -0
  29. package/Standalone/Runtime.meta +8 -0
  30. package/Standalone/TapSDK.CloudSave.Standalone.Runtime.asmdef +22 -0
  31. package/Standalone/TapSDK.CloudSave.Standalone.Runtime.asmdef.meta +7 -0
  32. package/Standalone.meta +8 -0
  33. package/link.xml.meta +1 -1
  34. 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
+ }