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?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
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 oldInstallation
. 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 namedandroidId
will be added to yourInstallation
table view in the Parse App Dashboard.
Resources: [1], [2], [3]