Выполнить запрос DNS srv в реагировать родной с JAVA на Android - PullRequest
1 голос
/ 28 июня 2019

Я пытаюсь разрешить запись 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 и выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...