Compare commits
	
		
			9 Commits
		
	
	
		
			main
			...
			newhometab
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8c9ff8c237 | |||
| 
						 | 
					9a1f7d19df | ||
| 
						 | 
					3c1f23f447 | ||
| 
						 | 
					9a9d8038e2 | ||
| 
						 | 
					874e920f6f | ||
| 
						 | 
					64f59c8e91 | ||
| 
						 | 
					769cdfdbc7 | ||
| 
						 | 
					a02fa53902 | ||
| 
						 | 
					efc7773c04 | 
							
								
								
									
										
											BIN
										
									
								
								Shared/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/100.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/1024.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.6 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/114.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 14 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/120.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 15 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/128.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 16 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/144.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 21 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/152.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 24 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/16.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 720 B  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/167.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 28 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/172.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 30 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/180.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 32 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/196.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 39 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/20.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1018 B  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/216.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 48 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/256.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 68 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/29.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/32.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/40.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/48.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/50.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/512.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 324 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/55.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/57.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/58.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/60.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/64.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/72.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 6.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/76.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.0 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/80.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/87.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 8.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Assets.xcassets/AppIcon.appiconset/88.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 9.0 KiB  | 
@ -1,141 +1,295 @@
 | 
			
		||||
{
 | 
			
		||||
  "images" : [
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "40.png",
 | 
			
		||||
      "idiom" : "iphone",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "20x20"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "60.png",
 | 
			
		||||
      "idiom" : "iphone",
 | 
			
		||||
      "scale" : "3x",
 | 
			
		||||
      "size" : "20x20"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "29.png",
 | 
			
		||||
      "idiom" : "iphone",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "29x29"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "58.png",
 | 
			
		||||
      "idiom" : "iphone",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "29x29"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "87.png",
 | 
			
		||||
      "idiom" : "iphone",
 | 
			
		||||
      "scale" : "3x",
 | 
			
		||||
      "size" : "29x29"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "80.png",
 | 
			
		||||
      "idiom" : "iphone",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "40x40"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "120.png",
 | 
			
		||||
      "idiom" : "iphone",
 | 
			
		||||
      "scale" : "3x",
 | 
			
		||||
      "size" : "40x40"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "57.png",
 | 
			
		||||
      "idiom" : "iphone",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "57x57"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "114.png",
 | 
			
		||||
      "idiom" : "iphone",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "57x57"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "120.png",
 | 
			
		||||
      "idiom" : "iphone",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "60x60"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "180.png",
 | 
			
		||||
      "idiom" : "iphone",
 | 
			
		||||
      "scale" : "3x",
 | 
			
		||||
      "size" : "60x60"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "20.png",
 | 
			
		||||
      "idiom" : "ipad",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "20x20"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "40.png",
 | 
			
		||||
      "idiom" : "ipad",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "20x20"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "29.png",
 | 
			
		||||
      "idiom" : "ipad",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "29x29"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "58.png",
 | 
			
		||||
      "idiom" : "ipad",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "29x29"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "40.png",
 | 
			
		||||
      "idiom" : "ipad",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "40x40"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "80.png",
 | 
			
		||||
      "idiom" : "ipad",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "40x40"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "50.png",
 | 
			
		||||
      "idiom" : "ipad",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "50x50"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "100.png",
 | 
			
		||||
      "idiom" : "ipad",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "50x50"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "72.png",
 | 
			
		||||
      "idiom" : "ipad",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "72x72"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "144.png",
 | 
			
		||||
      "idiom" : "ipad",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "72x72"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "76.png",
 | 
			
		||||
      "idiom" : "ipad",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "76x76"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "152.png",
 | 
			
		||||
      "idiom" : "ipad",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "76x76"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "167.png",
 | 
			
		||||
      "idiom" : "ipad",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "83.5x83.5"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "1024.png",
 | 
			
		||||
      "idiom" : "ios-marketing",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "1024x1024"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "48.png",
 | 
			
		||||
      "idiom" : "watch",
 | 
			
		||||
      "role" : "notificationCenter",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "24x24",
 | 
			
		||||
      "subtype" : "38mm"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "55.png",
 | 
			
		||||
      "idiom" : "watch",
 | 
			
		||||
      "role" : "notificationCenter",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "27.5x27.5",
 | 
			
		||||
      "subtype" : "42mm"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "58.png",
 | 
			
		||||
      "idiom" : "watch",
 | 
			
		||||
      "role" : "companionSettings",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "29x29"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "87.png",
 | 
			
		||||
      "idiom" : "watch",
 | 
			
		||||
      "role" : "companionSettings",
 | 
			
		||||
      "scale" : "3x",
 | 
			
		||||
      "size" : "29x29"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "80.png",
 | 
			
		||||
      "idiom" : "watch",
 | 
			
		||||
      "role" : "appLauncher",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "40x40",
 | 
			
		||||
      "subtype" : "38mm"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "88.png",
 | 
			
		||||
      "idiom" : "watch",
 | 
			
		||||
      "role" : "appLauncher",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "44x44",
 | 
			
		||||
      "subtype" : "40mm"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "100.png",
 | 
			
		||||
      "idiom" : "watch",
 | 
			
		||||
      "role" : "appLauncher",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "50x50",
 | 
			
		||||
      "subtype" : "44mm"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "172.png",
 | 
			
		||||
      "idiom" : "watch",
 | 
			
		||||
      "role" : "quickLook",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "86x86",
 | 
			
		||||
      "subtype" : "38mm"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "196.png",
 | 
			
		||||
      "idiom" : "watch",
 | 
			
		||||
      "role" : "quickLook",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "98x98",
 | 
			
		||||
      "subtype" : "42mm"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "216.png",
 | 
			
		||||
      "idiom" : "watch",
 | 
			
		||||
      "role" : "quickLook",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "108x108",
 | 
			
		||||
      "subtype" : "44mm"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "1024.png",
 | 
			
		||||
      "idiom" : "watch-marketing",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "1024x1024"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "16.png",
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "16x16"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "32.png",
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "16x16"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "32.png",
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "32x32"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "64.png",
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "32x32"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "128.png",
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "128x128"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "256.png",
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "128x128"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "256.png",
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "256x256"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "512.png",
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "256x256"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "512.png",
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "512x512"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "1024.png",
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "512x512"
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ struct RefreshableScrollView<Content: View>: UIViewRepresentable {
 | 
			
		||||
        scrollView.refreshControl = refreshControl
 | 
			
		||||
 | 
			
		||||
        let hostingController = UIHostingController(rootView: content)
 | 
			
		||||
        hostingController.view.backgroundColor = .clear
 | 
			
		||||
        hostingController.view.translatesAutoresizingMaskIntoConstraints = false
 | 
			
		||||
        scrollView.addSubview(hostingController.view)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										73
									
								
								Shared/Components/RemoteImageView.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,73 @@
 | 
			
		||||
import SwiftUI
 | 
			
		||||
import Combine
 | 
			
		||||
 | 
			
		||||
// 1. Класс для загрузки изображения с поддержкой кеширования
 | 
			
		||||
class ImageLoader: ObservableObject {
 | 
			
		||||
    @Published var image: UIImage?
 | 
			
		||||
    
 | 
			
		||||
    private var cancellable: AnyCancellable?
 | 
			
		||||
    private let url: URL
 | 
			
		||||
    private let cache = ImageCacheManager.shared
 | 
			
		||||
    
 | 
			
		||||
    init(url: URL) {
 | 
			
		||||
        self.url = url
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    deinit {
 | 
			
		||||
        cancellable?.cancel()
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    func load() {
 | 
			
		||||
        // Проверяем, есть ли изображение в кеше
 | 
			
		||||
        if let cachedImage = cache.get(forKey: url.absoluteString) {
 | 
			
		||||
            self.image = cachedImage
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        // Если в кеше нет, загружаем из сети
 | 
			
		||||
        cancellable = URLSession.shared.dataTaskPublisher(for: url)
 | 
			
		||||
            .map { UIImage(data: $0.data) }
 | 
			
		||||
            .replaceError(with: nil)
 | 
			
		||||
            .handleEvents(receiveOutput: { [weak self] image in
 | 
			
		||||
                // Сохраняем загруженное изображение в кеш
 | 
			
		||||
                if let image = image, let key = self?.url.absoluteString {
 | 
			
		||||
                    self?.cache.set(image, forKey: key)
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
            .receive(on: DispatchQueue.main)
 | 
			
		||||
            .assign(to: \.image, on: self)
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    func cancel() {
 | 
			
		||||
        cancellable?.cancel()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 2. View для отображения удаленного изображения
 | 
			
		||||
struct RemoteImageView: View {
 | 
			
		||||
    @StateObject private var loader: ImageLoader
 | 
			
		||||
    
 | 
			
		||||
    init(url: URL) {
 | 
			
		||||
        _loader = StateObject(wrappedValue: ImageLoader(url: url))
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    var body: some View {
 | 
			
		||||
        content
 | 
			
		||||
            .onAppear(perform: loader.load)
 | 
			
		||||
            .onDisappear(perform: loader.cancel)
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private var content: some View {
 | 
			
		||||
        Group {
 | 
			
		||||
            if let image = loader.image {
 | 
			
		||||
                Image(uiImage: image)
 | 
			
		||||
                    .resizable()
 | 
			
		||||
            } else {
 | 
			
		||||
                ZStack {
 | 
			
		||||
                    Color(.systemGray5)
 | 
			
		||||
                    ProgressView()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								Shared/Media/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Shared/Media/Media.xcassets/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@ -1,12 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "data" : [
 | 
			
		||||
    {
 | 
			
		||||
      "filename" : "placeholderVideo.mp4",
 | 
			
		||||
      "idiom" : "universal"
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "info" : {
 | 
			
		||||
    "author" : "xcode",
 | 
			
		||||
    "version" : 1
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 3.0 KiB  | 
| 
		 Before Width: | Height: | Size: 173 KiB  | 
@ -26,6 +26,10 @@ struct Post: Identifiable, Codable {
 | 
			
		||||
    let location: String?                  // Гео
 | 
			
		||||
    let languageCode: [String]?            // Язык
 | 
			
		||||
    let accessLevel: AccessLevel           // Доступ (публичный и т.п.)
 | 
			
		||||
 | 
			
		||||
    var isVideo: Bool {
 | 
			
		||||
        return media.first?.type == .video
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum MediaType: String, Codable {
 | 
			
		||||
@ -37,6 +41,8 @@ enum MediaType: String, Codable {
 | 
			
		||||
struct MediaItem: Identifiable, Codable {
 | 
			
		||||
    let id: UUID
 | 
			
		||||
    let type: MediaType
 | 
			
		||||
    let width: Int?
 | 
			
		||||
    let height: Int?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum AccessLevel: String, Codable {
 | 
			
		||||
 | 
			
		||||
@ -13,106 +13,79 @@ class PostService {
 | 
			
		||||
        guard posts.isEmpty else { return }
 | 
			
		||||
 | 
			
		||||
        let sampleTitles = [
 | 
			
		||||
            "Обзор TikTok UI",
 | 
			
		||||
            "Мой первый ролик",
 | 
			
		||||
            "Котик в кадре",
 | 
			
		||||
            "SwiftUI мастер-класс",
 | 
			
		||||
            "Анимации и переходы",
 | 
			
		||||
            "Съёмка с дрона",
 | 
			
		||||
            "Урок по дизайну",
 | 
			
		||||
            "Как сделать свайпы",
 | 
			
		||||
            "Лучший UI 2025",
 | 
			
		||||
            "Мой первый ролик",
 | 
			
		||||
            "Котик в кадре",
 | 
			
		||||
            "SwiftUI мастер-класс",
 | 
			
		||||
            "Анимации и переходы",
 | 
			
		||||
            "Съёмка с дрона",
 | 
			
		||||
            "Урок по дизайну",
 | 
			
		||||
            "Как сделать свайпы",
 | 
			
		||||
            "Лучший UI 2025",
 | 
			
		||||
            "Мой первый ролик",
 | 
			
		||||
            "Котик в кадре",
 | 
			
		||||
            "SwiftUI мастер-класс",
 | 
			
		||||
            "Анимации и переходы",
 | 
			
		||||
            "Съёмка с дрона",
 | 
			
		||||
            "Урок по дизайну",
 | 
			
		||||
            "Как сделать свайпы",
 | 
			
		||||
            "Лучший UI 2025",
 | 
			
		||||
            "Мой первый ролик",
 | 
			
		||||
            "Котик в кадре",
 | 
			
		||||
            "SwiftUI мастер-класс",
 | 
			
		||||
            "Анимации и переходы",
 | 
			
		||||
            "Съёмка с дрона",
 | 
			
		||||
            "Урок по дизайну",
 | 
			
		||||
            "Как сделать свайпы",
 | 
			
		||||
            "Лучший UI 2025",
 | 
			
		||||
            "Мой первый ролик",
 | 
			
		||||
            "Котик в кадре",
 | 
			
		||||
            "SwiftUI мастер-класс",
 | 
			
		||||
            "Анимации и переходы",
 | 
			
		||||
            "Съёмка с дрона",
 | 
			
		||||
            "Урок по дизайну",
 | 
			
		||||
            "Как сделать свайпы",
 | 
			
		||||
            "Лучший UI 2025",
 | 
			
		||||
            "Завершаем проект"
 | 
			
		||||
            "Обзор TikTok UI", "Мой первый ролик", "Котик в кадре", "SwiftUI мастер-класс",
 | 
			
		||||
            "Анимации и переходы", "Съёмка с дрона", "Урок по дизайну", "Как сделать свайпы",
 | 
			
		||||
            "Лучший UI 2025", "Мой первый ролик", "Котик в кадре", "SwiftUI мастер-класс",
 | 
			
		||||
            "Анимации и переходы", "Съёмка с дрона", "Урок по дизайну", "Как сделать свайпы",
 | 
			
		||||
            "Лучший UI 2025", "Мой первый ролик", "Котик в кадре", "SwiftUI мастер-класс",
 | 
			
		||||
            "Анимации и переходы", "Съёмка с дрона", "Урок по дизайну", "Как сделать свайпы",
 | 
			
		||||
            "Лучший UI 2025", "Мой первый ролик", "Котик в кадре", "SwiftUI мастер-класс",
 | 
			
		||||
            "Анимации и переходы", "Съёмка с дрона", "Урок по дизайну", "Как сделать свайпы",
 | 
			
		||||
            "Лучший UI 2025", "Мой первый ролик", "Котик в кадре", "SwiftUI мастер-класс",
 | 
			
		||||
            "Анимации и переходы", "Съёмка с дрона", "Урок по дизайну", "Как сделать свайпы",
 | 
			
		||||
            "Лучший UI 2025", "Завершаем проект"
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
        let sampleDescriptions = [
 | 
			
		||||
            "Первый тестовый пост с видео",
 | 
			
		||||
            "Фейковый контент для ленты",
 | 
			
		||||
            "Видео с котиком 🐱",
 | 
			
		||||
            "Интерфейс в стиле TikTok",
 | 
			
		||||
            "Просто тестирую отображение",
 | 
			
		||||
            "Код и UI — любовь",
 | 
			
		||||
            "Видео в реальном времени",
 | 
			
		||||
            "Интересный UX пример",
 | 
			
		||||
            "Анимации, переходы, свайпы",
 | 
			
		||||
            "Фейковый контент для ленты",
 | 
			
		||||
            "Видео с котиком 🐱",
 | 
			
		||||
            "Интерфейс в стиле TikTok",
 | 
			
		||||
            "Просто тестирую отображение",
 | 
			
		||||
            "Код и UI — любовь",
 | 
			
		||||
            "Видео в реальном времени",
 | 
			
		||||
            "Интересный UX пример",
 | 
			
		||||
            "Анимации, переходы, свайпы",
 | 
			
		||||
            "Фейковый контент для ленты",
 | 
			
		||||
            "Видео с котиком 🐱",
 | 
			
		||||
            "Интерфейс в стиле TikTok",
 | 
			
		||||
            "Просто тестирую отображение",
 | 
			
		||||
            "Код и UI — любовь",
 | 
			
		||||
            "Видео в реальном времени",
 | 
			
		||||
            "Интересный UX пример",
 | 
			
		||||
            "Анимации, переходы, свайпы",
 | 
			
		||||
            "Фейковый контент для ленты",
 | 
			
		||||
            "Видео с котиком 🐱",
 | 
			
		||||
            "Интерфейс в стиле TikTok",
 | 
			
		||||
            "Просто тестирую отображение",
 | 
			
		||||
            "Код и UI — любовь",
 | 
			
		||||
            "Видео в реальном времени",
 | 
			
		||||
            "Интересный UX пример",
 | 
			
		||||
            "Анимации, переходы, свайпы",
 | 
			
		||||
            "Первый тестовый пост с видео", "Фейковый контент для ленты", "Видео с котиком 🐱",
 | 
			
		||||
            "Интерфейс в стиле TikTok", "Просто тестирую отображение", "Код и UI — любовь",
 | 
			
		||||
            "Видео в реальном времени", "Интересный UX пример", "Анимации, переходы, свайпы",
 | 
			
		||||
            "Фейковый контент для ленты", "Видео с котиком 🐱", "Интерфейс в стиле TikTok",
 | 
			
		||||
            "Просто тестирую отображение", "Код и UI — любовь", "Видео в реальном времени",
 | 
			
		||||
            "Интересный UX пример", "Анимации, переходы, свайпы", "Фейковый контент для ленты",
 | 
			
		||||
            "Видео с котиком 🐱", "Интерфейс в стиле TikTok", "Просто тестирую отображение",
 | 
			
		||||
            "Код и UI — любовь", "Видео в реальном времени", "Интересный UX пример",
 | 
			
		||||
            "Анимации, переходы, свайпы", "Фейковый контент для ленты", "Видео с котиком 🐱",
 | 
			
		||||
            "Интерфейс в стиле TikTok", "Просто тестирую отображение", "Код и UI — любовь",
 | 
			
		||||
            "Видео в реальном времени", "Интересный UX пример", "Анимации, переходы, свайпы",
 | 
			
		||||
            "Вот это да, пост работает!"
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
        for i in 0..<32 {
 | 
			
		||||
            let mediaID = UUID()
 | 
			
		||||
//            let thumbID = Bool.random() ? UUID() : nil
 | 
			
		||||
            let thumbID = UUID()
 | 
			
		||||
            let postID = UUID()
 | 
			
		||||
            
 | 
			
		||||
            let authorId = UUID()
 | 
			
		||||
            let authorUserName = "username_\(Int.random(in: 1...5))"
 | 
			
		||||
//            let authorId = "user_\(Int.random(in: 1...5))"
 | 
			
		||||
            let thumbID = UUID()
 | 
			
		||||
 | 
			
		||||
            var mediaItems: [MediaItem] = []
 | 
			
		||||
            var mediaOrder: [UUID] = []
 | 
			
		||||
            
 | 
			
		||||
            let mediaTypeChoice = Int.random(in: 0...2)
 | 
			
		||||
            
 | 
			
		||||
            if mediaTypeChoice == 0 { // Single Video
 | 
			
		||||
                let mediaID = UUID()
 | 
			
		||||
                let width = 1080
 | 
			
		||||
                let randomRatio = Double.random(in: 1.0...1.77)
 | 
			
		||||
                let height = Int(Double(width) * randomRatio)
 | 
			
		||||
                mediaItems.append(MediaItem(id: mediaID, type: .video, width: width, height: height))
 | 
			
		||||
                mediaOrder.append(mediaID)
 | 
			
		||||
            } else if mediaTypeChoice == 1 { // Single Photo
 | 
			
		||||
                let mediaID = UUID()
 | 
			
		||||
                let width = 1080
 | 
			
		||||
                let randomRatio = Double.random(in: 1.0...1.77)
 | 
			
		||||
                let height = Int(Double(width) * randomRatio)
 | 
			
		||||
                mediaItems.append(MediaItem(id: mediaID, type: .photo, width: width, height: height))
 | 
			
		||||
                mediaOrder.append(mediaID)
 | 
			
		||||
            } else { // Photo Gallery
 | 
			
		||||
                let numberOfPhotos = Int.random(in: 2...5)
 | 
			
		||||
                for _ in 0..<numberOfPhotos {
 | 
			
		||||
                    let mediaID = UUID()
 | 
			
		||||
                    let width = 1080
 | 
			
		||||
                    let randomRatio = Double.random(in: 1.0...1.77)
 | 
			
		||||
                    let height = Int(Double(width) * randomRatio)
 | 
			
		||||
                    mediaItems.append(MediaItem(id: mediaID, type: .photo, width: width, height: height))
 | 
			
		||||
                    mediaOrder.append(mediaID)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let post = Post(
 | 
			
		||||
                id: postID,
 | 
			
		||||
                title: sampleTitles[i],
 | 
			
		||||
                description: sampleDescriptions[i],
 | 
			
		||||
                media: [
 | 
			
		||||
                    MediaItem(id: mediaID, type: .video)
 | 
			
		||||
                ],
 | 
			
		||||
                mediaOrder: [mediaID],
 | 
			
		||||
                media: mediaItems,
 | 
			
		||||
                mediaOrder: mediaOrder,
 | 
			
		||||
                thumbnailID: thumbID,
 | 
			
		||||
                duration: Double.random(in: 15.0...180.0),
 | 
			
		||||
                duration: mediaItems.first?.type == .video ? Double.random(in: 15.0...180.0) : nil,
 | 
			
		||||
                createdAt: Date(),
 | 
			
		||||
                updatedAt: Date(),
 | 
			
		||||
                views: Int.random(in: 1_000...10_000),
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								Shared/Resources/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Shared/Services/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										22
									
								
								Shared/Services/ImageCacheManager.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,22 @@
 | 
			
		||||
import UIKit
 | 
			
		||||
 | 
			
		||||
// Менеджер для кеширования изображений в памяти
 | 
			
		||||
class ImageCacheManager {
 | 
			
		||||
    static let shared = ImageCacheManager()
 | 
			
		||||
    
 | 
			
		||||
    // NSCache будет хранить UIImage по ключу NSString (URL)
 | 
			
		||||
    // Он автоматически удаляет объекты при нехватке памяти
 | 
			
		||||
    private let cache = NSCache<NSString, UIImage>()
 | 
			
		||||
    
 | 
			
		||||
    private init() {}
 | 
			
		||||
    
 | 
			
		||||
    // Добавить изображение в кеш
 | 
			
		||||
    func set(_ image: UIImage, forKey key: String) {
 | 
			
		||||
        cache.setObject(image, forKey: key as NSString)
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Получить изображение из кеша
 | 
			
		||||
    func get(forKey key: String) -> UIImage? {
 | 
			
		||||
        return cache.object(forKey: key as NSString)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,15 @@
 | 
			
		||||
 | 
			
		||||
App Thinning Size Report for All Variants of yobble (iOS)
 | 
			
		||||
 | 
			
		||||
Variant: yobble-39F914DE-E598-4709-910F-2793854A9000.ipa
 | 
			
		||||
Supported variant descriptors: [device: iPad8,5, os-version: 14.0], [device: iPad7,5, os-version: 14.0], [device: iPhone10,3, os-version: 14.0], [device: iPhone11,2, os-version: 14.0], [device: iPad7,3, os-version: 14.0], [device: iPad8,4, os-version: 14.0], [device: iPad8,11, os-version: 14.0], [device: MacFamily20,1, os-version: 14.0], [device: iPad7,12, os-version: 14.0], [device: iPhone8,4, os-version: 14.0], [device: iPad8,8, os-version: 14.0], [device: iPad6,8, os-version: 14.0], [device: iPhone12,8, os-version: 14.0], [device: iPhone13,2, os-version: 14.0], [device: iPhone12,3, os-version: 14.0], [device: iPad6,3, os-version: 14.0], [device: iPhone9,3, os-version: 14.0], [device: iPad8,6, os-version: 14.0], [device: iPad8,2, os-version: 14.0], [device: iPad5,1, os-version: 14.0], [device: iPhone9,1, os-version: 14.0], [device: iPad7,11, os-version: 14.0], [device: iPhone10,1, os-version: 14.0], [device: iPhone12,5, os-version: 14.0], [device: iPad8,9, os-version: 14.0], [device: iPhone13,4, os-version: 14.0], [device: iPad11,2, os-version: 14.0], [device: iPad6,12, os-version: 14.0], [device: iPad7,2, os-version: 14.0], [device: iPhone9,4, os-version: 14.0], [device: iPhone10,2, os-version: 14.0], [device: iPad13,1, os-version: 14.0], [device: iPhone10,6, os-version: 14.0], [device: iPad11,4, os-version: 14.0], [device: iPad8,7, os-version: 14.0], [device: iPad8,10, os-version: 14.0], [device: iPhone10,4, os-version: 14.0], [device: iPhone8,1, os-version: 14.0], [device: iPad8,1, os-version: 14.0], [device: iPhone13,3, os-version: 14.0], [device: iPad7,4, os-version: 14.0], [device: iPhone11,4, os-version: 14.0], [device: iPhone10,5, os-version: 14.0], [device: iPad6,4, os-version: 14.0], [device: iPad11,3, os-version: 14.0], [device: iPad13,2, os-version: 14.0], [device: iPad7,1, os-version: 14.0], [device: iPad5,2, os-version: 14.0], [device: iPhone11,6, os-version: 14.0], [device: iPad6,11, os-version: 14.0], [device: iPad8,12, os-version: 14.0], [device: iPhone12,1, os-version: 14.0], [device: iPod9,1, os-version: 14.0], [device: iPhone11,8, os-version: 14.0], [device: iPad5,3, os-version: 14.0], [device: iPad6,7, os-version: 14.0], [device: iPhone8,2, os-version: 14.0], [device: iPad11,6, os-version: 14.0], [device: iPhone9,2, os-version: 14.0], [device: iPad8,3, os-version: 14.0], [device: iPad7,6, os-version: 14.0], [device: iPad11,1, os-version: 14.0], [device: iPad11,7, os-version: 14.0], [device: iPhone13,1, os-version: 14.0], and [device: iPad5,4, os-version: 14.0]
 | 
			
		||||
App + On Demand Resources size: 394 KB compressed, 847 KB uncompressed
 | 
			
		||||
App size: 394 KB compressed, 847 KB uncompressed
 | 
			
		||||
On Demand Resources size: Zero KB compressed, Zero KB uncompressed
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Variant: yobble.ipa
 | 
			
		||||
Supported variant descriptors: Universal
 | 
			
		||||
App + On Demand Resources size: 394 KB compressed, 849 KB uncompressed
 | 
			
		||||
App size: 394 KB compressed, 849 KB uncompressed
 | 
			
		||||
On Demand Resources size: Zero KB compressed, Zero KB uncompressed
 | 
			
		||||
@ -0,0 +1,53 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 | 
			
		||||
<plist version="1.0">
 | 
			
		||||
<dict>
 | 
			
		||||
	<key>yobble.ipa</key>
 | 
			
		||||
	<array>
 | 
			
		||||
		<dict>
 | 
			
		||||
			<key>architectures</key>
 | 
			
		||||
			<array>
 | 
			
		||||
				<string>arm64</string>
 | 
			
		||||
			</array>
 | 
			
		||||
			<key>certificate</key>
 | 
			
		||||
			<dict>
 | 
			
		||||
				<key>SHA1</key>
 | 
			
		||||
				<string>F228000CAD4A5F5EDC27722D23EE01FEC1DE310F</string>
 | 
			
		||||
				<key>dateExpires</key>
 | 
			
		||||
				<string>11/09/2026</string>
 | 
			
		||||
				<key>type</key>
 | 
			
		||||
				<string>Apple Distribution</string>
 | 
			
		||||
			</dict>
 | 
			
		||||
			<key>entitlements</key>
 | 
			
		||||
			<dict>
 | 
			
		||||
				<key>application-identifier</key>
 | 
			
		||||
				<string>V22H44W47J.org.yobble.app</string>
 | 
			
		||||
				<key>com.apple.developer.team-identifier</key>
 | 
			
		||||
				<string>V22H44W47J</string>
 | 
			
		||||
				<key>get-task-allow</key>
 | 
			
		||||
				<false/>
 | 
			
		||||
				<key>keychain-access-groups</key>
 | 
			
		||||
				<array>
 | 
			
		||||
					<string>V22H44W47J.org.yobble.app</string>
 | 
			
		||||
				</array>
 | 
			
		||||
			</dict>
 | 
			
		||||
			<key>name</key>
 | 
			
		||||
			<string>yobble.app</string>
 | 
			
		||||
			<key>profile</key>
 | 
			
		||||
			<dict>
 | 
			
		||||
				<key>UUID</key>
 | 
			
		||||
				<string>3c15fa81-2a05-4082-a989-a1629217adee</string>
 | 
			
		||||
				<key>name</key>
 | 
			
		||||
				<string>iOS Team Ad Hoc Provisioning Profile: org.yobble.app</string>
 | 
			
		||||
			</dict>
 | 
			
		||||
			<key>team</key>
 | 
			
		||||
			<dict>
 | 
			
		||||
				<key>id</key>
 | 
			
		||||
				<string>V22H44W47J</string>
 | 
			
		||||
				<key>name</key>
 | 
			
		||||
				<string>Ivan Vasilev</string>
 | 
			
		||||
			</dict>
 | 
			
		||||
		</dict>
 | 
			
		||||
	</array>
 | 
			
		||||
</dict>
 | 
			
		||||
</plist>
 | 
			
		||||
@ -0,0 +1,20 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 | 
			
		||||
<plist version="1.0">
 | 
			
		||||
<dict>
 | 
			
		||||
	<key>compileBitcode</key>
 | 
			
		||||
	<true/>
 | 
			
		||||
	<key>destination</key>
 | 
			
		||||
	<string>export</string>
 | 
			
		||||
	<key>method</key>
 | 
			
		||||
	<string>ad-hoc</string>
 | 
			
		||||
	<key>signingStyle</key>
 | 
			
		||||
	<string>automatic</string>
 | 
			
		||||
	<key>stripSwiftSymbols</key>
 | 
			
		||||
	<true/>
 | 
			
		||||
	<key>teamID</key>
 | 
			
		||||
	<string>V22H44W47J</string>
 | 
			
		||||
	<key>thinning</key>
 | 
			
		||||
	<string><thin-for-all-variants></string>
 | 
			
		||||
</dict>
 | 
			
		||||
</plist>
 | 
			
		||||
							
								
								
									
										3070
									
								
								Shared/Services/yobble (iOS) 2025-09-11 6-22-59 PM/Packaging.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,452 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 | 
			
		||||
<plist version="1.0">
 | 
			
		||||
<dict>
 | 
			
		||||
	<key>variants</key>
 | 
			
		||||
	<dict>
 | 
			
		||||
		<key>Apps/yobble-39F914DE-E598-4709-910F-2793854A9000.ipa</key>
 | 
			
		||||
		<dict>
 | 
			
		||||
			<key>limitUncompressedInitialPrefetchedODR</key>
 | 
			
		||||
			<integer>2147483648</integer>
 | 
			
		||||
			<key>onDemandResourcesAssetPacks</key>
 | 
			
		||||
			<dict/>
 | 
			
		||||
			<key>sizeCompressedApp</key>
 | 
			
		||||
			<integer>394217</integer>
 | 
			
		||||
			<key>sizeCompressedAppAndODR</key>
 | 
			
		||||
			<integer>394217</integer>
 | 
			
		||||
			<key>sizeCompressedODR</key>
 | 
			
		||||
			<integer>0</integer>
 | 
			
		||||
			<key>sizeUncompressedApp</key>
 | 
			
		||||
			<integer>846752</integer>
 | 
			
		||||
			<key>sizeUncompressedAppAndODR</key>
 | 
			
		||||
			<integer>846752</integer>
 | 
			
		||||
			<key>sizeUncompressedInitialPrefetchedODR</key>
 | 
			
		||||
			<integer>0</integer>
 | 
			
		||||
			<key>sizeUncompressedInitialPrefetchedODRExceedsLimit</key>
 | 
			
		||||
			<false/>
 | 
			
		||||
			<key>sizeUncompressedODR</key>
 | 
			
		||||
			<integer>0</integer>
 | 
			
		||||
			<key>tagsUncompressedInitialPrefetchedODR</key>
 | 
			
		||||
			<array/>
 | 
			
		||||
			<key>variantDescriptors</key>
 | 
			
		||||
			<array>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad8,5</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad7,5</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone10,3</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone11,2</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad7,3</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad8,4</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad8,11</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>MacFamily20,1</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad7,12</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone8,4</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad8,8</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad6,8</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone12,8</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone13,2</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone12,3</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad6,3</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone9,3</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad8,6</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad8,2</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad5,1</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone9,1</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad7,11</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone10,1</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone12,5</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad8,9</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone13,4</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad11,2</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad6,12</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad7,2</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone9,4</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone10,2</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad13,1</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone10,6</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad11,4</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad8,7</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad8,10</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone10,4</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone8,1</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad8,1</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone13,3</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad7,4</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone11,4</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone10,5</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad6,4</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad11,3</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad13,2</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad7,1</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad5,2</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone11,6</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad6,11</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad8,12</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone12,1</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPod9,1</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone11,8</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad5,3</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad6,7</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone8,2</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad11,6</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone9,2</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad8,3</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad7,6</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad11,1</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad11,7</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPhone13,1</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
				<dict>
 | 
			
		||||
					<key>device</key>
 | 
			
		||||
					<string>iPad5,4</string>
 | 
			
		||||
					<key>os-version</key>
 | 
			
		||||
					<string>14.0</string>
 | 
			
		||||
				</dict>
 | 
			
		||||
			</array>
 | 
			
		||||
		</dict>
 | 
			
		||||
		<key>Apps/yobble.ipa</key>
 | 
			
		||||
		<dict>
 | 
			
		||||
			<key>limitUncompressedInitialPrefetchedODR</key>
 | 
			
		||||
			<integer>2147483648</integer>
 | 
			
		||||
			<key>onDemandResourcesAssetPacks</key>
 | 
			
		||||
			<dict/>
 | 
			
		||||
			<key>sizeCompressedApp</key>
 | 
			
		||||
			<integer>394090</integer>
 | 
			
		||||
			<key>sizeCompressedAppAndODR</key>
 | 
			
		||||
			<integer>394090</integer>
 | 
			
		||||
			<key>sizeCompressedODR</key>
 | 
			
		||||
			<integer>0</integer>
 | 
			
		||||
			<key>sizeUncompressedApp</key>
 | 
			
		||||
			<integer>848692</integer>
 | 
			
		||||
			<key>sizeUncompressedAppAndODR</key>
 | 
			
		||||
			<integer>848692</integer>
 | 
			
		||||
			<key>sizeUncompressedInitialPrefetchedODR</key>
 | 
			
		||||
			<integer>0</integer>
 | 
			
		||||
			<key>sizeUncompressedInitialPrefetchedODRExceedsLimit</key>
 | 
			
		||||
			<false/>
 | 
			
		||||
			<key>sizeUncompressedODR</key>
 | 
			
		||||
			<integer>0</integer>
 | 
			
		||||
			<key>tagsUncompressedInitialPrefetchedODR</key>
 | 
			
		||||
			<array/>
 | 
			
		||||
		</dict>
 | 
			
		||||
	</dict>
 | 
			
		||||
</dict>
 | 
			
		||||
</plist>
 | 
			
		||||
@ -0,0 +1,59 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 | 
			
		||||
<plist version="1.0">
 | 
			
		||||
<dict>
 | 
			
		||||
	<key>yobble.ipa</key>
 | 
			
		||||
	<array>
 | 
			
		||||
		<dict>
 | 
			
		||||
			<key>architectures</key>
 | 
			
		||||
			<array>
 | 
			
		||||
				<string>arm64</string>
 | 
			
		||||
			</array>
 | 
			
		||||
			<key>bitcode</key>
 | 
			
		||||
			<true/>
 | 
			
		||||
			<key>certificate</key>
 | 
			
		||||
			<dict>
 | 
			
		||||
				<key>SHA1</key>
 | 
			
		||||
				<string>F228000CAD4A5F5EDC27722D23EE01FEC1DE310F</string>
 | 
			
		||||
				<key>dateExpires</key>
 | 
			
		||||
				<string>11/09/2026</string>
 | 
			
		||||
				<key>type</key>
 | 
			
		||||
				<string>Apple Distribution</string>
 | 
			
		||||
			</dict>
 | 
			
		||||
			<key>entitlements</key>
 | 
			
		||||
			<dict>
 | 
			
		||||
				<key>application-identifier</key>
 | 
			
		||||
				<string>V22H44W47J.org.yobble.app</string>
 | 
			
		||||
				<key>beta-reports-active</key>
 | 
			
		||||
				<true/>
 | 
			
		||||
				<key>com.apple.developer.team-identifier</key>
 | 
			
		||||
				<string>V22H44W47J</string>
 | 
			
		||||
				<key>get-task-allow</key>
 | 
			
		||||
				<false/>
 | 
			
		||||
				<key>keychain-access-groups</key>
 | 
			
		||||
				<array>
 | 
			
		||||
					<string>V22H44W47J.org.yobble.app</string>
 | 
			
		||||
				</array>
 | 
			
		||||
			</dict>
 | 
			
		||||
			<key>name</key>
 | 
			
		||||
			<string>yobble.app</string>
 | 
			
		||||
			<key>profile</key>
 | 
			
		||||
			<dict>
 | 
			
		||||
				<key>UUID</key>
 | 
			
		||||
				<string>7afe5f4d-4c11-414c-b123-8481bcfe5360</string>
 | 
			
		||||
				<key>name</key>
 | 
			
		||||
				<string>iOS Team Store Provisioning Profile: org.yobble.app</string>
 | 
			
		||||
			</dict>
 | 
			
		||||
			<key>symbols</key>
 | 
			
		||||
			<false/>
 | 
			
		||||
			<key>team</key>
 | 
			
		||||
			<dict>
 | 
			
		||||
				<key>id</key>
 | 
			
		||||
				<string>V22H44W47J</string>
 | 
			
		||||
				<key>name</key>
 | 
			
		||||
				<string>Ivan Vasilev</string>
 | 
			
		||||
			</dict>
 | 
			
		||||
		</dict>
 | 
			
		||||
	</array>
 | 
			
		||||
</dict>
 | 
			
		||||
</plist>
 | 
			
		||||
@ -0,0 +1,20 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 | 
			
		||||
<plist version="1.0">
 | 
			
		||||
<dict>
 | 
			
		||||
	<key>destination</key>
 | 
			
		||||
	<string>export</string>
 | 
			
		||||
	<key>method</key>
 | 
			
		||||
	<string>app-store</string>
 | 
			
		||||
	<key>signingStyle</key>
 | 
			
		||||
	<string>automatic</string>
 | 
			
		||||
	<key>stripSwiftSymbols</key>
 | 
			
		||||
	<true/>
 | 
			
		||||
	<key>teamID</key>
 | 
			
		||||
	<string>V22H44W47J</string>
 | 
			
		||||
	<key>uploadBitcode</key>
 | 
			
		||||
	<true/>
 | 
			
		||||
	<key>uploadSymbols</key>
 | 
			
		||||
	<false/>
 | 
			
		||||
</dict>
 | 
			
		||||
</plist>
 | 
			
		||||
							
								
								
									
										143
									
								
								Shared/Services/yobble (iOS) 2025-09-11 6-24-34 PM/Packaging.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,143 @@
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Initial pipeline context: <IDEDistributionProcessingPipelineContext: 0x7fb6ac8eaf60; archive(resolved)='<IDEArchive: 0x7fb6a64e0fd0>', distributionTask(resolved)='2', distributionDestination(resolved)='1', distributionMethod(resolved)='<IDEDistributionMethodiOSAppStoreDistribution: 0x7fb6a7518a60>', team(resolved)='<IDEProvisioningDisambiguatableBasicTeam: 0x7fb6a65a7a50; teamID='V22H44W47J', teamName='Ivan Vasilev', teamType='Individual', username='gans302@bk.ru', isFreeProvisioningTeam='0'>'>
 | 
			
		||||
	Chain (12, self inclusive):
 | 
			
		||||
	<IDEDistributionProcessingPipelineContext: 0x7fb6ac8eaf60; archive = '<IDEArchive: 0x7fb6a64e0fd0>', distributionMethod='<IDEDistributionMethodiOSAppStoreDistribution: 0x7fb6a7518a60>', team='<IDEProvisioningDisambiguatableBasicTeam: 0x7fb6a65a7a50; teamID='V22H44W47J', teamName='Ivan Vasilev', teamType='Individual', username='gans302@bk.ru', isFreeProvisioningTeam='0'>'>
 | 
			
		||||
	<IDEDistributionProcessingPipelineContext: 0x7fb6ac8ebd80; archive = '<IDEArchive: 0x7fb6a64e0fd0>', distributionMethod='<IDEDistributionMethodiOSAppStoreDistribution: 0x7fb6a7518a60>', team='<IDEProvisioningDisambiguatableBasicTeam: 0x7fb6a65a7a50; teamID='V22H44W47J', teamName='Ivan Vasilev', teamType='Individual', username='gans302@bk.ru', isFreeProvisioningTeam='0'>'>
 | 
			
		||||
	<IDEDistributionContext: 0x7fb6abbcaf50; archive = '<IDEArchive: 0x7fb6a64e0fd0>', distributionMethod='<IDEDistributionMethodiOSAppStoreDistribution: 0x7fb6a7518a60>', team='<IDEProvisioningDisambiguatableBasicTeam: 0x7fb6a65a7a50; teamID='V22H44W47J', teamName='Ivan Vasilev', teamType='Individual', username='gans302@bk.ru', isFreeProvisioningTeam='0'>'>
 | 
			
		||||
	<IDEDistributionContext: 0x7fb6a7505cc0; archive = '<IDEArchive: 0x7fb6a64e0fd0>', distributionMethod='<IDEDistributionMethodiOSAppStoreDistribution: 0x7fb6a7518a60>', team='<IDEProvisioningDisambiguatableBasicTeam: 0x7fb6a65a7a50; teamID='V22H44W47J', teamName='Ivan Vasilev', teamType='Individual', username='gans302@bk.ru', isFreeProvisioningTeam='0'>'>
 | 
			
		||||
	<IDEDistributionContext: 0x7fb69f571ef0; archive = '<IDEArchive: 0x7fb6a64e0fd0>', distributionMethod='<IDEDistributionMethodiOSAppStoreDistribution: 0x7fb6a7518a60>', team='<IDEProvisioningDisambiguatableBasicTeam: 0x7fb6a65a7a50; teamID='V22H44W47J', teamName='Ivan Vasilev', teamType='Individual', username='gans302@bk.ru', isFreeProvisioningTeam='0'>'>
 | 
			
		||||
	<IDEDistributionContext: 0x7fb6ac8a8620; archive = '<IDEArchive: 0x7fb6a64e0fd0>', distributionMethod='<IDEDistributionMethodiOSAppStoreDistribution: 0x7fb6a7518a60>', team='<IDEProvisioningDisambiguatableBasicTeam: 0x7fb6a65a7a50; teamID='V22H44W47J', teamName='Ivan Vasilev', teamType='Individual', username='gans302@bk.ru', isFreeProvisioningTeam='0'>'>
 | 
			
		||||
	<IDEDistributionContext: 0x7fb6a7524270; archive = '<IDEArchive: 0x7fb6a64e0fd0>', distributionMethod='<IDEDistributionMethodiOSAppStoreDistribution: 0x7fb6a7518a60>', team='<IDEProvisioningDisambiguatableBasicTeam: 0x7fb6a65a7a50; teamID='V22H44W47J', teamName='Ivan Vasilev', teamType='Individual', username='gans302@bk.ru', isFreeProvisioningTeam='0'>'>
 | 
			
		||||
	<IDEDistributionContext: 0x7fb6a7568000; archive = '<IDEArchive: 0x7fb6a64e0fd0>', distributionMethod='<IDEDistributionMethodiOSAppStoreDistribution: 0x7fb6a7518a60>', team='<IDEProvisioningDisambiguatableBasicTeam: 0x7fb6a65a7a50; teamID='V22H44W47J', teamName='Ivan Vasilev', teamType='Individual', username='gans302@bk.ru', isFreeProvisioningTeam='0'>'>
 | 
			
		||||
	<IDEDistributionContext: 0x7fb6a67dcb50; archive = '<IDEArchive: 0x7fb6a64e0fd0>', distributionMethod='<IDEDistributionMethodiOSAppStoreDistribution: 0x7fb6a7518a60>', team='<IDEProvisioningDisambiguatableBasicTeam: 0x7fb6a65a7a50; teamID='V22H44W47J', teamName='Ivan Vasilev', teamType='Individual', username='gans302@bk.ru', isFreeProvisioningTeam='0'>'>
 | 
			
		||||
	<IDEDistributionContext: 0x7fb6abbc5400; archive = '<IDEArchive: 0x7fb6a64e0fd0>', distributionMethod='<IDEDistributionMethodiOSAppStoreDistribution: 0x7fb6a7518a60>', team='(null)'>
 | 
			
		||||
	<IDEDistributionContext: 0x7fb69f26a3a0; archive = '<IDEArchive: 0x7fb6a64e0fd0>', distributionMethod='<IDEDistributionMethodiOSAppStoreDistribution: 0x7fb6a7518a60>', team='(null)'>
 | 
			
		||||
	<IDEDistributionContext: 0x7fb6a4a08270; archive = '<IDEArchive: 0x7fb6a64e0fd0>', distributionMethod='(null)', team='(null)'>
 | 
			
		||||
</IDEDistributionProcessingPipelineContext: 0x7fb6ac8eaf60>
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Processing step: IDEDistributionCreateDestRootStep
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Processing step: IDEDistributionCopyItemStep
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Running /usr/bin/ditto '-V' '/Users/cheykrym/Library/Developer/Xcode/Archives/2025-09-11/yobble (iOS) 11-09-2025, 6.21 PM.xcarchive/Products/Applications/yobble.app' '/var/folders/x7/f27pcjkx7vq8xtsxcbm7xjc40000gn/T/XcodeDistPipeline.~~~zlRpCa/Root/Payload/yobble.app'
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  >>> Copying /Users/cheykrym/Library/Developer/Xcode/Archives/2025-09-11/yobble (iOS) 11-09-2025, 6.21 PM.xcarchive/Products/Applications/yobble.app 
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  copying file ./_CodeSignature/CodeResources ... 
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  3019 bytes for ./_CodeSignature/CodeResources
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  copying file ./en.lproj/Localizable.strings ... 
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  2456 bytes for ./en.lproj/Localizable.strings
 | 
			
		||||
copying file ./yobble ... 
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  4018656 bytes for ./yobble
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  copying file ./Assets.car ... 
 | 
			
		||||
158191 bytes for ./Assets.car
 | 
			
		||||
copying file ./ru.lproj/Localizable.strings ... 
 | 
			
		||||
3332 bytes for ./ru.lproj/Localizable.strings
 | 
			
		||||
copying file ./embedded.mobileprovision ... 
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  12356 bytes for ./embedded.mobileprovision
 | 
			
		||||
copying file ./Info.plist ... 
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  1208 bytes for ./Info.plist
 | 
			
		||||
copying file ./PkgInfo ... 
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  8 bytes for ./PkgInfo
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  /usr/bin/ditto exited with 0
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Processing step: IDEDistributionEmbedProfileStep
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Processing step: IDEDistributionInfoPlistStep
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Skipping step: IDEDistributionInfoPlistStep because it said so
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Processing step: IDEDistributionItemRemovalStep
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Processing step: IDEDistributionAppThinningPlistStep
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Skipping step: IDEDistributionAppThinningPlistStep because it said so
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Processing step: IDEDistributionCompileBitcodeStep
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Skipping step: IDEDistributionCompileBitcodeStep because it said so
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Processing step: IDEDistributionCodeSlimmingStep
 | 
			
		||||
2025-09-11 3:24:26 PM +0000  Running /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/bitcode_strip '/var/folders/x7/f27pcjkx7vq8xtsxcbm7xjc40000gn/T/XcodeDistPipeline.~~~zlRpCa/Root/Payload/yobble.app/yobble' '-l' '-o' '/var/folders/x7/f27pcjkx7vq8xtsxcbm7xjc40000gn/T/XcodeDistPipeline.~~~zlRpCa/Root/Payload/yobble.app/yobble'
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/bitcode_strip exited with 0
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Processing step: IDEDistributionCopyBCSymbolMapsStep
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Skipping step: IDEDistributionCopyBCSymbolMapsStep because it said so
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Processing step: IDEDistributionSymbolsStep
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Skipping step: IDEDistributionSymbolsStep because it said so
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Processing step: IDEDistributionCopyAppleProvidedContentStep
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Processing step: IDEDistributionAppThinningStep
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Skipping step: IDEDistributionAppThinningStep because it said so
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Processing step: IDEDistributionArchThinningStep
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Running /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo '/var/folders/x7/f27pcjkx7vq8xtsxcbm7xjc40000gn/T/XcodeDistPipeline.~~~zlRpCa/Root/Payload/yobble.app/yobble' '-verify_arch' 'arm64e'
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo exited with 1
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Skipping architecture thinning for item "yobble" because arch "arm64e" wasn't found
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Processing step: IDEDistributionODRStep
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Processing step: IDEDistributionStripXattrsStep
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Running /usr/bin/xattr '-crs' '/var/folders/x7/f27pcjkx7vq8xtsxcbm7xjc40000gn/T/XcodeDistPipeline.~~~zlRpCa/Root/Payload/yobble.app'
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  /usr/bin/xattr exited with 0
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Processing step: IDEDistributionCodesignStep
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Entitlements for <IDEDistributionItem: 0x7fb6a7552d30; bundleID='org.yobble.app', path='<DVTFilePath:0x7fb6a54245f0:'/Users/cheykrym/Library/Developer/Xcode/Archives/2025-09-11/yobble (iOS) 11-09-2025, 6.21 PM.xcarchive/Products/Applications/yobble.app'>', codeSigningInfo='<_DVTCodeSigningInformation_Path: 0x7fb6a77d1050; isSigned='1', isAdHocSigned='0', signingCertificate='<DVTSigningCertificate: 0x7fb6abb18900; name='Apple Development: Ivan Vasilev (L76X27FJQR)', hash='C32900D3361E172AE5E38C5C959734ED34DB40C4', serialNumber='<DVTSigningCertificateSerialNumber: 0x7fb6a755e8e0>', certificateKinds='(
 | 
			
		||||
    "1.2.840.113635.100.6.1.12",
 | 
			
		||||
    "1.2.840.113635.100.6.1.2"
 | 
			
		||||
), issueDate='2025-09-11 3:11:14 PM +0000''>', entitlements='{
 | 
			
		||||
    "application-identifier" = "V22H44W47J.org.yobble.app";
 | 
			
		||||
    "com.apple.developer.team-identifier" = V22H44W47J;
 | 
			
		||||
    "get-task-allow" = 1;
 | 
			
		||||
    "keychain-access-groups" =     (
 | 
			
		||||
        "V22H44W47J.org.yobble.app"
 | 
			
		||||
    );
 | 
			
		||||
}', teamID='V22H44W47J', identifier='org.yobble.app', executablePath='<DVTFilePath:0x7fb6a753f430:'/Users/cheykrym/Library/Developer/Xcode/Archives/2025-09-11/yobble (iOS) 11-09-2025, 6.21 PM.xcarchive/Products/Applications/yobble.app/yobble'>', hardenedRuntime='0'>'>: {
 | 
			
		||||
    "application-identifier" = "V22H44W47J.org.yobble.app";
 | 
			
		||||
    "beta-reports-active" = 1;
 | 
			
		||||
    "com.apple.developer.team-identifier" = V22H44W47J;
 | 
			
		||||
    "get-task-allow" = 0;
 | 
			
		||||
    "keychain-access-groups" =     (
 | 
			
		||||
        "V22H44W47J.org.yobble.app"
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Entitlements for <IDEDistributionItem: 0x7fb6a7552d30; bundleID='org.yobble.app', path='<DVTFilePath:0x7fb6a54245f0:'/Users/cheykrym/Library/Developer/Xcode/Archives/2025-09-11/yobble (iOS) 11-09-2025, 6.21 PM.xcarchive/Products/Applications/yobble.app'>', codeSigningInfo='<_DVTCodeSigningInformation_Path: 0x7fb6a77d1050; isSigned='1', isAdHocSigned='0', signingCertificate='<DVTSigningCertificate: 0x7fb6abbc47f0; name='Apple Development: Ivan Vasilev (L76X27FJQR)', hash='C32900D3361E172AE5E38C5C959734ED34DB40C4', serialNumber='<DVTSigningCertificateSerialNumber: 0x7fb6a7505660>', certificateKinds='(
 | 
			
		||||
    "1.2.840.113635.100.6.1.12",
 | 
			
		||||
    "1.2.840.113635.100.6.1.2"
 | 
			
		||||
), issueDate='2025-09-11 3:11:14 PM +0000''>', entitlements='{
 | 
			
		||||
    "application-identifier" = "V22H44W47J.org.yobble.app";
 | 
			
		||||
    "com.apple.developer.team-identifier" = V22H44W47J;
 | 
			
		||||
    "get-task-allow" = 1;
 | 
			
		||||
    "keychain-access-groups" =     (
 | 
			
		||||
        "V22H44W47J.org.yobble.app"
 | 
			
		||||
    );
 | 
			
		||||
}', teamID='V22H44W47J', identifier='org.yobble.app', executablePath='<DVTFilePath:0x7fb6a753f430:'/Users/cheykrym/Library/Developer/Xcode/Archives/2025-09-11/yobble (iOS) 11-09-2025, 6.21 PM.xcarchive/Products/Applications/yobble.app/yobble'>', hardenedRuntime='0'>'> are: {
 | 
			
		||||
    "application-identifier" = "V22H44W47J.org.yobble.app";
 | 
			
		||||
    "beta-reports-active" = 1;
 | 
			
		||||
    "com.apple.developer.team-identifier" = V22H44W47J;
 | 
			
		||||
    "get-task-allow" = 0;
 | 
			
		||||
    "keychain-access-groups" =     (
 | 
			
		||||
        "V22H44W47J.org.yobble.app"
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Writing entitlements for <IDEDistributionItem: 0x7fb6a7552d30; bundleID='org.yobble.app', path='<DVTFilePath:0x7fb6a54245f0:'/Users/cheykrym/Library/Developer/Xcode/Archives/2025-09-11/yobble (iOS) 11-09-2025, 6.21 PM.xcarchive/Products/Applications/yobble.app'>', codeSigningInfo='<_DVTCodeSigningInformation_Path: 0x7fb6a77d1050; isSigned='1', isAdHocSigned='0', signingCertificate='<DVTSigningCertificate: 0x7fb6abb56d00; name='Apple Development: Ivan Vasilev (L76X27FJQR)', hash='C32900D3361E172AE5E38C5C959734ED34DB40C4', serialNumber='<DVTSigningCertificateSerialNumber: 0x7fb6a7523c10>', certificateKinds='(
 | 
			
		||||
    "1.2.840.113635.100.6.1.12",
 | 
			
		||||
    "1.2.840.113635.100.6.1.2"
 | 
			
		||||
), issueDate='2025-09-11 3:11:14 PM +0000''>', entitlements='{
 | 
			
		||||
    "application-identifier" = "V22H44W47J.org.yobble.app";
 | 
			
		||||
    "com.apple.developer.team-identifier" = V22H44W47J;
 | 
			
		||||
    "get-task-allow" = 1;
 | 
			
		||||
    "keychain-access-groups" =     (
 | 
			
		||||
        "V22H44W47J.org.yobble.app"
 | 
			
		||||
    );
 | 
			
		||||
}', teamID='V22H44W47J', identifier='org.yobble.app', executablePath='<DVTFilePath:0x7fb6a753f430:'/Users/cheykrym/Library/Developer/Xcode/Archives/2025-09-11/yobble (iOS) 11-09-2025, 6.21 PM.xcarchive/Products/Applications/yobble.app/yobble'>', hardenedRuntime='0'>'> to: /var/folders/x7/f27pcjkx7vq8xtsxcbm7xjc40000gn/T/XcodeDistPipeline.~~~zlRpCa/entitlements~~~aLbbbI
 | 
			
		||||
2025-09-11 3:24:27 PM +0000  Running /usr/bin/codesign '-vvv' '--force' '--sign' 'F228000CAD4A5F5EDC27722D23EE01FEC1DE310F' '--entitlements' '/var/folders/x7/f27pcjkx7vq8xtsxcbm7xjc40000gn/T/XcodeDistPipeline.~~~zlRpCa/entitlements~~~aLbbbI' '--preserve-metadata=identifier,flags,runtime' '/var/folders/x7/f27pcjkx7vq8xtsxcbm7xjc40000gn/T/XcodeDistPipeline.~~~zlRpCa/Root/Payload/yobble.app'
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  /var/folders/x7/f27pcjkx7vq8xtsxcbm7xjc40000gn/T/XcodeDistPipeline.~~~zlRpCa/Root/Payload/yobble.app: signed app bundle with Mach-O thin (arm64) [org.yobble.app]
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  /usr/bin/codesign exited with 0
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  Processing step: IDEDistributionZipODRItemStep
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  Skipping step: IDEDistributionZipODRItemStep because it said so
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  Processing step: IDEDistributionCreateIPAStep
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  Running /usr/bin/ditto '-V' '-c' '-k' '--norsrc' '/var/folders/x7/f27pcjkx7vq8xtsxcbm7xjc40000gn/T/XcodeDistPipeline.~~~zlRpCa/Root' '/var/folders/x7/f27pcjkx7vq8xtsxcbm7xjc40000gn/T/XcodeDistPipeline.~~~zlRpCa/Packages/yobble.ipa'
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  >>> Copying /var/folders/x7/f27pcjkx7vq8xtsxcbm7xjc40000gn/T/XcodeDistPipeline.~~~zlRpCa/Root 
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  copying file ./Payload/yobble.app/_CodeSignature/CodeResources ... 
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  3019 bytes for ./Payload/yobble.app/_CodeSignature/CodeResources
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  copying file ./Payload/yobble.app/en.lproj/Localizable.strings ... 
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  2456 bytes for ./Payload/yobble.app/en.lproj/Localizable.strings
 | 
			
		||||
copying file ./Payload/yobble.app/yobble ... 
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  3387872 bytes for ./Payload/yobble.app/yobble
 | 
			
		||||
copying file ./Payload/yobble.app/Assets.car ... 
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  158191 bytes for ./Payload/yobble.app/Assets.car
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  copying file ./Payload/yobble.app/ru.lproj/Localizable.strings ... 
 | 
			
		||||
3332 bytes for ./Payload/yobble.app/ru.lproj/Localizable.strings
 | 
			
		||||
copying file ./Payload/yobble.app/embedded.mobileprovision ... 
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  12203 bytes for ./Payload/yobble.app/embedded.mobileprovision
 | 
			
		||||
copying file ./Payload/yobble.app/Info.plist ... 
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  1208 bytes for ./Payload/yobble.app/Info.plist
 | 
			
		||||
copying file ./Payload/yobble.app/PkgInfo ... 
 | 
			
		||||
8 bytes for ./Payload/yobble.app/PkgInfo
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  /usr/bin/ditto exited with 0
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  Processing step: IDEDistributionAppStoreInformationStep
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  Skipping step: IDEDistributionAppStoreInformationStep because it said so
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  Processing step: IDEDistributionGenerateProcessedDistributionItems
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  IDEDistributionItem init <DVTFilePath:0x7fb6ac89d0a0:'/var/folders/x7/f27pcjkx7vq8xtsxcbm7xjc40000gn/T/XcodeDistPipeline.~~~zlRpCa/Root/Payload/yobble.app'>
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  Processing step: IDEDistributionCreateManifestStep
 | 
			
		||||
2025-09-11 3:24:31 PM +0000  Skipping step: IDEDistributionCreateManifestStep because it said so
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								Shared/Services/yobble (iOS) 2025-09-11 6-24-34 PM/yobble.ipa
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -1,32 +1,87 @@
 | 
			
		||||
import Foundation
 | 
			
		||||
import Combine
 | 
			
		||||
import UIKit // Для доступа к UIScreen
 | 
			
		||||
 | 
			
		||||
class NewHomeTabViewModel: ObservableObject {
 | 
			
		||||
    @Published var posts: [Post] = []
 | 
			
		||||
    @Published var isLoading = true
 | 
			
		||||
    @Published var isRefreshing = false
 | 
			
		||||
    @Published var column1Posts: [Post] = []
 | 
			
		||||
    @Published var column2Posts: [Post] = []
 | 
			
		||||
    @Published var isLoading: Bool = false
 | 
			
		||||
    @Published var isRefreshing: Bool = false
 | 
			
		||||
    
 | 
			
		||||
    private var hasLoadedData = false
 | 
			
		||||
    private var allPosts: [Post] = []
 | 
			
		||||
    private let postService = PostService.shared
 | 
			
		||||
    
 | 
			
		||||
    // Рассчитываем ширину колонки один раз
 | 
			
		||||
    private let columnWidth = (UIScreen.main.bounds.width - 14) / 2
 | 
			
		||||
    
 | 
			
		||||
    func fetchDataIfNeeded() {
 | 
			
		||||
        guard !hasLoadedData else { return }
 | 
			
		||||
        refreshData()
 | 
			
		||||
        guard allPosts.isEmpty else { return }
 | 
			
		||||
        fetchData()
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    func refreshData() {
 | 
			
		||||
        DispatchQueue.main.async {
 | 
			
		||||
            self.isRefreshing = true
 | 
			
		||||
        isRefreshing = true
 | 
			
		||||
        fetchData()
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
        PostService.shared.fetchAllPosts { [weak self] fetchedPosts in
 | 
			
		||||
    private func fetchData() {
 | 
			
		||||
        if !isRefreshing {
 | 
			
		||||
            isLoading = true
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        postService.fetchAllPosts { [weak self] posts in
 | 
			
		||||
            guard let self = self else { return }
 | 
			
		||||
            
 | 
			
		||||
            DispatchQueue.main.async {
 | 
			
		||||
                self.posts = fetchedPosts
 | 
			
		||||
            // Добавляем задержку в 0.5 секунды, чтобы дать UI время на подготовку
 | 
			
		||||
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
 | 
			
		||||
                self.allPosts = posts
 | 
			
		||||
                self.distributePosts()
 | 
			
		||||
                self.isLoading = false
 | 
			
		||||
                self.hasLoadedData = true
 | 
			
		||||
                self.isRefreshing = false
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private func distributePosts() {
 | 
			
		||||
        var tempColumn1Posts: [Post] = []
 | 
			
		||||
        var tempColumn2Posts: [Post] = []
 | 
			
		||||
        var column1Height: CGFloat = 0
 | 
			
		||||
        var column2Height: CGFloat = 0
 | 
			
		||||
        
 | 
			
		||||
        for post in allPosts {
 | 
			
		||||
            let postHeight = calculatePostHeight(for: post)
 | 
			
		||||
            
 | 
			
		||||
            // Добавляем пост в более короткую колонку
 | 
			
		||||
            if column1Height <= column2Height {
 | 
			
		||||
                tempColumn1Posts.append(post)
 | 
			
		||||
                column1Height += postHeight
 | 
			
		||||
            } else {
 | 
			
		||||
                tempColumn2Posts.append(post)
 | 
			
		||||
                column2Height += postHeight
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        self.column1Posts = tempColumn1Posts
 | 
			
		||||
        self.column2Posts = tempColumn2Posts
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private func calculatePostHeight(for post: Post) -> CGFloat {
 | 
			
		||||
        guard let media = post.media.first,
 | 
			
		||||
              let width = media.width,
 | 
			
		||||
              let height = media.height,
 | 
			
		||||
              width > 0 else {
 | 
			
		||||
            // Возвращаем стандартную высоту для постов без медиа или с неверными данными
 | 
			
		||||
            return columnWidth
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        // Рассчитываем высоту изображения на основе его пропорций
 | 
			
		||||
        let aspectRatio = CGFloat(height) / CGFloat(width)
 | 
			
		||||
        let imageHeight = columnWidth * aspectRatio
 | 
			
		||||
        
 | 
			
		||||
        // Здесь можно добавить примерную высоту для текста, если нужно
 | 
			
		||||
        // Например, + 50-70 поинтов для заголовка, автора и кнопок
 | 
			
		||||
        // Для простоты пока будем ориентироваться только на высоту картинки
 | 
			
		||||
        return imageHeight
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								Shared/Views/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Shared/Views/Tab/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@ -3,13 +3,8 @@ import SwiftUI
 | 
			
		||||
struct NewHomeTab: View {
 | 
			
		||||
    @ObservedObject var viewModel: NewHomeTabViewModel
 | 
			
		||||
    
 | 
			
		||||
    private var column1Posts: [Post] {
 | 
			
		||||
        viewModel.posts.enumerated().filter { $0.offset % 2 == 0 }.map { $0.element }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private var column2Posts: [Post] {
 | 
			
		||||
        viewModel.posts.enumerated().filter { $0.offset % 2 != 0 }.map { $0.element }
 | 
			
		||||
    }
 | 
			
		||||
    // Ширина колонки теперь вычисляется в ViewModel, но нам она нужна и здесь для PostGridItem
 | 
			
		||||
    private let columnWidth = (UIScreen.main.bounds.width - 14) / 2
 | 
			
		||||
    
 | 
			
		||||
    var body: some View {
 | 
			
		||||
        VStack {
 | 
			
		||||
@ -21,13 +16,13 @@ struct NewHomeTab: View {
 | 
			
		||||
                }) {
 | 
			
		||||
                    HStack(alignment: .top, spacing: 6) {
 | 
			
		||||
                        LazyVStack(spacing: 6) {
 | 
			
		||||
                            ForEach(column1Posts) { post in
 | 
			
		||||
                                PostGridItem(post: post)
 | 
			
		||||
                            ForEach(viewModel.column1Posts) { post in
 | 
			
		||||
                                PostGridItem(post: post, width: columnWidth)
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        LazyVStack(spacing: 6) {
 | 
			
		||||
                            ForEach(column2Posts) { post in
 | 
			
		||||
                                PostGridItem(post: post)
 | 
			
		||||
                            ForEach(viewModel.column2Posts) { post in
 | 
			
		||||
                                PostGridItem(post: post, width: columnWidth)
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
@ -38,25 +33,112 @@ struct NewHomeTab: View {
 | 
			
		||||
        .onAppear {
 | 
			
		||||
            viewModel.fetchDataIfNeeded()
 | 
			
		||||
        }
 | 
			
		||||
        .background(Color(.secondarySystemBackground)) // Фон для всей вкладки
 | 
			
		||||
//        .background(Color(.secondarySystemBackground)) // Фон для всей вкладки
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct PostGridItem: View {
 | 
			
		||||
    let post: Post
 | 
			
		||||
    let width: CGFloat // Ширина элемента
 | 
			
		||||
    
 | 
			
		||||
    private var randomHeight: CGFloat {
 | 
			
		||||
        CGFloat.random(in: 150...300)
 | 
			
		||||
    @State private var isNavigationActive = false // Состояние для программной навигации
 | 
			
		||||
 | 
			
		||||
    // Формируем URL для загрузки изображения
 | 
			
		||||
    private var imageURL: URL? {
 | 
			
		||||
        // Используем picsum.photos для получения уникального изображения для каждого поста
 | 
			
		||||
        // Используем реальные размеры для большей вариативности
 | 
			
		||||
        if let media = post.media.first, let w = media.width, let h = media.height {
 | 
			
		||||
            return URL(string: "https://picsum.photos/seed/\(post.id.uuidString)/\(w)/\(h)")
 | 
			
		||||
        }
 | 
			
		||||
        return URL(string: "https://picsum.photos/seed/\(post.id.uuidString)/400/400")
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Вычисляем высоту изображения на основе данных из модели
 | 
			
		||||
    private var imageHeight: CGFloat {
 | 
			
		||||
        guard let media = post.media.first,
 | 
			
		||||
              let mediaWidth = media.width,
 | 
			
		||||
              let mediaHeight = media.height,
 | 
			
		||||
              mediaWidth > 0 else {
 | 
			
		||||
            return width // Возвращаем 1:1, если данных нет
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        let aspectRatio = CGFloat(mediaHeight) / CGFloat(mediaWidth)
 | 
			
		||||
        return width * aspectRatio
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    var body: some View {
 | 
			
		||||
        ZStack {
 | 
			
		||||
            // Невидимая ссылка для навигации, активируемая состоянием
 | 
			
		||||
            NavigationLink(destination: PostDetailView(post: post), isActive: $isNavigationActive) {
 | 
			
		||||
                EmptyView()
 | 
			
		||||
            }
 | 
			
		||||
            .opacity(0)
 | 
			
		||||
 | 
			
		||||
            // Видимый контент карточки
 | 
			
		||||
            VStack(alignment: .leading, spacing: 0) { // Убираем отступ между картинкой и текстом
 | 
			
		||||
                            
 | 
			
		||||
                // 1. Медиа контент
 | 
			
		||||
            if let _ = post.media.first {
 | 
			
		||||
                Image("placeholderPhoto")
 | 
			
		||||
                    .resizable()
 | 
			
		||||
                    .aspectRatio(contentMode: .fill)
 | 
			
		||||
                    .frame(height: randomHeight)
 | 
			
		||||
                if let url = imageURL {
 | 
			
		||||
                    // Создаем контейнер с четкими границами, чтобы избежать перекрытия
 | 
			
		||||
                    Color.clear
 | 
			
		||||
                        .frame(width: width, height: imageHeight) // Используем вычисленную высоту
 | 
			
		||||
                        .background(
 | 
			
		||||
                            RemoteImageView(url: url)
 | 
			
		||||
                                .scaledToFill()
 | 
			
		||||
                        )
 | 
			
		||||
                        .clipped()
 | 
			
		||||
                        .overlay(
 | 
			
		||||
                            // Наложение для дополнительной информации
 | 
			
		||||
                            ZStack {
 | 
			
		||||
                                // Верхний ряд: дата и иконка видео
 | 
			
		||||
                                VStack {
 | 
			
		||||
                                    HStack {
 | 
			
		||||
                                        Text(post.createdAt, style: .relative)
 | 
			
		||||
                                            .font(.caption2)
 | 
			
		||||
                                            .foregroundColor(.white)
 | 
			
		||||
                                            .padding(.horizontal, 6)
 | 
			
		||||
                                            .padding(.vertical, 3)
 | 
			
		||||
                                            .background(Color.black.opacity(0.5))
 | 
			
		||||
                                            .clipShape(Capsule())
 | 
			
		||||
                                        
 | 
			
		||||
                                        Spacer()
 | 
			
		||||
                                        
 | 
			
		||||
                                        if post.isVideo {
 | 
			
		||||
                                            Image(systemName: "play.circle.fill")
 | 
			
		||||
                                                .font(.title3)
 | 
			
		||||
                                                .foregroundColor(.white)
 | 
			
		||||
                                                .shadow(radius: 2)
 | 
			
		||||
                                        }
 | 
			
		||||
                                    }
 | 
			
		||||
                                    Spacer()
 | 
			
		||||
                                }
 | 
			
		||||
                                .padding(6)
 | 
			
		||||
                                
 | 
			
		||||
                                // Нижний ряд: просмотры
 | 
			
		||||
                                VStack {
 | 
			
		||||
                                    Spacer()
 | 
			
		||||
                                    HStack {
 | 
			
		||||
                                        HStack(spacing: 4) {
 | 
			
		||||
                                            Image(systemName: "eye.fill")
 | 
			
		||||
                                            Text("\(post.views)")
 | 
			
		||||
                                        }
 | 
			
		||||
                                        .font(.caption2)
 | 
			
		||||
                                        .foregroundColor(.white)
 | 
			
		||||
                                        .padding(.horizontal, 6)
 | 
			
		||||
                                        .padding(.vertical, 3)
 | 
			
		||||
                                        .background(Color.black.opacity(0.5))
 | 
			
		||||
                                        .clipShape(Capsule())
 | 
			
		||||
                                        
 | 
			
		||||
                                        Spacer()
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                                .padding(6)
 | 
			
		||||
                            }
 | 
			
		||||
                        )
 | 
			
		||||
                        .contentShape(Rectangle()) // Указываем форму для жеста
 | 
			
		||||
                        .onTapGesture {
 | 
			
		||||
                            isNavigationActive = true // Активируем навигацию по тапу на картинку
 | 
			
		||||
                        }
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                // Контейнер для текста, который создает эффект "расширения"
 | 
			
		||||
@ -66,12 +148,17 @@ struct PostGridItem: View {
 | 
			
		||||
                        Text(title)
 | 
			
		||||
                            .font(.subheadline)
 | 
			
		||||
                            .lineLimit(2)
 | 
			
		||||
                            .contentShape(Rectangle()) // И по тапу на заголовок
 | 
			
		||||
                            .onTapGesture {
 | 
			
		||||
                                isNavigationActive = true
 | 
			
		||||
                            }
 | 
			
		||||
                    }
 | 
			
		||||
                    
 | 
			
		||||
                    // 3. Информация об авторе и лайки
 | 
			
		||||
                    HStack {
 | 
			
		||||
                        
 | 
			
		||||
                        Button(action: {
 | 
			
		||||
                            print("account \(post.id)")
 | 
			
		||||
                            // пока ничего не делаем
 | 
			
		||||
                        }) {
 | 
			
		||||
                            HStack(spacing: 4) {
 | 
			
		||||
@ -85,11 +172,12 @@ struct PostGridItem: View {
 | 
			
		||||
                                .foregroundColor(.primary)
 | 
			
		||||
                        }
 | 
			
		||||
                        }
 | 
			
		||||
                    .contentShape(Rectangle())
 | 
			
		||||
                        // .buttonStyle больше не нужен, т.к. нет конфликта
 | 
			
		||||
 | 
			
		||||
                        Spacer()
 | 
			
		||||
 | 
			
		||||
                        Button(action: {
 | 
			
		||||
                            print("like \(post.id)")
 | 
			
		||||
                            // пока ничего не делаем
 | 
			
		||||
                        }) {
 | 
			
		||||
                            HStack(spacing: 4) {
 | 
			
		||||
@ -100,7 +188,6 @@ struct PostGridItem: View {
 | 
			
		||||
                                .foregroundColor(.primary)
 | 
			
		||||
                        }
 | 
			
		||||
                        }
 | 
			
		||||
                    .contentShape(Rectangle())
 | 
			
		||||
                        
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
@ -112,3 +199,4 @@ struct PostGridItem: View {
 | 
			
		||||
            .shadow(color: Color.black.opacity(0.1), radius: 5, x: 0, y: 2)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								Shared/Views/Tab/Profile/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@ -30,13 +30,12 @@
 | 
			
		||||
		1A7940F02DF7B7A3002569DA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1A7940F22DF7B7A3002569DA /* Localizable.strings */; };
 | 
			
		||||
		1A79410C2DF7C81D002569DA /* RegistrationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A79410B2DF7C81D002569DA /* RegistrationView.swift */; };
 | 
			
		||||
		1A9B014B2E4BF3CD00887E0B /* NewHomeTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A9B014A2E4BF3CD00887E0B /* NewHomeTab.swift */; };
 | 
			
		||||
		1A9B01582E4BF50D00887E0B /* placeholderVideo.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = 1A9B01572E4BF50D00887E0B /* placeholderVideo.mp4 */; };
 | 
			
		||||
		1A9B015F2E4BF9C000887E0B /* placeholderPhotoSquare.png in Resources */ = {isa = PBXBuildFile; fileRef = 1A9B015D2E4BF9C000887E0B /* placeholderPhotoSquare.png */; };
 | 
			
		||||
		1A9B01602E4BF9C000887E0B /* placeholderPhoto.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1A9B015E2E4BF9C000887E0B /* placeholderPhoto.jpg */; };
 | 
			
		||||
		1A9B01662E4BFA3600887E0B /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1A9B01652E4BFA3600887E0B /* Media.xcassets */; };
 | 
			
		||||
		1A9B016E2E4BFB9000887E0B /* NewHomeTabViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A9B016D2E4BFB9000887E0B /* NewHomeTabViewModel.swift */; };
 | 
			
		||||
		1A9B017C2E4C087F00887E0B /* SideMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A9B017B2E4C087F00887E0B /* SideMenuView.swift */; };
 | 
			
		||||
		1A9E4FB32E4D6A67002249D6 /* ThemeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A9E4FB22E4D6A67002249D6 /* ThemeManager.swift */; };
 | 
			
		||||
		1A9E4FD72E4E47EF002249D6 /* RemoteImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A9E4FD62E4E47EF002249D6 /* RemoteImageView.swift */; };
 | 
			
		||||
		1A9E4FDF2E4E4AA1002249D6 /* ImageCacheManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A9E4FDE2E4E4AA1002249D6 /* ImageCacheManager.swift */; };
 | 
			
		||||
		1AB4F8CD2E22E341002B6E40 /* AccountShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AB4F8CC2E22E341002B6E40 /* AccountShareSheet.swift */; };
 | 
			
		||||
		1AB4F8F32E22EC9F002B6E40 /* FollowersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AB4F8F22E22EC9F002B6E40 /* FollowersView.swift */; };
 | 
			
		||||
		1AB4F8F72E22ECAC002B6E40 /* FollowingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AB4F8F62E22ECAC002B6E40 /* FollowingView.swift */; };
 | 
			
		||||
@ -85,13 +84,12 @@
 | 
			
		||||
		1A7940F72DF7B7EC002569DA /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; };
 | 
			
		||||
		1A79410B2DF7C81D002569DA /* RegistrationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegistrationView.swift; sourceTree = "<group>"; };
 | 
			
		||||
		1A9B014A2E4BF3CD00887E0B /* NewHomeTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewHomeTab.swift; sourceTree = "<group>"; };
 | 
			
		||||
		1A9B01572E4BF50D00887E0B /* placeholderVideo.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; name = placeholderVideo.mp4; path = ../../../../Volumes/Untitled/xcode/volnahub/Shared/Media/placeholderVideo.mp4; sourceTree = DEVELOPER_DIR; };
 | 
			
		||||
		1A9B015D2E4BF9C000887E0B /* placeholderPhotoSquare.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = placeholderPhotoSquare.png; path = ../../../../Volumes/Untitled/xcode/volnahub/Shared/Media/placeholderPhotoSquare.png; sourceTree = DEVELOPER_DIR; };
 | 
			
		||||
		1A9B015E2E4BF9C000887E0B /* placeholderPhoto.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = placeholderPhoto.jpg; path = ../../../../Volumes/Untitled/xcode/volnahub/Shared/Media/placeholderPhoto.jpg; sourceTree = DEVELOPER_DIR; };
 | 
			
		||||
		1A9B01652E4BFA3600887E0B /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = "<group>"; };
 | 
			
		||||
		1A9B016D2E4BFB9000887E0B /* NewHomeTabViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewHomeTabViewModel.swift; sourceTree = "<group>"; };
 | 
			
		||||
		1A9B017B2E4C087F00887E0B /* SideMenuView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SideMenuView.swift; sourceTree = "<group>"; };
 | 
			
		||||
		1A9E4FB22E4D6A67002249D6 /* ThemeManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeManager.swift; sourceTree = "<group>"; };
 | 
			
		||||
		1A9E4FD62E4E47EF002249D6 /* RemoteImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoteImageView.swift; sourceTree = "<group>"; };
 | 
			
		||||
		1A9E4FDE2E4E4AA1002249D6 /* ImageCacheManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageCacheManager.swift; sourceTree = "<group>"; };
 | 
			
		||||
		1AB4F8CC2E22E341002B6E40 /* AccountShareSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountShareSheet.swift; sourceTree = "<group>"; };
 | 
			
		||||
		1AB4F8F22E22EC9F002B6E40 /* FollowersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowersView.swift; sourceTree = "<group>"; };
 | 
			
		||||
		1AB4F8F62E22ECAC002B6E40 /* FollowingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowingView.swift; sourceTree = "<group>"; };
 | 
			
		||||
@ -229,6 +227,7 @@
 | 
			
		||||
		1A7940E52DF7B341002569DA /* Services */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				1A9E4FDE2E4E4AA1002249D6 /* ImageCacheManager.swift */,
 | 
			
		||||
				1A9E4FB22E4D6A67002249D6 /* ThemeManager.swift */,
 | 
			
		||||
				1A7940E12DF7B1C5002569DA /* KeychainService.swift */,
 | 
			
		||||
			);
 | 
			
		||||
@ -247,9 +246,6 @@
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				1A9B01652E4BFA3600887E0B /* Media.xcassets */,
 | 
			
		||||
				1A9B015E2E4BF9C000887E0B /* placeholderPhoto.jpg */,
 | 
			
		||||
				1A9B015D2E4BF9C000887E0B /* placeholderPhotoSquare.png */,
 | 
			
		||||
				1A9B01572E4BF50D00887E0B /* placeholderVideo.mp4 */,
 | 
			
		||||
			);
 | 
			
		||||
			path = Media;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
@ -257,6 +253,7 @@
 | 
			
		||||
		1AB7F5132E32EBF1003756F3 /* Components */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				1A9E4FD62E4E47EF002249D6 /* RemoteImageView.swift */,
 | 
			
		||||
				1AB7F5142E32EC1C003756F3 /* RefreshableScrollView.swift */,
 | 
			
		||||
				1AB7F5152E32EC1C003756F3 /* TopBarView.swift */,
 | 
			
		||||
			);
 | 
			
		||||
@ -402,12 +399,9 @@
 | 
			
		||||
			isa = PBXResourcesBuildPhase;
 | 
			
		||||
			buildActionMask = 2147483647;
 | 
			
		||||
			files = (
 | 
			
		||||
				1A9B01582E4BF50D00887E0B /* placeholderVideo.mp4 in Resources */,
 | 
			
		||||
				1A7940912DF77BC3002569DA /* Assets.xcassets in Resources */,
 | 
			
		||||
				1A7940F02DF7B7A3002569DA /* Localizable.strings in Resources */,
 | 
			
		||||
				1A9B01602E4BF9C000887E0B /* placeholderPhoto.jpg in Resources */,
 | 
			
		||||
				1A9B01662E4BFA3600887E0B /* Media.xcassets in Resources */,
 | 
			
		||||
				1A9B015F2E4BF9C000887E0B /* placeholderPhotoSquare.png in Resources */,
 | 
			
		||||
			);
 | 
			
		||||
			runOnlyForDeploymentPostprocessing = 0;
 | 
			
		||||
		};
 | 
			
		||||
@ -429,10 +423,12 @@
 | 
			
		||||
				1AEE5EAB2E21A83200A3DCA3 /* HomeTab.swift in Sources */,
 | 
			
		||||
				1ACE60F82E22F3DC00B37AC5 /* SettingsView.swift in Sources */,
 | 
			
		||||
				1AD757CD2E27608C0069C1FD /* PostFeedView.swift in Sources */,
 | 
			
		||||
				1A9E4FD72E4E47EF002249D6 /* RemoteImageView.swift in Sources */,
 | 
			
		||||
				1A9B017C2E4C087F00887E0B /* SideMenuView.swift in Sources */,
 | 
			
		||||
				1A7940C62DF7A98E002569DA /* ContactsTab.swift in Sources */,
 | 
			
		||||
				1ACE61092E22F57100B37AC5 /* AppPreferencesView.swift in Sources */,
 | 
			
		||||
				1ACE61052E22F56800B37AC5 /* SecuritySettingsView.swift in Sources */,
 | 
			
		||||
				1A9E4FDF2E4E4AA1002249D6 /* ImageCacheManager.swift in Sources */,
 | 
			
		||||
				1A9B016E2E4BFB9000887E0B /* NewHomeTabViewModel.swift in Sources */,
 | 
			
		||||
				1A7940E72DF7B5E5002569DA /* SplashScreenView.swift in Sources */,
 | 
			
		||||
				1A7940B02DF77E26002569DA /* LoginView.swift in Sources */,
 | 
			
		||||
@ -610,9 +606,9 @@
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 | 
			
		||||
				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 | 
			
		||||
				CODE_SIGN_IDENTITY = "Apple Development";
 | 
			
		||||
				CODE_SIGN_STYLE = Automatic;
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 1337;
 | 
			
		||||
				CODE_SIGN_IDENTITY = "iPhone Distribution";
 | 
			
		||||
				CODE_SIGN_STYLE = Manual;
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 1339;
 | 
			
		||||
				DEVELOPMENT_TEAM = V22H44W47J;
 | 
			
		||||
				ENABLE_PREVIEWS = YES;
 | 
			
		||||
				INFOPLIST_FILE = iOS/Info.plist;
 | 
			
		||||
@ -624,7 +620,7 @@
 | 
			
		||||
				MARKETING_VERSION = 0.1;
 | 
			
		||||
				PRODUCT_BUNDLE_IDENTIFIER = org.yobble.app;
 | 
			
		||||
				PRODUCT_NAME = yobble;
 | 
			
		||||
				PROVISIONING_PROFILE_SPECIFIER = "";
 | 
			
		||||
				PROVISIONING_PROFILE_SPECIFIER = distrib;
 | 
			
		||||
				SDKROOT = iphoneos;
 | 
			
		||||
				SWIFT_VERSION = 5.0;
 | 
			
		||||
				TARGETED_DEVICE_FAMILY = "1,2";
 | 
			
		||||
@ -636,9 +632,9 @@
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 | 
			
		||||
				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 | 
			
		||||
				CODE_SIGN_IDENTITY = "Apple Development";
 | 
			
		||||
				CODE_SIGN_STYLE = Automatic;
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 1337;
 | 
			
		||||
				CODE_SIGN_IDENTITY = "iPhone Distribution";
 | 
			
		||||
				CODE_SIGN_STYLE = Manual;
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 1339;
 | 
			
		||||
				DEVELOPMENT_TEAM = V22H44W47J;
 | 
			
		||||
				ENABLE_PREVIEWS = YES;
 | 
			
		||||
				INFOPLIST_FILE = iOS/Info.plist;
 | 
			
		||||
@ -650,7 +646,7 @@
 | 
			
		||||
				MARKETING_VERSION = 0.1;
 | 
			
		||||
				PRODUCT_BUNDLE_IDENTIFIER = org.yobble.app;
 | 
			
		||||
				PRODUCT_NAME = yobble;
 | 
			
		||||
				PROVISIONING_PROFILE_SPECIFIER = "";
 | 
			
		||||
				PROVISIONING_PROFILE_SPECIFIER = distrib;
 | 
			
		||||
				SDKROOT = iphoneos;
 | 
			
		||||
				SWIFT_VERSION = 5.0;
 | 
			
		||||
				TARGETED_DEVICE_FAMILY = "1,2";
 | 
			
		||||
 | 
			
		||||