关闭

ios中关于检测应用安装和流量信息研究

标签: nosql数据库应用流量内存数据库iocp
524人阅读 评论(0) 收藏 举报
分类:

关于检测应用安装和流量信息研究

1. 关于检测应用安装情况研究--- 

(1).利用URL scheme,看对于某一应用特有的url scheme,有没有响应。如果有响应,就说明安装了这个特定的app。

http://developer.apple.com/library/ios/#featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html

对于URL Scheme的使用请参看我之前的文章。 

市场上有一部分应用检测安装是利用第三方ihasapp的接口获取的,目前ihasapp接口可以返回5000多个应用的URL Scheme。https://ihasapp.herokuapp.com/api/schemeApps.json 遍历列表,里面提供了每个应用的URL Scheme,客户端利用application的openurl函数,一个一个在iphone上尝试打开这些app,不过这种实现方式会很快把你的iphone变成暖手宝. 

(2)利用一些方法获得当前正在运行的进程信息,从进程信息中获得安装的app信息。

代码请参看http://forrst.com/posts/UIDevice_Category_For_Processes-h1H

缺点是打印输出的应用名称:让你找不到北,最熟悉的是找到tmall.

(3)破解手机的私有API可参看

http://stackoverflow.com/questions/3878197/is-it-possible-to-get-information-about-all-apps-installed-on-iphone/3878220#3878220

http://www.iphonedevsdk.com/forum/iphone-sdk-development/22289-possible-retrieve-these-information.html

关于越狱情况获取iphone用户安装的app列表:(这是从一篇讨论 360因为侵犯用户隐私被苹果下架 的文章中看来的)

  • 已安装app列表 /private/var/mobile/Library/Caches/com.apple.mobile.installation.plist
  • 用户相片 /var/mobile/Media/DCIM/100APPLE/
  • 音乐目录 /var/mobile/Media/iTunes_Control/Music/

 /private/ ,/var/都是合法app不能访问的目录,但是你的iphone一旦越狱,app就可以为所欲为。

 

 2.关于流量检测研究-----

 (1) 通过读取系统网络接口信息,可以获取当前iphone设备的流量相关信息, 但统计的是上次开机至今的流量信息。代码如下:

-(void)checkNetworkflow {

    struct ifaddrs *ifa_list = 0, *ifa;

    if (getifaddrs(&ifa_list) == -1){

        return;

    }

    uint32_t iBytes = 0;

    uint32_t oBytes = 0;

    uint32_t allFlow = 0;

    uint32_t wifiIBytes = 0;

    uint32_t wifiOBytes = 0;

    uint32_t wifiFlow = 0;

    uint32_t wwanIBytes = 0;

    uint32_t wwanOBytes = 0;

    uint32_t wwanFlow = 0;

    struct timeval time ;

    for (ifa = ifa_list; ifa; ifa = ifa->ifa_next){

        if (AF_LINK != ifa->ifa_addr->sa_family)

            continue;

        if (!(ifa->ifa_flags & IFF_UP) && !(ifa->ifa_flags & IFF_RUNNING))

            continue;

        if (ifa->ifa_data == 0)

            continue;

        // Not a loopback device.

        // network flow

        if (strncmp(ifa->ifa_name"lo"2)){

            struct if_data *if_data = (struct if_data *)ifa->ifa_data;

            iBytes += if_data->ifi_ibytes;

            oBytes += if_data->ifi_obytes;

            allFlow = iBytes + oBytes;

            time = if_data->ifi_lastchange;

            // NSLog(@"1111===%s :iBytes is %d, oBytes is %d", ifa->ifa_name, iBytes, oBytes);

        }

        //<span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; ">WIFI流量统计功能</span>

        if (!strcmp(ifa->ifa_name"en0")){

            struct if_data *if_data = (struct if_data *)ifa->ifa_data;

            wifiIBytes += if_data->ifi_ibytes;

            wifiOBytes += if_data->ifi_obytes;

            wifiFlow = wifiIBytes + wifiOBytes;

        }

        //<span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; ">3GGPRS流量统计</span>

        if (!strcmp(ifa->ifa_name"pdp_ip0")){

            struct if_data *if_data = (struct if_data *)ifa->ifa_data;

            wwanIBytes += if_data->ifi_ibytes;

            wwanOBytes += if_data->ifi_obytes;

            wwanFlow = wwanIBytes + wwanOBytes;

            //NSLog(@"111122===%s :iBytes is %d, oBytes is %d", ifa->ifa_name, iBytes, oBytes);

        }  

    }

    freeifaddrs(ifa_list);

    //    NSString *changeTime=[NSString stringWithFormat:@"%s",ctime(&time)];

    //    NSLog(@"changeTime==%@",changeTime);

    NSString *receivedBytes= [self bytesToAvaiUnit:iBytes];

    NSLog(@"receivedBytes==%@",receivedBytes);

    NSString *sentBytes = [self bytesToAvaiUnit:oBytes];

    NSLog(@"sentBytes==%@",sentBytes);

    NSString *networkFlow = [self bytesToAvaiUnit:allFlow];

    NSLog(@"networkFlow==%@",networkFlow);

    NSString *wifiReceived = [self bytesToAvaiUnit:wifiIBytes];

    NSLog(@"wifiReceived==%@",wifiReceived);

    NSString *wifiSent = [self bytesToAvaiUnit: wifiOBytes];

    NSLog(@"wifiSent==%@",wifiSent);

    NSString *wifiBytes = [self bytesToAvaiUnit:wifiFlow];

    NSLog(@"wifiBytes==%@",wifiBytes);

    NSString *wwanReceived = [self bytesToAvaiUnit:wwanIBytes];

    NSLog(@"wwanReceived==%@",wwanReceived);

    NSString *wwanSent = [self bytesToAvaiUnit:wwanOBytes];

    NSLog(@"wwanSent==%@",wwanSent);

    NSString *wwanBytes = [self bytesToAvaiUnit:wwanFlow];

    NSLog(@"wwanBytes==%@",wwanBytes);

    NSString * alltext = [NSStringstringWithFormat:@" receivedBytes: %@\n sentBytes: %@\n networkFlow: %@\n wifiReceived: %@\n wifiSent: %@\n wifiBytes: %@\n wwanReceived: %@\n wwanSent: %@\n wwanBytes: %@",receivedBytes,sentBytes,networkFlow,wifiReceived,wifiSent,wifiBytes,wwanReceived,wwanSent,wwanBytes];

    //self.textView.text = alltext;

    int i = [selfgetGprs3GFlowIOBytes];

    NSLog(@"3G 流量-----%d",i);

    int j = [selfgetInterfaceBytes];

    NSLog(@"wifi 流量-----%d",j);

}

