Browse Source

3.6.24(3)增加会员限制提审
免费用户:视频 1 次,图片 1 次,只能用在开放了试用的模板,出来结果后无法保存和分享,必须付费

付费用户:
- 周费:一周内可随意使用 20 次【视频】功能,【图片】功能无限制,视频的次数用完后下一周续订可恢复
- 年费:一年内可随意使用 200 次【视频】功能,【图片】功能无限制

特殊限制:无论是什么会员,每天都有一个防刷机制:目前【图片和视频】都是 20 次

100Years 2 days ago
parent
commit
f2d3780139
49 changed files with 492 additions and 86 deletions
  1. 30 27
      AIEmoji.xcodeproj/project.pbxproj
  2. 22 0
      AIEmoji/Assets.xcassets/AIList/hint/hint_kiss_goodImage.imageset/Contents.json
  3. BIN
      AIEmoji/Assets.xcassets/AIList/hint/hint_kiss_goodImage.imageset/hint_kiss_goodImage@2x.png
  4. BIN
      AIEmoji/Assets.xcassets/AIList/hint/hint_kiss_goodImage.imageset/hint_kiss_goodImage@3x.png
  5. 21 0
      AIEmoji/Assets.xcassets/Discover/video/video_style_360Microwave.imageset/Contents.json
  6. BIN
      AIEmoji/Assets.xcassets/Discover/video/video_style_360Microwave.imageset/video_style_360Microwave@2x.png
  7. 21 0
      AIEmoji/Assets.xcassets/Discover/video/video_style_BodyShake.imageset/Contents.json
  8. BIN
      AIEmoji/Assets.xcassets/Discover/video/video_style_BodyShake.imageset/video_style_BodyShake@2x.png
  9. 21 0
      AIEmoji/Assets.xcassets/Discover/video/video_style_Kiss.imageset/Contents.json
  10. BIN
      AIEmoji/Assets.xcassets/Discover/video/video_style_Kiss.imageset/video_style_Kiss@2x.png
  11. 21 0
      AIEmoji/Assets.xcassets/Discover/video/video_style_PunchFace.imageset/Contents.json
  12. BIN
      AIEmoji/Assets.xcassets/Discover/video/video_style_PunchFace.imageset/video_style_PunchFace@2x.png
  13. BIN
      AIEmoji/Assets.xcassets/Discover/video/video_style_Robot.imageset/video_style_Robot@2x.png
  14. 21 0
      AIEmoji/Assets.xcassets/Discover/video/video_style_Sexyme.imageset/Contents.json
  15. BIN
      AIEmoji/Assets.xcassets/Discover/video/video_style_Sexyme.imageset/video_style_Sexyme@2x.png
  16. 21 0
      AIEmoji/Assets.xcassets/Discover/video/video_style_ShakeitDown.imageset/Contents.json
  17. BIN
      AIEmoji/Assets.xcassets/Discover/video/video_style_ShakeitDown.imageset/video_style_ShakeitDown@2x.png
  18. 1 1
      AIEmoji/Business/TSAILIstVC/TSAIAgeImageHintVC/TSAIListHintBaseVC.swift
  19. 1 1
      AIEmoji/Business/TSPTPGeneratorVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoBrowseVC.swift
  20. 1 1
      AIEmoji/Business/TSPurchaseMembershipVC/View/PurchaseView.swift
  21. 22 3
      AIEmoji/Business/TSSetingVC/SetingVC/TSSetingViewModel.swift
  22. 1 1
      AIEmoji/Business2/CommonVC/TSAppUpdateAlertVC/TSAppOtherAlertVC.swift
  23. 21 9
      AIEmoji/Business2/DisCover/Data/TSDiscoverViewModel+Data.swift
  24. 96 7
      AIEmoji/Business2/DisCover/Data/TSDiscoverViewModel+Dic.swift
  25. 0 1
      AIEmoji/Business2/DisCover/TSDiscoverVC/Cell/TSDiscoverBannerCell.swift
  26. 0 1
      AIEmoji/Business2/DisCover/TSDiscoverVC/Cell/TSDiscoverStyleMoreCell.swift
  27. 1 0
      AIEmoji/Business2/DisCover/TSPTPUploadImageVC/TSPTPUploadImageVC+View.swift
  28. 2 2
      AIEmoji/Common/NetworkManager/TSNetWork/TSNetWork+Business.swift
  29. 31 12
      AIEmoji/Common/Purchase/TSPurchaseManager.swift
  30. 1 19
      AIEmoji/Common/Tool/OperationQueue/V2/TSGenerateBasePhotoOperation.swift
  31. 1 1
      AIEmoji/Common/View/TSTextToastView.swift
  32. BIN
      AIEmoji/Res/Video/360° Microwave.mp4
  33. BIN
      AIEmoji/Res/Video/Body Shake.mp4
  34. BIN
      AIEmoji/Res/Video/Kiss.mp4
  35. BIN
      AIEmoji/Res/Video/PUBG Winner Hit.mp4
  36. BIN
      AIEmoji/Res/Video/Punch Face.mp4
  37. BIN
      AIEmoji/Res/Video/Rebot.MP4
  38. BIN
      AIEmoji/Res/Video/Robot.mp4
  39. BIN
      AIEmoji/Res/Video/Sexy me.mp4
  40. BIN
      AIEmoji/Res/Video/Shake it Down.mp4
  41. 15 0
      AIEmoji/de.lproj/Localizable.strings
  42. 15 0
      AIEmoji/en.lproj/Localizable.strings
  43. 15 0
      AIEmoji/es.lproj/Localizable.strings
  44. 15 0
      AIEmoji/ja.lproj/Localizable.strings
  45. 15 0
      AIEmoji/ko.lproj/Localizable.strings
  46. 15 0
      AIEmoji/pt-BR.lproj/Localizable.strings
  47. 15 0
      AIEmoji/pt-PT.lproj/Localizable.strings
  48. 15 0
      AIEmoji/zh-Hans.lproj/Localizable.strings
  49. 15 0
      AIEmoji/zh-Hant.lproj/Localizable.strings

+ 30 - 27
AIEmoji.xcodeproj/project.pbxproj

@@ -251,7 +251,6 @@
 		A8EB1AA52E320438001F58D7 /* Anime Me.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A862E320438001F58D7 /* Anime Me.mp4 */; };
 		A8EB1AA62E320438001F58D7 /* Photo Animater.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A962E320438001F58D7 /* Photo Animater.mp4 */; };
 		A8EB1AA72E320438001F58D7 /* Lafufu.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A8F2E320438001F58D7 /* Lafufu.mp4 */; };
-		A8EB1AA82E320438001F58D7 /* Rebot.MP4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A9A2E320438001F58D7 /* Rebot.MP4 */; };
 		A8EB1AA92E320438001F58D7 /* Fly.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A882E320438001F58D7 /* Fly.mp4 */; };
 		A8EB1AAA2E320438001F58D7 /* Funny Pet.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A8A2E320438001F58D7 /* Funny Pet.mp4 */; };
 		A8EB1AAB2E320438001F58D7 /* Hulk.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A8E2E320438001F58D7 /* Hulk.mp4 */; };
@@ -259,7 +258,6 @@
 		A8EB1AAD2E320438001F58D7 /* Subject 3.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A9C2E320438001F58D7 /* Subject 3.mp4 */; };
 		A8EB1AAE2E320438001F58D7 /* Pet to Human.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A952E320438001F58D7 /* Pet to Human.mp4 */; };
 		A8EB1AAF2E320438001F58D7 /* Hip Twist.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A8D2E320438001F58D7 /* Hip Twist.mp4 */; };
