Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to avoid Installation duplicates using Parse?

I've noticed that every time I've deployed my app to my phone,it duplicates the installation in parse to receive push notifications. How can I avoid this from happening whenever I reinstall the app?

like image 320
Rhynoboy Avatar asked Aug 23 '26 12:08

Rhynoboy


1 Answers

After a week of research and try and error, I finally found a working solution. Basically, you need to do two things to achieve this:

  • In your Android app: pass some unique ID when you initialize and save the ParseInstallation. we will use ANDROID_ID.
  • In Parse Cloud Code: Before you save a new Installation, check to see if its unique ID exist in an old Installation. If it does, delete the old one.

How To Do it:

  • In the onCreate() method of your Application:

    //First: get the ANDROID_ID
    String android_id = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
    Parse.initialize(this, "APP_ID", "CLIENT_KEY");
    //Now: add ANDROID_ID value to your Installation before saving.
    ParseInstallation.getCurrentInstallation().put("androidId", android_id);
    ParseInstallation.getCurrentInstallation().saveInBackground();
    
  • In your cloud code, add this:

    Parse.Cloud.beforeSave(Parse.Installation, function(request, response) {
        Parse.Cloud.useMasterKey();
        var androidId = request.object.get("androidId");
        if (androidId == null || androidId == "") {
            console.warn("No androidId found, save and exit");
            response.success();
        }
        var query = new Parse.Query(Parse.Installation);
        query.equalTo("androidId", androidId);
        query.addAscending("createdAt");
        query.find().then(function(results) {
            for (var i = 0; i < results.length; ++i) {
                console.warn("iterating over Installations with androidId= "+ androidId);
                if (results[i].get("installationId") != request.object.get("installationId")) {
                    console.warn("Installation["+i+"] and the request have different installationId values. Try to delete. [installationId:" + results[i].get("installationId") + "]");
                    results[i].destroy().then(function() {
                        console.warn("Installation["+i+"] has been deleted");
                    },
                    function() {
                        console.warn("Error: Installation["+i+"] could not be deleted");
                    });
                } else {
                    console.warn("Installation["+i+"] and the request has the same installationId value. Ignore. [installationId:" + results[i].get("installationId") + "]");
                }
            }
            console.warn("Finished iterating over Installations. A new Installation will be saved now...");
            response.success();
        },
        function(error) {
            response.error("Error: Can't query for Installation objects.");
        });
    });
    

And that's it!


Things you might want to know:

  • There is no perfect unique identifier for Android devices. In my case, I used ANDROID_ID. You might use something else. Read this official article to get a better picture.
  • Note that after calling put("androidId", android_id); for the first time, a new column named androidId will be added to your Installation table view in the Parse App Dashboard.

Resources: [1], [2], [3]

like image 140
iTurki Avatar answered Aug 26 '26 01:08

iTurki



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!