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