promotionLink

来自于:开发者立即使用

getChannelStr

概述

promotionLink封装了读取apk文件中自定义的渠道字符串的接口。通过该模块开发者可生成不同渠道(用户)的推广链接,并且可以在用户使用app时读取到自定义的渠道字符串,从而可以追踪新安装(或新注册)用户来源,给推广下线提供了解决方案。由于iOS的限制,iOS不适用该方法。目前只提供Android的方法。

模块适用场景:

追溯新用户安装或注册来源:首先开发者需要有一个前端页面,比如www.xxx.com/promote/index.html,该页面主要用于宣传开发者的app,并提供下载app的按钮,生成推广链接时需要在后面加上参数,通常是加上用户id,比如www.xxx.com/promote/index.html?userid=123456,这个推广链接就可以发送到微信或QQ等平台推广,用户打开该链接并且点击”下载app”后,开发者在该页面获取到userid,并且在后台将该userid写入apk文件(方法见下文),最后将含有userid的apk提供给用户下载,用户下载安装该apk后,就可以用本模块的getChannelStr接口读取到userid,最终达到追溯新用户安装或注册来源的目的。

这只是其中一个应用场景,开发者可发散思维,将本模块用于更多的场景中。这是一个Android上用链接推广下线的解决方案,稳定性可行性都很好,且绝对不会与其他任何模块产生冲突;

本模块的思路如下:
开发者开发推广app的前端页面(带有下载app按钮)—> 用前端页面链接生成带有用户id参数的推广链接 —> 用户点击推广链接并点击下载app按钮 —> 开发者在前端页面获取到用户id —> 开发者在后台将该用户id写入apk文件(需要预先将发布的apk文件放到服务器,写入id之前要复制一个apk出来,然后再将id写入这个复制的apk文件中。写入方法见下文,分为php和java) —> 将写入用户id的apk文件提供给用户下载 —> 用户安装并打开app,开发者在用户登录或注册或其他地方就可以通过本模块的getChannelStr接口读取到用户id —> 完毕。

当然写入apk的内容不限于用户id,开发者可以向apk写入任何字符串,但建议不要过长,建议写入json字符串,方便读取,本模块接口会原样返回该字符串。

模块接口

后台将渠道字符串写入apk文件的方法:

首先开发者的apk文件已经达到发布要求,开发者需要事先将发布的apk文件放到服务器。一般不会在这个apk上直接写入渠道字符串,而是复制一个apk文件出来再写入,供用户下载,下载完毕后开发者也可删除复制的apk以节省空间。判断是否成功写入的方法(手动):解压最终导出的apk,进入META-INF文件夹,如果发现里面有extends.json文件,且文件内容为写入的内容,证明已经写入正确。以下分php的写法和java的写法:

php写法

  1. // 源文件,达到发布要求的apk文件名
  2. $apk = "source.apk";
  3. // 生成临时文件,此处要确保tmp文件夹已存在
  4. $file = tempnam("tmp", "zip");
  5. // 复制文件,将发布文件复制一个出来
  6. if(false===file_put_contents($file, file_get_contents($apk))){
  7. exit('copy faild!');
  8. }
  9. // 打开临时文件
  10. $zip = new ZipArchive();
  11. $zip->open($file);
  12. // 往临时文件写入内容
  13. // 注意这里的META-INF/extends.json是固定写法!不能改!第二参数是要写入apk的字符串,开发者可自定义,是字符串就行
  14. $zip->addFromString('META-INF/extends.json', json_encode(array('author'=>'deeka')));
  15. // 关闭zip
  16. $zip->close();
  17. // 下载文件,仅供参考,开发者可选择其他下载方法。
  18. header("Content-Type: application/zip");
  19. header("Content-Length: " . filesize($file));
  20. header("Content-Disposition: attachment; filename=\"{$apk}\"");
  21. // 输出二进制流
  22. readfile($file);
  23. // 下载完毕后删除临时文件,也可不删除,根据需要
  24. unlink($file);

java写法

由于java的代码较多,我已将代码作为附件的形式放到社区帖子上,开发者可到下面的帖子下载。附件有两个文件ApkUtils.java和commons-compress-1.9.jar,其中前面的java文件依赖于后面的jar包。

代码下载链接://community.apicloud.com/bbs/forum.php?mod=viewthread&tid=67957&extra=

代码中只包含用java将字符串写入apk的方法,不包含下载代码,下载代码请开发者自行解决。下面给出主要的调用代码:

  1. ApkUtils apkUtils = new ApkUtils();
  2. String json = "{\"a\":\"me\",\"b\":\"you\"}";
  3. //通过以下方法可以将指定字符串写入apk,且是新的apk,开发者就可以将该新的apk供用户下载
  4. apkUtils.addStrToApk("D:\\promotionLink.apk", //达到发布要求的apk路径,源apk
  5. "D:\\new.apk", //新生成的apk路径,最终提供给用户下载
  6. json, //需要写入的字符串
  7. "META-INF\\extends.json"//这个参数固定,不能改!
  8. );

getChannelStr

读取apk中的渠道字符串,前提是开发者已在服务器中用上文方法将字符串写入apk,此时本接口将返回写入apk的字符串,否则本接口将返回”null”。

getChannelStr(callback(ret))

callback(ret)

ret:

  • 类型:JSON对象
  • 描述:返回写入apk的字符串
  • 内部字段:
  1. {
  2. channelStr:"这里是服务器写入apk的字符串" //当apk没有按上文方法写入字符串或写入方法错误或为空,该字段返回"null"
  3. }

示例代码

  1. var demo = api.require('promotionLink');
  2. demo.getChannelStr(function(ret){
  3. alert("渠道字符串 "+JSON.stringify(ret) );
  4. });

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本