Many a times in React Native App development stage, we come at a point when we want to add a features which is not in-built in react native but can be developed by native IOS or Android coding. At that stage we need to develop a Native Module for our app which allow us to extend the native features to react native.
Create a react native project “PinterestAuth” using command below :
$ react-native init PinterestAuth
Change directory to “ios” using the below command :
$ cd PinterestAuth/ios
Now, using the command below, create a pod file
$ pod init
Open the Podfile and add the following dependency in the target section :
pod 'PinterestSDK', :git => 'https://github.com/pinterest/ios-pdk.git'
After saving the Podfile run the following command :
$ pod install
Now create a Pinterest app by going to this url and note down the APP ID for next steps.
Open project in XCode, right-click .plist file and select Open As > Source Code. Add the code below between the <dict> </dict> tags :
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string></string>
<key>CFBundleURLSchemes</key>
<array>
<string>pdk{your-app-id}</string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>pinterestsdk.v1</string>
</array>
Replace {your-app-id} with APP ID generated above.
Next, In file AppDelegate.m add the code below :
#import "PDKClient.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
.
.
.
[PDKClient configureSharedInstanceWithAppId:@"4948094164569964648"];
.
.
.
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
BOOL handled = [[PDKClient sharedInstance] handleCallbackURL:url];
return handled;
}
Right click on “PinterestAuth” folder and create a new Cocoa Touch Class with name “PinterestManage”. Now, we have two files PinterestManager.h and PinterestManager.m.
In the PinterestManager.h add the code below :
#import <Foundation/Foundation.h> #import "React/RCTBridgeModule.h" @interface PinterestManager : NSObject <RCTBridgeModule> @end
Next, we will add the code below to PinterestManager.m :
#import "PinterestManager.h"
#import "PDKClient.h"
#import "PDKResponseObject.h"
@implementation PinterestManager
RCT_EXPORT_MODULE();
RCT_REMAP_METHOD(pinterest,
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{
[[PDKClient sharedInstance] authenticateWithPermissions:@[PDKClientReadPublicPermissions,
PDKClientWritePublicPermissions,
PDKClientReadRelationshipsPermissions,
PDKClientWriteRelationshipsPermissions]
fromViewController:nil
withSuccess:^(PDKResponseObject *responseObject)
{
NSString *token = [[PDKClient sharedInstance] oauthToken];
resolve(token);
} andFailure:^(NSError *error) {
reject(@"get_error", @"Pinterest login error", error);
}];
}
@end
In the above code we are creating a Pinterest instance using the instance we are getting the token that is generated after user authenticates and return the token as a promise . In case, there is error, we reject with the error message.
Now, open file index.ios.js and add the code below :
import { NativeModules } from 'react-native';
const PinterestManager = NativeModules.PinterestManager;
PinterestManager.pinterest()
.then((authToken) => {
console.log("authToken : ",authToken);
})
.catch((error) => {
console.log(error);
})
Video Tutorial