diff --git a/app/Gemfile.lock b/app/Gemfile.lock
index 72d8b6b94..e1c7f3f8c 100644
--- a/app/Gemfile.lock
+++ b/app/Gemfile.lock
@@ -23,7 +23,7 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.4.0)
- aws-partitions (1.1212.0)
+ aws-partitions (1.1213.0)
aws-sdk-core (3.242.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
diff --git a/app/ios/Podfile b/app/ios/Podfile
index e033f03f8..51a4d824f 100755
--- a/app/ios/Podfile
+++ b/app/ios/Podfile
@@ -4,11 +4,15 @@ source "https://cdn.cocoapods.org/"
unless ENV["E2E_TESTING"] == "1"
source "https://github.com/SumSubstance/Specs.git"
- # Enable Fisherman (Device Intelligence) module
+ # Enable Fisherman (Device Intelligence) module for fraud detection
+ # Privacy: Device ID collection declared in app/ios/PrivacyInfo.xcprivacy
ENV["IDENSIC_WITH_FISHERMAN"] = "true"
- # Enable VideoIdent module
- ENV["IDENSIC_WITH_VIDEOIDENT"] = "true"
+ # VideoIdent module disabled for current release
+ # This feature provides liveness checks via live video calls with human agents
+ # Disabled to avoid microphone permission requirements on both platforms
+ # TODO: Re-enable for future release when liveness checks are needed
+ # ENV["IDENSIC_WITH_VIDEOIDENT"] = "true"
end
use_frameworks!
diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock
index cfff6c54e..93577e3df 100644
--- a/app/ios/Podfile.lock
+++ b/app/ios/Podfile.lock
@@ -158,11 +158,6 @@ PODS:
- IdensicMobileSDK/Fisherman (1.40.2):
- FingerprintPro (~> 2.11)
- IdensicMobileSDK/Core
- - IdensicMobileSDK/VideoIdent (1.40.2):
- - IdensicMobileSDK/VideoIdent-latest
- - IdensicMobileSDK/VideoIdent-latest (1.40.2):
- - IdensicMobileSDK/Core
- - TwilioVideo (>= 5.8.2)
- lottie-ios (4.5.0)
- lottie-react-native (7.2.2):
- DoubleConversion
@@ -1554,7 +1549,6 @@ PODS:
- react-native-mobilesdk-module (1.40.2):
- IdensicMobileSDK (= 1.40.2)
- IdensicMobileSDK/Fisherman (= 1.40.2)
- - IdensicMobileSDK/VideoIdent (= 1.40.2)
- React-Core
- react-native-netinfo (11.4.1):
- React-Core
@@ -2152,7 +2146,7 @@ PODS:
- ReactCommon/turbomodule/core
- Sentry/HybridSDK (= 8.53.2)
- Yoga
- - RNSVG (15.15.1):
+ - RNSVG (15.12.1):
- DoubleConversion
- glog
- hermes-engine
@@ -2172,9 +2166,9 @@ PODS:
- ReactCodegen
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- - RNSVG/common (= 15.15.1)
+ - RNSVG/common (= 15.12.1)
- Yoga
- - RNSVG/common (15.15.1):
+ - RNSVG/common (15.12.1):
- DoubleConversion
- glog
- hermes-engine
@@ -2204,7 +2198,6 @@ PODS:
- React-Core
- SwiftQRScanner (1.1.6)
- SwiftyTesseract (3.1.3)
- - TwilioVideo (5.11.1)
- Yoga (0.0.0)
DEPENDENCIES:
@@ -2346,7 +2339,6 @@ SPEC REPOS:
- Sentry
- SocketRocket
- SwiftyTesseract
- - TwilioVideo
EXTERNAL SOURCES:
boost:
@@ -2624,7 +2616,7 @@ SPEC CHECKSUMS:
react-native-cloud-storage: 8d89f2bc574cf11068dfd90933905974087fb9e9
react-native-compat: b80530ebcd3d574be5dd99cb27b984a17c119abc
react-native-get-random-values: d16467cf726c618e9c7a8c3c39c31faa2244bbba
- react-native-mobilesdk-module: 4770cb45fdd19dc4eed04615f0fcdab013b3dfe2
+ react-native-mobilesdk-module: 08c16fea2be97669f8e4c38153106e5fe698126a
react-native-netinfo: cec9c4e86083cb5b6aba0e0711f563e2fbbff187
react-native-nfc-manager: c8891e460b4943b695d63f7f4effc6345bbefc83
react-native-passkey: 8853c3c635164864da68a6dbbcec7148506c3bcf
@@ -2671,16 +2663,15 @@ SPEC CHECKSUMS:
RNReactNativeHapticFeedback: e526ac4a7ca9fb23c7843ea4fd7d823166054c73
RNScreens: 806e1449a8ec63c2a4e4cf8a63cc80203ccda9b8
RNSentry: f79dd124cc49088445c16d23955860dd0d1db6f3
- RNSVG: 8cd7dadbe9bdc7d70872910dbe611c8e0f4597bb
+ RNSVG: 0c1fc3e7b147949dc15644845e9124947ac8c9bb
segment-analytics-react-native: 0eae155b0e9fa560fa6b17d78941df64537c35b7
Sentry: 59993bffde4a1ac297ba6d268dc4bbce068d7c1b
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
sovran-react-native: a3ad3f8ff90c2002b2aa9790001a78b0b0a38594
SwiftQRScanner: e85a25f9b843e9231dab89a96e441472fe54a724
SwiftyTesseract: 1f3d96668ae92dc2208d9842c8a59bea9fad2cbb
- TwilioVideo: 9f51085d4e4fb3aff8e168b8215b31cb0f486a2f
Yoga: 1259c7a8cbaccf7b4c3ddf8ee36ca11be9dee407
-PODFILE CHECKSUM: 8cfd84595c3e826f512f5c545d232a27f1850ff3
+PODFILE CHECKSUM: ced4db0072978f965783277bc810af9a7bebe695
COCOAPODS: 1.16.2
diff --git a/app/ios/PrivacyInfo.xcprivacy b/app/ios/PrivacyInfo.xcprivacy
index 41b8317f0..a40e21da8 100644
--- a/app/ios/PrivacyInfo.xcprivacy
+++ b/app/ios/PrivacyInfo.xcprivacy
@@ -30,7 +30,20 @@
NSPrivacyCollectedDataTypes
-
+
+
+ NSPrivacyCollectedDataType
+ NSPrivacyCollectedDataTypeDeviceID
+ NSPrivacyCollectedDataTypeLinked
+
+ NSPrivacyCollectedDataTypeTracking
+
+ NSPrivacyCollectedDataTypePurposes
+
+ NSPrivacyCollectedDataTypePurposeFraudPreventionAndSecurity
+
+
+
NSPrivacyTracking
diff --git a/app/ios/Self.xcodeproj/project.pbxproj b/app/ios/Self.xcodeproj/project.pbxproj
index fee740bae..181d48af7 100644
--- a/app/ios/Self.xcodeproj/project.pbxproj
+++ b/app/ios/Self.xcodeproj/project.pbxproj
@@ -306,14 +306,10 @@
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Self/Pods-Self-resources-${CONFIGURATION}-input-files.xcfilelist",
);
- inputPaths = (
- );
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Self/Pods-Self-resources-${CONFIGURATION}-output-files.xcfilelist",
);
- outputPaths = (
- );
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Self/Pods-Self-resources.sh\"\n";
@@ -349,14 +345,10 @@
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Self/Pods-Self-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
- inputPaths = (
- );
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Self/Pods-Self-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
- outputPaths = (
- );
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Self/Pods-Self-frameworks.sh\"\n";
@@ -371,8 +363,6 @@
"$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)",
);
name = "[CP-User] [RNFB] Core Configuration";
- outputPaths = (
- );
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##########################################################################\n##########################################################################\n#\n# NOTE THAT IF YOU CHANGE THIS FILE YOU MUST RUN pod install AFTERWARDS\n#\n# This file is installed as an Xcode build script in the project file\n# by cocoapods, and you will not see your changes until you pod install\n#\n##########################################################################\n##########################################################################\n\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_analytics_storage\n _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_analytics_storage\")\n if [[ $_ANALYTICS_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_storage\n _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_storage\")\n if [[ $_ANALYTICS_AD_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_user_data\n _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_user_data\")\n if [[ $_ANALYTICS_AD_USER_DATA ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_USER_DATA\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n";
@@ -437,15 +427,15 @@
baseConfigurationReference = E67B3FF985359E36919C9E20 /* Pods-Self.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CODE_SIGN_ENTITLEMENTS = OpenPassport/OpenPassportDebug.entitlements;
- CODE_SIGN_IDENTITY = "Apple Development";
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 189;
- DEBUG_INFORMATION_FORMAT = dwarf;
- ENABLE_APP_SANDBOX = NO;
- ENABLE_BITCODE = NO;
- ENABLE_RESOURCE_ACCESS_CAMERA = YES;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = OpenPassport/OpenPassportDebug.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 189;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_APP_SANDBOX = NO;
+ ENABLE_BITCODE = NO;
+ ENABLE_RESOURCE_ACCESS_CAMERA = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"\"${PODS_CONFIGURATION_BUILD_DIR}/DoubleConversion\"",
@@ -579,14 +569,14 @@
13B07F951A680F5B00A75B9A /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 823EAA08DBB5F61225E922CA /* Pods-Self.release.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CODE_SIGN_ENTITLEMENTS = OpenPassport/OpenPassport.entitlements;
- CURRENT_PROJECT_VERSION = 189;
- DEBUG_INFORMATION_FORMAT = dwarf;
- ENABLE_APP_SANDBOX = NO;
- ENABLE_RESOURCE_ACCESS_CAMERA = YES;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = OpenPassport/OpenPassport.entitlements;
+ CURRENT_PROJECT_VERSION = 189;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_APP_SANDBOX = NO;
+ ENABLE_RESOURCE_ACCESS_CAMERA = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"\"${PODS_CONFIGURATION_BUILD_DIR}/DoubleConversion\"",
@@ -807,7 +797,10 @@
"-DFOLLY_MOBILE=1",
"-DFOLLY_USE_LIBCPP=1",
);
- OTHER_LDFLAGS = "$(inherited) ";
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ " ",
+ );
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -900,7 +893,10 @@
"-DFOLLY_MOBILE=1",
"-DFOLLY_USE_LIBCPP=1",
);
- OTHER_LDFLAGS = "$(inherited) ";
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ " ",
+ );
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
diff --git a/app/package.json b/app/package.json
index d21f71be9..531105645 100644
--- a/app/package.json
+++ b/app/package.json
@@ -164,7 +164,7 @@
"react-native-safe-area-context": "^5.6.2",
"react-native-screens": "4.15.3",
"react-native-sqlite-storage": "^6.0.1",
- "react-native-svg": "15.15.1",
+ "react-native-svg": "15.12.1",
"react-native-svg-web": "1.0.9",
"react-native-url-polyfill": "^3.0.0",
"react-native-web": "^0.21.2",
diff --git a/app/src/integrations/sumsub/sumsubService.ts b/app/src/integrations/sumsub/sumsubService.ts
index 20f191399..d50524da4 100644
--- a/app/src/integrations/sumsub/sumsubService.ts
+++ b/app/src/integrations/sumsub/sumsubService.ts
@@ -116,7 +116,17 @@ export const launchSumsub = async (
})
.withDebug(config.debug ?? __DEV__)
.withLocale(config.locale ?? 'en')
- .withAnalyticsEnabled(true); // Device Intelligence requires this
+ // Platform configuration:
+ // - Device Intelligence (Fisherman): Enabled on both iOS and Android
+ // * iOS: Configured via IDENSIC_WITH_FISHERMAN in Podfile
+ // * Android: Configured via idensic-mobile-sdk-fisherman in patch file
+ // * Privacy: iOS declares device ID collection in PrivacyInfo.xcprivacy
+ // * Privacy: Android should declare device fingerprinting in Google Play Data Safety
+ // - VideoIdent (live video calls): Disabled on both platforms for current release
+ // * iOS: Disabled in Podfile (avoids microphone permission requirements)
+ // * Android: Disabled in patch file (avoids FOREGROUND_SERVICE_MICROPHONE permission)
+ // * Note: VideoIdent will be re-enabled on both platforms in future release for liveness checks
+ .withAnalyticsEnabled(true); // Required for Device Intelligence to function
// Pre-select document type and country if provided
// This skips the document selection step in Sumsub
diff --git a/packages/mobile-sdk-alpha/package.json b/packages/mobile-sdk-alpha/package.json
index e14606e71..b32a1156d 100644
--- a/packages/mobile-sdk-alpha/package.json
+++ b/packages/mobile-sdk-alpha/package.json
@@ -186,7 +186,7 @@
"react-native-blur-effect": "^1.1.3",
"react-native-haptic-feedback": "^2.3.3",
"react-native-localize": "^3.6.1",
- "react-native-svg": "15.15.1",
+ "react-native-svg": "15.12.1",
"react-native-web": "^0.21.2",
"react-native-webview": "13.16.0",
"tsup": "^8.0.1",
diff --git a/patches/@sumsub+react-native-mobilesdk-module+1.40.2.patch b/patches/@sumsub+react-native-mobilesdk-module+1.40.2.patch
index fccb8e539..e04a1916a 100644
--- a/patches/@sumsub+react-native-mobilesdk-module+1.40.2.patch
+++ b/patches/@sumsub+react-native-mobilesdk-module+1.40.2.patch
@@ -5,12 +5,18 @@ index 0000000..0000001 100644
@@ -77,11 +77,11 @@ dependencies {
implementation "com.sumsub.sns:idensic-mobile-sdk:1.40.2"
+ // Enable Device Intelligence (Fisherman) for fraud detection
+ // Privacy: Declare device fingerprinting/identifiers in Google Play Data Safety form
// remove comment to enable Device Intelligence
- // implementation "com.sumsub.sns:idensic-mobile-sdk-fisherman:1.40.2"
+ implementation "com.sumsub.sns:idensic-mobile-sdk-fisherman:1.40.2"
+ // VideoIdent disabled on both iOS and Android for current release
+ // Reason: Avoids microphone permission requirements (FOREGROUND_SERVICE_MICROPHONE on Android)
+ // Feature: Provides liveness checks via live video calls with human agents
+ // TODO: Re-enable on both platforms for future release when liveness checks are needed
// remove comment if you need VideoIdent support
- // implementation "com.sumsub.sns:idensic-mobile-sdk-videoident:1.40.2"
-+ implementation "com.sumsub.sns:idensic-mobile-sdk-videoident:1.40.2"
++ // implementation "com.sumsub.sns:idensic-mobile-sdk-videoident:1.40.2"
// remove comment if you need EID support
// implementation "com.sumsub.sns:idensic-mobile-sdk-eid:1.40.2"
// remove comment if you need NFC support
diff --git a/patches/react-native-svg+15.15.1.patch b/patches/react-native-svg+15.15.1.patch
deleted file mode 100644
index 07ce8e430..000000000
--- a/patches/react-native-svg+15.15.1.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff --git a/node_modules/react-native-svg/common/cpp/react/renderer/components/rnsvg/RNSVGLayoutableShadowNode.cpp b/node_modules/react-native-svg/common/cpp/react/renderer/components/rnsvg/RNSVGLayoutableShadowNode.cpp
---- a/node_modules/react-native-svg/common/cpp/react/renderer/components/rnsvg/RNSVGLayoutableShadowNode.cpp
-+++ b/node_modules/react-native-svg/common/cpp/react/renderer/components/rnsvg/RNSVGLayoutableShadowNode.cpp
-@@ -27,8 +27,18 @@ void RNSVGLayoutableShadowNode::updatePosition() {
- auto style = yogaNode_.style();
- style.setPositionType(yoga::PositionType::Absolute);
- style.setPosition(yoga::Edge::All, yoga::Style::Length::points(0));
-- style.setDimension(yoga::Dimension::Width, yoga::StyleSizeLength::percent(100));
-- style.setDimension(yoga::Dimension::Height, yoga::StyleSizeLength::percent(100));
-+#if REACT_NATIVE_MINOR_VERSION >= 78
-+ style.setDimension(
-+ yoga::Dimension::Width, yoga::StyleSizeLength::percent(100));
-+ style.setDimension(
-+ yoga::Dimension::Height, yoga::StyleSizeLength::percent(100));
-+#elif REACT_NATIVE_MINOR_VERSION >= 77
-+ style.setDimension(yoga::Dimension::Width, yoga::StyleLength::percent(100));
-+ style.setDimension(yoga::Dimension::Height, yoga::StyleLength::percent(100));
-+#else
-+ style.setDimension(yoga::Dimension::Width, yoga::value::percent(100));
-+ style.setDimension(yoga::Dimension::Height, yoga::value::percent(100));
-+#endif
- yogaNode_.setStyle(style);
- }
-
diff --git a/yarn.lock b/yarn.lock
index f735821ab..72a61dcbd 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -9092,7 +9092,7 @@ __metadata:
react-native-safe-area-context: "npm:^5.6.2"
react-native-screens: "npm:4.15.3"
react-native-sqlite-storage: "npm:^6.0.1"
- react-native-svg: "npm:15.15.1"
+ react-native-svg: "npm:15.12.1"
react-native-svg-transformer: "npm:^1.5.2"
react-native-svg-web: "npm:1.0.9"
react-native-url-polyfill: "npm:^3.0.0"
@@ -9149,7 +9149,7 @@ __metadata:
react-native-haptic-feedback: "npm:^2.3.3"
react-native-localize: "npm:^3.6.1"
react-native-nfc-manager: "npm:^3.17.2"
- react-native-svg: "npm:15.15.1"
+ react-native-svg: "npm:15.12.1"
react-native-svg-circle-country-flags: "npm:^0.2.2"
react-native-web: "npm:^0.21.2"
react-native-webview: "npm:13.16.0"
@@ -30315,6 +30315,20 @@ __metadata:
languageName: node
linkType: hard
+"react-native-svg@npm:15.12.1":
+ version: 15.12.1
+ resolution: "react-native-svg@npm:15.12.1"
+ dependencies:
+ css-select: "npm:^5.1.0"
+ css-tree: "npm:^1.1.3"
+ warn-once: "npm:0.1.1"
+ peerDependencies:
+ react: "*"
+ react-native: "*"
+ checksum: 10c0/ed94b57007125c715283fc760438ac8eac0677ced3201f6e272a7cd4459f3fecb672a8eed2c32664e5b8e6e0367585353b0f83f99b231f603d75094bb052c01f
+ languageName: node
+ linkType: hard
+
"react-native-svg@npm:15.15.1":
version: 15.15.1
resolution: "react-native-svg@npm:15.15.1"