I am trying to implement deep link with React Native on IOS using this link here https://medium.com/react-native-training/deep-linking-your-react-native-app-d87c39a1ad5e, however, I am having trouble at the steps of setting code in AppDelegate.m. As part of integrate FBsdk, my AppDelegate.m is having the following code
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
return [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation];
}
then I integrate with App Deep Link (https://medium.com/react-native-training/deep-linking-your-react-native-app-d87c39a1ad5e), then it ask to modify the same function. Below are what Deep Link on IOS requirement for the above method
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:
(id)annotation
{
return [RCTLinkingManager application:application openURL:url
sourceApplication:sourceApplication annotation:annotation];
}
So my question is how do I combine these two function
BOOL fbsdk = [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation];
BOOL deeplink = [RCTLinkingManager application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation];
return fbsdk || deeplink;
Would this be a correct answer? or do I need to do something with the url that comeback from NSString * scheme = (NSString*)url.scheme;
Related
I need to add DeepLinking to my React Native app, and as mentioned in docs I need to add the method above #and.
// Add this above `#end`:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
return [RCTLinkingManager application:application openURL:url options:options];
}
I've added this method, but I also have similar one for Twitter login. Here's my AppDelegate.m:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
return [[Twitter sharedInstance] application:app openURL:url options:options];
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
return [RCTLinkingManager application:application openURL:url options:options];
}
#end
I get an error:
Duplicate declaration of method 'application:openURL:options:'
How can it be solved? I'm not an iOS developer, so it's hard to figure out, but I think both two methods should be somehow combined.
As the error suggests, you can not have multiple functions with the same signature.
A simple solution here is merging your implementation into one, like this:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
return ([[Twitter sharedInstance] application:app openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options]);
}
How do you combine these 2 functions?
If i run it like this, I get this on Xcode error: duplicate declaration of method 'application:openURL:options:'. The idea is to implement facebook and twitter login buttons.
// Twitter
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<NSString *,id> *)options {
return [[Twitter sharedInstance] application:app openURL:Url options:options];
}
// Facebook
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]
];
// Add any custom logic here.
return handled;
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
BOOL handledByFacebook = [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
BOOL handledByTwitter = [[Twitter sharedInstance] application:application
openURL:url
options:options];
return handledByFacebook || handledByTwitter;
}
I'm trying to handle both of Twitter and deep link in openURL, using ReactNative.
The code below does not work, ending up go into if (LinkingHandled) even when handling Twitter.
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
bool TwitterHandled = [[Twitter sharedInstance] application:application openURL:url options:options];
bool LinkingHandled =[RCTLinkingManager application:application openURL:url options:options];
if (TwitterHandled) {
return TwitterHandled;
}
if (LinkingHandled) {
return LinkingHandled;
}
return NO;
}
What is wrong with this? I'm new to ObjC.
Use } else if { so only Twitter goes if it gets handled, and 'linking' will only go if TwitterHandled is NO and LinkingHandled is YES.
This can be simplified into one expression:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
return [Twitter.sharedInstance
application:application
openURL:url options:options] ||
[RCTLinkingManager
application:application
openURL:url
options:options];
}
Switch to Swift if you can. 🙂
I use https://github.com/devfd/react-native-google-signin and https://github.com/luisfcofv/react-native-deep-linking packages in my project. I did not solve the following part of the AppDelegate.m file so that the packages can work.
For this react-native-google-signin
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [RNGoogleSignin application:application openURL:url
sourceApplication:sourceApplication annotation:annotation];
}
For this react-native-deep-linking
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [RCTLinkingManager application:application openURL:url
sourceApplication:sourceApplication annotation:annotation];
}
I'm not good at Objective-C. How do I return RNGoogleSignin and RCTLinkingManager with a single function?
Since both methods return a BOOL, you could try something like this:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
BOOL success = [RNGoogleSignin application:application openURL:url
sourceApplication:sourceApplication annotation:annotation])
if (!success)
success = [RCTLinkingManager application:application openURL:url
sourceApplication:sourceApplication annotation:annotation];
return success;
}
updated based on comments from #rmaddy.
To use FBSDK I need this snippet in app delegate
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation
];
// Add any custom logic here.
return handled;
}
To use LinkingManager I need this snippet in app delegate
#import "RCTLinkingManager.h"
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [RCTLinkingManager application:application openURL:url
sourceApplication:sourceApplication annotation:annotation];
}
They're obviously duplicates. How do I combine the two so both libraries work?
I don't know any Objective-C
Of course, you can implement this method only once in your AppDelegate.
[[FBSDKApplicationDelegate... and [RCTLinkingManager... both return a BOOL.
You can put both snippets in the same method. I would suggest to return YES, if both [RCTLinkingManager... and [[FBSDKApplicationDelegate... return YES. Otherwise, return NO.
It could look like this:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
BOOL handledFB = [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation
];
BOOL handledRCT = [RCTLinkingManager application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
return handledFB || handledRCT;
}
I can't guarantee, that you can use FBSDKApplicationDelegate and RCTLinkingManager in the same app, because I have never worked with this. But your code should at least compile.
Wow, exactly what I was looking for! The accepted answer works great, except for a slight variation, since my FBSDK implementation is different (newer?). Because it uses:
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
I just tried to use the same parameters as FBSDK, and it works!
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]
Full method:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
BOOL handledFB = [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]
];
BOOL handledRCT = [RCTLinkingManager application:application
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]
];
return handledFB || handledRCT;
}
RN 0.59.x
For those who are using RNFirebase Linking:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
BOOL handledFB = [[FBSDKApplicationDelegate sharedInstance]
application:application
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
BOOL handledRCT = [RCTLinkingManager application:application openURL:url options:options];
if (!handledRCT) {
handledRCT = [[RNFirebaseLinks instance] application:application openURL:url options:options];
}
return handledFB || handledRCT;
}