react native how to implement deep link and fbsdk in IOS - ios

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

iOS AppDelegate.m: Handling openUrl RCTLinkingManager and Twitter - Duplicate declaration of method 'application:openURL:options:'

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]);
}

iOS: objective-C, facebook and twitter implementation

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;
}

How to multiple source in openURL in AppDelegate.m?

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. 🙂

Two packages conflict in AppDelegate.m file

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.

AppDelegate.m for both FBSDK and LinkingManager

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;
}

Resources