我制作了一些可以免费下载的软件,希望它可以使用。当我向他发送流量时,我付了几个分支机构,现在它的工作方式是我给每个分支机构一个独特的链接,只有当我的软件实际下载时,联盟会员才会得到记入。 但是,如果我能够跟踪用户是否实际安装了该软件,那将是理想的。有没有办法在不要求用户注册软件的情况下执行此操作? (请记住,我需要知道用户被推荐的关联公司)
最初我曾想过用附属公司的ID在用户的浏览器上创建一个cookie,然后当软件安装完成时,它会打开一个浏览器来显示一个Thank You页面,此时我可以读取cookie并找出该用户所属的附属机构。但是,如果使用除用户默认浏览器之外的任何浏览器下载软件,则无法使用此功能....
我的另一个想法是将用户的IP地址存储在数据库中,然后在打开Thank You页面时将其匹配,但是当用户是大型网络的一部分时,例如在大学。
有什么建议吗?
答案 0 :(得分:3)
我的另一个想法是将用户的IP地址存储在数据库中,然后在打开Thank You页面时将其匹配,但是当用户是大型网络的一部分时,例如在大学。
向每个用户发送一个带有个性化名称的安装程序(例如binary01,binary02,binary03 ......)。让安装程序在下载时读取自己的名称,并将其作为GET参数放入Thank You页面,即http://www.yoursite.com/thankyou?exe=binary03
。
服务器上的二进制文件总是相同而且是一个文件,但是下载程序会为每个联盟会员报告一个不同的名称(或者你可以保留同一个二进制文件的多个副本,但这样更难以保持同步)。 / p>
例如,这可能是一个下载链接:
<?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}
,高级安装程序将其作为[SETUPEXEDIR]导出,依此类推。
您可能希望将其升级为“首次安装注册”功能,但是,如果发生许多用户下载安装(例如在工作中,在网吧等),然后在以后运行它互联网连接。您可能希望在安装时将“InstallationID”注册表值存储到Affiliate Name(通过从可执行文件中读取),然后程序可能会查找它并尝试将其交换为数字ID或UUID(如果不是)。
通过这种方式,您可以充分利用这两个世界,不要惹恼客户(“无法在没有互联网连接的情况下安装!Yeeech!”),甚至可以在讨价还价中获得UUID。
答案 1 :(得分:0)
我冒昧地猜测你使用cookie的想法是最好的。用户不太可能使用默认浏览器之外的其他内容来下载软件,除非他们正在设置新计算机并且还没有安装他们选择的浏览器。
如果您不介意更改字符串并为每个会员重新编译软件,您还可以分发为每个会员开设特定链接的不同可执行文件。
答案 2 :(得分:0)
首次执行应用程序时,您应该可以静默地将HTTP GET请求发送回您的主服务器 - 基本上是ping回家,而不是打开任何浏览器。您甚至可以发送唯一的设备ID以确保这是新设备。您可能希望在本地数据库中记住此事件,而不是每次都发送此事件。
请注意,为此,您的应用必须具有AndroidManifest.xml中列出的INTERNET权限。
但隐私方面存在一个问题:您应该向用户说明您要回家。