React Native Indy SDK wrapper.
with npm:
$ npm install rn-indy-sdk --save
with Yarn:
$ yarn add rn-indy-sdk
Link (for React Native lower than 0.60)
$ react-native link rn-indy-sdk
See https://github.com/TimoGlastra/ExampleRnIndySDK for an example android react native project that follows this tutorial.
Make sure there is a min. SDK version setup in android/build.gradle
:
buildscript {
ext {
...
minSdkVersion = 21
...
}
}
Add Sovrin Maven repository into android/build.gradle
:
allprojects {
repositories {
...
maven {
url 'https://repo.sovrin.org/repository/maven-public'
}
...
}
}
Add to android/app/build.gradle
:
dependencies {
// ...
implementation 'net.java.dev.jna:jna:5.2.0'
// ...
}
Download Android libindy binaries and copy them into android/app/src/main/jniLibs
.
android/app/src/main/jniLibs
directory in your projectarm64-v8a
, armeabi-v7a
, x86
and x86_64
inside android/app/src/main/jniLibs
.stable
channel and version 1.15.0
base url will be https://repo.sovrin.org/android/libindy/stable/1.15.0/arm64
, armv7
, x86
and x86_64
, e.g.:
libindy_android_arm64_1.15.0.zip
libindy_android_armv7_1.15.0.zip
libindy_android_x86_1.15.0.zip
libindy_android_x86_64_1.15.0.zip
libindy.so
files to corresponding jniLibs
directory
libindy_arm64/lib/libindy.so
to jniLibs/arm64-v8a/libindy.so
libindy_armv7/lib/libindy.so
to jniLibs/armeabi-v7a/libindy.so
libindy_x86/lib/libindy.so
to jniLibs/x86/libindy.so
libindy_x86_64/lib/libindy.so
to jniLibs/x86_64/libindy.so
aarch64
, armv7
, x86
, x86-64
, e.g.:
android-aarch64.jar
android-armv7.jar
android-x86-64.jar
android-x86.jar
libjnidispatch.so
to corresponding jniLibs
directory
.so
file from the jar using the jar
command. e.g. jar xf android-x86.jar
libjnidispatch.so
from android-aarch64.jar
to jniLibs/arm64-v8a/libjnidispatch.so
libjnidispatch.so
from android-armv7.jar
to jniLibs/armeabi-v7a/libjnidispatch.so
libjnidispatch.so
from android-x86.jar
to jniLibs/x86/libjnidispatch.so
libjnidispatch.so
from android-x86-64.jar
to jniLibs/x86_64/libjnidispatch.so
Add the following to MainActivity.java
:
//...
import android.os.Bundle;
import android.system.ErrnoException;
import android.system.Os;
import java.io.File;
public class MainActivity extends ReactActivity {
//...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
Os.setenv("EXTERNAL_STORAGE", getExternalFilesDir(null).getAbsolutePath(), true);
System.loadLibrary("indy");
} catch (ErrnoException e) {
e.printStackTrace();
}
}
}
Install CocoaPods dependencies:
pod install --project-directory=ios/
Create Frameworks
folder in your project's ios/Pods
directory and copy Indy.framework
into that directory.
[Optional] Most projects have ios/Pods
ignored in their .gitignore
. This is good practice, however this means the framework would need to be added after every clone. To prevent this you can "unignore" the Frameworks directory:
ios/Pods/
!ios/Pods/Frameworks
Indy.framework
as dependency into your project. Open .xcworkspace
file in Xcode and in your project settings, tab General, section Frameworks, Libraries, and Embedded Content, click on plus. Then select Add Other -> Add files... and navigate to Indy.framework
file on your disk. Beware that the Indy SDK repository does not have the "Build Libraries for Distribution" enabled by default. If that setting is disabled the version of Swift your project uses must be the same as the version of Swift used to compile
Indy.framework
. From Swift 5.0 onwards, building the library with that setting enabled will allow to use anIndy.framework
build that is compiled with a different version of Swift as your project. See https://stackoverflow.com/a/63305234/10552895 for more info.
import indy from 'rn-indy-sdk'
await indy.createWallet({ id: 'wallet-123' }, { key: 'key' })
You can see example project here https://github.com/jakubkoci/UseReactNativeIndySdk/. It currently shows only usage on Android.
I found an error with permission while calling createWallet
when I was testing this package:
2020-01-27 16:25:02.300 9955-10044/com.usereactnativeindysdk E/log_panics: thread 'unnamed' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }': libcore/result.rs:945
Modify onCreate
method in MainActivity
of your project where you want to use this library in a following way:
public class MainActivity extends ReactActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
File externalFilesDir = getExternalFilesDir(null);
String path = externalFilesDir.getAbsolutePath();
System.out.println("externalFilesDir=" + path);
try {
Os.setenv("EXTERNAL_STORAGE", path, true);
} catch (ErrnoException e) {
e.printStackTrace();
}
...
}
...
}
This should resolve the issue with permissions.