-(NSString *)bytesToAvaiUnit:(int)bytes {

    if(bytes < 1024// B        

    {

        return [NSString stringWithFormat:@"%dB", bytes];

    }

    else if(bytes >= 1024 && bytes < 1024 * 1024// KB

    {

        return [NSString stringWithFormat:@"%.1fKB", (double)bytes / 1024];        

    } else if(bytes >= 1024 * 1024 && bytes < 1024 * 1024 * 1024// MB

    {

        return [NSString stringWithFormat:@"%.2fMB", (double)bytes / (1024 * 1024)];

    } else // GB

    {

        return [NSString stringWithFormat:@"%.3fGB", (double)bytes / (1024 * 1024 * 1024)];

    }

}

 

//--- 3G/GPRS流量统计

-(int) getGprs3GFlowIOBytes

{

    struct ifaddrs *ifa_list = 0, *ifa;

    if (getifaddrs(&ifa_list) == -1)

    {

        return 0;

    }

    uint32_t iBytes = 0;

    uint32_t oBytes = 0;

    

    for (ifa = ifa_list; ifa; ifa = ifa->ifa_next)

    {

        if (AF_LINK != ifa->ifa_addr->sa_family)

            continue;

        

        if (!(ifa->ifa_flags & IFF_UP) && !(ifa->ifa_flags & IFF_RUNNING))

            continue;

        

        if (ifa->ifa_data == 0)

            continue;

        if (!strcmp(ifa->ifa_name"pdp_ip0"))

        {

            struct if_data *if_data = (struct if_data *)ifa->ifa_data;

            

            iBytes += if_data->ifi_ibytes;

            oBytes += if_data->ifi_obytes;

NSLog(@"%s :iBytes is %d, oBytes is %d",

  ifa->ifa_name, iBytes, oBytes);

        }

    }

    freeifaddrs(ifa_list);    

return iBytes + oBytes;

//WIFI流量统计功能

- (long long int)getInterfaceBytes

{

    struct ifaddrs *ifa_list = 0, *ifa;

    if (getifaddrs(&ifa_list) == -1)

    {

        return 0;

    }

    uint32_t iBytes = 0;

    uint32_t oBytes = 0;

    for (ifa = ifa_list; ifa; ifa = ifa->ifa_next)

    {

        if (AF_LINK != ifa->ifa_addr->sa_family)

            continue;        

        if (!(ifa->ifa_flags & IFF_UP) && !(ifa->ifa_flags & IFF_RUNNING))

            continue;        

        if (ifa->ifa_data == 0)

            continue;

        /* Not a loopback device. */

        if (strncmp(ifa->ifa_name"lo"2))

        {

            struct if_data *if_data = (struct if_data *)ifa->ifa_data;            

            iBytes += if_data->ifi_ibytes;

            oBytes += if_data->ifi_obytes;

            //            NSLog(@"%s :iBytes is %d, oBytes is %d",

            //                  ifa->ifa_name, iBytes, oBytes);

        }

    }

    freeifaddrs(ifa_list);

    return iBytes+oBytes;

}

  可以获取内容有:

  WIFI接收数据流量,WIFI发送数据流量;

  3G和GPRS接收数据流量,3G和GPRS发送数据流量;

 通过查看其他流量软件具体到每日每月总流量,越狱情况下应该可以实现这每日每月总流量检测, 但我还未找到获取单个应用的流量信息私有API,大家有知道怎么获取的,也分享下,呵呵。


1
0
查看评论

iOS开发监测手机流量使用情况

获取手机使用流量存在几个问题: ①iOS是无法像Android一样监听到开机广播和关机广播的,立刻关机再开机,监测的移动网络下流量会默认清空。 ②应用在后台运行时,突然被杀死,无法对流量统计,需要在应用进入后台时先保存流量使用情况 ③如果用户第一次打开流量统计软件是在2月份,当第3个月打开时,...
  • xiaozhuanddapang
  • xiaozhuanddapang
  • 2017-02-27 19:07
  • 3652

如何检测已安装的iOS应用

今天总结一下 针对非越狱设备的方法两个: 第一个方法,canOpenURL 可以看这里:http://blog.csdn.net/ydj213/article/details/8053393 第二个,sysctl(),获取进程名然后比较 ,可以看这里 http://blog....
  • ydj213
  • ydj213
  • 2012-11-15 14:04
  • 2640

基于流量的协议分析

Background做了差不多两个星期的流量分析,以为后面可以安稳的做research,结果组里来了一个项目,就把我扔过去做项目了。这就是实验室的本质,哪里缺人,你就去哪里填坑;这也是国内硕士生教育的现状吧,廉价劳动力,不用白不用。 虽然说仅仅是两个星期的research,怎么说呢,对resear...
  • geniusluzh
  • geniusluzh
  • 2015-04-27 23:18
  • 1715

Android 下获取所有应用的流量使用量

android 系统下,获取能联网的应用的流量使用情况,我们可以确切的分析:是谁家的应用又在后台偷偷使用我的流量了。
  • u010402982
  • u010402982
  • 2015-12-29 10:21
  • 1497

iOS如何判断设备中是否安装了某款应用

主要思路就是 ,在要被识别的应用程序B的XCode的info.plist中        如果是Xcode 4.2  ,那么        1. 在info.plist 中 增加 一个  URL ...
  • sevenquan
  • sevenquan
  • 2016-01-02 16:38
  • 661

iOS应用中检测第三方app是否安装及跳转解决方案

最近在做支付宝支付,需要验证客户端是否安装支付宝钱包App,可通过Url Scheme框架实现。 参考文档 :http://www.jianshu.com/p/28f517775214  1、 以支付宝为例,验证是否安装支付宝开发步骤:      ste...
  • w6524587
  • w6524587
  • 2017-08-04 11:57
  • 1338

Android 获取应用流量信息

 对于Android流量统计来说在2.2版中新加入了TrafficStats类可以轻松获取,其实本身TrafficStats类也是读取Linux提供的文件对象系统类型的文本进行解析。android.net.TrafficStats类中,提供了多种静态方法,可以直接调用获取,返回类型均为 lon...
  • lygttpod
  • lygttpod
  • 2015-01-14 17:10
  • 576

iOS 检测有没有安装其它应用

在iOS中,应用A如果想打开应用B,需要在B工程的info.plist文件中添加URL types字段下面的URL identifier 和 URL Schemes 字段; 比如URL identifier 设置为:com.mycompany.testapp  ;  U...
  • StudyRecord
  • StudyRecord
  • 2012-04-26 17:18
  • 4467

IOS应用信息抓取

本文档主要介绍怎么在真机中获取应用列表,并获得应用的相关核心信息,如版本号、bundleID、appleID、开发的sdk、上次打开时间。。。 由于能力有限,目前只能获取这些信息,还无法获取更多有意思的信息。   一、准备工作 使用最新的XCode创建应用AppList; 学习I...
  • y550918116j
  • y550918116j
  • 2015-09-30 14:56
  • 745

如何进行 iOS 网络环境模拟&流量监控

目前的商业 APP基本都需要进行网络请求,用户携带手机处于各种网络环境下,我们的 APP在这些环境下能否依然提供良好的用户体验? 这里不讲具体的代码实现和优化方法,只讲一下如果把 APP当做黑盒,如何模拟弱网络情况,如何测试电量和流量。嗯,这篇文章是写给 QA的。1.网络环境模拟1)network...
  • elisa1988
  • elisa1988
  • 2015-04-26 23:54
  • 3930
    个人资料
    • 访问:163714次
    • 积分:2462
    • 等级:
    • 排名:第17735名
    • 原创:82篇
    • 转载:32篇
    • 译文:0篇
    • 评论:22条
    广告栏目
    个人介绍
      详细资料
      姓名:贾大兵
      生日:1992.8
      学历:大专
      专注:c++、算法、iOS开发
      学校:湖北师范学院
      爱好:篮球、游戏、美女
      目前工作:iOS移动终端开发
    最新评论