npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@comapi/cordova-plugin-dotdigital-pushutils

v1.1.0

Published

Cordova plugin to provide some push related utilities

Downloads

4

Readme

Introduction

The Cordova plugin is designed to work in conjunction with the existing Javascript SDK. It allows your Cordova or PhoneGap app to open deep links.

Read through the sections below to discover how to deploy and use the Dotdigital Cordova Plugin to Dotdigital enable your apps:

Compatibility

This plugin supports iOS (7 and above) and Android (4.0 - API level 14 and above). It works with Cordova and PhoneGap frameworks.

Deep links

You can send a deep link as part of a push message. You will need to use another plugin to correctly handle the links in your application (for routing purposes). The following 3rd party plugins are recommended

To correctly handle deep links in your app you will need to tweak the native project files:

iOS

You will need to add LSApplicationQueriesSchemes key to your info.plist file to allow opening of deep links.

Android

You will need to modify AndroidManifest.xml

  • android:launchMode needs to be set to singleTask
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" 
    android:label="@string/activity_name" 
    **android:launchMode="singleTask" 
    **android:name="MainActivity" 
    android:theme="@android:style/Theme.DeviceDefault.NoActionBar" 
    android:windowSoftInputMode="adjustResize">
  • add an intent filter for the scheme
<intent-filter>
  <data android:scheme=">>>YOUR SCHEME NAME<<<"/>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
</intent-filter>

A simple way of testing these links is to implement the following function in your app: This is always called by cordova when the app is launched through a custom scheme url.

<script>
    function handleOpenURL(url) {
        setTimeout(function() {
        alert("received url: " + url);
        console.log(`handleOpenUrl(${url})`);
        }, 0);
    }
</script>

The above 3rd party plugins will have a more sophisticated approach and implementing this method may interfere with their behavior.

Methods

version()

const version = cordova.plugins.dotdigitalPlugin.version();

Returns the version of the plugin.

setBadgeCount()

window.cordova.plugins.dotdigitalPlugin.setBadgeCount(() => {
      console.log("setBadgeCount succeeded ;-)");
  }, () => {
      console.error("setBadgeCount failed ;-(");
  }, 0);

iOS specific method to explicitly set the Application Badge Count

getBadgeCount()

window.cordova.plugins.dotdigitalPlugin.getBadgeCount((count) => {
      console.log(`getBadgeCount succeeded: ${count}`);
  }, () => {
      console.error("getBadgeCount failed ;-(");
  });

iOS specific method to query the Application Badge Count

getPlatform()

cordova.plugins.dotdigitalPlugin.getPlatform((platform) => {
      console.log(`getPlatform succeeded: ${platform}`);
  }, () => {
      console.error("getBadgeCount failed ;-(");
  });

Method to query the application platform - (returns "android" or "iOS")

openLink()

cordova.plugins.dotdigitalPlugin.openLink(() => {
      console.log("openLink succeeded ;-)");
  }, () => {
      console.error("openLink failed ;-(");
  }, "myapp://products/1");

Method to directly open a link. The url is passed rather than the push payload. THis method is only supplied for advanced use cases.

handleLink()


cordova.plugins.dotdigitalPlugin.handleLink(payload)
    .then(() => {
        console.log("👍");
    })
    .catch((error) => {
        console.log("😌", error);
    })

Method to perform all the handling associated with a deep link. This can be safely called for all notifications received and will do nothing if no link is present. If there is a link present, this method will perform a GET request to a tracking analytics endpoint (if specified) and then open the link. It is up to the Integrator to handle the link (see above).

containsLink()

const containsLink = cordova.plugins.dotdigitalPlugin.containsLink(payload);

Method to ascertain whether a notification contains a link. No action is performed other than inspecting the payload.

Integration strategy

Here is a minimal sample app that uses phonegap-plugin-push to manage push notifications.


