IAPUserData.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. //
  2. // IAPUserData.cpp
  3. // TileManor
  4. //
  5. // Created by 徐炼新 on 2024/9/30.
  6. //
  7. #include "IAPUserData.hpp"
  8. #include "IAPConf.hpp"
  9. NS_IAP_BEGIN
  10. IAPUserData* IAPUserData::_instance = nullptr;
  11. IAPUserData* IAPUserData::getInstance(){
  12. if(!_instance){
  13. _instance = new IAPUserData();
  14. }
  15. return _instance;
  16. }
  17. IAPUserData::IAPUserData(){
  18. init();
  19. }
  20. IAPUserData::~IAPUserData() {
  21. saveVectorString(_buyInfos, "buyInfos");
  22. }
  23. void IAPUserData::init(){
  24. // 提取用户本地购买信息
  25. _buyInfos = loadVectorString("buyInfos");
  26. }
  27. void IAPUserData::addBuyInfo(std::string commodityID){
  28. _buyInfos.push_back(commodityID);
  29. }
  30. void IAPUserData::addBuyInfo(std::vector<std::string> commodityIDs){
  31. for(const auto& commodityID : commodityIDs){
  32. addBuyInfo(commodityID);
  33. }
  34. }
  35. std::vector<std::string> IAPUserData::getBuyInfos(){
  36. return _buyInfos;
  37. }
  38. void IAPUserData::clearBuyInfo(){
  39. _buyInfos.clear();
  40. }
  41. // 序列化 vector<string> 为单个字符串
  42. std::string IAPUserData::serialize(const std::vector<std::string>& vec) {
  43. std::ostringstream oss;
  44. for (size_t i = 0; i < vec.size(); ++i) {
  45. if (i != 0) oss << ","; // 使用逗号作为分隔符
  46. oss << vec[i];
  47. }
  48. return oss.str();
  49. }
  50. // 反序列化单个字符串为 vector<string>
  51. std::vector<std::string> IAPUserData::deserialize(const std::string& str) {
  52. std::vector<std::string> vec;
  53. std::istringstream iss(str);
  54. std::string item;
  55. while (std::getline(iss, item, ',')) { // 以逗号为分隔符
  56. vec.push_back(item);
  57. }
  58. return vec;
  59. }
  60. // 保存 vector<string>
  61. void IAPUserData::saveVectorString(const std::vector<std::string>& vec, const std::string& key) {
  62. auto userDefault = cocos2d::UserDefault::getInstance();
  63. std::string serializedData = serialize(vec);
  64. userDefault->setStringForKey(key.c_str(), serializedData);
  65. userDefault->flush();
  66. }
  67. // 读取 vector<string>
  68. std::vector<std::string> IAPUserData::loadVectorString(const std::string& key) {
  69. auto userDefault = cocos2d::UserDefault::getInstance();
  70. std::string serializedData = userDefault->getStringForKey(key.c_str(), "");
  71. return deserialize(serializedData);
  72. }
  73. NS_IAP_END