ReactNative Setup
As you follow this tutorial, we recommend using our demo project reference to assist you in integrating the SDK into your project.
Prerequisites
To follow along you should have basic knowledge of creating web apps with Javascript and it's ecosystem. In this tutorial we are going to use:
- Node.js
- NPM — JavaScript package manager.
- React Native CLI — React native development.
- Android Studio (for Android development)
- XCode (for iOS development) — React native development.
- Your access key must be setup under Pixelbin > GlamAR console.
- Any valid SKU inside your Product Inventory under GlamAR.
Visit Getting Started Page if access key or appId has not been created
Installation
Once you have obtained your access key and an appId, you're ready to integrate the GlamAR SDK into your project. This can be achieved through two primary methods:
- Installing it from NPM
- Manually download the latest GlamAr Package place it in your project root.
NPM
Add GlamAR React Native SDK to your project using npm:
npm i @glamario/core-react-native
Then you can simply import GlamAR SDK as follows
import { GlamAr, GlamArProvider } from "@glamario/core-react-native";
Because we use ES2017 syntax (such as import), this workflow assumes you are using a modern browser or a bundler/transpiler to convert your code to something older browsers understand. However, you are free to use any build tool that you prefer.
Manual download
Download latest GlamAr Package
Then update your package.json:
"dependencies": {
"@glamario/core-react-native": "glamar-react-native.tgz"
}
Once GlamAr SDK is setup now make sure you have the following peer dependencies in your project's package.json
"react": ">=18 <20",
"react-native": ">=0.68.0",
"react-native-webview": ">=11.0.0",
"react-native-device-info": ">=10.0.0",
"react-native-permissions": ">=3.8.0"
Once all these dependencies are setup run following command
npm install
Metro Configuration
React Native uses Metro to build your JavaScript code and assets.
Update your metro.config.js
const path = require("path");
const { getDefaultConfig, mergeConfig } = require("@react-native/metro-config");
const projectRoot = __dirname;
const appNM = (p) => path.join(projectRoot, "node_modules", p);
const defaultConfig = getDefaultConfig(projectRoot);
module.exports = mergeConfig(defaultConfig, {
resolver: {
nodeModulesPaths: [path.join(projectRoot, "node_modules")],
extraNodeModules: {
react: appNM("react"),
"react/jsx-runtime": appNM("react/jsx-runtime"),
"react/jsx-dev-runtime": appNM("react/jsx-dev-runtime"),
"react-native": appNM("react-native"),
"react-native-webview": appNM("react-native-webview"),
scheduler: appNM("scheduler"),
"@babel/runtime": appNM("@babel/runtime"),
},
},
});
Camera Permissions
Android
To handle camera permission handling for Android follow the given steps
- On Android, request camera permission using PermissionsAndroid
- Add the required permissions in
AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="true"/>
- In
MainActivity.java, ensureonPermissionRequestgrants camera access.
@Override
public void onPermissionRequest(final PermissionRequest request) {
runOnUiThread(() -> request.grant(request.getResources()));
}
iOS
To handle camera permission handling for iOS follow the given steps
- In
Info.plist, add the following key-value pair to request camera permissions:
<key>NSCameraUsageDescription</key>
<string>This app requires access to the camera for showing virtual try on's</string>
No additional WebView permission handling is needed if you are using react-native-webview.
For any other react-native integration and environement setup check React Native setup guide
Basic Functions
skinAnalysis
Launch Skin Analysis follow
GlamAr.skinAnalysis('start');
on
Event listeners are essential soon after initialization is called to start listening to GlamAR SDK callback events.
const subscriptions = [];
["loaded", "skin-analysis", "error"].forEach((event) => {
const sub = GlamArEmitter.on(event, (payload) => {
console.log(`Event: ${event}`, payload);
});
subscriptions.push(sub);
});
// cleanup
subscriptions.forEach((sub) => sub.remove());
After calling
init, best practise is to wait to receive the event "loaded" before calling any other function