-		A8EB1AB02E320438001F58D7 /* Robot.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A9B2E320438001F58D7 /* Robot.mp4 */; };
 		A8EB1AB12E320438001F58D7 /* Mermaid.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A912E320438001F58D7 /* Mermaid.mp4 */; };
 		A8EB1AB22E320438001F58D7 /* Pinch.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A972E320438001F58D7 /* Pinch.mp4 */; };
 		A8EB1AB32E320438001F58D7 /* Motor Dance.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A922E320438001F58D7 /* Motor Dance.mp4 */; };
@@ -270,6 +268,13 @@
 		A8EB1AB82E320438001F58D7 /* Oscar Gala.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A942E320438001F58D7 /* Oscar Gala.mp4 */; };
 		A8EB1AB92E320438001F58D7 /* Walking with Beasts.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A9F2E320438001F58D7 /* Walking with Beasts.mp4 */; };
 		A8EB1ABA2E320438001F58D7 /* MuscleUp.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1A932E320438001F58D7 /* MuscleUp.mp4 */; };
+		A8EB1AC12E321E9B001F58D7 /* Body Shake.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1ABC2E321E9B001F58D7 /* Body Shake.mp4 */; };
+		A8EB1AC22E321E9B001F58D7 /* Punch Face.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1ABE2E321E9B001F58D7 /* Punch Face.mp4 */; };
+		A8EB1AC32E321E9B001F58D7 /* Sexy me.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1ABF2E321E9B001F58D7 /* Sexy me.mp4 */; };
+		A8EB1AC42E321E9B001F58D7 /* Kiss.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1ABD2E321E9B001F58D7 /* Kiss.mp4 */; };
+		A8EB1AC52E321E9B001F58D7 /* 360° Microwave.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1ABB2E321E9B001F58D7 /* 360° Microwave.mp4 */; };
+		A8EB1AC62E321E9B001F58D7 /* Shake it Down.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1AC02E321E9B001F58D7 /* Shake it Down.mp4 */; };
+		A8EB1AC82E3234F6001F58D7 /* Robot.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = A8EB1AC72E3234F6001F58D7 /* Robot.mp4 */; };
 		A8EB38382E137F48002F90E9 /* TSPurchasePromotionalVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EB38372E137F47002F90E9 /* TSPurchasePromotionalVC.swift */; };
 		A8EB383C2E13AE6F002F90E9 /* TSPurchasePromotionalVC+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EB383B2E13AE67002F90E9 /* TSPurchasePromotionalVC+View.swift */; };
 		A8EB38412E13BB0E002F90E9 /* PurchaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EB38402E13BB0D002F90E9 /* PurchaseView.swift */; };
