+				05B87D5F228E94AA0098FE87 /* Kingfisher.framework in Frameworks */,
615 598
 				0505AD0B21DF348F00404071 /* libc++.tbd in Frameworks */,
599
+				05B87D60228E94AC0098FE87 /* ObjectMapper.framework in Frameworks */,
616 600
 				0505AD0A21DF347400404071 /* CFNetwork.framework in Frameworks */,
617 601
 				050D7187225317AD0076CE06 /* Paiai_iOS.framework in Frameworks */,
602
+				05B87D61228E94E90098FE87 /* PullToRefresh.framework in Frameworks */,
603
+				05B87D5E228E94A70098FE87 /* Alamofire.framework in Frameworks */,
618 604
 				0505AD0921DF345E00404071 /* Security.framework in Frameworks */,
605
+				05B87D62228E94EB0098FE87 /* RxCocoa.framework in Frameworks */,
619 606
 				0505AD0621DF342F00404071 /* libz.tbd in Frameworks */,
620 607
 				050D7181225317AD0076CE06 /* PaiaiUIKit.framework in Frameworks */,
608
+				05B87D63228E94EE0098FE87 /* RxDataSources.framework in Frameworks */,
621 609
 				050D7183225317AD0076CE06 /* PaiaiDataKit.framework in Frameworks */,
622
-				051310B421CB5EC3004EF1BE /* Kingfisher.framework in Frameworks */,
623
-				052BF1C821E344020010D270 /* PullToRefresh.framework in Frameworks */,
624
-				0513109C21CA4103004EF1BE /* Alamofire.framework in Frameworks */,
625
-				0513109F21CA4103004EF1BE /* ObjectMapper.framework in Frameworks */,
626
-				051310A221CA4103004EF1BE /* RxCocoa.framework in Frameworks */,
627
-				051310A421CA4103004EF1BE /* RxSwift.framework in Frameworks */,
628
-				051310A621CA4103004EF1BE /* SQLite.framework in Frameworks */,
629 610
 			);
630 611
 			runOnlyForDeploymentPostprocessing = 0;
631 612
 		};