const config = {
  urlBase: "https://api.comapi.com",
  apispaceId: ">>>YOUR APISPACE <<<",
  secret: ">>>YOUR SECRET<<<",
  profileId: ">>>PROFILEID OF DEVICE OWNER<<<",
  email: ">>>EMAIL OF DEVICE OWNER<<<",
  iss: "https://api.comapi.com/defaultauth",
  aud: "https://api.comapi.com",
};

function createJwt(profileId, nonce) {

    // Header
    var oHeader = { alg: 'HS256', typ: 'JWT' };
    // Payload
    var tNow = KJUR.jws.IntDate.get('now');
    var tEnd = KJUR.jws.IntDate.get('now + 1day');
    var oPayload = {
        sub: profileId,
        nonce: nonce,
        iss: config.iss,
        aud: config.aud,
        iat: tNow,
        exp: tEnd,
    };
    var sHeader = JSON.stringify(oHeader);
    var sPayload = JSON.stringify(oPayload);
    var sJWT = KJUR.jws.JWS.sign("HS256", sHeader, sPayload, { utf8: config.secret });

    return sJWT;
}

function challengeHandler(options, answerAuthenticationChallenge) {
    var jwt = createJwt(config.profileId, options.nonce);
    answerAuthenticationChallenge(jwt);
}

// This should only be called once
function initialiseComapi(data) {

    let pushConfig = {};
    // NOTE: you cannot set both apns and fcm 
    // - identify the platform and set the appropriate device specific config
    // this device object is from cordova-plugin-device
    if (device.platform === 'iOS') {
        pushConfig.apns = {
            "bundleId": "your bundleId",
            // Ensure you set te correct environment - 0 for Sandbox, 1 for production (ur use enum if using TS)
            "environment": 0,
            "token": data.registrationId
        };
    } else if (device.platform === 'Android') {
        pushConfig.fcm = {
            "package": "your packagename",
            "registrationId": data.registrationId
        };
    }

    var comapiConfig = new COMAPI.ComapiConfig()
        .withApiSpace(config.apispaceId)
        .withUrlBase(config.urlBase)
        .withAuthChallenge(challengeHandler)
        .withLogLevel(3)
        .withPushConfiguration(pushConfig)

    let _comapiSDK;

    COMAPI.Foundation.initialise(comapiConfig)
        .then(function (result) {
            _comapiSDK = result;
            console.log("Initialized, starting session ...")
            return _comapiSDK.startSession();
        })
        .then(function (result) {
            console.log("Getting Profile ...")
            return _comapiSDK.services.profile.getMyProfile();
        })
        .then(function (profile) {
            // EC will create a contact off the back of a webhook subscription for this ...
            profile.email = config.email;
            console.log("Updating profile");
            return _comapiSDK.services.profile.updateMyProfile(profile);
        })
        .then(function (result) {
            console.log("Done");
            return _comapiSDK;
        });
}

function onDeviceReady() {

    const push = PushNotification.init({
        ios: {
            alert: "true",
            badge: "true",
            sound: "true"
        },
        android: {
        },
    });

    let hasRegistered = false;
    push.on('registration', (data) => {

        console.log(`push.on("registration") : ${data.registrationId}`);

        // plugin can fire this twice so ignore subsequent calls
        if (!hasRegistered) {
            hasRegistered = true;
            initialiseComapi(data);
        }
    });

    push.on('notification', (data) => {

      let msg = JSON.stringify(data);
      console.log(msg);

      if (cordova && cordova.plugins && cordova.plugins.dotdigitalPlugin) {

        /* You don't need to call containsDeepLink() as handleLink() will simply do nothing if there is no link to process
         */

        if(cordova.plugins.dotdigitalPlugin.containsLink(data)){

            cordova.plugins.dotdigitalPlugin.handleLink(data)
                .then(() => {
                    console.log("👍");
                })
                .catch((error) => {
                    console.log("😌", error);
                })
            }
        }

        let msg = JSON.stringify(data);
        alert(msg);

    });

    push.on('error', (e) => {
        console.log(e.message);
    });


}