帮助文档(2019)
进入GrowingIO平台
  • What's new
  • 文档使用指南
  • 产品简介
    • 产品概述
    • 数据模型
      • 用户模型
        • 访问用户
        • 登录用户
        • 用户属性
      • 事件模型
        • 什么是事件
        • 无埋点事件
          • 概述
          • 访问事件及变量
          • 页面事件及变量
          • 动作事件及变量
        • 埋点事件
      • 统计模型
        • 指标-事件的度量
        • 维度-事件的属性
        • 预定义指标
        • 预定义维度
    • 数据定义
      • 用户变量
        • 登录用户变量
        • 访问用户变量
      • 页面级变量
      • 埋点事件及变量
        • 埋点事件和事件级变量
        • 转化变量
    • 数据安全
    • 产品界面熟悉
    • 角色权限说明
  • 开发者文档
    • SDK集成
      • SDK简介
      • SDK使用流程
      • Web JS SDK
        • 概述
        • 集成最新SDK
        • Web JS SDK升级指导
        • Web JS SDK API
          • API 2.x
          • API 1.x
        • Web半自动采集浏览事件
        • 常见问题
          • 为什么我们的网站要允许iframe加载?
          • 为什么我的网站不能复写 window 对象?
          • 页面内部嵌入的 iframe 元素如何加载 SDK?
          • 同时集成了web sdk和hybrid sdk会怎么处理?
          • 同时集成了web sdk 1.x 和web sdk 2.x会怎么处理?
          • 元素没有元素浏览量怎么处理?
          • 对于 display:none 的元素,其子元素中的a/button只会采集一次浏览量,但是想每次曝光都采集一次浏览量怎么处理?
          • 设置了growing-ignore之后,其子元素也都不采集数据了怎么处理?
        • Web JS SDK更新日志
      • 原生Android SDK
        • 无埋点 SDK集成
        • 埋点 SDK 集成
        • Android SDK API
          • Gradle配置API
          • 初始化配置项API
          • 运行时API
          • 自定义数据上传API
        • Android半自动采集浏览事件
        • 1.x Android SDK 升级指导
        • 常见问题
          • 无埋点数据采集问题
          • 无埋点下埋点API使用问题
          • SDK性能问题
          • 圈选问题
          • Gradle 常见问题
          • App内嵌H5页面常见问题
        • 更新日志
      • 原生iOS SDK
        • 无埋点 SDK集成
        • 埋点 SDK集成
        • iOS SDK API
          • 初始化配置项API
          • 埋点SDK支持的其他接口
          • 动态添加属性说明
          • 自定义数据上传API
        • iOS半自动采集浏览事件
        • iOS SDK升级指导
        • 常见问题
        • 更新日志
      • 移动端第三方框架SDK
        • React Native无埋点SDK
        • React Native埋点SDK
        • Flutter埋点SDK
        • Cordova埋点SDK
        • Weex埋点SDK
        • API Cloud埋点SDK
        • AppCan埋点SDK
      • Hybrid JS SDK
      • 小程序、小游戏、内嵌页SDK
        • 更新日志
        • 微信小程序 SDK
        • 微信小游戏SDK
        • 支付宝小程序SDK
        • 百度小程序SDK
        • H5内嵌页SDK
        • QQ小程序SDK
        • 字节跳动小程序SDK
        • 快应用SDK
        • 自定义数据上传API
      • 服务端埋点SDK
        • Java埋点SDK
        • PHP埋点SDK
        • 常见问题
    • SDK调试
      • 概述
      • Web Debugger
      • Mobile Debugger
      • 小程序&内嵌页Debugger
      • 验证埋点事件
        • 概述
        • cstm(事件以及关联的事件级变量)事件
        • pvar(页面级变量)事件
        • evar(转化变量)事件
        • ppl(用户变量)事件
    • API参考
      • 公共请求参数
      • 原始数据导出API V2
        • 概述
        • 事件表字段说明
          • 事件表关联
          • 无埋点事件字段
          • 埋点事件与变量字段
          • 广告相关字段
        • 接口定义
          • 获取不同类型原始数据下载链接
          • 获取全部事件类型原始数据的下载链接
        • 升级说明
        • 导出数据处理建议
      • 原始数据导出API V1
        • 概述
        • 字段说明
          • 事件类型
          • 无埋点事件字段
          • 埋点事件与变量字段
          • 广告相关字段
        • 接口定义
          • 获取原始数据下载链接
          • 来源管理数据导出
        • 导出数据处理建议
      • 统计数据导出API V3
        • V3接口概述
        • 接口定义
          • 获取事件分析数据
          • 获取漏斗分析数据
          • 获取留存分析数据
          • 获取用户分群的下载链接
      • 统计数据导出API
        • 概述
        • 接口定义
          • 获取看板列表
          • 获取看板中的图表信息
          • 获取事件分析数据
          • 获取漏斗分析数据
          • 获取留存分析数据
          • 获取分群列表
          • 获取特定分群的用户列表
          • 获取圈选元素定义
      • 广告监测链接创建API
        • 概述
        • 接口定义
          • 查询应用ID
          • 新建推广活动
          • 查询推广活动ID
          • 新建推广渠道
          • 查询推广渠道ID
          • 新建监测链接(吸引用户直接打开App)
          • 查询监测链接(吸引用户直接打开App)
          • 新建监测链接(增加APP下载量-同时推广iOS和Android)
          • 查询监测链接(增加APP下载量-同时推广iOS和Android)
          • 新建监测链接(增加App下载量-推广iOS或Android单个平台)
          • 查询监测链接(增加App下载量-推广iOS或Android单个平台)
          • 新建监测链接(推广网页)
          • 查询监测链接(推广网页)
      • 微信小程序码&小程序监测链接创建服务API
      • 埋点数据上传API
      • 登录用户变量上传API
        • 登录用户变量上传
        • 维度分类上传
        • 既有登录用户ID上传
        • (旧)接口定义
          • 用户变量上传
          • 维度分类上传
      • 项目管理API
        • 概述
        • 从项目内移除成员
        • 获取埋点事件列表
        • 创建埋点事件
        • 获取事件级变量
        • 创建事件级变量
        • 获取页面级变量
        • 创建页面级变量
        • 获取登录用户变量
        • 创建登录用户变量
        • 获取埋点数量限额
      • 数据管理API(GDPR)
        • 数据保护
        • 删除原始数据
  • 产品使用文档
    • 看板
      • 看板简介
      • 看板管理
      • 自定义首页
      • 预置看板介绍
        • 概览看板
        • 实时监控看板
        • 小程序预置看板
        • 微信内嵌页预置看板
        • 业务场景预置看板
      • KPI看板(企业版)
    • 产品分析
      • 事件分析
        • 什么是事件分析
        • 创建事件分析
        • 视图介绍
      • 漏斗分析
        • 什么是漏斗分析
        • 创建漏斗分析
        • 漏斗分析结果解读
        • 案例解读
      • 留存分析
        • 什么是留存分析
        • 创建留存分析
        • 留存分析结果解读
        • 视图介绍
        • 应用场景
        • 常见问题
      • 分布分析
        • 什么是分布分析
        • 使用场景
        • 创建分布分析
      • 热图分析
        • 什么是热图分析
        • Web端热图
        • App热图
      • 分析实验室-留存魔法师
      • 分析实验室-智能路径
    • 用户分析
      • 用户分群
        • 什么是用户分群
        • 创建用户分群
        • 查看分群详情页
        • 分群的计算和使用
        • 常见问题
      • 用户细查
        • 什么是用户细查
        • 细查用户
        • 应用场景
        • 常见问题
      • 活跃用户分析
        • 什么是活跃用户分析
        • 分析活跃用户
      • 微信应用用户分析
    • 用户运营
    • 获客分析
      • 广告监测
        • 创建监测链接
          • 推广App
          • 推广网页
          • 推广小程序(微信)
          • 推广链接的投放和设置指南
        • 数据报表
          • 应用级数据
          • 深度数据分析
          • 数据指标说明
        • 推广管理
          • 监测链接管理
          • 广告活动管理
          • 推广渠道管理
        • 高级设置
          • 日志导出
          • 维度配置
          • 权限配置
          • 反作弊规则
          • 深度链接配置
        • 相关知识
          • UTM参数使用指南
          • 移动端转化归因
          • 默认的渠道来源跟踪
          • DeepLink启用新域名
        • 常见问题
        • 渠道配置指南
          • 腾讯社交广告
          • 今日头条
          • 百度原生信息流
          • 微博超级粉丝通
          • 爱奇艺
          • InMobi
          • 微信广告平台
          • 凤羽广告平台
          • bilibili(B站)
      • 活动分析
      • 落地页分析
      • 分享分析
      • 小程序码管理
    • 看数助手
    • 数据中心
      • 数据管理
        • 事件管理
          • 无埋点事件管理
          • 埋点事件管理
        • 变量管理
          • 事件变量
          • 用户变量
          • 转化变量
        • 自定义指标管理
          • 合并事件
          • 计算指标
        • 业务标签管理
      • 数据规划
      • 无埋点事件定义(圈选)
        • 概述
        • Web端数据定义(Web圈选)
        • App端数据定义(Web圈选)
        • App端数据定义(App圈选)
        • 小程序数据定义
        • 微信内嵌页数据定义
      • 数据校验
      • 微信公众号数据集成
    • 系统管理
      • 组织管理
        • 组织架构介绍
        • 组织概览
        • 组织下项目管理
        • 组织下成员管理
        • 计费方案
        • 成员使用看板
      • 项目管理
        • 项目概览
        • 项目下应用管理
        • 项目下成员管理
        • IP及域名数据过滤
        • 爬虫预防
        • UTM映射管理
        • API Token管理
        • 获取项目UID
      • 权限管理
        • 角色权限
        • 资源权限
        • 数据权限
        • 典型应用场景
      • 工单管理
        • 提交工单
        • 查看进度
        • 邀请技术支持
      • 个人中心
        • 学习中心
        • 个人信息
        • 安全设置
    • 常见问题
      • 基本问题
      • SDK集成
      • 圈选问题
      • 指标和维度
      • 数据安全
      • 产品使用
      • 数据统计差异
      • 无效指标清理说明
  • 术语解释
