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

Offical Documentation

Official Docs: