Заголовок Swift Bridging не экспортирует типы React Native - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь создать собственный (iOS) модуль для приложения React Native, используя Swift.Я хочу показать метод модуля, который возвращает обещание, используя функции типа RCTPromiseResolveBlock и RCTPromiseRejectBlock, обе из которых объявлены в заголовке RCTBridgeModule.h React Native.Однако моя сборка завершается неудачно с сообщением «Использование необъявленного типа ...» для обоих этих типов.

Я уже создал заголовок моста (автоматически используя Xcode) для другой цели, поэтому я считаю, что импорт React/RCTBridgeModule.h - это все, что мне нужно, чтобы предоставить типы, упомянутые выше.Предположительно, я что-то неправильно настроил, поскольку это не решает проблему.Я попытался настроить новый проект, и там все работает как положено, но я не могу найти разницу, которая привела бы к сбою сборки моего проекта.

Некоторые важные сведения о конфигурации:

  • Заголовок моста с именем <ProjectName>-Bridging-Header.h и хранится в моем исходном каталоге.Я переместил его, чтобы убедиться, что XCode находит его (сборка завершается ошибкой, когда он не в нужном месте).
  • Содержимое заголовка моста просто: #import <React/RCTBridgeModule.h>
  • Inмои настройки сборки проекта:
    • <ProjectName>-Bridging-Header.h настроен как «Заголовок моста Objective C»
    • «Установить заголовок совместимости Objective C» установлен на «Да»
    • «Precompile Bridging Header» установлен в «Yes»
  • Когда я печатаю псевдоним отсутствующих типов, проект строится и запускается, как и ожидалось
  • У меня есть сторонняя программаУстановленные библиотеки Swift (одна с использованием react-native link и одна с использованием подмодуля Git)
  • Я попытался очистить папку сборки, переустановить node_modules и удалить данные, полученные из Xcode, но все безрезультатно.

Неправильно ли настроен мой проект или я пропустил что-то важное?

1 Ответ

0 голосов
/ 31 января 2019

Это руководство довольно хорошо объясняет, как настроить собственный модуль с помощью Swift.Он разбивает все на шаги, и за ним довольно легко следить.

https://teabreak.e -spres-oh.com / swift-in-response-native-the-ultimate-guide-part-1-modules-9bb8d054db03

  1. Настройка
  2. Как открыть класс Swift для JS
  3. Как предоставить статические данные Swift
  4. Как открыть метод Swift
  5. Как открытьметод с обратным вызовом
  6. Как выставить метод в качестве Обещания
  7. Как выставить Emitter Event
  8. Как извлечь свой React Native Module

Очевидно, что это шаг 6, который вы хотите сделать.

Вот пример кода.Это очень похоже на то, что сделано в приведенной выше ссылке.Заголовок моста должен выглядеть следующим образом:

// <ProjectName>-Bridging-Header.h

#import "React/RCTBridgeModule.h"
#import "React/RCTEventEmitter.h"

У вас должны быть файлы с именами ModuleName.m и ModuleName.swift.

// ModuleName.m
#import "React/RCTBridgeModule.h"
#import "React/RCTEventEmitter.h"
@interface RCT_EXTERN_MODULE(ModuleName, NSObject)
// this is how we expose the promise to the javascript side.
RCT_EXTERN_METHOD(functionWithPromise: (RCTPromiseResolveBlock)resolve rejecter: (RCTPromiseRejectBlock)reject)
@end

// ModuleName.swift

@objc(ModuleName)
class ModuleName: NSObject {
  @objc
  func constantsToExport() -> [AnyHashable : Any]! {
    return ["projectName": "ModuleName"]
  }

  @objc
  static func requiresMainQueueSetup() -> Bool {
    return true
  }

  @objc
  func functionWithPromise(
    _ resolve: RCTPromiseResolveBlock,
    rejecter reject: RCTPromiseRejectBlock
  ) -> Void {
    if (//something bad happens) {
      let error = NSError(domain: "", code: 200, userInfo: nil)
      reject("ERROR_FOUND", "failure", error)
    } else {
      resolve("success")
    }
  }
}

Затем на стороне Javascript вы можете получить к нему доступ следующим образом:

import { NativeModules } from 'react-native'

NativeModules.Counter.functionWithPromise()
    .then(res => console.log(res))
    .catch(e => console.log(e.message, e.code))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...