@@ -1260,15 +1241,6 @@
1260 1241
 		6CEBD0F61CA8D680004DBDE0 = {
1261 1242
 			isa = PBXGroup;
1262 1243
 			children = (
1263
-				050D719A22531B860076CE06 /* RxSwift.framework */,
1264
-				050D719C22531BA60076CE06 /* SQLite.framework */,
1265
-				050D719822531B780076CE06 /* RxCocoa.framework */,
1266
-				050D719622531B650076CE06 /* PullToRefresh.framework */,
1267
-				050D719422531B520076CE06 /* ObjectMapper.framework */,
1268
-				050D719322531B440076CE06 /* Kingfisher.framework */,
1269
-				050D719122531B360076CE06 /* Alamofire.framework */,
1270
-				050D718F22531B180076CE06 /* Kingfisher.framework */,
1271
-				050D718D22531AF40076CE06 /* RxDataSources.framework */,
1272 1244
 				05130FBB21C9F707004EF1BE /* Cartfile */,
1273 1245
 				3864C06C1CAD27EC0048ADAD /* Swift-bridge.h */,
1274 1246
 				6CEBD1011CA8D680004DBDE0 /* Paiai */,
@@ -1295,7 +1267,6 @@
1295 1267
 		6CEBD1011CA8D680004DBDE0 /* Paiai */ = {
1296 1268
 			isa = PBXGroup;
1297 1269
 			children = (
1298
-				045F01541DED33DC00B80C87 /* Paiai.entitlements */,
1299 1270
 				6CEBD1021CA8D680004DBDE0 /* AppDelegate.swift */,
1300 1271
 				6CEBD10E1CA8D680004DBDE0 /* Info.plist */,
1301 1272
 				A69FFB8C1E7018CC0006FEE0 /* LaunchScreen.storyboard */,
@@ -1308,7 +1279,15 @@
1308 1279
 		7737858CEE753530C312F2CB /* Frameworks */ = {
1309 1280
 			isa = PBXGroup;
1310 1281
 			children = (
1311
-				052BF1C721E344020010D270 /* PullToRefresh.framework */,
1282
+				05B87D6E228EA2820098FE87 /* Differentiator.framework */,
1283
+				05B87D6C228E9F140098FE87 /* RxRelay.framework */,
1284
+				05DFDBEC228BE53100F4A7F7 /* Alamofire.framework */,
1285
+				05DFDBED228BE53100F4A7F7 /* Kingfisher.framework */,
1286
+				05DFDBF1228BE53200F4A7F7 /* ObjectMapper.framework */,
1287
+				05DFDBF0228BE53100F4A7F7 /* PullToRefresh.framework */,
1288
+				05DFDBEF228BE53100F4A7F7 /* RxCocoa.framework */,
1289
+				05DFDBEB228BE53100F4A7F7 /* RxDataSources.framework */,
1290
+				05DFDBEE228BE53100F4A7F7 /* RxSwift.framework */,
1312 1291
 				0505AD0421DF109E00404071 /* libz.tbd */,
1313 1292
 				0505AD0221DF108300404071 /* CFNetwork.framework */,
1314 1293
 				0505AD0021DF107D00404071 /* CoreTelephony.framework */,
@@ -1316,17 +1295,6 @@
1316 1295
 				0505ACFC21DF106E00404071 /* libc++.tbd */,
1317 1296
 				0505ACFA21DF106000404071 /* libsqlite3.0.tbd */,
1318 1297
 				0505ACF821DF104500404071 /* SystemConfiguration.framework */,
1319
-				051310B321CB5EC3004EF1BE /* Kingfisher.framework */,
1320
-				0513106121CA22B5004EF1BE /* Alamofire.framework */,
1321
-				05130FC921CA1997004EF1BE /* ObjectMapper.framework */,
1322
-				05130FC621CA1997004EF1BE /* RxAtomic.framework */,
1323
-				05130FC521CA1997004EF1BE /* RxBlocking.framework */,
1324
-				05130FC221CA1997004EF1BE /* RxCocoa.framework */,
1325
-				05130FC421CA1997004EF1BE /* RxDataSources.framework */,
1326
-				05130FC321CA1997004EF1BE /* RxSwift.framework */,
1327
-				05130FC721CA1997004EF1BE /* RxTest.framework */,
1328
-				05130FC821CA1997004EF1BE /* SQLite.framework */,
1329
-				05130FBD21CA194B004EF1BE /* Differentiator.framework */,
1330 1298
 			);
1331 1299
 			name = Frameworks;
1332 1300
 			sourceTree = "<group>";
@@ -1427,6 +1395,7 @@
1427 1395
 				05130F8A21C9E5E8004EF1BE /* Sources */,
1428 1396
 				05130F8B21C9E5E8004EF1BE /* Frameworks */,
1429 1397
 				05130F8C21C9E5E8004EF1BE /* Resources */,
1398
+				05B87D5B228E94260098FE87 /* CopyFiles */,
1430 1399
 			);
1431 1400
 			buildRules = (
1432 1401
 			);
@@ -1497,7 +1466,7 @@
1497 1466
 								enabled = 0;
1498 1467
 							};
1499 1468
 							com.apple.Keychain = {
1500
-								enabled = 1;
1469
+								enabled = 0;
1501 1470
 							};
1502 1471
 							com.apple.Maps.iOS = {
1503 1472
 								enabled = 0;
@@ -1564,6 +1533,7 @@
1564 1533
 			buildActionMask = 2147483647;
1565 1534
 			files = (
1566 1535
 				05E80E3021DF65D5006368C4 /* Assets.xcassets in Resources */,
1536
+				05BEBE3E228E51D800541855 /* LaunchScreen.storyboard in Resources */,
1567 1537
 			);
1568 1538
 			runOnlyForDeploymentPostprocessing = 0;
1569 1539
 		};
@@ -1575,8 +1545,9 @@
1575 1545
 			buildActionMask = 12;
1576 1546
 			files = (
1577 1547
 			);
1548
+			inputFileListPaths = (
1549
+			);
1578 1550
 			inputPaths = (
1579
-				"$(SRCROOT)/Carthage/Build/iOS/SQLite.framework",
1580 1551
 				"$(SRCROOT)/Carthage/Build/iOS/RxCocoa.framework",
1581 1552
 				"$(SRCROOT)/Carthage/Build/iOS/RxSwift.framework",
1582 1553
 				"$(SRCROOT)/Carthage/Build/iOS/RxDataSources.framework",
@@ -1584,21 +1555,24 @@
1584 1555
 				"$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework",
1585 1556
 				"$(SRCROOT)/Carthage/Build/iOS/Kingfisher.framework",
1586 1557
 				"$(SRCROOT)/Carthage/Build/iOS/PullToRefresh.framework",
1558
+				"$(SRCROOT)/Carthage/Build/iOS/Differentiator.framework",
1559
+				"$(SRCROOT)/Carthage/Build/iOS/RxRelay.framework",
1587 1560
 			);
1588 1561
 			name = "Run Script";
1589 1562
 			outputPaths = (
1590
-				"$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/SQLite.framework",
1591
-				"$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/RxCocoa.framework",
1592 1563
 				"$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/RxSwift.framework",
1593 1564
 				"$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/RxDataSources.framework",
1594 1565
 				"$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/ObjectMapper.framework",
1595 1566
 				"$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Alamofire.framework",
1596 1567
 				"$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Kingfisher.framework",
1597 1568
 				"$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/PullToRefresh.framework",
1569
+				"$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/RxCocoa.framework",
1570
+				"$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Differentiator.framework",
1571
+				"$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/RxRelay.framework",
1598 1572
 			);
1599 1573
 			runOnlyForDeploymentPostprocessing = 0;
1600 1574
 			shellPath = /bin/sh;
1601
-			shellScript = "/usr/local/bin/carthage copy-frameworks\n";
1575
+			shellScript = "/usr/local/bin/carthage copy-frameworks\n\n#!/usr/bin/env bash\n\nAPP_PATH=\"${TARGET_BUILD_DIR}/${WRAPPER_NAME}\"\n\n# This script loops through the frameworks embedded in the application and\n# removes unused architectures.\nfind \"$APP_PATH\" -name '*.framework' -type d | while read -r FRAMEWORK\ndo\nFRAMEWORK_EXECUTABLE_NAME=$(defaults read \"$FRAMEWORK/Info.plist\" CFBundleExecutable)\nFRAMEWORK_EXECUTABLE_PATH=\"$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME\"\n\nif [ ! -f \"${FRAMEWORK_EXECUTABLE_PATH}\" ]; then\ncontinue\nfi\n\nif xcrun lipo -info \"${FRAMEWORK_EXECUTABLE_PATH}\" | grep --silent \"Non-fat\"; then\necho \"Framework non-fat, skipping: $FRAMEWORK_EXECUTABLE_NAME\"\ncontinue\nfi\n\necho \"Thinning framework $FRAMEWORK_EXECUTABLE_NAME\"\n\nEXTRACTED_ARCHS=()\n\nfor ARCH in $ARCHS\ndo\necho \"Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME\"\nxcrun lipo -extract \"$ARCH\" \"$FRAMEWORK_EXECUTABLE_PATH\" -o \"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\"\nEXTRACTED_ARCHS+=(\"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\")\ndone\n\necho \"Merging extracted architectures: ${ARCHS}\"\nxcrun lipo -o \"$FRAMEWORK_EXECUTABLE_PATH-merged\" -create \"${EXTRACTED_ARCHS[@]}\"\nrm \"${EXTRACTED_ARCHS[@]}\"\n\necho \"Replacing original executable with thinned version\"\nrm \"$FRAMEWORK_EXECUTABLE_PATH\"\nmv \"$FRAMEWORK_EXECUTABLE_PATH-merged\" \"$FRAMEWORK_EXECUTABLE_PATH\"\ndone\n";
1602 1576
 		};
1603 1577
 /* End PBXShellScriptBuildPhase section */
1604 1578
 
@@ -1912,6 +1886,10 @@
1912 1886
 				DYLIB_COMPATIBILITY_VERSION = 1;
1913 1887
 				DYLIB_CURRENT_VERSION = 1;
1914 1888
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
1889
+				FRAMEWORK_SEARCH_PATHS = (
1890
+					"$(inherited)",
1891
+					"$(PROJECT_DIR)/Carthage/Build/iOS",
1892
+				);
1915 1893
 				GCC_C_LANGUAGE_STANDARD = gnu11;
1916 1894
 				INFOPLIST_FILE = PaiaiUIKit/Info.plist;
1917 1895
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -1952,7 +1930,12 @@
1952 1930
 				DYLIB_COMPATIBILITY_VERSION = 1;
1953 1931
 				DYLIB_CURRENT_VERSION = 1;
1954 1932
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
1933
+				FRAMEWORK_SEARCH_PATHS = (
1934
+					"$(inherited)",
1935
+					"$(PROJECT_DIR)/Carthage/Build/iOS",
1936
+				);
1955 1937
 				GCC_C_LANGUAGE_STANDARD = gnu11;
1938
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
1956 1939
 				INFOPLIST_FILE = PaiaiUIKit/Info.plist;
1957 1940
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1958 1941
 				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
@@ -1967,6 +1950,7 @@
1967 1950
 				SKIP_INSTALL = YES;
1968 1951
 				SWIFT_VERSION = 5.0;
1969 1952
 				TARGETED_DEVICE_FAMILY = 1;
1953
+				VALID_ARCHS = "arm64 arm64e armv7s";
1970 1954
 				VERSIONING_SYSTEM = "apple-generic";
1971 1955
 				VERSION_INFO_PREFIX = "";
1972 1956
 			};
@@ -1994,12 +1978,14 @@
1994 1978
 				FRAMEWORK_SEARCH_PATHS = (
1995 1979
 					"$(inherited)",
1996 1980
 					"$(PROJECT_DIR)/Carthage/Build/iOS",
1981
+					"$(PROJECT_DIR)",
1997 1982
 				);
1998 1983
 				GCC_C_LANGUAGE_STANDARD = gnu11;
1999 1984
 				HEADER_SEARCH_PATHS = "";
2000 1985
 				INFOPLIST_FILE = PaiaiDataKit/Info.plist;
2001 1986
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2002 1987
 				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
1988
+				LD_GENERATE_MAP_FILE = YES;
2003 1989
 				LD_RUNPATH_SEARCH_PATHS = (
2004 1990
 					"$(inherited)",
2005 1991
 					"@executable_path/Frameworks",
@@ -2047,12 +2033,15 @@
2047 2033
 				FRAMEWORK_SEARCH_PATHS = (
2048 2034
 					"$(inherited)",
2049 2035
 					"$(PROJECT_DIR)/Carthage/Build/iOS",
2036
+					"$(PROJECT_DIR)",
2050 2037
 				);
2051 2038
 				GCC_C_LANGUAGE_STANDARD = gnu11;
2039
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
2052 2040
 				HEADER_SEARCH_PATHS = "";
2053 2041
 				INFOPLIST_FILE = PaiaiDataKit/Info.plist;
2054 2042
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2055 2043
 				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
2044
+				LD_GENERATE_MAP_FILE = YES;
2056 2045
 				LD_RUNPATH_SEARCH_PATHS = (
2057 2046
 					"$(inherited)",
2058 2047
 					"@executable_path/Frameworks",
@@ -2069,6 +2058,7 @@
2069 2058
 				SWIFT_OBJC_BRIDGING_HEADER = "";
2070 2059
 				SWIFT_VERSION = 5.0;
2071 2060
 				TARGETED_DEVICE_FAMILY = "1,2";
2061
+				VALID_ARCHS = "arm64 arm64e armv7s";
2072 2062
 				VERSIONING_SYSTEM = "apple-generic";
2073 2063
 				VERSION_INFO_PREFIX = "";
2074 2064
 			};
@@ -2094,6 +2084,7 @@
2094 2084
 				FRAMEWORK_SEARCH_PATHS = (
2095 2085
 					"$(inherited)",
2096 2086
 					"$(PROJECT_DIR)/Carthage/Build/iOS",
2087
+					"$(PROJECT_DIR)",
2097 2088
 				);
2098 2089
 				GCC_C_LANGUAGE_STANDARD = gnu11;
2099 2090
 				INFOPLIST_FILE = Paiai_iOS/Info.plist;
@@ -2112,6 +2103,7 @@
2112 2103
 				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
2113 2104
 				SWIFT_VERSION = 5.0;
2114 2105
 				TARGETED_DEVICE_FAMILY = 1;
2106
+				VALID_ARCHS = "arm64 arm64e armv7s";
2115 2107
 				VERSIONING_SYSTEM = "apple-generic";
2116 2108
 				VERSION_INFO_PREFIX = "";
2117 2109
 			};
@@ -2138,8 +2130,10 @@
2138 2130
 				FRAMEWORK_SEARCH_PATHS = (
2139 2131
 					"$(inherited)",
2140 2132
 					"$(PROJECT_DIR)/Carthage/Build/iOS",
2133
+					"$(PROJECT_DIR)",
2141 2134
 				);
2142 2135
 				GCC_C_LANGUAGE_STANDARD = gnu11;
2136
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
2143 2137
 				INFOPLIST_FILE = Paiai_iOS/Info.plist;
2144 2138
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2145 2139
 				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
@@ -2154,6 +2148,7 @@
2154 2148
 				SKIP_INSTALL = YES;
2155 2149
 				SWIFT_VERSION = 5.0;
2156 2150
 				TARGETED_DEVICE_FAMILY = 1;
2151
+				VALID_ARCHS = "arm64 arm64e armv7s";
2157 2152
 				VERSIONING_SYSTEM = "apple-generic";
2158 2153
 				VERSION_INFO_PREFIX = "";
2159 2154
 			};
