是否可以获取已安装应用程序的UserId和密码?

时间:2013-11-17 08:53:52

标签: android ios iphone

Android SDK中是否可以获取已安装应用程序的UserId和密码(如果有登录名)?我需要安装应用程序信息,如应用程序名称,软件包名称,安装日期,并且想知道获取登录名和密码是否可行且Android是否允许。

This question有助于获取所需的用户名,但这是特定于应用程序的。我想要的是一个通用的解决方案,例如,如果安装的应用程序有登录(用户名和密码),例如Facebook或Gmail或Twitter,那么它应该返回值。

我想在iPhone应用程序中使用它。请在iOS上建议您的观点。我想清楚地提一下,我不确定Android和iOS是否允许这样做。

另外,AccountManager可以在Android中帮助我吗?

3 个答案:

答案 0 :(得分:10)

用户名和密码

<强>的iOS

有点不清楚,但我认为您正在谈论获取其他已安装应用的登录信息,因为我不明白为什么您需要一种通用的方式来获取您自己应用的信息。

对于iOS部分,这是不可行的。大多数应用程序将密码存储在钥匙串中(如Apple建议的那样),并且无法与其他应用程序共享钥匙串访问组(除非应用程序共享相同的Bundle种子ID,但这不是这种情况)。 Apple Keychain Services Concepts明确指出

  

iOS允许应用程序仅访问自己的钥匙串项。   本节中讨论的钥匙串访问控制不适用于   的iOS。

<强>的Android

我强烈怀疑在Android上有一种方法,但我会留下一个更有经验的Android开发人员回答。

编辑:由于您还没有收到任何其他答案,我会继续说出我对Android部分的看法。一般来说,Android没有像iOS那样提供存储凭据的方式。相反,有多种方法可以做到这一点。在他们的Security Tips site上,他们声明在可能的情况下,用户名和密码不应存储在设备上。例如,Gmail不会(perhaps unreliable source)。如果你把它们存放在那里,它也说

  

默认情况下,您可以访问在内部存储上创建的文件   仅适用于您的应用。

App检测

在检测应用时,有两种方法(适用于iOS):

  • 检查设备是否支持特定的URL方案(因此安装了应用程序)。这可以使用canOpenUrl:
  • 完成
  • 将设备当前正在运行的进程与已知的应用程序可执行文件名进行比较。这是通过sysctl()完成的。这是一种巧妙的方式:UIDevice Category For Processes

对于Android,请查看此示例:How to Get List of Installed Apps in Android

<强>结论

按照设计,无法在iOS或Android中获取用户名和密码。有一些方法可以获得iPhone上安装的大多数应用程序的列表。这在Android上也应该是可行的,我提供了一个链接,描述了一种方法。

答案 1 :(得分:4)

您可能希望将OAuth视为最终完成您要做的事情的工具。你提到的所有三个例子都支持这个:

https://developers.facebook.com/docs/reference/dialogs/oauth/

https://dev.twitter.com/docs/auth/oauth/faq

https://developers.google.com/accounts/docs/OAuth2

答案 2 :(得分:3)

从技术上讲,在Android中,在将应用程序存储在某个共享位置之前,您无法找到用于该应用程序的凭据(这会留下很大的安全漏洞,因此未完成!)。

您可以使用PackageManager查找信息,包名称,应用程序名称,安装时间等。请参阅下面的代码段。

    PackageManager pm = getPackageManager();
    List<ApplicationInfo> packages = pm
            .getInstalledApplications(PackageManager.GET_META_DATA);

    for (ApplicationInfo packageInfo : packages) {
        // returns the package name
         packageInfo.packageName;
         // returns the application name
        pm.getApplicationLabel(packageInfo).toString();
        // returns the last installation time
        pm.getPackageInfo(packageInfo.packageName, 0).firstInstallTime;

    }