diff --git a/Info.plist b/Info.plist new file mode 100644 index 0000000..a45c648 --- /dev/null +++ b/Info.plist @@ -0,0 +1,77 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + EudiWalletKitReactNativeExample + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + + + NSBluetoothAlwaysUsageDescription + For document presentation via Bluetooth (proximity use case) + NSBluetoothPeripheralUsageDescription + For document presentation via Bluetooth (proximity use case) + NSCameraUsageDescription + Camera used for in-app QR Code scanning + NSFaceIDUsageDescription + Authentication with TouchId or FaceID + UIAppFonts + + AntDesign.ttf + Entypo.ttf + EvilIcons.ttf + Feather.ttf + FontAwesome.ttf + FontAwesome5_Brands.ttf + FontAwesome5_Regular.ttf + FontAwesome5_Solid.ttf + FontAwesome6_Brands.ttf + FontAwesome6_Regular.ttf + FontAwesome6_Solid.ttf + Foundation.ttf + Ionicons.ttf + MaterialIcons.ttf + MaterialCommunityIcons.ttf + SimpleLineIcons.ttf + Octicons.ttf + Zocial.ttf + Fontisto.ttf + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/example/ios/EudiWalletKitReactNativeExample.xcodeproj/project.pbxproj b/example/ios/EudiWalletKitReactNativeExample.xcodeproj/project.pbxproj index a35ea57..889b017 100644 --- a/example/ios/EudiWalletKitReactNativeExample.xcodeproj/project.pbxproj +++ b/example/ios/EudiWalletKitReactNativeExample.xcodeproj/project.pbxproj @@ -8,12 +8,32 @@ /* Begin PBXBuildFile section */ 00E356F31AD99517003FC87E /* EudiWalletKitReactNativeExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* EudiWalletKitReactNativeExampleTests.m */; }; + 05B565DE2BD846E100ADD7DC /* eudi_sample_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 05B565DD2BD846E100ADD7DC /* eudi_sample_data.json */; }; + 05B565F32BD847CC00ADD7DC /* Fontisto.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565E02BD847CC00ADD7DC /* Fontisto.ttf */; }; + 05B565F42BD847CC00ADD7DC /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565E12BD847CC00ADD7DC /* Octicons.ttf */; }; + 05B565F52BD847CC00ADD7DC /* Feather.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565E22BD847CC00ADD7DC /* Feather.ttf */; }; + 05B565F62BD847CC00ADD7DC /* FontAwesome6_Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565E32BD847CC00ADD7DC /* FontAwesome6_Regular.ttf */; }; + 05B565F72BD847CC00ADD7DC /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565E42BD847CC00ADD7DC /* Entypo.ttf */; }; + 05B565F82BD847CC00ADD7DC /* FontAwesome5_Brands.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565E52BD847CC00ADD7DC /* FontAwesome5_Brands.ttf */; }; + 05B565F92BD847CC00ADD7DC /* MaterialCommunityIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565E62BD847CC00ADD7DC /* MaterialCommunityIcons.ttf */; }; + 05B565FA2BD847CC00ADD7DC /* AntDesign.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565E72BD847CC00ADD7DC /* AntDesign.ttf */; }; + 05B565FB2BD847CC00ADD7DC /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565E82BD847CC00ADD7DC /* Foundation.ttf */; }; + 05B565FC2BD847CC00ADD7DC /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565E92BD847CC00ADD7DC /* Ionicons.ttf */; }; + 05B565FD2BD847CC00ADD7DC /* FontAwesome5_Solid.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565EA2BD847CC00ADD7DC /* FontAwesome5_Solid.ttf */; }; + 05B565FE2BD847CC00ADD7DC /* FontAwesome5_Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565EB2BD847CC00ADD7DC /* FontAwesome5_Regular.ttf */; }; + 05B565FF2BD847CC00ADD7DC /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565EC2BD847CC00ADD7DC /* FontAwesome.ttf */; }; + 05B566002BD847CC00ADD7DC /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565ED2BD847CC00ADD7DC /* Zocial.ttf */; }; + 05B566012BD847CC00ADD7DC /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565EE2BD847CC00ADD7DC /* EvilIcons.ttf */; }; + 05B566022BD847CC00ADD7DC /* FontAwesome6_Solid.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565EF2BD847CC00ADD7DC /* FontAwesome6_Solid.ttf */; }; + 05B566032BD847CC00ADD7DC /* SimpleLineIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565F02BD847CC00ADD7DC /* SimpleLineIcons.ttf */; }; + 05B566042BD847CC00ADD7DC /* FontAwesome6_Brands.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565F12BD847CC00ADD7DC /* FontAwesome6_Brands.ttf */; }; + 05B566052BD847CC00ADD7DC /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 05B565F22BD847CC00ADD7DC /* MaterialIcons.ttf */; }; 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 388350B20F257F7E63F134DF /* libPods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 249B756584B5F0355015090D /* libPods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.a */; }; + 2DEEAC49EDD939CB7D9F6E89 /* libPods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DBE7351A0D37F5EE50DE6015 /* libPods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.a */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; - E5F58BB5BC254D2779A128E8 /* libPods-EudiWalletKitReactNativeExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C87999369A7C4C25AA0AA252 /* libPods-EudiWalletKitReactNativeExample.a */; }; + C5090BBF0F467BB01EE451D6 /* libPods-EudiWalletKitReactNativeExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BD827150D16989BD7BC3E8AC /* libPods-EudiWalletKitReactNativeExample.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -30,6 +50,26 @@ 00E356EE1AD99517003FC87E /* EudiWalletKitReactNativeExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EudiWalletKitReactNativeExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* EudiWalletKitReactNativeExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EudiWalletKitReactNativeExampleTests.m; sourceTree = ""; }; + 05B565DD2BD846E100ADD7DC /* eudi_sample_data.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = eudi_sample_data.json; sourceTree = ""; }; + 05B565E02BD847CC00ADD7DC /* Fontisto.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Fontisto.ttf; sourceTree = ""; }; + 05B565E12BD847CC00ADD7DC /* Octicons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Octicons.ttf; sourceTree = ""; }; + 05B565E22BD847CC00ADD7DC /* Feather.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Feather.ttf; sourceTree = ""; }; + 05B565E32BD847CC00ADD7DC /* FontAwesome6_Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = FontAwesome6_Regular.ttf; sourceTree = ""; }; + 05B565E42BD847CC00ADD7DC /* Entypo.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Entypo.ttf; sourceTree = ""; }; + 05B565E52BD847CC00ADD7DC /* FontAwesome5_Brands.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = FontAwesome5_Brands.ttf; sourceTree = ""; }; + 05B565E62BD847CC00ADD7DC /* MaterialCommunityIcons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = MaterialCommunityIcons.ttf; sourceTree = ""; }; + 05B565E72BD847CC00ADD7DC /* AntDesign.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = AntDesign.ttf; sourceTree = ""; }; + 05B565E82BD847CC00ADD7DC /* Foundation.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Foundation.ttf; sourceTree = ""; }; + 05B565E92BD847CC00ADD7DC /* Ionicons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Ionicons.ttf; sourceTree = ""; }; + 05B565EA2BD847CC00ADD7DC /* FontAwesome5_Solid.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = FontAwesome5_Solid.ttf; sourceTree = ""; }; + 05B565EB2BD847CC00ADD7DC /* FontAwesome5_Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = FontAwesome5_Regular.ttf; sourceTree = ""; }; + 05B565EC2BD847CC00ADD7DC /* FontAwesome.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = FontAwesome.ttf; sourceTree = ""; }; + 05B565ED2BD847CC00ADD7DC /* Zocial.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Zocial.ttf; sourceTree = ""; }; + 05B565EE2BD847CC00ADD7DC /* EvilIcons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = EvilIcons.ttf; sourceTree = ""; }; + 05B565EF2BD847CC00ADD7DC /* FontAwesome6_Solid.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = FontAwesome6_Solid.ttf; sourceTree = ""; }; + 05B565F02BD847CC00ADD7DC /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = SimpleLineIcons.ttf; sourceTree = ""; }; + 05B565F12BD847CC00ADD7DC /* FontAwesome6_Brands.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = FontAwesome6_Brands.ttf; sourceTree = ""; }; + 05B565F22BD847CC00ADD7DC /* MaterialIcons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = MaterialIcons.ttf; sourceTree = ""; }; 05E047262BC6FE860092DE0E /* libeudi-wallet-kit-react-native.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libeudi-wallet-kit-react-native.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 05E047282BC6FEA90092DE0E /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; 05E0472A2BC71B060092DE0E /* CoreAudioTypes.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioTypes.framework; path = System/Library/Frameworks/CoreAudioTypes.framework; sourceTree = SDKROOT; }; @@ -39,14 +79,14 @@ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = EudiWalletKitReactNativeExample/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = EudiWalletKitReactNativeExample/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = EudiWalletKitReactNativeExample/main.m; sourceTree = ""; }; - 249B756584B5F0355015090D /* libPods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 19450A64CF20FD2D293783B8 /* Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.release.xcconfig"; path = "Target Support Files/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.release.xcconfig"; sourceTree = ""; }; + 41273EE635B35ABCD97E4EED /* Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.debug.xcconfig"; sourceTree = ""; }; + 771BDCA496BBAC0EFAFF1C4B /* Pods-EudiWalletKitReactNativeExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EudiWalletKitReactNativeExample.debug.xcconfig"; path = "Target Support Files/Pods-EudiWalletKitReactNativeExample/Pods-EudiWalletKitReactNativeExample.debug.xcconfig"; sourceTree = ""; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = EudiWalletKitReactNativeExample/LaunchScreen.storyboard; sourceTree = ""; }; - 9DC7DACC0792EB75772F8A25 /* Pods-EudiWalletKitReactNativeExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EudiWalletKitReactNativeExample.release.xcconfig"; path = "Target Support Files/Pods-EudiWalletKitReactNativeExample/Pods-EudiWalletKitReactNativeExample.release.xcconfig"; sourceTree = ""; }; - C87999369A7C4C25AA0AA252 /* libPods-EudiWalletKitReactNativeExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-EudiWalletKitReactNativeExample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - EC37F38A0D5971A913509391 /* Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.release.xcconfig"; path = "Target Support Files/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.release.xcconfig"; sourceTree = ""; }; + BD827150D16989BD7BC3E8AC /* libPods-EudiWalletKitReactNativeExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-EudiWalletKitReactNativeExample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + DBE7351A0D37F5EE50DE6015 /* libPods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; - ED5FCC9BB6F1CB6E38AE4A21 /* Pods-EudiWalletKitReactNativeExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EudiWalletKitReactNativeExample.debug.xcconfig"; path = "Target Support Files/Pods-EudiWalletKitReactNativeExample/Pods-EudiWalletKitReactNativeExample.debug.xcconfig"; sourceTree = ""; }; - F07188C862CAA00277E25EE0 /* Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.debug.xcconfig"; sourceTree = ""; }; + FF2DC21D83BC48B4876F405A /* Pods-EudiWalletKitReactNativeExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EudiWalletKitReactNativeExample.release.xcconfig"; path = "Target Support Files/Pods-EudiWalletKitReactNativeExample/Pods-EudiWalletKitReactNativeExample.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -54,7 +94,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 388350B20F257F7E63F134DF /* libPods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.a in Frameworks */, + 2DEEAC49EDD939CB7D9F6E89 /* libPods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -62,7 +102,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E5F58BB5BC254D2779A128E8 /* libPods-EudiWalletKitReactNativeExample.a in Frameworks */, + C5090BBF0F467BB01EE451D6 /* libPods-EudiWalletKitReactNativeExample.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -86,6 +126,33 @@ name = "Supporting Files"; sourceTree = ""; }; + 05B565DF2BD847CC00ADD7DC /* Fonts */ = { + isa = PBXGroup; + children = ( + 05B565E02BD847CC00ADD7DC /* Fontisto.ttf */, + 05B565E12BD847CC00ADD7DC /* Octicons.ttf */, + 05B565E22BD847CC00ADD7DC /* Feather.ttf */, + 05B565E32BD847CC00ADD7DC /* FontAwesome6_Regular.ttf */, + 05B565E42BD847CC00ADD7DC /* Entypo.ttf */, + 05B565E52BD847CC00ADD7DC /* FontAwesome5_Brands.ttf */, + 05B565E62BD847CC00ADD7DC /* MaterialCommunityIcons.ttf */, + 05B565E72BD847CC00ADD7DC /* AntDesign.ttf */, + 05B565E82BD847CC00ADD7DC /* Foundation.ttf */, + 05B565E92BD847CC00ADD7DC /* Ionicons.ttf */, + 05B565EA2BD847CC00ADD7DC /* FontAwesome5_Solid.ttf */, + 05B565EB2BD847CC00ADD7DC /* FontAwesome5_Regular.ttf */, + 05B565EC2BD847CC00ADD7DC /* FontAwesome.ttf */, + 05B565ED2BD847CC00ADD7DC /* Zocial.ttf */, + 05B565EE2BD847CC00ADD7DC /* EvilIcons.ttf */, + 05B565EF2BD847CC00ADD7DC /* FontAwesome6_Solid.ttf */, + 05B565F02BD847CC00ADD7DC /* SimpleLineIcons.ttf */, + 05B565F12BD847CC00ADD7DC /* FontAwesome6_Brands.ttf */, + 05B565F22BD847CC00ADD7DC /* MaterialIcons.ttf */, + ); + name = Fonts; + path = "../node_modules/react-native-vector-icons/Fonts"; + sourceTree = ""; + }; 13B07FAE1A68108700A75B9A /* EudiWalletKitReactNativeExample */ = { isa = PBXGroup; children = ( @@ -95,6 +162,7 @@ 13B07FB61A68108700A75B9A /* Info.plist */, 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, 13B07FB71A68108700A75B9A /* main.m */, + 05B565DD2BD846E100ADD7DC /* eudi_sample_data.json */, ); name = EudiWalletKitReactNativeExample; sourceTree = ""; @@ -106,8 +174,8 @@ 05E047282BC6FEA90092DE0E /* CoreAudio.framework */, 05E047262BC6FE860092DE0E /* libeudi-wallet-kit-react-native.a */, ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - C87999369A7C4C25AA0AA252 /* libPods-EudiWalletKitReactNativeExample.a */, - 249B756584B5F0355015090D /* libPods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.a */, + BD827150D16989BD7BC3E8AC /* libPods-EudiWalletKitReactNativeExample.a */, + DBE7351A0D37F5EE50DE6015 /* libPods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.a */, ); name = Frameworks; sourceTree = ""; @@ -122,6 +190,7 @@ 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( + 05B565DF2BD847CC00ADD7DC /* Fonts */, 13B07FAE1A68108700A75B9A /* EudiWalletKitReactNativeExample */, 832341AE1AAA6A7D00B99B32 /* Libraries */, 00E356EF1AD99517003FC87E /* EudiWalletKitReactNativeExampleTests */, @@ -146,10 +215,10 @@ BBD78D7AC51CEA395F1C20DB /* Pods */ = { isa = PBXGroup; children = ( - ED5FCC9BB6F1CB6E38AE4A21 /* Pods-EudiWalletKitReactNativeExample.debug.xcconfig */, - 9DC7DACC0792EB75772F8A25 /* Pods-EudiWalletKitReactNativeExample.release.xcconfig */, - F07188C862CAA00277E25EE0 /* Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.debug.xcconfig */, - EC37F38A0D5971A913509391 /* Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.release.xcconfig */, + 771BDCA496BBAC0EFAFF1C4B /* Pods-EudiWalletKitReactNativeExample.debug.xcconfig */, + FF2DC21D83BC48B4876F405A /* Pods-EudiWalletKitReactNativeExample.release.xcconfig */, + 41273EE635B35ABCD97E4EED /* Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.debug.xcconfig */, + 19450A64CF20FD2D293783B8 /* Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -161,12 +230,12 @@ isa = PBXNativeTarget; buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "EudiWalletKitReactNativeExampleTests" */; buildPhases = ( - 16143AFE94B0AF78659301DE /* [CP] Check Pods Manifest.lock */, + D1C83E32530625475AA9E831 /* [CP] Check Pods Manifest.lock */, 00E356EA1AD99517003FC87E /* Sources */, 00E356EB1AD99517003FC87E /* Frameworks */, 00E356EC1AD99517003FC87E /* Resources */, - 2CCD349D51FDDEE4EFE40366 /* [CP] Embed Pods Frameworks */, - F9C674EE6466B95F749F7090 /* [CP] Copy Pods Resources */, + 90F790A1B2A25B28F3AF678B /* [CP] Embed Pods Frameworks */, + 971B290AD3E0E73BFCC32F35 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -182,13 +251,13 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "EudiWalletKitReactNativeExample" */; buildPhases = ( - E37FBDAE3693CACA3D2F8F0B /* [CP] Check Pods Manifest.lock */, + EA0E696C4D6AE7A39B4FED96 /* [CP] Check Pods Manifest.lock */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - E1C08AE445E762F7E239DCFD /* [CP] Embed Pods Frameworks */, - 1923CAF2EC54B64BC98E44F3 /* [CP] Copy Pods Resources */, + 0E10750BACBC256E75DF19C0 /* [CP] Embed Pods Frameworks */, + 431BB2265094C06538E8F9C7 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -212,7 +281,7 @@ TestTargetID = 13B07F861A680F5B00A75B9A; }; 13B07F861A680F5B00A75B9A = { - LastSwiftMigration = 1120; + LastSwiftMigration = 1500; }; }; }; @@ -247,7 +316,27 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 05B565FC2BD847CC00ADD7DC /* Ionicons.ttf in Resources */, + 05B565F42BD847CC00ADD7DC /* Octicons.ttf in Resources */, 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, + 05B565FF2BD847CC00ADD7DC /* FontAwesome.ttf in Resources */, + 05B565F52BD847CC00ADD7DC /* Feather.ttf in Resources */, + 05B565F82BD847CC00ADD7DC /* FontAwesome5_Brands.ttf in Resources */, + 05B566052BD847CC00ADD7DC /* MaterialIcons.ttf in Resources */, + 05B565F62BD847CC00ADD7DC /* FontAwesome6_Regular.ttf in Resources */, + 05B566012BD847CC00ADD7DC /* EvilIcons.ttf in Resources */, + 05B565DE2BD846E100ADD7DC /* eudi_sample_data.json in Resources */, + 05B565FD2BD847CC00ADD7DC /* FontAwesome5_Solid.ttf in Resources */, + 05B566042BD847CC00ADD7DC /* FontAwesome6_Brands.ttf in Resources */, + 05B565F92BD847CC00ADD7DC /* MaterialCommunityIcons.ttf in Resources */, + 05B565F72BD847CC00ADD7DC /* Entypo.ttf in Resources */, + 05B566022BD847CC00ADD7DC /* FontAwesome6_Solid.ttf in Resources */, + 05B565F32BD847CC00ADD7DC /* Fontisto.ttf in Resources */, + 05B565FB2BD847CC00ADD7DC /* Foundation.ttf in Resources */, + 05B565FE2BD847CC00ADD7DC /* FontAwesome5_Regular.ttf in Resources */, + 05B565FA2BD847CC00ADD7DC /* AntDesign.ttf in Resources */, + 05B566032BD847CC00ADD7DC /* SimpleLineIcons.ttf in Resources */, + 05B566002BD847CC00ADD7DC /* Zocial.ttf in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -271,29 +360,24 @@ shellPath = /bin/sh; shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; - 16143AFE94B0AF78659301DE /* [CP] Check Pods Manifest.lock */ = { + 0E10750BACBC256E75DF19C0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample/Pods-EudiWalletKitReactNativeExample-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample/Pods-EudiWalletKitReactNativeExample-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample/Pods-EudiWalletKitReactNativeExample-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 1923CAF2EC54B64BC98E44F3 /* [CP] Copy Pods Resources */ = { + 431BB2265094C06538E8F9C7 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -310,7 +394,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample/Pods-EudiWalletKitReactNativeExample-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 2CCD349D51FDDEE4EFE40366 /* [CP] Embed Pods Frameworks */ = { + 90F790A1B2A25B28F3AF678B /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -327,24 +411,24 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - E1C08AE445E762F7E239DCFD /* [CP] Embed Pods Frameworks */ = { + 971B290AD3E0E73BFCC32F35 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample/Pods-EudiWalletKitReactNativeExample-frameworks-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample/Pods-EudiWalletKitReactNativeExample-frameworks-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample/Pods-EudiWalletKitReactNativeExample-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; - E37FBDAE3693CACA3D2F8F0B /* [CP] Check Pods Manifest.lock */ = { + D1C83E32530625475AA9E831 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -359,28 +443,33 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-EudiWalletKitReactNativeExample-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - F9C674EE6466B95F749F7090 /* [CP] Copy Pods Resources */ = { + EA0E696C4D6AE7A39B4FED96 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Copy Pods Resources"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-EudiWalletKitReactNativeExample-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests/Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -416,9 +505,10 @@ /* Begin XCBuildConfiguration section */ 00E356F61AD99517003FC87E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F07188C862CAA00277E25EE0 /* Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.debug.xcconfig */; + baseConfigurationReference = 41273EE635B35ABCD97E4EED /* Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; + DEVELOPMENT_TEAM = RR27SN59Q7; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -443,10 +533,11 @@ }; 00E356F71AD99517003FC87E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EC37F38A0D5971A913509391 /* Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.release.xcconfig */; + baseConfigurationReference = 19450A64CF20FD2D293783B8 /* Pods-EudiWalletKitReactNativeExample-EudiWalletKitReactNativeExampleTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = RR27SN59Q7; INFOPLIST_FILE = EudiWalletKitReactNativeExampleTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -467,10 +558,12 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = ED5FCC9BB6F1CB6E38AE4A21 /* Pods-EudiWalletKitReactNativeExample.debug.xcconfig */; + baseConfigurationReference = 771BDCA496BBAC0EFAFF1C4B /* Pods-EudiWalletKitReactNativeExample.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = RR27SN59Q7; ENABLE_BITCODE = NO; @@ -488,8 +581,9 @@ "-l\"SiopOpenID4VP.o\"", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_BUNDLE_IDENTIFIER = org.reactjs.native.example.EudiWalletKitReactNativeExample; PRODUCT_NAME = EudiWalletKitReactNativeExample; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -498,10 +592,12 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9DC7DACC0792EB75772F8A25 /* Pods-EudiWalletKitReactNativeExample.release.xcconfig */; + baseConfigurationReference = FF2DC21D83BC48B4876F405A /* Pods-EudiWalletKitReactNativeExample.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = RR27SN59Q7; INFOPLIST_FILE = EudiWalletKitReactNativeExample/Info.plist; @@ -515,8 +611,9 @@ "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_BUNDLE_IDENTIFIER = org.reactjs.native.example.EudiWalletKitReactNativeExample; PRODUCT_NAME = EudiWalletKitReactNativeExample; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; diff --git a/example/ios/EudiWalletKitReactNativeExample.xcworkspace/xcshareddata/swiftpm/Package.resolved b/example/ios/EudiWalletKitReactNativeExample.xcworkspace/xcshareddata/swiftpm/Package.resolved index 0408399..7d4fc01 100644 --- a/example/ios/EudiWalletKitReactNativeExample.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/example/ios/EudiWalletKitReactNativeExample.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -23,8 +23,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/eu-digital-identity-wallet/eudi-lib-ios-iso18013-data-model.git", "state" : { - "revision" : "44464efb1ab5a35c6b5863736e34f973b3313a74", - "version" : "0.2.2" + "revision" : "b507b918869c24e7b9e7265bee16a192e1013f89", + "version" : "0.2.3" } }, { @@ -50,8 +50,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/eu-digital-identity-wallet/eudi-lib-ios-openid4vci-swift.git", "state" : { - "revision" : "1c06b020e6866906690c2eb36c8718e193659780", - "version" : "0.0.5" + "revision" : "e75c7ebaee5953d0c10a3dd5510747fdcdcadfa7", + "version" : "0.0.6" } }, { @@ -68,8 +68,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/eu-digital-identity-wallet/eudi-lib-ios-siop-openid4vp-swift.git", "state" : { - "revision" : "e822000c9b45040961d74839ce0c75a01391cc3c", - "version" : "0.0.71" + "revision" : "1336ad97d024dceaf629f3e531eb1c6dcfb10188", + "version" : "0.0.73" } }, { @@ -78,7 +78,7 @@ "location" : "https://github.com/eu-digital-identity-wallet/eudi-lib-ios-wallet-kit.git", "state" : { "branch" : "main", - "revision" : "4fd0d8aba4fe89e718d21d5e96fbb3ac69705913" + "revision" : "9c165692de7d7a9dde317c65462c20feccd73c9a" } }, { @@ -203,8 +203,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/niscy-eudiw/SwiftCBOR.git", "state" : { - "revision" : "74763c2624c09e8702967d8bef01767d12a71615", - "version" : "0.5.1" + "revision" : "310dbc3975a5653237fed304d88a6dd59d04dd30", + "version" : "0.5.7" } }, { diff --git a/example/ios/EudiWalletKitReactNativeExample/Info.plist b/example/ios/EudiWalletKitReactNativeExample/Info.plist index bfc349b..9270991 100644 --- a/example/ios/EudiWalletKitReactNativeExample/Info.plist +++ b/example/ios/EudiWalletKitReactNativeExample/Info.plist @@ -26,14 +26,39 @@ NSAppTransportSecurity - + NSAllowsArbitraryLoads NSAllowsLocalNetworking - NSLocationWhenInUseUsageDescription - + NSBluetoothAlwaysUsageDescription + For document presentation via Bluetooth (proximity use case) + NSBluetoothPeripheralUsageDescription + For document presentation via Bluetooth (proximity use case) + NSCameraUsageDescription + Camera used for in-app QR Code scanning + NSFaceIDUsageDescription + Authentication with TouchId or FaceID + UIAppFonts + + MaterialIcons.ttf + MaterialCommunityIcons.ttf + AntDesign.ttf + Entypo.ttf + EvilIcons.ttf + Feather.ttf + FontAwesome.ttf + FontAwesome5_Brands.ttf + FontAwesome5_Regular.ttf + FontAwesome5_Solid.ttf + Fontisto.ttf + Foundation.ttf + Ionicons.ttf + Octicons.ttf + SimpleLineIcons.ttf + Zocial.ttf + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities @@ -43,8 +68,6 @@ UISupportedInterfaceOrientations UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance diff --git a/example/ios/Podfile b/example/ios/Podfile index 031b1ba..c377b0c 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,15 +1,25 @@ -# Resolve react_native_pods.rb with node to allow for hoisting -require Pod::Executable.execute_command('node', ['-p', - 'require.resolve( - "react-native/scripts/react_native_pods.rb", - {paths: [process.argv[1]]}, - )', __dir__]).strip +def node_require(script) + # Resolve script with node to allow for hoisting + require Pod::Executable.execute_command('node', ['-p', + "require.resolve( + '#{script}', + {paths: [process.argv[1]]}, + )", __dir__]).strip +end + +node_require('react-native/scripts/react_native_pods.rb') +node_require('react-native-permissions/scripts/setup.rb') minimum_target = '14.0' platform :ios, minimum_target prepare_react_native_project! +setup_permissions([ + 'Camera', + 'Bluetooth' +]) + plugin "cocoapods-spm" # If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 7922323..fae091f 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -948,6 +948,8 @@ PODS: - React-Mapbuffer (0.73.6): - glog - React-debug + - react-native-safe-area-context (4.9.0): + - React-Core - React-nativeconfig (0.73.6) - React-NativeModulesApple (0.73.6): - glog @@ -1115,7 +1117,23 @@ PODS: - React-jsi (= 0.73.6) - React-logger (= 0.73.6) - React-perflogger (= 0.73.6) + - RNBluetoothStateManager (1.3.5): + - React-Core + - RNDeviceInfo (10.13.1): + - React-Core + - RNPermissions (4.1.5): + - React-Core + - RNScreens (3.30.1): + - glog + - RCT-Folly (= 2022.05.16.00) + - React-Core + - RNSVG (15.1.0): + - React-Core - SocketRocket (0.6.1) + - VisionCamera (3.9.2): + - React + - React-callinvoker + - React-Core - Yoga (1.14.0) DEPENDENCIES: @@ -1172,6 +1190,7 @@ DEPENDENCIES: - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) + - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - React-nativeconfig (from `../node_modules/react-native/ReactCommon`) - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) @@ -1192,6 +1211,12 @@ DEPENDENCIES: - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - RNBluetoothStateManager (from `../node_modules/react-native-bluetooth-state-manager`) + - RNDeviceInfo (from `../node_modules/react-native-device-info`) + - RNPermissions (from `../node_modules/react-native-permissions`) + - RNScreens (from `../node_modules/react-native-screens`) + - RNSVG (from `../node_modules/react-native-svg`) + - VisionCamera (from `../node_modules/react-native-vision-camera`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: @@ -1268,6 +1293,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/logger" React-Mapbuffer: :path: "../node_modules/react-native/ReactCommon" + react-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" React-nativeconfig: :path: "../node_modules/react-native/ReactCommon" React-NativeModulesApple: @@ -1308,6 +1335,18 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/utils" ReactCommon: :path: "../node_modules/react-native/ReactCommon" + RNBluetoothStateManager: + :path: "../node_modules/react-native-bluetooth-state-manager" + RNDeviceInfo: + :path: "../node_modules/react-native-device-info" + RNPermissions: + :path: "../node_modules/react-native-permissions" + RNScreens: + :path: "../node_modules/react-native-screens" + RNSVG: + :path: "../node_modules/react-native-svg" + VisionCamera: + :path: "../node_modules/react-native-vision-camera" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" @@ -1352,6 +1391,7 @@ SPEC CHECKSUMS: React-jsinspector: 85583ef014ce53d731a98c66a0e24496f7a83066 React-logger: 3eb80a977f0d9669468ef641a5e1fabbc50a09ec React-Mapbuffer: 84ea43c6c6232049135b1550b8c60b2faac19fab + react-native-safe-area-context: b97eb6f9e3b7f437806c2ce5983f479f8eb5de4b React-nativeconfig: b4d4e9901d4cabb57be63053fd2aa6086eb3c85f React-NativeModulesApple: cd26e56d56350e123da0c1e3e4c76cb58a05e1ee React-perflogger: 5f49905de275bac07ac7ea7f575a70611fa988f2 @@ -1372,9 +1412,15 @@ SPEC CHECKSUMS: React-runtimescheduler: 9636eee762c699ca7c85751a359101797e4c8b3b React-utils: d16c1d2251c088ad817996621947d0ac8167b46c ReactCommon: 2aa35648354bd4c4665b9a5084a7d37097b89c10 + RNBluetoothStateManager: 724f2c76b04e0a2b840dfd7305b68f614bc01c81 + RNDeviceInfo: 4f9c7cfd6b9db1b05eb919620a001cf35b536423 + RNPermissions: e8d46b1cb07b97819c5c52c1ab24c33dc889ad03 + RNScreens: b6b64d956af3715adbfe84808694ae82d3fec74f + RNSVG: 50cf2c7018e57cf5d3522d98d0a3a4dd6bf9d093 SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 + VisionCamera: 36c460338692788a0d377dce7d32f8ba049fb4f2 Yoga: 805bf71192903b20fc14babe48080582fee65a80 -PODFILE CHECKSUM: 0ccc688e296c01cd1c0493b0674f83769ae21695 +PODFILE CHECKSUM: 5c556abbb22d0f8c8730b0c18d61e73428a97dd4 COCOAPODS: 1.14.3 diff --git a/example/ios/eudi_sample_data.json b/example/ios/eudi_sample_data.json new file mode 100644 index 0000000..8098738 --- /dev/null +++ b/example/ios/eudi_sample_data.json @@ -0,0 +1,6 @@ +{"response":"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", + + "publicKey": "pCABIVggaByIgUJw0TC1E+Mji6idZfJq3zSIK4zZxauEcmYMUpoiWCBg/0mm7uhno2keHk4sptSZMo5wTXCfn+faTfpQhMoVcgEC", + "privateKey": "pQECIAEhWCBoHIiBQnDRMLUT4yOLqJ1l8mrfNIgrjNnFq4RyZgxSmiJYIGD/Sabu6GejaR4eTiym1JkyjnBNcJ+f59pN+lCEyhVyI1ggC6EPCKyGci++LGWUX3fXpPFW6pYO8pyyKLMKs1qF0jo=" + +} diff --git a/example/package.json b/example/package.json index 28b7fca..fb0bb75 100644 --- a/example/package.json +++ b/example/package.json @@ -8,6 +8,7 @@ "ios": "react-native run-ios" }, "dependencies": { + "@craftzdog/react-native-buffer": "^6.0.5", "@react-navigation/bottom-tabs": "^6.5.14", "@react-navigation/native": "^6.1.12", "@react-navigation/native-stack": "^6.9.20", @@ -17,6 +18,7 @@ "react-native-device-info": "^10.13.1", "react-native-permissions": "^4.1.5", "react-native-qrcode-svg": "^6.3.0", + "react-native-quick-base64": "^2.0.8", "react-native-safe-area-context": "^4.9.0", "react-native-screens": "^3.29.0", "react-native-svg": "^15.0.0", diff --git a/example/react-native.config.js b/example/react-native.config.js index ffacfe8..61fd1ae 100644 --- a/example/react-native.config.js +++ b/example/react-native.config.js @@ -6,5 +6,10 @@ module.exports = { [pak.name]: { root: path.join(__dirname, '..'), }, + 'react-native-vector-icons': { + platforms: { + ios: null, + }, + }, }, -} +} \ No newline at end of file diff --git a/example/src/components/modals/AddDocumentModal.tsx b/example/src/components/modals/AddDocumentModal.tsx index dbcc296..a3d3cdc 100644 --- a/example/src/components/modals/AddDocumentModal.tsx +++ b/example/src/components/modals/AddDocumentModal.tsx @@ -1,7 +1,6 @@ import { EudiWallet } from 'eudi-wallet-kit-react-native' import React, { useCallback, useState } from 'react' -import { Button, Modal, StyleSheet, Text, View } from 'react-native' -import { SafeAreaView } from 'react-native-safe-area-context' +import { Button, Modal, StyleSheet, Text, View, SafeAreaView } from 'react-native' import { IconButton } from '../buttons' diff --git a/example/src/components/views/QRCodeView.tsx b/example/src/components/views/QRCodeView.tsx index bc4f62f..de6dd3e 100644 --- a/example/src/components/views/QRCodeView.tsx +++ b/example/src/components/views/QRCodeView.tsx @@ -1,5 +1,6 @@ +import { Buffer } from '@craftzdog/react-native-buffer' import React, { useState } from 'react' -import { StyleSheet, View, Text, useWindowDimensions } from 'react-native' +import { StyleSheet, View, Text, Platform, Image } from 'react-native' import QRCode from 'react-native-qrcode-svg' const styles = StyleSheet.create({ @@ -14,24 +15,35 @@ const styles = StyleSheet.create({ }, }) +function getBase64Uri(base64Url: string): string { + // iOS native lib returns image data as Base64URL that needs to be converted + // See https://stackoverflow.com/questions/55389211/string-based-data-encoding-base64-vs-base64url + const base64String = Buffer.from(base64Url, 'base64').toString('base64') + return `data:image/png;base64,${base64String}` +} + interface Props { value: string - size?: number + size: number } export const QRCodeView: React.FC = ({ value, size }) => { - const { width } = useWindowDimensions() - const [isInvalidQR, setIsInvalidQR] = useState(false) const onQRGenerationError = () => { setIsInvalidQR(true) } - const defaultQRSize = width - 80 return ( - {} + { + // TODO: Remove this after Android/iOS QR content inconsistency fixed + Platform.OS === 'ios' ? ( + + ) : ( + + ) + } {isInvalidQR && {'QR generation error'}} ) diff --git a/example/src/screens/ProximityPresentation.tsx b/example/src/screens/ProximityPresentation.tsx index 6987a9a..f5f3938 100644 --- a/example/src/screens/ProximityPresentation.tsx +++ b/example/src/screens/ProximityPresentation.tsx @@ -3,8 +3,7 @@ import type { NativeStackScreenProps } from '@react-navigation/native-stack' import { EudiWallet, TransferEventType } from 'eudi-wallet-kit-react-native' import React, { useEffect, useState } from 'react' -import { ScrollView, StyleSheet, Text, useWindowDimensions, View } from 'react-native' -import { SafeAreaView } from 'react-native-safe-area-context' +import { StyleSheet, Text, useWindowDimensions, View, SafeAreaView, Platform } from 'react-native' import Icon from 'react-native-vector-icons/MaterialCommunityIcons' import { QRCodeView } from '../components/views' @@ -39,9 +38,8 @@ const styles = StyleSheet.create({ marginHorizontal: 10, marginTop: 16, }, - nfcOptionContainer: { + bottomIconContainer: { alignItems: 'center', - justifyContent: 'center', marginTop: 16, }, }) @@ -75,23 +73,25 @@ export const ProximityPresentation: React.FC = () => { }, []) const { qrSize, qrContainerSize } = useQRSizesForWindow() + + const isAndroid = Platform.OS === 'android' + const headerText = isAndroid ? 'Show QR or Tap' : 'Show QR' + const bottomIconName = isAndroid ? 'nfc' : 'bluetooth-transfer' return ( - - - - Show QR or Tap - - Show this QR code to access the necessary information for sharing - - - - {qrCodeContent && } - - - Or use the NFC - - - + + + {headerText} + + Show this QR code to access the necessary information for sharing + + + + {qrCodeContent && } + + + {isAndroid && Or use the NFC} + + ) } diff --git a/example/src/screens/Scan.tsx b/example/src/screens/Scan.tsx index 9255a7b..1fb340b 100644 --- a/example/src/screens/Scan.tsx +++ b/example/src/screens/Scan.tsx @@ -80,6 +80,7 @@ export const Scan: React.FC = () => { const message = value console.log('Received QR code message:', message) + EudiWallet.stopPresentation() EudiWallet.startRemotePresentation(message) navigation.navigate(Screens.Home) diff --git a/ios/Podfile b/ios/Podfile index eef4550..90ab3c1 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -6,5 +6,8 @@ plugin "cocoapods-spm" target 'EudiWalletKitReactNative' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! + spm_pkg "EudiWalletKit", :url => "https://github.com/eu-digital-identity-wallet/eudi-lib-ios-wallet-kit.git", :branch => "main" + + pod 'AnyCodable-FlightSchool', '~> 0.6.0' end diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a4aa145..c163061 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,3 +1,16 @@ -PODFILE CHECKSUM: d7215c4d0e2dd6417fdfac8143dcb79837bad51e +PODS: + - AnyCodable-FlightSchool (0.6.7) + +DEPENDENCIES: + - AnyCodable-FlightSchool (~> 0.6.0) + +SPEC REPOS: + trunk: + - AnyCodable-FlightSchool + +SPEC CHECKSUMS: + AnyCodable-FlightSchool: 261cbe76757802b17d471b9059b21e6fa5edf57b + +PODFILE CHECKSUM: 47cc14601fa6e1e286867ffd315dba23a8bfec46 COCOAPODS: 1.13.0 diff --git a/ios/Sources/Interfaces/EudiWalletModule.m b/ios/Sources/Interfaces/EudiWalletModule.m index 44aa837..9dfb3e7 100644 --- a/ios/Sources/Interfaces/EudiWalletModule.m +++ b/ios/Sources/Interfaces/EudiWalletModule.m @@ -7,7 +7,7 @@ @interface RCT_EXTERN_MODULE(EudiWalletModule, NSObject) withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject) -RCT_EXTERN_METHOD(getDocuments:withResolver:(RCTPromiseResolveBlock)resolve +RCT_EXTERN_METHOD(getDocuments:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject) RCT_EXTERN_METHOD(getDocumentById:(NSString *)documentId @@ -32,7 +32,7 @@ @interface RCT_EXTERN_MODULE(EudiWalletModule, NSObject) RCT_EXTERN_METHOD(stopPresentation) -RCT_EXTERN_METHOD(loadSampleData:(NSArray *)sampleDataFiles +RCT_EXTERN_METHOD(loadSampleData:(NSString *)sampleDataFile withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject) diff --git a/ios/Sources/Model/JSDisclosedDocument.swift b/ios/Sources/Model/JSDisclosedDocument.swift index 73861c4..c2621d6 100644 --- a/ios/Sources/Model/JSDisclosedDocument.swift +++ b/ios/Sources/Model/JSDisclosedDocument.swift @@ -1,7 +1,7 @@ import EudiWalletKit import Foundation -struct JSDisclosedDocument { +struct JSDisclosedDocument: Codable { let documentId: String let docType: String let selectedDocItems: [JSDocumentItem] diff --git a/ios/Sources/Model/JSDocument.swift b/ios/Sources/Model/JSDocument.swift index 8dd355e..df70b86 100644 --- a/ios/Sources/Model/JSDocument.swift +++ b/ios/Sources/Model/JSDocument.swift @@ -1,14 +1,14 @@ import MdocDataModel18013 -import Foundation +import SwiftCBOR +import OrderedCollections - -struct JSDocument { +struct JSDocument: Encodable { let id: String let docType: String let name: String let createdAt: Int? let namespaces: [String] - let namespacedData: [String: Any] + let namespacedData: [String: AnyCodable] init(id: String, mdocModel: MdocDecodable) { self.id = id @@ -17,6 +17,14 @@ struct JSDocument { // TODO: Find a way to resolve createdAt timestamp self.createdAt = nil self.namespaces = mdocModel.nameSpaces ?? [String]() - self.namespacedData = mdocModel.toJson(base64: false) + self.namespacedData = mdocModel.toJson(base64: false).mapValues { + let orderedDictionary = $0 as! OrderedDictionary + + // We need to convert OrderedDictionary to a regular one in order to get proper serialization output on JS side + // See https://github.com/apple/swift-collections/issues/12#issuecomment-816277180 + let convertedDictionary = SerializationUtils.convertOrderedDictionaryToDictionary(orderedDict: orderedDictionary) + + return AnyCodable(convertedDictionary) + } } } diff --git a/ios/Sources/Model/JSDocumentItem.swift b/ios/Sources/Model/JSDocumentItem.swift index bde7504..2706472 100644 --- a/ios/Sources/Model/JSDocumentItem.swift +++ b/ios/Sources/Model/JSDocumentItem.swift @@ -1,4 +1,4 @@ -struct JSDocumentItem { +struct JSDocumentItem: Codable { let namespace: String let elementIdentifier: String } diff --git a/ios/Sources/Model/JSDocumentRequest.swift b/ios/Sources/Model/JSDocumentRequest.swift index 0e09e79..c601f87 100644 --- a/ios/Sources/Model/JSDocumentRequest.swift +++ b/ios/Sources/Model/JSDocumentRequest.swift @@ -1,7 +1,7 @@ import EudiWalletKit import Foundation -struct JSDocumentRequest { +struct JSDocumentRequest: Codable { let docType: String let requestItems: [JSDocumentItem] let readerAuth: JSReaderAuth @@ -31,7 +31,7 @@ extension JSDocumentRequest { } } -struct JSReaderAuth { +struct JSReaderAuth: Codable { let readerCommonName: String let readerSignIsValid: Bool let readerCertificateIsTrusted: Bool diff --git a/ios/Sources/Model/JSEudiWalletConfig.swift b/ios/Sources/Model/JSEudiWalletConfig.swift index e93d196..7baf273 100644 --- a/ios/Sources/Model/JSEudiWalletConfig.swift +++ b/ios/Sources/Model/JSEudiWalletConfig.swift @@ -9,7 +9,7 @@ extension JSEudiWalletConfig { init(fromJson json: JSONDictionary) throws { let trustedReaderCertificatesPem = json["trustedReaderCertificates"] as? [String] let trustedReaderCertificates = try trustedReaderCertificatesPem?.map { - try parseCertDataFromPem(certPem: $0) + try CertUtils.parseCertDataFromPem(certPem: $0) } ?? [Data]() let openId4VpConfigJson = json["openId4VpConfig"] as? JSONDictionary diff --git a/ios/Sources/Model/JSRequestedDocument.swift b/ios/Sources/Model/JSRequestedDocument.swift index f114d92..859d73c 100644 --- a/ios/Sources/Model/JSRequestedDocument.swift +++ b/ios/Sources/Model/JSRequestedDocument.swift @@ -1,7 +1,7 @@ import EudiWalletKit import Foundation -struct JSRequestedDocument { +struct JSRequestedDocument: Codable { let documentId: String let docType: String let docName: String diff --git a/ios/Sources/Model/JSTransferEvent.swift b/ios/Sources/Model/JSTransferEvent.swift index f6f9c12..bbf4bd4 100644 --- a/ios/Sources/Model/JSTransferEvent.swift +++ b/ios/Sources/Model/JSTransferEvent.swift @@ -10,14 +10,20 @@ enum JSTransferEvent { case Error(errorMessage: String) case Redirect + var type: String { + let enumCaseName = Mirror(reflecting: self).children.first?.label ?? "\(self)" + return "Transfer\(enumCaseName)" + } + var asProxyEventPayload: JSONDictionary { - var payload: JSONDictionary = ["type": "Transfer\(String(reflecting: self))"] + var payload: JSONDictionary = ["type": self.type] switch self { case let .QrEngagementReady(qrCodeContent): payload.updateValue(qrCodeContent, forKey: "qrCodeContent") case let .RequestReceived(requestedDocuments): - payload.updateValue(requestedDocuments, forKey: "requestedDocuments") + // TODO: Improve error handling + payload.updateValue(requestedDocuments.map { try? $0.toDictionary() }, forKey: "requestedDocuments") case let .Error(errorMessage): payload.updateValue(errorMessage, forKey: "errorMessage") default: diff --git a/ios/Sources/Utils.swift b/ios/Sources/Utils.swift deleted file mode 100644 index 23df6a7..0000000 --- a/ios/Sources/Utils.swift +++ /dev/null @@ -1,19 +0,0 @@ -typealias JSONDictionary = [String: Any?] - -enum RuntimeError: Error { - case error(_ msg: String) -} - -func parseCertDataFromPem(certPem: String) throws -> Data { - let certBase64 = certPem - .split(separator: "\n") - .dropFirst() - .dropLast() - .joined() - - guard let certData = Data(base64Encoded: String(certBase64)) else { - throw RuntimeError.error("Cannot parse cert data from PEM") - } - - return certData -} diff --git a/ios/Sources/Utils/CertUtils.swift b/ios/Sources/Utils/CertUtils.swift new file mode 100644 index 0000000..fe67459 --- /dev/null +++ b/ios/Sources/Utils/CertUtils.swift @@ -0,0 +1,15 @@ +struct CertUtils { + static func parseCertDataFromPem(certPem: String) throws -> Data { + let certBase64 = certPem + .split(separator: "\n") + .dropFirst() + .dropLast() + .joined() + + guard let certData = Data(base64Encoded: String(certBase64)) else { + throw RuntimeError.error("Cannot parse cert data from PEM") + } + + return certData + } +} diff --git a/ios/Sources/Utils/SerializationUtils.swift b/ios/Sources/Utils/SerializationUtils.swift new file mode 100644 index 0000000..70d80d0 --- /dev/null +++ b/ios/Sources/Utils/SerializationUtils.swift @@ -0,0 +1,22 @@ +import OrderedCollections + +struct SerializationUtils { + // TODO: Check if there is a better way to do this + static func convertOrderedDictionaryToDictionary(orderedDict: OrderedDictionary) -> Dictionary { + let keyValuePairs = orderedDict.elements.map { + if let nestedDict = $0.value as? OrderedDictionary { + let convertedNestedDict = self.convertOrderedDictionaryToDictionary(orderedDict: nestedDict) + return ($0.key, convertedNestedDict as Any) + } + + if let nestedDictArray = $0.value as? [OrderedDictionary] { + let convertedNestedDictArray = nestedDictArray.map { self.convertOrderedDictionaryToDictionary(orderedDict: $0) } + return ($0.key, convertedNestedDictArray as Any) + } + + return ($0.key, $0.value) + } + + return Dictionary(uniqueKeysWithValues: keyValuePairs) + } +} diff --git a/ios/Sources/Utils/Types.swift b/ios/Sources/Utils/Types.swift new file mode 100644 index 0000000..9e1468b --- /dev/null +++ b/ios/Sources/Utils/Types.swift @@ -0,0 +1,7 @@ +import Foundation + +typealias JSONDictionary = [String: Any?] + +enum RuntimeError: Error { + case error(_ msg: String) +} diff --git a/ios/Sources/WalletModule.swift b/ios/Sources/WalletModule.swift index 1d977e2..d37d0cb 100644 --- a/ios/Sources/WalletModule.swift +++ b/ios/Sources/WalletModule.swift @@ -42,30 +42,37 @@ final class WalletModule: NSObject { } } - @objc(withResolver:withRejecter:) + @objc(getDocuments:withRejecter:) func getDocuments(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { - var result = [JSDocument]() - - let documentIds = self._walletInstance.storage.documentIds - let storedModels = self._walletInstance.storage.mdocModels - - for (index, storedModel) in storedModels.enumerated() { - guard let documentId = documentIds[index] - else { - self._logger.warning("Document ID for loaded model is null, skipping item...") - continue - } + do { + var result = [JSONDictionary]() + + let documentIds = self._walletInstance.storage.documentIds + let storedModels = self._walletInstance.storage.mdocModels - guard let model = storedModel - else { - self._logger.warning("Loaded model is null (documentId = \(documentId), skipping item...") - continue + for (index, storedModel) in storedModels.enumerated() { + guard let documentId = documentIds[index] + else { + self._logger.warning("Document ID for loaded model is null, skipping item...") + continue + } + + guard let model = storedModel + else { + self._logger.warning("Loaded model is null (documentId = \(documentId), skipping item...") + continue + } + + let documentJson = try JSDocument(id: documentId, mdocModel: model).toDictionary() + result.append(documentJson) } - result.append(JSDocument(id: documentId, mdocModel: model)) + resolve(result) } - - resolve(result) + catch { + reject("Error on getting documents", error.localizedDescription, error) + } + } @objc(getDocumentById:withResolver:withRejecter:) @@ -73,22 +80,29 @@ final class WalletModule: NSObject { _ documentId: NSString, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { - let documentId = documentId as String - - guard let documentIndex = self._walletInstance.storage.documentIds.firstIndex(of: documentId) - else { - self._logger.warning("Cannot find document index to delete (documentId = \(documentId)), returning empty result...") - resolve(nil) - return + do { + let documentId = documentId as String + + guard let documentIndex = self._walletInstance.storage.documentIds.firstIndex(of: documentId) + else { + self._logger.warning("Cannot find document index to delete (documentId = \(documentId)), returning empty result...") + resolve(nil) + return + } + + guard let model = self._walletInstance.storage.getDocumentModel(index: documentIndex) + else { + resolve(nil) + return + } + + let result = try JSDocument(id: documentId, mdocModel: model).toDictionary() + resolve(result) } - - guard let model = self._walletInstance.storage.getDocumentModel(index: documentIndex) - else { - resolve(nil) - return + catch { + reject("Error on getting document by id", error.localizedDescription, error) } - - resolve(JSDocument(id: documentId, mdocModel: model)) + } @objc(deleteDocumentById:withResolver:withRejecter:) @@ -134,7 +148,6 @@ final class WalletModule: NSObject { } } - // TODO: Same-device use case (deeplink) @objc(startRemotePresentation:) func startRemotePresentation(_ url: NSString) { self.stopPresentation() @@ -186,6 +199,7 @@ final class WalletModule: NSObject { else { throw RuntimeError.error("There is no active presentation session") } await self._activePresentation!.sendResponse(disclosedDocuments: disclosedDocuments, onSuccess: nil, onCancel: nil) + resolve(nil) } catch { reject("Error on sending presentation response", error.localizedDescription, error) diff --git a/src/EudiWallet.ts b/src/EudiWallet.ts index da79274..5846b12 100644 --- a/src/EudiWallet.ts +++ b/src/EudiWallet.ts @@ -2,7 +2,7 @@ import type { EudiWalletConfig } from './config' import type { TransferEventListener } from './events' import type { DisclosedDocument, Document } from './model' -import { NativeModules } from 'react-native' +import { NativeModules, Platform } from 'react-native' import { EudiWalletEventManager } from './EudiWalletEventManager' @@ -49,7 +49,11 @@ export abstract class EudiWallet { sendSessionTerminationMessage: boolean = true, useTransportSpecificSessionTermination: boolean = false, ): void { - EudiWalletModule.stopPresentation(sendSessionTerminationMessage, useTransportSpecificSessionTermination) + if (Platform.OS === 'android') { + EudiWalletModule.stopPresentation(sendSessionTerminationMessage, useTransportSpecificSessionTermination) + } else { + EudiWalletModule.stopPresentation() + } } public static async loadSampleData(sampleDataFile?: string): Promise { diff --git a/src/model/Document.ts b/src/model/Document.ts index cd0ac5a..c072eda 100644 --- a/src/model/Document.ts +++ b/src/model/Document.ts @@ -4,8 +4,8 @@ export interface Document { id: string docType: string name: string - createdAt: number - requiresUserAuth: boolean + createdAt?: number + requiresUserAuth?: boolean namespaces: Record namespacedData: Record } diff --git a/yarn.lock b/yarn.lock index 5a40400..d3d567e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1873,6 +1873,16 @@ __metadata: languageName: node linkType: hard +"@craftzdog/react-native-buffer@npm:^6.0.5": + version: 6.0.5 + resolution: "@craftzdog/react-native-buffer@npm:6.0.5" + dependencies: + ieee754: ^1.2.1 + react-native-quick-base64: ^2.0.5 + checksum: 921b8bc7f84778e355e81e475792399276d611a346a7e51b6266a45cf4aa82194beb3a8106af796ed143d958c8476070c59e3720c0eec0a3c31e368fbb08b350 + languageName: node + linkType: hard + "@cspotcode/source-map-support@npm:^0.8.0": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" @@ -6626,6 +6636,7 @@ __metadata: "@babel/core": ^7.20.0 "@babel/preset-env": ^7.20.0 "@babel/runtime": ^7.20.0 + "@craftzdog/react-native-buffer": ^6.0.5 "@react-native/babel-preset": 0.73.21 "@react-native/metro-config": 0.73.5 "@react-native/typescript-config": 0.73.1 @@ -6644,6 +6655,7 @@ __metadata: react-native-device-info: ^10.13.1 react-native-permissions: ^4.1.5 react-native-qrcode-svg: ^6.3.0 + react-native-quick-base64: ^2.0.8 react-native-safe-area-context: ^4.9.0 react-native-screens: ^3.29.0 react-native-svg: ^15.0.0 @@ -11532,6 +11544,18 @@ __metadata: languageName: node linkType: hard +"react-native-quick-base64@npm:^2.0.5, react-native-quick-base64@npm:^2.0.8": + version: 2.1.2 + resolution: "react-native-quick-base64@npm:2.1.2" + dependencies: + base64-js: ^1.5.1 + peerDependencies: + react: "*" + react-native: "*" + checksum: 46f3b26f48b26978686b0c043336220d681e6a02af5abcf3eb4ab7b9216251d1eb2fac5c559e984d963e93f54bd9f323651daac09762196815558abbd551729b + languageName: node + linkType: hard + "react-native-safe-area-context@npm:^4.9.0": version: 4.9.0 resolution: "react-native-safe-area-context@npm:4.9.0"