你好,打包出来指什么?

是指release出来的,不是debug出来的,这样说明白么?就是用release签名生成的文件

你好,请描述下获取 objectId() 是做什么用?

然后,打印一下日志 AVOSCloud.setDebugLogEnabled(true); 看看,在打包后 getObjectId() 时是否报异常。

因为iOS没有installationId,要保证iOS和Android接收推送,选了共有的objectId,上传服务器,好的,我看看你说的那个

AVOSCloud.setDebugLogEnabled(true)这句话我加在application里面了啊,打包后,AVInstallation.getCurrentInstallation()的输出是:AVObject [className=_Installation, objectId=, updatedAt=null, createdAt=null, uuid=16330898-29a0-4af9-b463-6d46ab8dd3ec, fetchWhenSave=false, keyValues={installationId=com.avos.avoscloud.u@42d6c4e8, timeZone=com.avos.avoscloud.u@42d6c6a8, deviceType=com.avos.avoscloud.u@42d6c5d8}]

你好,iOS 那边有自己的 SDK 推送接收方式(deviceToke之类的),能确保设备的唯一性。

如果你是想保证两端都接受推送,按照文档集成即可。

另外,我自己用 Smartisan T1 实测了下,打包后,仍然是可以获取 objectId 的。

好的,我再看下,我将官方的demo打包测试了一下,安装后的objectId也没有得到啊,我将demo里面的textview显示的installationId改为了objectId,打包安装后那里面是显示空的,但是退出再进来就显示了

你好,麻烦把操作相关的 log 都贴出来下。我自己去测下 官方demo。

如果你们已经开始在项目中集成了推送,请用最新版的 SDK 试试,因为 官方demo 里的 SDK 是 3.7.1 版。或者把 官方demo 里的 SDK 版本链到最新版然后再测下。

我明白你的问题了。请仔细阅读推送文档:
https://leancloud.cn/docs/android_push_guide.html4

为什么拿不到 objectId 是因为,SDK 的逻辑是设备安装时初始化一个 installationId,然后像如下代码所示,保存到服务器成功后才会生成 objectId 的,因为它对应数据库表里的一条数据:

// 保存 installation 到服务器
    AVInstallation.getCurrentInstallation().saveInBackground(new SaveCallback() {
      @Override
      public void done(AVException e) {
        if (e == null) {
          // 保存成功
          String objectId = AVInstallation.getCurrentInstallation().getObjectId();
          t.setText("这个设备的 objectId: " + objectId);
          // 关联  installationId 到用户表等操作……
        } else {
          // 保存失败,输出错误信息
        }
      }
    });

供参考。

这个代码我有的,我也是这样写的,还是那个问题,直接run出来的显示保存成功,能获取到objectId,release出来的也是打印的保存成功,但是我输出AVInstallation.getCurrentInstallation():AVObject [className=_Installation, objectId=, updatedAt=null, createdAt=null, uuid=10aec870-d103-4c5f-b641-359a8469fc83, fetchWhenSave=false, keyValues={installationId=com.avos.avoscloud.u@47a4cce8, timeZone=com.avos.avoscloud.u@47a4cbf8, deviceType=com.avos.avoscloud.u@47a4ca90}],还是没找到原因

方便的话,把关系到 installationId 逻辑部分的代码,贴出来我看下。

//这个启动pushservice,同时设置默认打开activity
PushService.setDefaultPushCallback(this, MainPageActivity.class);

    // 保存 installation 到leancloud服务器
    AVInstallation.getCurrentInstallation().saveInBackground(new SaveCallback() {
        @Override
        public void done(AVException e) {
            if (e == null) {
                Log.e("保存成功:", AVInstallation.getCurrentInstallation().toString());
            } else {
                Log.e("保存失败:", e + "---#######---" + AVInstallation.getCurrentInstallation().toString());
            }

            AVInstallation.getCurrentInstallation().saveInBackground();
        }
    });
    // 显示的设备的 installationId,用于推送的设备标示
    Log.e("该设备--obj-id: " ,AVInstallation.getCurrentInstallation().toString());
    Log.e("该设备--obj-id: ", AVInstallation.getCurrentInstallation().getObjectId());

这是我写在主页的与leancloud有关的,你看下,还需要什么?

这里应该是:

AVInstallation.getCurrentInstallation().getObjectId();

不然你 toSting() 的是 AVInstallation 对象。

嗯,我知道,这是我为了输出查看的,这个对象输出是: AVObject [className=_Installation, objectId=, updatedAt=null, createdAt=null, uuid=0ff63481-2b42-4c48-825b-46dc4c3e66fb, fetchWhenSave=false, keyValues={installationId=com.avos.avoscloud.u@42d6bbe0, timeZone=com.avos.avoscloud.u@42d6bda0, deviceType=com.avos.avoscloud.u@42d6bcd0}]
从这里也可以看到objectId= ,

而且你的 log 必须在回调成功里写,这是两个线程。

你是说显示该设备那两个Log.e是吧,我也写在里面过,情况是一样的,而且我不认为写在外面是错误的啊,因为run的时候写在哪里都可以打印的,都有值的,但是release就不行了

我自己的测试的情况是,不管是 run 还是 release,第一次进入应用都获取不到 objectId,因为这是一个异步的操作,此时 objectId 没还有生成。

所以,只能 installationId 上传服务器成功后的回调里获取 objectId 才能取到。