Name
global.MobileDeepLinkGenerator
Description
No description available
Script
var MobileDeepLinkGenerator = Class.create();
// Mobile deep link format: {scheme}://{authority}/deeplink/{customScheme}?params={params}
var scheme;
var authority;
var customScheme;
var params;
// Firebase link format: {firebaseCustomDomainPath}{appName}&link={mobileDeepLink}&{firebaseParams}
var shouldWrapFirebase;
var firebaseCustomDomainPath;
var appName;
var firebaseParams;
MobileDeepLinkGenerator.prototype = {
initialize: function(mobileAppName) {
var mobileAppGR = new GlideRecord('sys_sg_mobile_application');
mobileAppGR.addQuery('name', mobileAppName);
mobileAppGR.query();
if (!mobileAppGR.next())
throw new Error("Mobile Application: " + mobileAppName + " does not match any valid mobile applications.");
var instanceId = gs.getProperty('instance_id');
var instanceName = gs.getProperty('glide.sg.deeplink.instance_name', gs.getProperty('instance_name'));
var domain = gs.getProperty('glide.sg.deeplink.instance_domain', 'service-now.com');
// Initialize deep link properties
this.scheme = "https";
this.authority = instanceName + "." + domain;
this.customScheme = mobileAppGR.custom_scheme;
this.params = {
"instanceId": instanceId,
"instanceName": instanceName,
"instanceUrl": this.scheme + "://" + this.authority
};
// Initialize firebase properties
this.shouldWrapFirebase = GlideProperties.getBoolean('glide.sg.deeplink.use_firebase_links') && mobileAppGR.use_firebase_links;
this.firebaseCustomDomainPath = gs.getProperty('glide.sg.deeplink.firebase_custom_domain_path');
this.appName = mobileAppGR.link_path;
this.firebaseParams = {
"apn": mobileAppGR.android_package_name,
"ibi": mobileAppGR.ios_bundle_id,
"isi": mobileAppGR.ios_apple_id
};
},
ID_TYPES: {
SCREEN: "Screen",
BUTTON: "Button",
APPLET_LAUNCHER: "AppletLauncher"
},
/**
* Public methods
**/
getScreenLink: function(documentId, /* json dictionary */ uiParams) {
var payload = this._generatePayload(documentId, this.ID_TYPES.SCREEN, "", "", uiParams);
this.params.redirectPayload = payload;
return this._generateLink("redirect");
},
getFormScreenLink: function(formScreenId, tableName, recordSysId) {
var payload = this._generatePayload(formScreenId, this.ID_TYPES.SCREEN, tableName, recordSysId);
this.params.redirectPayload = payload;
return this._generateLink("redirect");
},
getLauncherScreenLink: function(launcherScreenId) {
var payload = this._generatePayload(launcherScreenId, this.ID_TYPES.APPLET_LAUNCHER);
this.params.redirectPayload = payload;
return this._generateLink("redirect");
},
getButtonLink: function(buttonId, tableName, recordSysId) {
var payload = this._generatePayload(buttonId, this.ID_TYPES.BUTTON, tableName, recordSysId);
this.params.redirectPayload = payload;
return this._generateLink("launch_button");
},
getUniversalLink: function(url) {
this.params.url = url;
return this._generateLink("ulink");
},
getPrefillLink: function(forceLocalLogin) {
this.params.forceLocalLogin = (forceLocalLogin === undefined) ? false : forceLocalLogin;
return this._generateLink("prefill");
},
getSSOPrefillLink: function(forceSsoId) {
this.params.forceSsoId = forceSsoId;
return this._generateLink("ssoPrefill");
},
/**
* Private methods
**/
_generateLink: function(action) {
var mobileLink = this._createMobileLink(action);
if (this.shouldWrapFirebase)
return this._createFirebaseLink(mobileLink);
return mobileLink;
},
_createMobileLink: function(action) {
this.params.action = action;
var base64Parameters = GlideStringUtil.base64Encode(JSON.stringify(this.params));
return this.scheme + "://" + this.authority + "/deeplink/" + this.customScheme + "?params=" + base64Parameters;
},
_createFirebaseLink: function(link) {
var paramsArr = [];
for(var key in this.firebaseParams) {
paramsArr.push(key + "=" + this.firebaseParams[key]);
}
var paramsPath = paramsArr.join('&');
var encodedLink = encodeURIComponent(link);
return this.firebaseCustomDomainPath + this.appName + "&link=" + encodedLink + "&" + paramsPath;
},
_generatePayload: function(id, idType, tableName, recordSysId, uiParams) {
if (!id)
throw new Error(idType + "Id is invalid");
if (recordSysId && !tableName)
throw new Error("table name is missing for record " + recordSysId);
var payload = {};
payload[idType + 'Id'] = id;
if (recordSysId) {
payload['RecordId'] = recordSysId;
payload['TableName'] = tableName;
}
if (uiParams)
payload['FormFieldValues'] = uiParams;
return GlideStringUtil.base64Encode(JSON.stringify(payload));
},
type: 'MobileDeepLinkGenerator'
};
Sys ID
d52318830ba03300dee1c71437673ac8