@@ -635,12 +640,17 @@
 		A8EB1A972E320438001F58D7 /* Pinch.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = Pinch.mp4; sourceTree = "<group>"; };
 		A8EB1A982E320438001F58D7 /* Pixel World.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pixel World.mp4"; sourceTree = "<group>"; };
 		A8EB1A992E320438001F58D7 /* PUBG Winner Hit.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "PUBG Winner Hit.mp4"; sourceTree = "<group>"; };
-		A8EB1A9A2E320438001F58D7 /* Rebot.MP4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = Rebot.MP4; sourceTree = "<group>"; };
-		A8EB1A9B2E320438001F58D7 /* Robot.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = Robot.mp4; sourceTree = "<group>"; };
 		A8EB1A9C2E320438001F58D7 /* Subject 3.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Subject 3.mp4"; sourceTree = "<group>"; };
 		A8EB1A9D2E320438001F58D7 /* Surprise Flower.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Surprise Flower.mp4"; sourceTree = "<group>"; };
 		A8EB1A9E2E320438001F58D7 /* Toy Me.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Toy Me.mp4"; sourceTree = "<group>"; };
 		A8EB1A9F2E320438001F58D7 /* Walking with Beasts.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Walking with Beasts.mp4"; sourceTree = "<group>"; };
+		A8EB1ABB2E321E9B001F58D7 /* 360° Microwave.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "360° Microwave.mp4"; sourceTree = "<group>"; };
+		A8EB1ABC2E321E9B001F58D7 /* Body Shake.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Body Shake.mp4"; sourceTree = "<group>"; };
+		A8EB1ABD2E321E9B001F58D7 /* Kiss.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = Kiss.mp4; sourceTree = "<group>"; };
+		A8EB1ABE2E321E9B001F58D7 /* Punch Face.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Punch Face.mp4"; sourceTree = "<group>"; };
+		A8EB1ABF2E321E9B001F58D7 /* Sexy me.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Sexy me.mp4"; sourceTree = "<group>"; };
+		A8EB1AC02E321E9B001F58D7 /* Shake it Down.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Shake it Down.mp4"; sourceTree = "<group>"; };
+		A8EB1AC72E3234F6001F58D7 /* Robot.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = Robot.mp4; sourceTree = "<group>"; };
 		A8EB38372E137F47002F90E9 /* TSPurchasePromotionalVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPurchasePromotionalVC.swift; sourceTree = "<group>"; };
 		A8EB383B2E13AE67002F90E9 /* TSPurchasePromotionalVC+View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSPurchasePromotionalVC+View.swift"; sourceTree = "<group>"; };
 		A8EB38402E13BB0D002F90E9 /* PurchaseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurchaseView.swift; sourceTree = "<group>"; };
@@ -1362,9 +1372,16 @@
 		A82542D52E279C4700F54FE5 /* Video */ = {
 			isa = PBXGroup;
 			children = (
+				A8EB1ABB2E321E9B001F58D7 /* 360° Microwave.mp4 */,
+				A8EB1ABC2E321E9B001F58D7 /* Body Shake.mp4 */,
+				A8EB1ABD2E321E9B001F58D7 /* Kiss.mp4 */,
+				A8EB1ABE2E321E9B001F58D7 /* Punch Face.mp4 */,
+				A8EB1ABF2E321E9B001F58D7 /* Sexy me.mp4 */,
+				A8EB1AC02E321E9B001F58D7 /* Shake it Down.mp4 */,
 				A8EB1A852E320438001F58D7 /* Animal Diving Show.mp4 */,
 				A8EB1A862E320438001F58D7 /* Anime Me.mp4 */,
 				A8EB1A872E320438001F58D7 /* Fairy.mp4 */,
+				A8EB1AC72E3234F6001F58D7 /* Robot.mp4 */,
 				A8EB1A882E320438001F58D7 /* Fly.mp4 */,
 				A8EB1A892E320438001F58D7 /* French Kiss.mp4 */,
 				A8EB1A8A2E320438001F58D7 /* Funny Pet.mp4 */,
@@ -1383,8 +1400,6 @@
 				A8EB1A972E320438001F58D7 /* Pinch.mp4 */,
 				A8EB1A982E320438001F58D7 /* Pixel World.mp4 */,
 				A8EB1A992E320438001F58D7 /* PUBG Winner Hit.mp4 */,
-				A8EB1A9A2E320438001F58D7 /* Rebot.MP4 */,
-				A8EB1A9B2E320438001F58D7 /* Robot.mp4 */,
 				A8EB1A9C2E320438001F58D7 /* Subject 3.mp4 */,
 				A8EB1A9D2E320438001F58D7 /* Surprise Flower.mp4 */,
 				A8EB1A9E2E320438001F58D7 /* Toy Me.mp4 */,
@@ -2564,26 +2579,10 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				A8EB1AC82E3234F6001F58D7 /* Robot.mp4 in Resources */,
 				A83404D82D9D34ED00C140E4 /* Kelsi-fill.otf in Resources */,
 				A83404D92D9D34ED00C140E4 /* Kelsi-Regular.otf in Resources */,
-				A82542EA2E279C5A00F54FE5 /* Funny Pet.mp4 in Resources */,
-				A82542EB2E279C5A00F54FE5 /* Toy Me.mp4 in Resources */,
-				A82542EC2E279C5A00F54FE5 /* Mermaid.mp4 in Resources */,
-				A82542ED2E279C5A00F54FE5 /* Fly.mp4 in Resources */,
-				A82542EE2E279C5A00F54FE5 /* Happy Birthday.mp4 in Resources */,
-				A82542EF2E279C5A00F54FE5 /* Fairy.mp4 in Resources */,
-				A82542F02E279C5A00F54FE5 /* MuscleUp.mp4 in Resources */,
-				A82542F12E279C5A00F54FE5 /* Grab doll.mp4 in Resources */,
-				A82542F22E279C5A00F54FE5 /* Surprise Flower.mp4 in Resources */,
-				A82542F32E279C5A00F54FE5 /* Pinch.mp4 in Resources */,
-				A82542F42E279C5A00F54FE5 /* Hulk.mp4 in Resources */,
-				A82542F52E279C5A00F54FE5 /* Lafufu.mp4 in Resources */,
-				A82542F62E279C5A00F54FE5 /* Making Face.mp4 in Resources */,
-				A82542F72E279C5A00F54FE5 /* Robot.mp4 in Resources */,
-				A82542F82E279C5A00F54FE5 /* Pet to Human.mp4 in Resources */,
 				60AE42912E31E046009FBB77 /* GoogleService-Info.plist in Resources */,
-				A82542FA2E279C5A00F54FE5 /* Walking with Beasts.mp4 in Resources */,
-				A82542FB2E279C5A00F54FE5 /* French Kiss.mp4 in Resources */,
 				A80E72482D3F4F0A00C64288 /* templates.json in Resources */,
 				A83404CC2D9BEED800C140E4 /* Poppins-BlackItalic.ttf in Resources */,
 				A87587162D81734300286A66 /* text_to_photo_style.json in Resources */,
@@ -2596,7 +2595,6 @@
 				A8EB1AA52E320438001F58D7 /* Anime Me.mp4 in Resources */,
 				A8EB1AA62E320438001F58D7 /* Photo Animater.mp4 in Resources */,
 				A8EB1AA72E320438001F58D7 /* Lafufu.mp4 in Resources */,
-				A8EB1AA82E320438001F58D7 /* Rebot.MP4 in Resources */,
 				A8EB1AA92E320438001F58D7 /* Fly.mp4 in Resources */,
 				A8EB1AAA2E320438001F58D7 /* Funny Pet.mp4 in Resources */,
 				A8EB1AAB2E320438001F58D7 /* Hulk.mp4 in Resources */,
@@ -2604,7 +2602,6 @@
 				A8EB1AAD2E320438001F58D7 /* Subject 3.mp4 in Resources */,
 				A8EB1AAE2E320438001F58D7 /* Pet to Human.mp4 in Resources */,
 				A8EB1AAF2E320438001F58D7 /* Hip Twist.mp4 in Resources */,
-				A8EB1AB02E320438001F58D7 /* Robot.mp4 in Resources */,
 				A8EB1AB12E320438001F58D7 /* Mermaid.mp4 in Resources */,
 				A8EB1AB22E320438001F58D7 /* Pinch.mp4 in Resources */,
 				A8EB1AB32E320438001F58D7 /* Motor Dance.mp4 in Resources */,
@@ -2636,6 +2633,12 @@
 				A80E72462D3F4EED00C64288 /* sticker.json in Resources */,
 				A80EDDFD2D6EF34F003CD332 /* photo_to_photo_style.json in Resources */,
 				A8708A532E0D4FA000601686 /* discover_0_AnimatePhoto1.gif in Resources */,
+				A8EB1AC12E321E9B001F58D7 /* Body Shake.mp4 in Resources */,
+				A8EB1AC22E321E9B001F58D7 /* Punch Face.mp4 in Resources */,
+				A8EB1AC32E321E9B001F58D7 /* Sexy me.mp4 in Resources */,
+				A8EB1AC42E321E9B001F58D7 /* Kiss.mp4 in Resources */,
+				A8EB1AC52E321E9B001F58D7 /* 360° Microwave.mp4 in Resources */,
+				A8EB1AC62E321E9B001F58D7 /* Shake it Down.mp4 in Resources */,
 				A8EEADD62D3E6CD80032C5A0 /* Fish🐠.json in Resources */,
 				A8EEADE22D3E76110032C5A0 /* Dog🐕.json in Resources */,
 				A83405032DA35CB700C140E4 /* InfoPlist.strings in Resources */,
@@ -3033,7 +3036,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 3;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -3072,7 +3075,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 3;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;

+ 22 - 0
AIEmoji/Assets.xcassets/AIList/hint/hint_kiss_goodImage.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "hint_kiss_goodImage@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "hint_kiss_goodImage@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIEmoji/Assets.xcassets/AIList/hint/hint_kiss_goodImage.imageset/hint_kiss_goodImage@2x.png


BIN
AIEmoji/Assets.xcassets/AIList/hint/hint_kiss_goodImage.imageset/hint_kiss_goodImage@3x.png


+ 21 - 0
AIEmoji/Assets.xcassets/Discover/video/video_style_360Microwave.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "video_style_360Microwave@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIEmoji/Assets.xcassets/Discover/video/video_style_360Microwave.imageset/video_style_360Microwave@2x.png


+ 21 - 0
AIEmoji/Assets.xcassets/Discover/video/video_style_BodyShake.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "video_style_BodyShake@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIEmoji/Assets.xcassets/Discover/video/video_style_BodyShake.imageset/video_style_BodyShake@2x.png


+ 21 - 0
AIEmoji/Assets.xcassets/Discover/video/video_style_Kiss.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "video_style_Kiss@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIEmoji/Assets.xcassets/Discover/video/video_style_Kiss.imageset/video_style_Kiss@2x.png


+ 21 - 0
AIEmoji/Assets.xcassets/Discover/video/video_style_PunchFace.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "video_style_PunchFace@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIEmoji/Assets.xcassets/Discover/video/video_style_PunchFace.imageset/video_style_PunchFace@2x.png


BIN
AIEmoji/Assets.xcassets/Discover/video/video_style_Robot.imageset/video_style_Robot@2x.png


+ 21 - 0
AIEmoji/Assets.xcassets/Discover/video/video_style_Sexyme.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "video_style_Sexyme@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIEmoji/Assets.xcassets/Discover/video/video_style_Sexyme.imageset/video_style_Sexyme@2x.png


+ 21 - 0
AIEmoji/Assets.xcassets/Discover/video/video_style_ShakeitDown.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "video_style_ShakeitDown@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIEmoji/Assets.xcassets/Discover/video/video_style_ShakeitDown.imageset/video_style_ShakeitDown@2x.png


+ 1 - 1
AIEmoji/Business/TSAILIstVC/TSAIAgeImageHintVC/TSAIListHintBaseVC.swift

@@ -136,7 +136,7 @@ class TSAIListHintBaseVC: TSBaseVC {
         //亲吻
         static var kissConfig:Config {
             return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
-                          goodImageNamed: "hint_singleMmultiple_goodImage",
+                          goodImageNamed: "hint_kiss_goodImage",
                           badImageNamed: "hint_kiss_badImage",
                           titleText: "Upload your photos".localized,
                           titleSubText: "",

+ 1 - 1
AIEmoji/Business/TSPTPGeneratorVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoBrowseVC.swift

@@ -449,7 +449,7 @@ class TSAIVideoBrowseCell : TSBaseCollectionCell{
                 make.width.equalTo(k_ScreenWidth)
                 make.height.equalTo(k_ScreenHeight)
             }
-            self.videoPlayerVC?.runloppPlay()
+//            self.videoPlayerVC?.runloppPlay()
         }
     }
     

+ 1 - 1
AIEmoji/Business/TSPurchaseMembershipVC/View/PurchaseView.swift

@@ -22,7 +22,7 @@ struct PurchaseView :View {
             VStack(alignment: .leading, spacing: 12, content: {
                 TSFeatureItemView(image: .purchaseIconPhoto, text: "Unlimited Photo Filters & Styles".localized)
                 TSFeatureItemView(image: .purchaseIconUnlimited, text: "Unlimited AI Image Generation".localized)
-                TSFeatureItemView(image: .purchaseIconVideo, text: String(format: "%d Video Effects Generation".localized,viewModel.selectedType.creatVideoMaxNum))
+                TSFeatureItemView(image: .purchaseIconVideo, text: String(format: "%d Video Effect Generations".localized,viewModel.selectedType.creatVideoMaxNum))
                 TSFeatureItemView(image: .purchaseIconAd, text: "No Ads or Watermarks".localized)
             }).multilineTextAlignment(.center).font(.font(size: 16,weight:.regular)).foregroundColor(.white)
             

+ 22 - 3
AIEmoji/Business/TSSetingVC/SetingVC/TSSetingViewModel.swift

@@ -15,6 +15,26 @@ class TSSetingViewModel: ObservableObject {
 
     // todo.kailen-privacy
     func showPrivacy(parent: UIViewController) {
+        
+//#if DEBUG
+//        var string = ""
+//        if var saveDict = UserDefaults.standard.dictionary(forKey: kFreeNumKey) as? [String: Int]{
+//            string = string + "新用户免费次数" + (saveDict.toJSONString() ?? "")
+//        }
+//        string = string + "\n"
+//        
+//        if var saveDict = UserDefaults.standard.dictionary(forKey: kDayGeneratedNumKey) as? [String: [String: Any]]{
+//            string = string + "每日的次数" + (saveDict.toJSONString() ?? "")
+//        }
+//        string = string + "\n"
+//        if var saveDict = UserDefaults.standard.dictionary(forKey: kVipGeneratedNumKey) as? [String: [String: Any]]{
+//            string = string + "会员的总次"  + (saveDict.toJSONString() ?? "")
+//        }
+//        string = string + "\n当前会员过期时间戳:\(kPurchaseDefault.expireTime)"
+//        UIAlertView(title: "", message: string, delegate: nil, cancelButtonTitle: "OK").show()
+//        dePrint("所有的会员次数=\(string)")
+//        return
+//#endif
         let vc = TSBusinessWebVC(urlType: .privacy)
         vc.hidesBottomBarWhenPushed = true
         parent.navigationController?.pushViewController(vc, animated: true)
@@ -80,9 +100,8 @@ class TSSetingViewModel: ObservableObject {
         }
     
 #if DEBUG
-        
-        KeychainManager.clearAll()
-        
+//        KeychainManager.clearAll()
+//        UIAlertView(title: "", message: "清除了钥匙串", delegate: nil, cancelButtonTitle: "OK").show()
 //        kSaveSuccesswShared.show(atView: parent.view)
 //        TSAbnormalPopUpAlertVC.showRobotWarning()
 //        guard let window = WindowHelper.getKeyWindow() else {

+ 1 - 1
AIEmoji/Business2/CommonVC/TSAppUpdateAlertVC/TSAppOtherAlertVC.swift

@@ -53,7 +53,7 @@ extension TSAppOtherAlertVC {
     func setUpAlertContent(){
         let leading = 16.0
         
-        let titleLab = UILabel.createLabel(text: "You have used all your video effect generations.".localized,font: .font(size: 16,weight: .regular),textColor: .white)
+        let titleLab = UILabel.createLabel(text: "You have used all your video effect generations".localized,font: .font(size: 16,weight: .regular),textColor: .white)
         alertContent.addSubview(titleLab)
         titleLab.snp.makeConstraints { make in
             make.leading.equalTo(16)

+ 21 - 9
AIEmoji/Business2/DisCover/Data/TSDiscoverViewModel+Data.swift

@@ -36,12 +36,18 @@ class TSDiscoverViewModel {
         section.style = .styleMore
         section.setTitle(title:"Video Effect".localized,imageNamed: "🎞️",colors: ["#E7D1AB","#FFFFFF"])
         section.items = [[
+            TSDiscoverItemModel(style: .videoV2,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["360° Microwave.mp4"]),
+                                generateModel: TSGenerateModel(json: video_360Microwave)),
             TSDiscoverItemModel(style: .videoV2,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Subject 3.mp4"]),
                                 generateModel: TSGenerateModel(json: video_Subject3)),
             TSDiscoverItemModel(style: .videoV2,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["PUBG Winner Hit.mp4"]),
                                 generateModel: TSGenerateModel(json: video_PUBGWinnerHit)),
+            TSDiscoverItemModel(style: .videoV2,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Body Shake.mp4"]),
+                                generateModel: TSGenerateModel(json: video_BodyShake)),
             TSDiscoverItemModel(style: .videoV2,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Mermaid.mp4"]),
                                 generateModel: TSGenerateModel(json: video_Mermaid)),
@@ -72,21 +78,21 @@ class TSDiscoverViewModel {
             TSDiscoverItemModel(style: .videoV2,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Making Face.mp4"]),
                                 generateModel: TSGenerateModel(json: video_MakingFace)),
+            TSDiscoverItemModel(style: .videoV2,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Pixel World.mp4"]),
+                                generateModel: TSGenerateModel(json: video_PixelWorld)),
             TSDiscoverItemModel(style: .videoV2,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Robot.mp4"]),
                                 generateModel: TSGenerateModel(json: video_Robot)),
-            TSDiscoverItemModel(style: .videoV2,
-                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Walking with Beasts.mp4"]),
-                                generateModel: TSGenerateModel(json: video_WalkingwithBeasts)),
-            TSDiscoverItemModel(style: .videoV2,
-                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Funny Pet.mp4"]),
-                                generateModel: TSGenerateModel(json: video_FunnyPet)),
             TSDiscoverItemModel(style: .videoV2,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Fly.mp4"]),
                                 generateModel: TSGenerateModel(json: video_Fly)),
             TSDiscoverItemModel(style: .videoV2,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Pinch.mp4"]),
                                 generateModel: TSGenerateModel(json: video_Pinch)),
+            TSDiscoverItemModel(style: .videoV2,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Punch Face.mp4"]),
+                                generateModel: TSGenerateModel(json: video_PunchFace)),
             TSDiscoverItemModel(style: .videoV2,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Grab doll.mp4"]),
                                 generateModel: TSGenerateModel(json: video_Grabdoll)),
@@ -96,15 +102,21 @@ class TSDiscoverViewModel {
             TSDiscoverItemModel(style: .videoV2,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Hulk.mp4"]),
                                 generateModel: TSGenerateModel(json: video_Hulk)),
+            TSDiscoverItemModel(style: .videoV2,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Shake it Down.mp4"]),
+                                generateModel: TSGenerateModel(json: video_ShakeitDown)),
+            TSDiscoverItemModel(style: .videoV2,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Walking with Beasts.mp4"]),
+                                generateModel: TSGenerateModel(json: video_WalkingwithBeasts)),
+            TSDiscoverItemModel(style: .videoV2,
+                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Funny Pet.mp4"]),
+                                generateModel: TSGenerateModel(json: video_FunnyPet)),
             TSDiscoverItemModel(style: .videoV2,
                                 viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["MuscleUp.mp4"]),
                                 generateModel: TSGenerateModel(json: video_MuscleUp)),
 //            TSDiscoverItemModel(style: .videoV2,
 //                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["French Kiss.mp4"]),
 //                                generateModel: TSGenerateModel(json: video_FrenchKiss))
-            TSDiscoverItemModel(style: .videoV2,
-                                viewModel: TSDiscoverAnimationItemVM(title: "",style: .video, imageNameds: ["Pixel World.mp4"]),
-                                generateModel: TSGenerateModel(json: video_PixelWorld))
         ]]
         
         return section

+ 96 - 7
AIEmoji/Business2/DisCover/Data/TSDiscoverViewModel+Dic.swift

@@ -163,29 +163,35 @@ extension TSDiscoverViewModel {
             TSGenerateModel(json: ageOld),
             
             //video
+//            TSGenerateModel(json: video_Kiss),
+            TSGenerateModel(json: video_360Microwave),
             TSGenerateModel(json: video_Subject3),
             TSGenerateModel(json: video_PUBGWinnerHit),
+            TSGenerateModel(json: video_BodyShake),
             TSGenerateModel(json: video_Mermaid),
             TSGenerateModel(json: video_Fairy),
             TSGenerateModel(json: video_MotorDance),
             TSGenerateModel(json: video_HipTwist),
+//            TSGenerateModel(json: video_Sexyme),
             TSGenerateModel(json: video_Lafufu),
             TSGenerateModel(json: video_AnimeMe),
             TSGenerateModel(json: video_HappyBirthday),
             TSGenerateModel(json: video_SurpriseFlower),
             TSGenerateModel(json: video_PettoHuman),
             TSGenerateModel(json: video_MakingFace),
+            TSGenerateModel(json: video_PixelWorld),
             TSGenerateModel(json: video_Robot),
-            TSGenerateModel(json: video_WalkingwithBeasts),
-            TSGenerateModel(json: video_FunnyPet),
             TSGenerateModel(json: video_Fly),
             TSGenerateModel(json: video_Pinch),
+            TSGenerateModel(json: video_PunchFace),
             TSGenerateModel(json: video_Grabdoll),
             TSGenerateModel(json: video_ToyMe),
             TSGenerateModel(json: video_Hulk),
+            TSGenerateModel(json: video_ShakeitDown),
+            TSGenerateModel(json: video_WalkingwithBeasts),
+            TSGenerateModel(json: video_FunnyPet),
             TSGenerateModel(json: video_MuscleUp),
 //            TSGenerateModel(json: video_FrenchKiss),
-            TSGenerateModel(json: video_PixelWorld),
             TSGenerateModel(json: video_PhotoAnimater),
             TSGenerateModel(json: video_AnimalDivingShow),
             TSGenerateModel(json: video_OscarGala)
@@ -223,6 +229,89 @@ let videoUnionType = 2
 //MARK: video
 extension TSDiscoverViewModel {
     
+    var video_Kiss:[String:Any]{
+        [
+            imageName: "video_style_Kiss",
+            imageText: "Kiss",
+            prompt:"The two figures in the painting move closer and then passionately kiss, alternating with deep and firm intensity.",
+            template:"french_kiss",
+            specialStyle:0,
+            isVip: false,
+            unionType: videoUnionType,
+            hintType:4,
+            model:kie
+        ]
+    }
+    
+    var video_ShakeitDown:[String:Any]{
+        [
+            imageName: "video_style_ShakeitDown",
+            imageText: "Shake it Down",
+            prompt:"In the [scene/background], the frame shows [number and type of subjects] — [subject 1 description], [subject 2 description] (if applicable)… They are [current pose — e.g., standing, sitting, gazing upward, etc.].Next, the character casually lowers into a half-squat position, keeping the upper body steady. Then he (or she) performs a rhythmic up-and-down hip movement. The motion is smooth, powerful, and full of dynamic energy.\\nRequirements\n1. Replace every bracketed placeholder above with the actual content derived from the image.\n2. If the picture contains two or more subjects, all subjects must perform the twerking dance, following the same key hip-movement points described above.\n3. Motion Level:Large\n4. Camera Movement:Follow",
+            template:"shake_it_down",
+            specialStyle:0,
+            isVip: true,
+            unionType: videoUnionType,
+            hintType:2,
+            model:kie
+        ]
+    }
+    
+    var video_PunchFace:[String:Any]{
+        [
+            imageName: "video_style_PunchFace",
+            imageText: "Punch Face",
+            prompt:"A clenched fist suddenly swings in from off-screen on the left and slams into [person/pet]’s face, distorting their features — lips pushed aside and skin visibly rippling from the impact.\\nRequirements: \\n1. Replace [person/pet] with the actual subject shown in the image. \\n2. If there are two or more people or pets in the image, all of them must be struck by the fist, and the reaction of each one must be described individually.",
+            template:"punch_hit",
+            specialStyle:0,
+            isVip: true,
+            unionType: videoUnionType,
+            hintType:2,
+            model:kie
+        ]
+    }
+    
+    var video_Sexyme:[String:Any]{
+        [
+            imageName: "video_style_Sexyme",
+            imageText: "Sexy me",
+            prompt:"Video content\\n Subjects of different genders underwent different transformations.\\nIf the image depicts a woman: 'The woman's outfit undergoes a seamless transformation, as her original clothing smoothly shifts into a sleek bikini. In the final moment, she confidently places her hands on her waist, exuding elegance and poise.'\\nIf the image depicts a man: 'The man swiftly takes off his shirt, revealing his well-built muscles, which are the same color as his skin. Then, he steps forward.'\\nRequirements:\\n1. If the image is a close-up or medium shot, set Camera Movement to: 'Zoom out'\\n2. Motion Level: Large",
+            template:"sexy_me",
+            specialStyle:0,
+            isVip: true,
+            unionType: videoUnionType,
+            hintType:2,
+            model:kie
+        ]
+    }
+    
+    var video_360Microwave:[String:Any]{
+        [
+            imageName: "video_style_360Microwave",
+            imageText: "360° Microwave",
+            prompt:"Video content\\nThe subject in the image smoothly rotates 360° in place.\\n Requirements:\\n1.Accurately identify the number of subjects.\\n Camera Movement:Static shot",
+            template:"spin360",
+            specialStyle:0,
+            isVip: false,
+            unionType: videoUnionType,
+            hintType:2,
+            model:kie
+        ]
+    }
+    
+    var video_BodyShake:[String:Any]{
+        [
+            imageName: "video_style_BodyShake",
+            imageText: "Body Shake",
+            prompt:"Video content\\nThe character performs a rhythmic dance sequence in an indoor environment. She starts by twisting her hips, then turns to one side, briefly shaking her hips in a playful manner. Her movements are smooth and confident, consistently emphasizing body rhythm and expressiveness.\\n Requirement:\\n Motion_level:Large",
+            template:"bodyshake",
+            specialStyle:0,
+            isVip: false,
+            unionType: videoUnionType,
+            hintType:2,
+            model:kie
+        ]
+    }
     
     var video_Subject3:[String:Any]{
         [
@@ -231,7 +320,7 @@ extension TSDiscoverViewModel {
             prompt:"",
             template:"subject_3",
             specialStyle:0,
-            isVip: false,
+            isVip: true,
             unionType: videoUnionType,
             hintType:6,
             model:kie
@@ -245,7 +334,7 @@ extension TSDiscoverViewModel {
             prompt:"",
             template:"pubg_winner_hit",
             specialStyle:0,
-            isVip: false,
+            isVip: true,
             unionType: videoUnionType,
             hintType:6,
             model:kie
@@ -259,7 +348,7 @@ extension TSDiscoverViewModel {
             prompt:"",
             template:"motor_dance",
             specialStyle:0,
-            isVip: false,
+            isVip: true,
             unionType: videoUnionType,
             hintType:6,
             model:kie
@@ -275,7 +364,7 @@ extension TSDiscoverViewModel {
             specialStyle:0,
             isVip: false,
             unionType: videoUnionType,
-            hintType:6,
+            hintType:2,
             model:kie
         ]
     }

+ 0 - 1
AIEmoji/Business2/DisCover/TSDiscoverVC/Cell/TSDiscoverBannerCell.swift

@@ -194,7 +194,6 @@ class TSDiscoverBannerViewCell: TSBaseCollectionCell {
                 if let videoURL = Bundle.main.url(forResource: imageNamed, withExtension: nil) {
                     self.videoURL = videoURL
                     imageView.image = TSVideoPlayer.getFirstFrameOnly(url: videoURL)
-                    dePrint("UICollectionViewCell model set")
                 }
             }
         }

+ 0 - 1
AIEmoji/Business2/DisCover/TSDiscoverVC/Cell/TSDiscoverStyleMoreCell.swift

@@ -296,7 +296,6 @@ class TSDiscoverStyleMoreAnimationVideoCell: TSDiscoverStyleMoreBaseCell {
                 if let videoURL = Bundle.main.url(forResource: imageNamed, withExtension: nil) {
                     self.videoURL = videoURL
                     imageView.image = TSVideoPlayer.getFirstFrameOnly(url: videoURL)
-                    dePrint("UICollectionViewCell model set")
                 }
             }
         }

+ 1 - 0
AIEmoji/Business2/DisCover/TSPTPUploadImageVC/TSPTPUploadImageVC+View.swift

@@ -50,6 +50,7 @@ extension TSPTPUploadImageVC {
                     
                     if viewModel.upLoadImage == nil {
                         self.uploadView.uploadVideoView.play()
+                        self.uploadView.uploadVideoView.touchButton.isSelected = true
                     }
                     
                 }

+ 2 - 2
AIEmoji/Common/NetworkManager/TSNetWork/TSNetWork+Business.swift

@@ -108,7 +108,7 @@ enum TSNetWorkCode : Int {
         case .generateTooMuch:
             return "We've detected unusually high generation activity. You may be a bot. Please try again tomorrow.".localized
         case .generateToMax:
-            return "You have used all your video effect generations.".localized
+            return "You have used all your video effect generations".localized
         default:
             return "Sorry there was a slight problem with the image processing, please try again later.".localized
         }
@@ -269,7 +269,7 @@ extension TSNetworkManager {
         responseType: T.Type? = nil,
         completion: @escaping (Result<Any, Error>) -> Void
     ) -> Request? {
-        var vipFreeNumType:VipFreeNumType = urlType.isVideo ? .videoV2 : .aiGenerate
+        let vipFreeNumType:VipFreeNumType = urlType.isVideo ? .videoV2 : .aiGenerate
         ///需要校验。且需要判断是否超过最大次数
         if urlType.needValidate,urlType.isVideo,PurchaseManager.default.isExceedsVipGeneratedNum(vipFreeNumType: .videoV2) {
             completion(.failure(NSError(domain: "", code: TSNetWorkCode.generateToMax.rawValue)))

+ 31 - 12
AIEmoji/Common/Purchase/TSPurchaseManager.swift

@@ -71,27 +71,25 @@ extension PremiumPeriod:CaseIterable ,RawRepresentable {
             return false
         }
     }
-    
-
 }
 
 extension PremiumPeriod {
 
     /// 对应vip类型,可以每天限额次数
     var dayGeneratedNumber: Int {
-        return 2//50
+        return 50//50
     }
     /// 对应vip类型,可以每天限额视频次数
     var dayGeneratedVideoNumber: Int {
-        return 2//20
+        return 20//20
     }
     /// 对应vip类型,可以一共限额视频次数
     var creatVideoMaxNum:Int {
         switch self  {
         case .year:
-            return 4//200
+            return 200//200
         default:
-            return 3//20
+            return 20//20
         }
     }
     
@@ -173,9 +171,9 @@ public extension Notification.Name {
     static let kPurchaseDidChanged = Self("kPurchaseDidChanged")
 }
 
-private let kFreeNumKey = "kFreeNumKey"
-private let kDayGeneratedNumKey = "kDayGeneratedNumKey"
-private let kVipGeneratedNumKey = "kVipGeneratedNumKey"
+let kFreeNumKey = "kFreeNumKey"
+let kDayGeneratedNumKey = "kDayGeneratedNumKey"
+let kVipGeneratedNumKey = "kVipGeneratedNumKey"
 
 private let kPremiumExpiredInfoKey = "premiumExpiredInfoKey"
 
@@ -228,6 +226,13 @@ public class PurchaseManager: NSObject {
         }
 
         initializeForFree()
+        
+#if DEBUG
+    verifyPayResult(transaction: SKPaymentTransaction(), useSandBox: true)
+#else
+    verifyPayResult(transaction: SKPaymentTransaction(), useSandBox: false)
+#endif
+        
     }
     
     public var expiredDate: Date? {
@@ -642,7 +647,7 @@ extension PurchaseManager {
             guard let self = self else { return }
             if let data = data,
                let jsonResponse = try? JSONSerialization.jsonObject(with: data) as? [String: Any] {
-                debugPrint("PurchaseManager verifyPayResult = \(jsonResponse)")
+//                debugPrint("PurchaseManager verifyPayResult = \(jsonResponse)")
                 let status = jsonResponse["status"]
                 if let status = status as? String, status == "21007" {
                     self.verifyPayResult(transaction: transaction, useSandBox: true)
@@ -697,6 +702,7 @@ extension PurchaseManager {
         if !isLifetime {
             if upgradePendingRenewalInfo(resp) == false {
                 let info = resp["latest_receipt_info"] as? [[String: Any]]
+                debugPrint("PurchaseManager verifyPayResult latest_receipt_info = \(info)")
                 if let firstItem = info?.first,
                    let expires_date_ms = firstItem["expires_date_ms"] as? String,
                    let productId = firstItem["product_id"] as? String,
@@ -982,8 +988,13 @@ extension PurchaseManager {
         
         var dayNum = loadDayGeneratedNum(type: type)
         dayNum = dayNum + 1
+        
         // 保存新的记录
-        let dict: [String: [String: Any]] = [type.rawValue:["date": Date().dateDayString, "times": dayNum]]
+        var dict: [String: [String: Any]] = [:]
+        if var saveDict = UserDefaults.standard.dictionary(forKey: kDayGeneratedNumKey) as? [String: [String: Any]]{
+            dict = saveDict
+        }
+        dict[type.rawValue] = ["date": Date().dateDayString, "times": dayNum]
         UserDefaults.standard.set(dict, forKey: kDayGeneratedNumKey)
         UserDefaults.standard.synchronize()
         //保存到钥匙串
@@ -1001,6 +1012,9 @@ extension PurchaseManager {
                 typeDict.safeString(forKey: "date") == Date().dateDayString else {
             return 0
         }
+        
+        dePrint("从钥匙串 loadDayGeneratedNum=\(dict)")
+        
         // 有记录,设置已经使用次数
         return typeDict.safeInt(forKey: "times")
     }
@@ -1029,7 +1043,11 @@ extension PurchaseManager {
         var dayNum = loadVipGeneratedNum(type: type)
         dayNum = dayNum + 1
         // 保存新的记录
-        let dict: [String: [String: Any]] = [type.rawValue:["times": dayNum,"expireTime":expireTime]]
+        var dict: [String: [String: Any]] = [:]
+        if var saveDict = UserDefaults.standard.dictionary(forKey: kVipGeneratedNumKey) as? [String: [String: Any]]{
+            dict = saveDict
+        }
+        dict[type.rawValue] = ["times": dayNum,"expireTime":expireTime]
         UserDefaults.standard.set(dict, forKey: kVipGeneratedNumKey)
         UserDefaults.standard.synchronize()
         //保存到钥匙串
@@ -1049,6 +1067,7 @@ extension PurchaseManager {
         else {
             return 0
         }
+        dePrint("从钥匙串 loadVipGeneratedNum=\(dict)")
         // 有记录,设置已经使用次数
         return typeDict.safeInt(forKey: "times")
     }

+ 1 - 19
AIEmoji/Common/Tool/OperationQueue/V2/TSGenerateBasePhotoOperation.swift

@@ -211,25 +211,7 @@ extension TSGenerateBasePhotoOperation {
     
     //上传一张图片
     func uploadImage(generateStyleModel:TSAIGeneratorModel,complete:@escaping (TSActionInfoModel?)->Void) {
-        
-//        ///需要校验。且需要判断是否超过最大次数
-//        if PurchaseManager.default.isExceedsVipGeneratedNum(vipFreeNumType: .videoV2) {
-//            let tsCode:Int = TSNetWorkCode.generateToMax.rawValue
-//            self.stateDatauPblished = (TSProgressState.getFailed(TSNetWorkCode.errorMsg(code: tsCode),tsCode),nil)
-//            complete(nil)
-//            dePrint("TSNetWorkCode.generateToMax")
-//            return
-//        }
-//        
-//        ///需要校验。且需要判断是否超过最大次数
-//        if PurchaseManager.default.isExceedsDayGeneratedNum(vipFreeNumType: generateStyleModel.generatorStyle.vipFreeNumType) {
-//            let tsCode:Int = TSNetWorkCode.generateTooMuch.rawValue
-//            self.stateDatauPblished = (TSProgressState.getFailed(TSNetWorkCode.errorMsg(code: tsCode),tsCode),nil)
-//            complete(nil)
-//            dePrint("TSNetWorkCode.generateTooMuch")
-//            return
-//        }
-        
+
         //走多张图片上传逻辑
         if let upLoadImages = generateStyleModel.upLoadImages ,upLoadImages.count > 0{
             uploadImages(generateStyleModel: generateStyleModel, complete: complete)

+ 1 - 1
AIEmoji/Common/View/TSTextToastView.swift

@@ -114,7 +114,7 @@ open class TSTextToastView {
                 make.width.lessThanOrEqualTo(k_ScreenWidth-32)
                 make.height.equalTo(48)
                 make.centerX.equalToSuperview()
-                make.top.equalTo(k_Nav_Height + 10)
+                make.top.equalTo(k_Height_StatusBar + 20)
             }
             
             self.loadingView.startRotating()

BIN
AIEmoji/Res/Video/360° Microwave.mp4


BIN
AIEmoji/Res/Video/Body Shake.mp4


BIN
AIEmoji/Res/Video/Kiss.mp4


BIN
AIEmoji/Res/Video/PUBG Winner Hit.mp4


BIN
AIEmoji/Res/Video/Punch Face.mp4


BIN
AIEmoji/Res/Video/Rebot.MP4


BIN
AIEmoji/Res/Video/Robot.mp4


BIN
AIEmoji/Res/Video/Sexy me.mp4


BIN
AIEmoji/Res/Video/Shake it Down.mp4


+ 15 - 0
AIEmoji/de.lproj/Localizable.strings

@@ -538,3 +538,18 @@
 "You have used all your video effect generations" = "Sie haben alle Ihre Videoeffekt-Generationen verwendet";
 "StickerMe" = "3D-Aufkleber";
 "Bride" = "Braut";
+
+"360° Microwave" = "360° Mikrowelle";
+"Subject 3" = "Thema 3";
+"PUBG Winner Hit" = "Siegestanz";
+"Body Shake" = "Shake";
+"Motor Dance" = "Motorradtanz";
+"Hip Twist" = "Hüften und Hüften";
+"Allure Me" = "Bikini";
+"Punch Face" = "Nimm meinen Schlag";
+"Shake it Down" = "Kniebeugendrehung";
+"Blush" = "Zungenkuss";
+
+"Aspect ratio must be between 1:2 to 1:1.2" = "Das Seitenverhältnis muss zwischen 1:2 und 1:1,2 liegen";
+"Front view, clear face, upper/full body" = "Vorderansicht, klares Gesicht, Oberkörper/Ganzkörper";
+"Invalid photo size, covered face, not a single person" = "Ungültige Fotogröße, verdecktes Gesicht, keine einzelne Person";

+ 15 - 0
AIEmoji/en.lproj/Localizable.strings

@@ -537,3 +537,18 @@
 "You have used all your video effect generations" = "You have used all your video effect generations";
 "StickerMe" = "StickerMe";
 "Bride" = "Bride";
+
+"360° Microwave" = "360° Microwave";
+"Subject 3" = "Subject 3";
+"PUBG Winner Hit" = "PUBG Winner Hit";
+"Body Shake" = "Body Shake";
+"Motor Dance" = "Motor Dance";
+"Hip Twist" = "Hip Twist";
+"Allure Me" = "Allure Me";
+"Punch Face" = "Punch Face";
+"Shake it Down" = "Shake it Down";
+"Blush" = "Blush";
+
+"Aspect ratio must be between 1:2 to 1:1.2" = "Aspect ratio must be between 1:2 to 1:1.2";
+"Front view, clear face, upper/full body" = "Front view, clear face, upper/full body";
+"Invalid photo size, covered face, not a single person" = "Invalid photo size, covered face, not a single person";

+ 15 - 0
AIEmoji/es.lproj/Localizable.strings

@@ -536,3 +536,18 @@
 "You have used all your video effect generations" = "Has utilizado todas tus generaciones de efectos de vídeo.";
 "StickerMe" = "Pegatinas 3D";
 "Bride" = "Novia";
+
+"360° Microwave" = "Microondas de 360°";
+"Subject 3" = "Tema 3";
+"PUBG Winner Hit" = "Danza de la victoria";
+"Body Shake" = "agitar";
+"Motor Dance" = "Baile de motocicletas";
+"Hip Twist" = "Caderas y caderas";
+"Allure Me" = "Bikini";
+"Punch Face" = "Toma mi puñetazo";
+"Shake it Down" = "Sentadilla con giro";
+"Blush" = "Beso francés";
+
+"Aspect ratio must be between 1:2 to 1:1.2" = "La relación de aspecto debe estar entre 1:2 y 1:1,2";
+"Front view, clear face, upper/full body" = "Vista frontal, cara despejada, parte superior/cuerpo completo";
+"Invalid photo size, covered face, not a single person" = "Tamaño de foto no válido, cara cubierta, ni una sola persona";

+ 15 - 0
AIEmoji/ja.lproj/Localizable.strings

@@ -535,3 +535,18 @@
 "You have used all your video effect generations" = "すべてのビデオエフェクトの使い切り回数";
 "StickerMe" = "立体ステッカー";
 "Bride" = "ブライダル";
+
+"360° Microwave" = "360°電子レンジ";
+"Subject 3" = "被験者3";
+"PUBG Winner Hit" = "勝利のダンス";
+"Body Shake" = "振る";
+"Motor Dance" = "モーターサイクルダンス";
+"Hip Twist" = "腰と腰";
+"Allure Me" = "ビキニ";
+"Punch Face" = "私のパンチを受けて";
+"Shake it Down" = "スクワットツイスト";
+"Blush" = "フレンチキス";
+
+"Aspect ratio must be between 1:2 to 1:1.2" = "アスペクト比は1:2~1:1.2の範囲でなければなりません";
+"Front view, clear face, upper/full body" = "正面、顔がはっきり、上半身/全身";
+"Invalid photo size, covered face, not a single person" = "写真のサイズが無効、顔が隠れている、人物が写っていない";

+ 15 - 0
AIEmoji/ko.lproj/Localizable.strings

@@ -539,3 +539,18 @@
 "You have used all your video effect generations" = "당신은 모든 비디오 효과 세대를 사용했습니다";
 "StickerMe" = "3D 스티커";
 "Bride" = "신부";
+
+"360° Microwave" = "360° 전자레인지";
+"Subject 3" = "주제 3";
+"PUBG Winner Hit" = "승리의 춤";
+"Body Shake" = "떨림";
+"Motor Dance" = "모터사이클 댄스";
+"Hip Twist" = "엉덩이와 엉덩이";
+"Allure Me" = "비키니";
+"Punch Face" = "내 펀치를 받아라";
+"Shake it Down" = "스쿼트 트위스트";
+"Blush" = "프렌치 키스";
+
+"Aspect ratio must be between 1:2 to 1:1.2" = "화면비는 1:2~1:1.2 사이여야 합니다.";
+"Front view, clear face, upper/full body" = "정면도, 깨끗한 얼굴, 상체/전신";
+"Invalid photo size, covered face, not a single person" = "잘못된 사진 크기, 얼굴 가려짐, 사람 한 명 없음";

+ 15 - 0
AIEmoji/pt-BR.lproj/Localizable.strings

@@ -535,3 +535,18 @@
 "You have used all your video effect generations" = "Você usou todas as suas gerações de efeitos de vídeo";
 "StickerMe" = "Adesivos 3D";
 "Bride" = "Noiva";
+
+"360° Microwave" = "Micro-ondas 360°";
+"Subject 3" = "Assunto 3";
+"PUBG Winner Hit" = "Dança da Vitória";
+"Body Shake" = "sacudir";
+"Motor Dance" = "Dança de Motocicleta";
+"Hip Twist" = "Quadris e quadris";
+"Allure Me" = "Bikini";
+"Punch Face" = "Pegue meu soco";
+"Shake it Down" = "Agachamento com torção";
+"Blush" = "Beijo Francês";
+
+"Aspect ratio must be between 1:2 to 1:1.2" = "A proporção da tela deve estar entre 1:2 e 1:1,2";
+"Front view, clear face, upper/full body" = "Vista frontal, rosto limpo, corpo superior/inteiro";
+"Invalid photo size, covered face, not a single person" = "Tamanho de foto inválido, rosto coberto, nenhuma pessoa";

+ 15 - 0
AIEmoji/pt-PT.lproj/Localizable.strings

@@ -534,3 +534,18 @@
 "You have used all your video effect generations" = "Você usou todas as suas gerações de efeitos de vídeo";
 "StickerMe" = "Adesivos 3D";
 "Bride" = "Noiva";
+
+"360° Microwave" = "Micro-ondas 360°";
+"Subject 3" = "Assunto 3";
+"PUBG Winner Hit" = "Dança da Vitória";
+"Body Shake" = "sacudir";
+"Motor Dance" = "Dança de Motocicleta";
+"Hip Twist" = "Quadris e quadris";
+"Allure Me" = "Bikini";
+"Punch Face" = "Pegue meu soco";
+"Shake it Down" = "Agachamento com torção";
+"Blush" = "Beijo Francês";
+
+"Aspect ratio must be between 1:2 to 1:1.2" = "A proporção da tela deve estar entre 1:2 e 1:1,2";
+"Front view, clear face, upper/full body" = "Vista frontal, rosto limpo, corpo superior/inteiro";
+"Invalid photo size, covered face, not a single person" = "Tamanho de foto inválido, rosto coberto, nenhuma pessoa";

+ 15 - 0
AIEmoji/zh-Hans.lproj/Localizable.strings

@@ -536,3 +536,18 @@
 "You have used all your video effect generations" = "您已使用完所有视频特效的次数";
 "StickerMe" = "立体贴纸";
 "Bride" = "新娘";
+
+"360° Microwave" = "360° 微波炉";
+"Subject 3" = "科目三";
+"PUBG Winner Hit" = "胜利之舞";
+"Body Shake" = "摇晃";
+"Motor Dance" = "摩托舞";
+"Hip Twist" = "叉腰扭臀";
+"Allure Me" = "比基尼";
+"Punch Face" = "吃我一拳";
+"Shake it Down" = "深蹲扭扭";
+"Blush" = "法式热吻";
+
+"Aspect ratio must be between 1:2 to 1:1.2" = "长宽比必须介于 1:2 到 1:1.2 之间";
+"Front view, clear face, upper/full body" = "正面图、清晰的脸部、上半身/全身";
+"Invalid photo size, covered face, not a single person" = "照片尺寸无效,脸部被遮住,不是单人照片";

+ 15 - 0
AIEmoji/zh-Hant.lproj/Localizable.strings

@@ -525,3 +525,18 @@
 "You have used all your video effect generations" = "您已使用完所有視頻特效的次數";
 "StickerMe" = "立體貼紙";
 "Bride" = "新娘";
+
+"360° Microwave" = "360° 微波爐";
+"Subject 3" = "科目三";
+"PUBG Winner Hit" = "勝利之舞";
+"Body Shake" = "搖晃";
+"Motor Dance" = "摩托舞";
+"Hip Twist" = "叉腰扭臀";
+"Allure Me" = "比基尼";
+"Punch Face" = "吃我一拳";
+"Shake it Down" = "深蹲扭扭";
+"Blush" = "法式熱吻";
+
+"Aspect ratio must be between 1:2 to 1:1.2" = "長寬比必須介於 1:2 到 1:1.2 之間";
+"Front view, clear face, upper/full body" = "正面圖、清晰的臉部、上半身/全身";
+"Invalid photo size, covered face, not a single person" = "照片尺寸無效,臉部被遮住,不是單人照片";