Android无法删除解析安装

时间:2015-05-26 08:44:40

标签: android parse-platform

我使用parse来处理推送通知。因为我已经拥有自己的数据库,所以我只使用parse存储安装数据。(不使用ParseUser登录并在应用程序中注销) 当我退出我的应用程序时,我想删除我的安装。

ParseInstallation installation = ParseInstallation.getCurrentInstallation();
installation.deleteInBackground(new DeleteCallback() {
    @Override
    public void done(ParseException ex) {
        Log.d(TAG, "ParseInstallation deleteInBackground done");
        if (ex != null) {
            Log.e(TAG, "ParseInstallation deleteInBackground", ex);
        }
    }
});

然后我收到以下错误:

com.parse.ParseRequest$ParseRequestException: forbidden
        at com.parse.ParseRequest.newPermanentException(ParseRequest.java:391)
        at com.parse.ParseRESTCommand.onResponse(ParseRESTCommand.java:197)
        at com.parse.ParseRequest$3.then(ParseRequest.java:258)
        at com.parse.ParseRequest$3.then(ParseRequest.java:254)
        at bolts.Task$14.run(Task.java:796)
        at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:105)
        at bolts.Task.completeAfterTask(Task.java:787)
        at bolts.Task.continueWithTask(Task.java:599)
        at bolts.Task.continueWithTask(Task.java:610)
        at bolts.Task$12.then(Task.java:702)
        at bolts.Task$12.then(Task.java:690)
        at bolts.Task$14.run(Task.java:796)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
        at java.lang.Thread.run(Thread.java:841)

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为您正在尝试向没有足够授权的用户提出请求。 也许,当会话已被销毁(用于注销)时,您正在执行此请求,而不是在销毁之前执行此操作。

答案 1 :(得分:1)

您必须使用主密钥从Cloud Code中删除它。

在android客户端中:

                //clear the installation backend
            HashMap<String, String> params = new HashMap<>();
            String idToken = ParseInstallation.getCurrentInstallation().getInstallationId();
            params.put("installationId", idToken);
            ParseCloud.callFunctionInBackground("removeInstallation", params, new FunctionCallback<String>() {
                @Override
                public void done(String response, ParseException e) {
                    if (e == null) {
                        //clear the local chache
                        ParseEasyAccess.clearParse();
                    } else {
                        e.printStackTrace();
                    }
                }
            });

然后在Cloud Code中:

         Parse.Cloud.define("removeInstallation", function(request, response) {

         Parse.Cloud.useMasterKey();

         var installationId = request.params.installationId;

         var query = new Parse.Query(Parse.Installation);
         query.equalTo("installationId", installationId);

         query.find(function(installations) {
             installations[0].destroy().then(
                 function() {
                     response.success("Destroyed");
                 },
                 function() {
                     response.error("Failed");
                 });
         });

     });

如果您还希望删除设备上的缓存安装,请执行以下操作:

  1. 创建名为com.parse的包

  2. 创建一个类,例如MyParseTools。

  3. 使静态方法如此:

    public static void clearParseInstallation() {
    ParseInstallation.getCurrentInstallationController().clearFromDisk();
    ParseInstallation.getCurrentInstallationController().clearFromMemory();}