Я пытаюсь разрешить запись DNS SRV через реактивное нативное приложение для Android. К сожалению, после некоторых исследований npm и google я не смог найти подходящую библиотеку и попытался реализовать нативную реализацию JAVA самостоятельно. К сожалению, без успеха.
Поэтому я следовал Официальному руководству Facebook (https://facebook.github.io/react-native/docs/native-modules-android), чтобы создать собственный модуль. Но перед этим я успешно провел общий тест на JAVA. Пример кода можно найти ниже.
Нативная реализация Java. Я создал новый проект Maven с зависимостью dnsjava (https://github.com/dnsjava/dnsjava/blob/master/EXAMPLES.md)
package test.jsc;
import org.xbill.DNS.*;
public class App
{
public static void main( String[] args )
{
try {
Record[] records = new Lookup("_2ndlock._tcp.symlink.de", Type.SRV).run();
if(records != null && records.length > 0) {
System.out.println(records[0]);
}
} catch (TextParseException e) {
e.printStackTrace();
System.out.println("no service found");
}
}
}
Это прекрасно работает и распечатывает запись в моем терминале.
_2ndlock._tcp.symlink.de. 600 IN SRV 10 5 443 jarvis.symlink.de.
Пока все хорошо.
Затем я создал нативную реализацию для реактивного приложения.
То есть, в моем реактивном проекте в папке android / app / src / java / com / secondlock / SymlinkDnsSrv.java. Класс предоставляет метод "resolDnsSrvRecord" для разрешения записи DNS.
package com.secondlock;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import org.xbill.DNS.*;
import com.facebook.react.bridge.Promise;
public class SymlinkDnsSrv extends ReactContextBaseJavaModule {
public SymlinkDnsSrv(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return "SymlinkDnsSrv";
}
@ReactMethod
public void resolveDnsSrvRecord(String domain, Promise promise) {
try {
Record[] records = new Lookup(domain, Type.SRV).run();
promise.resolve(records);
} catch (Exception e) {
promise.reject(e);
}
}
}
И это java-класс пакета в моем реактивном проекте в папке android / app / src / java / com / secondlock / SymlinkDnsSrvPackage.java
package com.secondlock;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SymlinkDnsSrvPackage implements ReactPackage {
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext){
List<NativeModule> modules = new ArrayList<>();
modules.add(new SymlinkDnsSrv(reactContext));
return modules;
}
}
В моем реактивном проекте, если есть, создайте модуль загрузки модулей (как рекомендует Facebook) для загрузки собственного модуля
import {NativeModules} from 'react-native';
export default NativeModules.SymlinkDnsSrv;
И используйте реализацию в моем классе начальной загрузки
private async load(): Promise<void> {
console.log(SymlinkDnsSrv);
const r = await SymlinkDnsSrv.resolveDnsSrvRecord("_2ndlock._tcp.symlink.de");
console.log(r);
}
Затем я запускаю приложение в симуляторе Android (Pixel Api 28, Android 9.0) и всегда получаю вывод отладчика:
{resolveDnsSrvRecord: ƒ, getConstants: ƒ}getConstants: ƒ ()resolveDnsSrvRecord: ƒ fn()__proto__: Object
Bootstrapper.ts:22 null
Не удается разрешить запись DNS SRV. Возврат всегда нулевой.
Может, у кого-то есть подсказка, что я делаю не так? Или, может быть, уже сделали такую реализацию? Я с нетерпением жду любой помощи и говорю спасибо.
+++ Обновление
Я играл с различными версиями Android на моем виртуальном устройстве, и оказалось, что с Android 7 все работает нормально. Проблема возникает в версии 8 и выше.