Powered by GitBook
On this page
  • 1. GrowingIO SDK无埋点采集的原理是什么?
  • 2. GrowingIO SDK 支持哪些iOS系统?
  • 3. 如果动态添加UIView、删除UIView或者修改UIView在父视图中的位置,会有什么影响?
  • 4. 子线程操作UI引起的问题如何处理?
  • 5. 圈选时,来自不同VC的元素显示的VC名称相同?
  • 6. 是否允许设置view的growingAttributesValue为单个的数字或者字母?
  • 7. 埋点为什么也要在主线程调用?
  • 8. 是否支持在开启热图的时候圈选?
  • 9. 是否支持用UITouch事件的点击事件?
  • 10. GIO SDK是否支持Swift项目?
  • 11. App做了Button防重复点击,集成SDK后发现按钮无法点击?
  • 12. 如果项目中使用了Firebase SDK,需要注意什么?
  • 13. 关于苹果隐私政策相关事宜的公告
  • 14. Webview crash

Was this helpful?

  1. 开发者文档
  2. SDK集成
  3. 原生iOS SDK

常见问题

PreviousiOS SDK升级指导Next更新日志

Last updated 4 years ago

Was this helpful?

1. GrowingIO SDK无埋点采集的原理是什么?

实现原理: ( method swizzling 作用为替换或者修改系统方法),可理解为以下 5 个步骤。

  1. 在系统方法M1中插入GIO代码GIO_B1

  2. 系统方法 M1 被执行,此时也会执行 GIO_B1

  3. 在 GIO_B1 内遍历 View Tree / DOM Tree 以及 UIViewController 的层次关系以获取必要的数据

  4. 生成待发送事件并缓存

  5. 发送事件到服务器,完成采集

