GCM 的令牌 id 是设备 uuid 的良好替代品吗?

Posted

技术标签:

【中文标题】GCM 的令牌 id 是设备 uuid 的良好替代品吗?【英文标题】:is GCM's token id a good substitution for device's uuid? 【发布时间】:2015-07-20 01:38:10 【问题描述】:

在我的应用程序中,我需要识别每个安装和用户。目前,我正在使用 Settings.Secure.android_ID、sim 序列号和为此目的构建序列号的组合生成我的 uuid。最近,我一直致力于将谷歌云消息集成到我的应用程序中。现在在我的数据库中,每个安装似乎都有 2 个 id。使用 GCM 的令牌 ID 替换我当前的设备 ID 是个好主意吗?哪个更可靠?假设每次安装都存在 google 服务。

【问题讨论】:

IIRC,GCM 令牌 id 可以随时更改。不确定这会如何影响您对该主题的思考。 【参考方案1】:

我建议不要使用 GCM 令牌令牌 ID 作为应用程序或用户或设备的标识符。主要原因是谷歌不保证它对于给定的设备会保持不变。因此,Google 甚至有可能在某个时候重新循环这些 ID - 尽管不太可能,但 GCM 文档中没有任何内容表明这不会发生。

通常认为定期向 GCM 重新注册您的设备是个好主意:(请参阅 Register a device on GCM every time the app start is the right approach?)。这使得最终您的应用的 GCM 令牌可能更改的可能性更大。同样,GCM 文档没有承诺它对于给定的设备将始终保持不变。

如果您需要唯一标识一个应用安装,这是一个经过深思熟虑的好方法:http://android-developers.blogspot.com/2011/03/identifying-app-installations.html

最后对您的方法提出警告。如果我没看错的话,你正在以某种方式使用 SIM 卡 ID。请记住,这不会出现在所有设备(例如平板电脑)中。

【讨论】:

【参考方案2】:

我想建议您将 gcm id 和设备 id 保留在单独的列中,两者都有不同的作用。 GCM Id 将用于通知目的,最好的方法是为什么每次用户从 gcm 服务器请求 gcm id 时不更新 GCM id。 要获得更多输出,您必须正确使用 GCM 类的属性。这是必需的代码。

public class GCMIntentService extends GCMBaseIntentService

    String value11,value22,value33,value44;
    static String msg;
    static Bitmap myBitmap,myBitmapy;
    String arr[];
    static String ns;
    static NotificationManager myNotiMgr;
    static Context cgh;
    String type;
    static String GOOGLE_SENDER_ID  ="124545124542";
    private static final String TAG = "GCMIntentService";

    public GCMIntentService() 
    
        super(GOOGLE_SENDER_ID);
    


    protected void onRegistered(Context context, String registrationId) 
    

        try 
        

            cgh=context;
            Log.d("vddddddd",cgh+""+registrationId);
            TelephonyManager tmw = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            String imeie = tmw.getDeviceId();
            new HttpAsynctask1().execute("http://url);



         
        catch (Exception e)
        

            e.printStackTrace();


        
    

    @Override
    protected void onUnregistered(Context context, String registrationId) 
    

    

    @Override
    protected void onMessage(Context context, Intent intent) 

        String  link    =   "";

        try
             type = intent.getStringExtra("price");
             Log.d("msgggg",type);
             generateNotification(context, type);

        
        catch (Exception e) 
        
            e.printStackTrace();
        
    

    @Override
    protected void onDeletedMessages(Context context, int total) 
    


    

    @Override
    public void onError(Context context, String errorId) 
    

    


谢谢。

【讨论】:

以上是关于GCM 的令牌 id 是设备 uuid 的良好替代品吗?的主要内容,如果未能解决你的问题,请参考以下文章

设备注册 ID/设备令牌未生成

APNS 或 GCM 设备令牌验证

如何验证 android 设备令牌

使用 GCM 重新安装应用程序后,获取旧设备令牌的推送通知成功

getExpoPushTokenAsync出现问题,错误“无法获取设备的GCM令牌”

即使卸载后旧的 GCM 令牌仍然存在吗?