Me gustaría manejar el esquema de URL personalizado en mi aplicación nativa de reacción. Por lo tanto, primero agregué un eventListener en mi código JS dentro de mi componente raíz así:
componentDidMount() { Linking.addEventListener('url', this.handleOpenURL); } componentWillUnmount() { Linking.removeEventListener('url', this.handleOpenURL); } handleOpenURL = event => { console.log('event', event); };En mi aplicación Xcode, agregué un esquema de URL personalizado "com.myScheme".
Mi problema apareció cuando traté de agregar la función en mi AppDelegate.swift para manejar la vinculación profunda.
Aquí está mi función:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { print(url) return true }Parece que devolver verdadero no es suficiente para activar mi oyente dentro de mi aplicación...
Sé que hay un método Objective-C en la documentación nativa de reacción:
#import <React/RCTLinkingManager.h> - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { return [RCTLinkingManager application:application openURL:url options:options]; }Pero me gustaría tratar solo con Swift para mi proyecto con el fin de mejorar mis habilidades en este idioma. El problema es que no puedo encontrar ningún ejemplo de esta función implementada usando Swift.
Es por eso que pido ayuda para implementar este método y luego activar mi evento dentro de mi aplicación RN.
Gracias por su comprensión :)
Con respecto a su método AppDelegate, la versión rápida debería ser:
public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { return RCTLinkingManager.application(app, open: url, options: options) }La respuesta de Ro22e0 funcionó muy bien para mí. Mi aplicación también admite enlaces universales, por lo que también necesitaba un equivalente rápido para la siguiente función proporcionada en los documentos de React Native :
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity
restorationHandler: (nonnull void (^)(NSArray<id<UIUserActivityRestoring>> *_Nullable))restorationHandler {
// Debug log something here
return [RCTLinkingManager application:application
continueUserActivity:userActivity
restorationHandler:restorationHandler];
}No me siento muy cómodo con Swift, pero finalmente pude obtener una solución funcional por ensayo y error:
func application( _ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void ) -> Bool { return RCTLinkingManager.application(application, continue: userActivity, restorationHandler: restorationHandler) }