2. GrowingIO SDK 支持哪些iOS系统?

目前支持iOS 8-iOS 13。

3. 如果动态添加UIView、删除UIView或者修改UIView在父视图中的位置,会有什么影响?

SDK 依赖 subviews 里面的元素次序。如果有动态的需求,建议在 viewDidLoad 里加载所有可能的 UIView 节点,添加或删除可以通过设置 hidden 属性来实现,把不需要显示的设置 hidden 属性为 YES,把需要显示的设置 hidden 属性为 NO。在 UIView 已经显示之后,不要调用 -bringSubviewToFront:方法, -sendSubviewToBack:方法或 -insertSubview: 方法。

4. 子线程操作UI引起的问题如何处理?

答:GIO SDK 会在主线程中遍历找寻某个subView,如果此时在子线程中删除了该subView,就会造成错乱甚至 crash。此外,Apple 不建议用户在子线程更新 UI。建议客户在 Xcode 中打开 "Main Thread Checker" 检测线程使用是否合理。参考:

5. 圈选时,来自不同VC的元素显示的VC名称相同?

这种情况,一般是因为父 VC 添加子 VC 方式不正确引起的,请客户排查子VC的生命周期是否完整。

6. 是否允许设置view的growingAttributesValue为单个的数字或者字母?

不允许这种设置。出于安全考虑,金融类 App 会自定义键盘(默认键盘容易被黑),如果 SDK 允许采集 V 值为单个数字或字母的点击事件,则有可能会记录用户输入的账号或密码。由于上述原因, SDK 不会发送V 值为单个字母或数字的点击事件,如果用户违反约定,则会导致某个元素只有浏览量而没有点击量。