@@ -2209,6 +2204,7 @@
2209 2204
 				GCC_WARN_UNUSED_FUNCTION = YES;
2210 2205
 				GCC_WARN_UNUSED_VARIABLE = YES;
2211 2206
 				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
2207
+				LD_GENERATE_MAP_FILE = YES;
2212 2208
 				MTL_ENABLE_DEBUG_INFO = YES;
2213 2209
 				ONLY_ACTIVE_ARCH = YES;
2214 2210
 				OTHER_LDFLAGS = (
@@ -2264,6 +2260,7 @@
2264 2260
 				GCC_WARN_UNUSED_FUNCTION = YES;
2265 2261
 				GCC_WARN_UNUSED_VARIABLE = YES;
2266 2262
 				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
2263
+				LD_GENERATE_MAP_FILE = YES;
2267 2264
 				MTL_ENABLE_DEBUG_INFO = NO;
2268 2265
 				OTHER_LDFLAGS = (
2269 2266
 					"-Objc",
@@ -2284,17 +2281,17 @@
2284 2281
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
2285 2282
 				CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
2286 2283
 				CLANG_ENABLE_MODULES = NO;
2287
-				CODE_SIGN_ENTITLEMENTS = PaiAi/PaiAi.entitlements;
2288 2284
 				CODE_SIGN_IDENTITY = "iPhone Developer";
2289 2285
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
2290 2286
 				CODE_SIGN_STYLE = Automatic;
2291 2287
 				DEFINES_MODULE = YES;
2292
-				DEVELOPMENT_TEAM = RSJ4N8U2LM;
2288
+				DEVELOPMENT_TEAM = Q38447SL4M;
2293 2289
 				ENABLE_BITCODE = NO;
2294 2290
 				FRAMEWORK_SEARCH_PATHS = (
2295 2291
 					"$(inherited)",
2296 2292
 					"$(PROJECT_DIR)/Paiai",
2297 2293
 					"$(PROJECT_DIR)/Carthage/Build/iOS",
2294
+					"$(PROJECT_DIR)",
2298 2295
 				);
2299 2296
 				GCC_PREFIX_HEADER = "";
2300 2297
 				GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
@@ -2305,6 +2302,7 @@
2305 2302
 				);
2306 2303
 				INFOPLIST_FILE = PaiAi/Info.plist;
2307 2304
 				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
2305
+				LD_GENERATE_MAP_FILE = YES;
2308 2306
 				LD_RUNPATH_SEARCH_PATHS = (
2309 2307
 					"$(inherited)",
2310 2308
 					"@executable_path/Frameworks",
@@ -2315,6 +2313,7 @@
2315 2313
 				);
2316 2314
 				MACH_O_TYPE = mh_execute;
2317 2315
 				ONLY_ACTIVE_ARCH = YES;
2316
+				OTHER_CODE_SIGN_FLAGS = "--deep";
2318 2317
 				OTHER_LDFLAGS = "-all_load";
2319 2318
 				OTHER_SWIFT_FLAGS = "-DDEBUG";
2320 2319
 				PRODUCT_BUNDLE_IDENTIFIER = com.PaiAi.PaiAi;
@@ -2335,18 +2334,19 @@
2335 2334
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
2336 2335
 				CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
2337 2336
 				CLANG_ENABLE_MODULES = NO;
2338
-				CODE_SIGN_ENTITLEMENTS = PaiAi/PaiAi.entitlements;
2339 2337
 				CODE_SIGN_IDENTITY = "iPhone Developer";
2340 2338
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
2341 2339
 				CODE_SIGN_STYLE = Automatic;
2342 2340
 				DEBUG_INFORMATION_FORMAT = dwarf;
2343 2341
 				DEFINES_MODULE = YES;
2344
-				DEVELOPMENT_TEAM = RSJ4N8U2LM;
2342
+				DEVELOPMENT_TEAM = Q38447SL4M;
2345 2343
 				FRAMEWORK_SEARCH_PATHS = (
2346 2344
 					"$(inherited)",
2347 2345
 					"$(PROJECT_DIR)/Paiai",
2348 2346
 					"$(PROJECT_DIR)/Carthage/Build/iOS",
2347
+					"$(PROJECT_DIR)",
2349 2348
 				);
2349
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
2350 2350
 				GCC_PREFIX_HEADER = "";
2351 2351
 				HEADER_SEARCH_PATHS = (
2352 2352
 					"$(PROJECT_DIR)/Paiai/wxSDK/WXApi.h",
@@ -2355,6 +2355,7 @@
2355 2355
 				);
2356 2356
 				INFOPLIST_FILE = PaiAi/Info.plist;
2357 2357
 				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
2358
+				LD_GENERATE_MAP_FILE = YES;
2358 2359
 				LD_RUNPATH_SEARCH_PATHS = (
2359 2360
 					"$(inherited)",
2360 2361
 					"@executable_path/Frameworks",
@@ -2365,6 +2366,7 @@
2365 2366
 				);
2366 2367
 				MACH_O_TYPE = mh_execute;
2367 2368
 				ONLY_ACTIVE_ARCH = YES;
2369
+				OTHER_CODE_SIGN_FLAGS = "--deep";
2368 2370
 				OTHER_LDFLAGS = "-all_load";
2369 2371
 				OTHER_SWIFT_FLAGS = "";
2370 2372
 				PRODUCT_BUNDLE_IDENTIFIER = com.PaiAi.PaiAi;
@@ -2374,6 +2376,7 @@
2374 2376
 				SWIFT_OBJC_BRIDGING_HEADER = "Swift-bridge.h";
2375 2377
 				SWIFT_VERSION = 5.0;
2376 2378
 				USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/**";
2379
+				VALID_ARCHS = "arm64 arm64e armv7s";
2377 2380
 			};
2378 2381
 			name = Release;
2379 2382
 		};

BIN
PaiAi/Paiai.xcodeproj/project.xcworkspace/xcuserdata/FFIB.xcuserdatad/UserInterfaceState.xcuserstate


+ 0 - 12
PaiAi/Paiai.xcodeproj/xcuserdata/FFIB.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -2,16 +2,4 @@
2 2
 <Bucket
3 3
    type = "1"
4 4
    version = "2.0">
5
-   <Breakpoints>
6
-      <BreakpointProxy
7
-         BreakpointExtensionID = "Xcode.Breakpoint.ExceptionBreakpoint">
8
-         <BreakpointContent
9
-            shouldBeEnabled = "Yes"
10
-            ignoreCount = "0"
11
-            continueAfterRunningActions = "No"
12
-            scope = "0"
13
-            stopOnStyle = "0">
14
-         </BreakpointContent>
15
-      </BreakpointProxy>
16
-   </Breakpoints>
17 5
 </Bucket>

+ 2 - 2
PaiAi/Paiai.xcodeproj/xcuserdata/FFIB.xcuserdatad/xcschemes/PaiAi.xcscheme

@@ -104,10 +104,10 @@
104 104
       </BuildableProductRunnable>
105 105
    </ProfileAction>
106 106
    <AnalyzeAction
107
-      buildConfiguration = "Debug">
107
+      buildConfiguration = "Release">
108 108
    </AnalyzeAction>
109 109
    <ArchiveAction
110
-      buildConfiguration = "Debug"
110
+      buildConfiguration = "Release"
111 111
       revealArchiveInOrganizer = "YES">
112 112
    </ArchiveAction>
113 113
 </Scheme>

BIN
PaiAi/Paiai/Assets.xcassets/.DS_Store


BIN
PaiAi/Paiai/Assets.xcassets/module/login/guide1.imageset/8778FB9773576108C6D5109F23D69C69.png


BIN
PaiAi/Paiai/Assets.xcassets/module/login/guide2.imageset/A4494A157AB20FA47B8B96993319B3E9.png


BIN
PaiAi/Paiai/Assets.xcassets/module/login/guide3.imageset/862B9012863929D278CBEF1E3A118E6D.png


+ 1 - 1
PaiAi/Paiai/Info.plist

@@ -62,7 +62,7 @@
62 62
 		</dict>
63 63
 	</array>
64 64
 	<key>CFBundleVersion</key>
65
-	<string>1</string>
65
+	<string>3</string>
66 66
 	<key>LSApplicationCategoryType</key>
67 67
 	<string></string>
68 68
 	<key>LSApplicationQueriesSchemes</key>

+ 0 - 10
PaiAi/Paiai/Paiai.entitlements

@@ -1,10 +0,0 @@
1
-<?xml version="1.0" encoding="UTF-8"?>
2
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
-<plist version="1.0">
4
-<dict>
5
-	<key>keychain-access-groups</key>
6
-	<array>
7
-		<string>$(AppIdentifierPrefix)com.Paiai.Paiai</string>
8
-	</array>
9
-</dict>
10
-</plist>

+ 6 - 7
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/NetWork/NetworkApi.swift

@@ -31,10 +31,7 @@ class NetworkApi {
31 31
             return
32 32
         }
33 33
 
34
-        if err.isSessionDeinitializedError
35
-            || err.isSessionInvalidatedError
36
-            || err.isInvalidURLError
37
-            || err.isRequestAdaptationError {
34
+        if err.isInvalidURLError {
38 35
             Toast.show(message: "客户端网络请求出错")
39 36
         } else if err.isParameterEncoderError || err.isParameterEncodingError {
40 37
             Toast.show(message: "客户端参数编码出错")
@@ -46,9 +43,11 @@ class NetworkApi {
46 43
             Toast.show(message: "服务器返回数据出错")
47 44
         } else if err.isServerTrustEvaluationError {
48 45
             Toast.show(message: "服务器验证错误")
49
-        } else if err.isRequestRetryError {
50
-            Toast.show(message: "客户端重试出错")
51
-        } else if err.isExplicitlyCancelledError {
46
+        }
47
+//        else if err.isRequestRetryError {
48
+//            Toast.show(message: "客户端重试出错")
49
+//        }
50
+        else if err.isExplicitlyCancelledError {
52 51
             return
53 52
         } else {
54 53
             Toast.show(message: "网络出现未知错误")

+ 9 - 3
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/WXUserInfoRemoteAPI.swift

@@ -60,8 +60,8 @@ struct WXUserInfoRemoteAPI: UserInfoRemoteAPI {
60 60
                 }
61 61
                 switch errcode {
62 62
                 case 0:
63
-                    observer(.success(["appid": WXAppid, "secret": WXSecret,
64
-                                       "code": code, "grant_type": "authorization_code"]))
63
+                    return observer(.success(["appid": WXAppid, "secret": WXSecret,
64
+                                              "code": code, "grant_type": "authorization_code"]))
65 65
                 case -4:
66 66
                     Toast.show(message: "您拒绝授权,登录失败")
67 67
                 case -2:
@@ -89,12 +89,18 @@ struct WXUserInfoRemoteAPI: UserInfoRemoteAPI {
89 89
 
90 90
         return NetworkApi.share.get(resource: resource)
91 91
     }
92
+    
93
+    fileprivate func pareseWXUserInfo(json: JSON) -> [String: Any]? {
94
+        var data = json
95
+        data.removeValue(forKey: "privilege")
96
+        return data
97
+    }
92 98
 
93 99
     fileprivate func getWXUserInfo(param: [String: String]) -> Single<[String: Any]> {
94 100
         let resource = ContentResource<[String: Any]>(host: "https://api.weixin.qq.com",
95 101
                                                       path: .wxUserInfo,
96 102
                                                       parameter: param,
97
-                                                      parseJSON: { $0 })
103
+                                                      parseJSON: pareseWXUserInfo)
98 104
         return NetworkApi.share.get(resource: resource)
99 105
     }
100 106
 

+ 1 - 0
PaiAi/PaiaiDataKit/PaiaiDataKit.h

@@ -18,3 +18,4 @@ FOUNDATION_EXPORT const unsigned char PaiaiDataKitVersionString[];
18 18
 
19 19
 //微信SDK头文件
20 20
 #import "WXApi.h"
21
+#import "WechatAuthSDK.h"

+ 44 - 20
PaiAi/PaiaiDataKit/PresentLayer/PhotoDetail/PhotoDetailItemViewModel.swift

@@ -27,41 +27,65 @@ public final class PhotoDetailItemViewModel {
27 27
 
28 28
         self.item.subscribe(onNext: {[unowned self] (photoItem) in
29 29
             self.repository = PhotoDetailRepository(photoId: photoItem.photo_id, groupId: photoItem.group_id)
30
-            self.loadCommentItems().concat(self.loadThumbupUserItems()).subscribe(onCompleted: {
31
-                var val = self.item.value
32
-                val.comment_num = self.commentItems.value.count
33
-                val.thumbup_num = self.thumbupItems.value.count
34
-                self.item.accept(val)
35
-
36
-                let userInfo = [PhotoItemsOperator.key: PhotoItemsOperator.update(val.photo_id, val)]
37
-                NotificationCenter.default.post(name: .PhotoItemsChanged,
38
-                                                object: nil,
39
-                                                userInfo: userInfo)
40
-            }).disposed(by: self.disposeBag)
30
+            self.loadThumbupAndComment()
31
+//            Observable.zip(self.loadCommentItems(), self.loadThumbupUserItems()).subscribe(onNext: { _ in
32
+//                <#code#>
33
+//            }, onError: <#T##((Error) -> Void)?##((Error) -> Void)?##(Error) -> Void#>, onCompleted: <#T##(() -> Void)?##(() -> Void)?##() -> Void#>, onDisposed: <#T##(() -> Void)?##(() -> Void)?##() -> Void#>)
34
+//                .subscribe(onCompleted: {
35
+//
36
+//                var val = self.item.value
37
+//                val.comment_num = self.commentItems.value.count
38
+//                val.thumbup_num = self.thumbupItems.value.count
39
+//                self.item.accept(val)
40
+//
41
+//                let userInfo = [PhotoItemsOperator.key: PhotoItemsOperator.update(val.photo_id, val)]
42
+//                NotificationCenter.default.post(name: .PhotoItemsChanged,
43
+//                                                object: nil,
44
+//                                                userInfo: userInfo)
45
+//            }).disposed(by: self.disposeBag)
41 46
         }).disposed(by: disposeBag)
42 47
     }
43
-
44
-    private func loadThumbupUserItems() -> Completable {
45
-        return repository.loadThumbups().do(onSuccess: { (items) in
46
-            self.thumbupItems.accept(items)
47
-        }).asCompletable()
48
+    
49
+    private func loadThumbupAndComment() {
50
+        print(#function)
51
+        Single.zip(repository.loadComments(), repository.loadThumbups()).subscribe(onSuccess: {[unowned self] (commentItems, thumbupItems) in
52
+            self.commentItems.accept(commentItems)
53
+            self.thumbupItems.accept(thumbupItems)
54
+            self.update()
55
+        }).disposed(by: disposeBag)
56
+    }
57
+    
58
+    private func loadThumbupUserItems() -> Single<[PhotoThumbupUserItem]>  {
59
+        return repository.loadThumbups()
48 60
     }
49 61
 
50
-    private func loadCommentItems() -> Completable {
51
-        return repository.loadComments().do(onSuccess: { (items) in
52
-            self.commentItems.accept(items)
53
-        }).asCompletable()
62
+    private func loadCommentItems() -> Single<[PhotoCommentItem]>  {
63
+        return repository.loadComments()
64
+    }
65
+    
66
+    private func update() {
67
+        var val = self.item.value
68
+        val.comment_num = self.commentItems.value.count
69
+        val.thumbup_num = self.thumbupItems.value.count
70
+        let userInfo = [PhotoItemsOperator.key: PhotoItemsOperator.update(val.photo_id, val)]
71
+        NotificationCenter.default.post(name: .PhotoItemsChanged,
72
+                                        object: nil,
73
+                                        userInfo: userInfo)
54 74
     }
55 75
 
56 76
     public func submitThumbup() {
57 77
         repository.submitThumbup().subscribe(onSuccess: { items in
58 78
             self.thumbupItems.accept(items)
79
+            self.update()
59 80
         }).disposed(by: disposeBag)
60 81
     }
61 82
 
62 83
     public func submitComment(text: String) {
63 84
         repository.submitComment(text: text).subscribe(onSuccess: { (items) in
64 85
             self.commentItems.accept(items)
86
+            self.update()
65 87
         }).disposed(by: disposeBag)
66 88
     }
89
+    
90
+    
67 91
 }

+ 1 - 0
PaiAi/PaiaiDataKit/PresentLayer/PhotoDetail/PhotoDetailViewModel.swift

@@ -127,6 +127,7 @@ public final class PhotoDetailViewModel {
127 127
     }
128 128
 
129 129
     public func willShow(index: Int) {
130
+        print(index)
130 131
         currIndex = index
131 132
         _hasGetPrice.accept(false)
132 133
         itemViewModel.item.accept(_items.value[index])

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKit/WaterfallFlowLayout/WaterfallFlowLayout.swift

@@ -125,7 +125,7 @@ public final class WaterfallFlowLayout: UICollectionViewLayout {
125 125
     }
126 126
     
127 127
     /// called at collectionView reload
128
-    func setNeedsLayout() {
128
+    public func setNeedsLayout() {
129 129
         isNeedLayout = true
130 130
     }
131 131
 }

+ 6 - 1
PaiAi/Paiai_iOS/App/Home/HomeViewController.swift

@@ -31,6 +31,10 @@ final class HomeViewController: UIViewController {
31 31
     override func viewDidAppear(_ animated: Bool) {
32 32
         super.viewDidAppear(animated)
33 33
     }
34
+    
35
+    override func viewDidDisappear(_ animated: Bool) {
36
+        super.viewDidDisappear(animated)
37
+    }
34 38
 
35 39
     func initalize() {
36 40
         collectionView.register(UINib(nibName: "PhotoCell",
@@ -95,7 +99,8 @@ fileprivate extension HomeViewController {
95 99
 
96 100
     func bindViewModelToRefreshing() {
97 101
         viewModel.isLoading
98
-            .subscribe(onNext: {[unowned self] flag in
102
+            .asDriver(onErrorJustReturn: true)
103
+            .drive(onNext: {[unowned self] flag in
99 104
                 if flag {
100 105
                     self.collectionView.endRefreshing(at: .top)
101 106
                 } else {

paiai_ios - Gogs: Go Git Service

Brak opisu

Toast.swift 5.3KB

    // // Toast.swift // PaiaiUIKit // // Created by ffib on 2019/1/21. // Copyright © 2019 yb. All rights reserved. // import UIKit private let globalInstance = Toast() public class Toast { public enum ToastType { case text(String) case image(UIImage?) case imageWithText(UIImage?, String) case activityIndicator(String?) } public enum PresentationStyle { case center case custom(animator: ToastAnimator) var animator: ToastAnimator { switch self { case .center: return FadeToastAnimator() case let .custom(animator): return animator } } } public enum AnimationDuration { case none case duration(TimeInterval) } public struct Config { public init() {} public var toastType: ToastType = .text("") public var presentationStyle: PresentationStyle = .center public var duration: AnimationDuration = .duration(1) public var option: ToastOption = .default public static var `default`: Config { return Config() } } private var _toastView: ToastView? private var _config: Config = .default private var _task: DispatchWorkItem? } /// MARK: - APIS public extension Toast { func show(config: Config = .default, in view: UIView? = UIApplication.shared.keyWindow) { self._config = config if _toastView == nil { let toastView = ToastView(option: config.option, type: config.toastType) view?.addSubview(toastView) _toastView = toastView showAnimation() } else { if case let .duration(interval) = config.duration { if let task = _task { let _ = task.wait(timeout: .now() + interval) } else { self._task = DispatchWorkItem(block: { self.hideAnimation() }) DispatchQueue.main.asyncAfter(deadline: .now() + interval, execute: self._task!) } } else { _task?.cancel() _task = nil } _toastView?.option = config.option _toastView?.toastType = config.toastType _toastView?.switchToast() } } func show(message: String, in view: UIView? = UIApplication.shared.keyWindow) { var config = Config() config.toastType = .text(message) show(config: config, in: view) } func show(image: UIImage?, in view: UIView? = UIApplication.shared.keyWindow) { var config = Config() config.toastType = .image(image) show(config: config, in: view) } func show(message: String, image: UIImage?, in view: UIView? = UIApplication.shared.keyWindow) { var config = Config() config.toastType = .imageWithText(image, message) show(config: config, in: view) } func showActivity(message: String?, in view: UIView? = UIApplication.shared.keyWindow) { var config = Config() config.toastType = .activityIndicator(message) config.duration = .none show(config: config, in: view) } func hide() { hideAnimation() } private func showAnimation() { guard let _toastView = _toastView else { return } _config.presentationStyle.animator.toastIn(in: _toastView) {[weak self] _ in guard let `self` = self else { return } switch self._config.duration { case .none: break case let .duration(interval): self._task = DispatchWorkItem(block: { self.hideAnimation() }) DispatchQueue.main.asyncAfter(deadline: .now() + interval, execute: self._task!) break } } } private func hideAnimation() { guard let _toastView = _toastView else { return } _config.presentationStyle.animator.toastOut(in: _toastView) {[weak self] (flag) in guard let `self` = self else { return } self.clear() } } private func clear() { _toastView?.removeFromSuperview() _toastView = nil _task = nil } } /// MARK: - Static APIS public extension Toast { static var share: Toast { return globalInstance } static func show(config: Config = .default, in view: UIView? = UIApplication.shared.keyWindow) { globalInstance.show(config: config, in: view) } static func show(message: String, in view: UIView? = UIApplication.shared.keyWindow) { globalInstance.show(message: message, in: view) } static func show(image: UIImage?, in view: UIView? = UIApplication.shared.keyWindow) { globalInstance.show(image: image, in: view) } static func show(message: String, image: UIImage?, in view: UIView? = UIApplication.shared.keyWindow) { globalInstance.show(message: message, image: image, in: view) } static func showActivity(message: String?, in view: UIView? = UIApplication.shared.keyWindow) { globalInstance.showActivity(message: message, in: view) } static func hide() { globalInstance.hide() } }
kodo - Gogs: Go Git Service

Keine Beschreibung

pai2_supervisor.conf 287B

    [program:pai2] command=/home/paiai/env/bin/uwsgi --ini /home/paiai/work/pai2/pai2/uwsgi/pai2.ini autostart=true autorestart=true startretries=3 exitcodes=0,1,2 stopsignal=QUIT stdout_logfile=/var/log/supervisor_pai2_access.log stderr_logfile=/var/log/supervisor_pai2_error.log user=paiai