2

我制作了一些可以免费下载的软件,希望它能够使用。当他们向我发送流量时,我会向几个附属公司付款,它现在的工作方式是我给每个附属公司一个唯一的链接,只有当我的软件被实际下载时,附属公司才会得到信用。但是,如果我可以跟踪用户是否实际安装了软件,那将是理想的。有什么方法可以在不需要用户注册软件的情况下做到这一点?(请记住,我需要知道用户是由哪个会员推荐的)

本来想用会员ID在用户浏览器上创建一个cookie,然后软件安装完成后,会打开浏览器显示感谢页面,此时我可以读取cookie并弄清楚此用户与哪个附属公司绑定。但是,如果软件是使用用户默认浏览器以外的任何浏览器下载的,这将不起作用....

我的另一个想法是将用户的 IP 地址存储在数据库中,然后在打开“谢谢”页面时将其匹配,但是当用户是大型网络的一部分时,例如在大学中,这将无法正常工作。

有什么建议么?

4

3 回答 3

3

我的另一个想法是将用户的 IP 地址存储在数据库中,然后在打开“谢谢”页面时将其匹配,但是当用户是大型网络的一部分时,例如在大学中,这将无法正常工作。

向每个用户发送一个带有个性化名称的安装程序(例如 binary01、binary02、binary03...)。让安装程序在下载时读取自己的名称,并将其作为 GET 参数放入感谢页面,即http://www.yoursite.com/thankyou?exe=binary03.

服务器上的二进制文件始终是同一个文件,但下载器会为每个附属公司报告不同的名称(或者您可以保留同一个二进制文件的多个副本,但这更难保持同步)。

例如,这可能是一个下载链接:

<?php
    // Download URL, of the form http://www.yoursite.com/download.php?aff=AffName
    // You can rewrite this with Apache's mod_rewrite and have .../filename-AffName.exe

    $affiliates = array(
        // You can keep these in a database
        "widgets"  => "Widgets'r'us",
        "foobar"   => "Foo's Software Bar",
    );

    $aff  = isset($_GET['aff']) ?  $_GET['aff'] : 'unaffiliated';
    $base = "YourBinary";
    $ext  = '.exe';

    $file = $base.$ext;
    $name = $base.'-'.$aff.$ext;

    Header("Content-Disposition: attachment; filename=" . urlencode($name));
    Header("Content-Type: application/force-download");
    Header("Content-Type: application/octet-stream");
    Header("Content-Type: application/download");
    Header("Content-Description: File Transfer");            
    Header("Content-Length: " . filesize($file));

    readfile($file);
?>

至于如何读取包名,取决于安装程序。InnoSetup 会将信息导出为脚本变量{srcexe},Advanced Installer 会将其导出为 [SETUPEXEDIR],依此类推。

您可能希望将此提升为“首次安装注册”功能,但是,如果许多用户(例如在工作中、在网吧等)下载安装,然后在没有 Internet 连接的情况下运行它。您可能希望在安装时将“InstallationID”注册表值存储到附属名称(通过从可执行文件中读取它),然后程序可能会查找它并尝试将其交换为数字 ID 或 UUID(如果不是)。

通过这种方式,您可以两全其美,不会惹恼客户(“没有 Internet 连接就无法安装!Yeeech!”),甚至可以在讨价还价中获得一个 UUID。

于 2013-02-11T06:50:21.090 回答
0

我冒昧地猜测您使用 cookie 的想法是最好的。用户不太可能使用默认浏览器以外的其他东西来下载软件,除非他们正在设置一台新计算机并且还没有安装他们选择的浏览器。

如果您不介意更改字符串并为每个会员重新编译软件,您还可以分发不同的可执行文件,为每个会员打开特定链接。

于 2013-02-11T06:45:12.160 回答
0

在首次执行应用程序时,您应该能够以静默方式将 HTTP GET 请求发送回您的主服务器 - 基本上是 ping 回家,根本不打开任何浏览器。您甚至可以发送唯一的设备 ID 以确保这是新设备。您可能希望在本地数据库中记住此事件,而不是每次都发送此事件。

请注意,要使其正常工作,您的应用程序必须具有AndroidManifest.xml 中列出的INTERNET权限。

但是有一个关于隐私的问题:你应该让用户清楚地知道你在家里ping。

于 2013-02-11T06:47:44.123 回答