7. 埋点为什么也要在主线程调用?

埋点采集UI操作,建议在UI线程(主线程)中调用。

8. 是否支持在开启热图的时候圈选?

不支持,开启热图可能会导致被圈选元素的 x 值发生变化。

9. 是否支持用UITouch事件的点击事件?

不支持,建议使用 UITapGestureRecognizer

10. GIO SDK是否支持Swift项目?

支持

11. App做了Button防重复点击,集成SDK后发现按钮无法点击?

如果您的UIButton 防重复方案中, hook了 UIControl 的 originalSelector: @selector(sendAction:to:forEvent:) 方法,请确保在您的 swizzledSelector: @selector(your_swizzled_sendAction:to:forEvent:) 方法前面执行 如下代码:

- (void)your_swizzled_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
     
      //  Called before your  extra work
       if ([NSStringFromClass([target class]) isEqualToString:@"GrowingUIControlObserver"]) { 
              [self your_swizzled_sendAction:action to:target forEvent:event]; // call origin
              return;
       }

       // Do your extra work. such as judge click interval....

       [self your_swizzled_sendAction:action to:target forEvent:event]; // call origin
}

如果还是无法点击,请联系技术支持。

12. 如果项目中使用了Firebase SDK,需要注意什么?

如果您的iOS项目中集成了Firebase SDK,请确保使用的Firebase SDK版本在4.8.1及以上,否则会造成数据采集不到的情况。

当您的Firebase SDK版本符合要求,但是没有发送vst事件时,请将采集模式改为hook模式。

修改方法:

Objective-C:修改main.m文件:

Swift:修改AppDelegate.swift,并手动创建main.swift文件。

13. 关于苹果隐私政策相关事宜的公告

亲爱的客户:

您好!

从2018年10月3日开始,App Store Connect将要求所有新应用和应用更新版本时提供隐私政策,添加后才可以在App Store上提交或通过TestFlight外部测试进行分发。

所以,在此提醒各位开发者:提交App Store 审核前一定要准备自己的隐私权政策,并在app SafariViewContoller中弹出,否则会无法通过审核哦!如需要专业的法律意见,还请各位开发者小伙伴咨询您的律师或法律顾问哦!

14. Webview crash

如果遇到此类崩溃:Cannot form weak reference to instance (xxxxx) of class xxxxxx. It is possible that this object was over-released, or is in the process of deallocation 或者程序卡死通过 bt 打印出的堆栈含有weak_register_no_lock并且错误是关于UIWebView+Growing的。 解释如下: 由于业务需要我们会 hook UIWebView 的 setDelegate 方法 拿到传入的对象从而进行对UIWebViewDelegate 一系列方法的监听,并且对传入的对象实现 weak 处理,这样做是为了保证不影响客户对象的引用计数; 由于苹果 api 的不完善 UIWebViewDelegate 的声明至今为assign,所以delegate对象在释放后不会被置为nil;由此可能会造成的后果是setDelegate方法调用时,如果传入的是一个over-released, or is in the process of deallocation 的对象而我们 SDK 又对此对象进行了 weak 处理,从而导致崩溃;

由于苹果api没有判断对象是否是over-released, or is in the process of deallocation的 api ,所以我们SDK暂时无法处理。需要手动解决一下,解决方式很简单,先分享一个发生崩溃的案例:

案例如下: 这是客户UIWebViewDelegate对象中dealloc方法

- (void)dealloc
{
    self.webView.delegate = nil;
}

上面的代码引发了崩溃,很多人奇怪delegate不是已经设置为nil了么? 为什么还崩,请看下面是如何解决的

- (void)dealloc
{
    _webView.delegate = nil;
}

发现差异了么?我们没有调用的webView的get方法,因为在此案例中webView的get方法会提前执行一遍setDelegate方法从而导致崩溃。 所以希望您在delegate对象的dealloc方法中不要调用webView的get方法即self.webView,而是采用_webView的形式把delegate设置为nil。

在实际开发中,除了上述场景之外,还有如下两种情况:

  • UIWebViewDelegate 对象是自定义的 UIWebView 本身,通过上述方式会发现在自定义的 UIWebView 类中无法通过下划线的方式来访问 delegate 属性,即 _delegate,因此也就无法调用 _delegate = nil;解决方式如下:

-(void)dealloc 
{
        @autoreleasepool {
        self.growingAttributesDonotTrack = YES;
    }
    self.delegate = nil;
}

如果在其他的第三方SDK中发生了这样的问题,但是无法修改其源码的情况下,可以按照如下方式进行处理,首先根据崩溃信息找到崩溃产生的类名信息,例如

Cannot form weak reference to instance (0xXXXXX) of class NSKVONotifying_XXUIWebView

XXUIWebView 即为自定义的 UIWebView 类, 此时可以新增一个UIView的分类,具体实现代码如下,特别需要注意的是 Class clazz = NSClassFromString(@"XXUIWebView");

#import "UIView+Growing_fix.h"
#import <objc/runtime.h>
#import "Growing.h"
@implementation UIView (Growing_fix)
+(void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class clazz = NSClassFromString(@"XXUIWebView");
        
        SEL originalSelector = NSSelectorFromString(@"dealloc");
        SEL swizzledSelector = @selector(grow_dealloc);
        
        Method originalMethod = class_getInstanceMethod(clazz, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(clazz, swizzledSelector);
        
        BOOL didAddMethod =
        class_addMethod(clazz,
                        originalSelector,
                        method_getImplementation(swizzledMethod),
                        method_getTypeEncoding(swizzledMethod));
        
        if (didAddMethod) {
            class_replaceMethod(clazz,
                                swizzledSelector,
                                method_getImplementation(originalMethod),
                                method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}
​
- (void)grow_dealloc
{
    @autoreleasepool {
        self.growingAttributeDonotTrack = YES;
    }
    [self grow_dealloc];
}
@end

备注: SDK 2.8.12开始去除对UIWebView的支持

【苹果通知:As a reminder, in June the App Store Review Guidelines were updated to require a privacy policy for all new apps and app updates as part of the app review process. Starting October 3, 2018, App Store Connect will require a privacy policy for all new apps and app updates before they can be submitted for distribution on the App Store or through TestFlight external testing. In addition, your app’s privacy policy link or text will only be editable when you submit a new version of your app.(详情可参见: )

Method Swizzling
Main Thread Checker
https://developer.apple.com/news/?id=08312018a