旧-帮助文档
回到 GrowingIO
  • GrowingIO 帮助文档
  • 快速提交工单
  • 快速上手-Web
  • 快速上手-移动端
  • 快速上手-小程序
  • 产品更新日志
  • 分析工具
    • 事件分析
    • 用户分群
    • 用户细查
    • 漏斗分析
    • 活动分析
    • 落地页分析
    • 分布分析
    • 智能路径
    • 留存分析
    • 留存魔法师
    • 活跃用户分析
    • 热图分析
      • Web 端热图
      • App 热图
    • 单图
    • 微信应用用户分析
    • 小程序-分享分析
  • 看板
    • 自定义首页
    • 概览看板
    • KPI看板(企业版)
    • 小程序预置看板
    • 微信内嵌页预置看板
    • 实时监控模板
    • 业务场景
  • GIO 小程序看数助手
  • 广告监测
    • 创建监测链接
      • 推广 App
      • 推广网页
      • 推广小程序(微信)
    • 数据报表
      • 应用级数据
      • 深度数据分析
      • 数据指标说明
    • 推广管理
      • 监测链接
      • 广告活动
      • 推广渠道
    • 渠道配置指南
      • 腾讯社交广告
      • 今日头条
      • 百度原生信息流
      • 微博超级粉丝通
      • 爱奇艺
      • Inmobi
      • 微信广告平台
      • 凤羽广告平台
      • bilibili(B 站)
    • 其他功能
      • 日志导出
      • 维度配置
      • 权限配置
      • 反作弊规则
      • 深度链接配置
    • 相关知识
      • UTM 参数使用指南
      • 创建小程序的推广码
      • 移动端转化归因
      • 默认的渠道来源跟踪
      • DeepLink 启用新域名
    • 广告监测FAQ
  • SDK 文档
    • SDK 简介与安全性说明
    • 各平台 SDK 支持明细
    • SDK 更新日志
    • Web JS SDK
      • Web JS SDK API
      • Web JS SDK 常见问题
    • Android SDK
      • Android 无埋点 SDK
      • Android 无埋点 SDK API
      • Android 半自动采集浏览事件
      • Android 埋点 SDK
      • Android SDK 常见问题
    • iOS SDK
      • iOS 无埋点SDK
      • iOS SDK API
      • iOS 半自动采集浏览事件
      • iOS SDK 1.X旧版本升级指导
      • iOS 埋点SDK
      • iOS SDK 常见问题
    • Hybrid SDK (App内嵌H5)
    • 小程序、小游戏以及内嵌页 SDK
      • SDK 更新日志 - 小程序 & 内嵌页 & 快应用
      • 微信小程序 SDK
        • mpvue+第三方插件 添加代码
      • 微信小游戏 SDK
      • H5 内嵌页 SDK
      • 支付宝小程序 SDK
      • 百度小程序 SDK
      • QQ 小程序 SDK
      • 字节跳动小程序 SDK
      • 快应用 SDK
    • React Native 无埋点 SDK
      • ReactNative 埋点 SDK
    • Flutter 埋点 SDK
    • Cordova 埋点 SDK
    • Weex 埋点 SDK
    • API Cloud埋点 SDK
    • AppCan 埋点 SDK
    • Java 埋点 SDK
    • PHP 埋点 SDK
    • GrowingIO Debugger
      • 验证打点事件
  • 数据模型
    • 用户模型
      • 访问用户
      • 登录用户
      • 用户属性
    • 事件模型
      • 什么是事件
      • 无埋点事件
        • 访问事件及属性
        • 页面事件及属性
        • 动作事件及属性
      • 埋点事件
        • 埋点事件及属性
    • 统计模型
      • 指标--事件的度量
      • 维度--事件的属性
      • 预定义的指标和维度
  • 数据定义
    • 用户变量
      • 登录用户变量
      • 访问用户变量
    • 页面级变量
      • 查询条件直接设置成页面级变量
    • 无埋点圈选
      • Web 圈选
      • App 端圈选 App
      • 电脑端圈选 App
      • 小程序数据定义
      • 微信内嵌页数据定义
      • 圈选指标管理
        • 合并简单指标
        • 复合指标
    • 埋点事件
      • 埋点事件级变量
      • 转化变量
    • 小程序事件和变量
  • 数据管理
    • 新版数据管理功能说明
    • 无埋点事件管理
    • 埋点事件管理
    • 变量管理
    • 合并事件管理
    • 计算指标
  • 系统配置
    • 组织管理
    • 项目管理
    • 用户管理
    • 权限管理
    • 爬虫规则
    • 账号管理
    • UTM 映射管理
    • IP及域名数据过滤
  • API
    • GrowingIO API 认证
    • 广告监测链接创建服务 API
    • 微信小程序二维码创建服务 API
    • 原始数据导出 API
      • 原始数据导出字段说明
        • 无埋点事件
        • 埋点事件与变量
        • 广告相关数据
        • 通用字段说明
      • 原始数据导出 2.0 API
      • 原始数据导出 1.0 API(已废弃)
      • 原始数据导出 API 的升级迁移
      • 原始数据导出格式及处理建议
    • 统计数据导出 API
    • 埋点数据上传API
    • 用户变量上传 API
    • 项目管理 API
    • 数据管理 API (GDPR)
    • API 更新日志
  • 常见问题
    • 基本问题
    • 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.无法圈选
  • 15.如何查看当前 APP SDK 版本
  • 16.为何不建议自定义设备ID
  • 17. WebView crash
  1. SDK 文档
  2. iOS SDK

iOS SDK 常见问题

PreviousiOS 埋点SDKNextHybrid SDK (App内嵌H5)

Last updated 5 years ago

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 7 ~ iOS 13。

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

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

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

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 后发现按钮无法点击?

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

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

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

亲爱的客户:

您好!

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

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

14.无法圈选

17. 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

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

答: 请使用 GrowingIO 提供的防重复点击解决方式:。

【苹果通知: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.(详情可参见: 】

请根据自行排查,如果仍有问题,可以联系技术支持。

15.

16.

Main Thread Checker
DJRepeatClickFilter
https://developer.apple.com/news/?id=08312018a)。
Method Swizzling
这篇文档
如何查看当前 APP SDK 版本
为何不建议自定义设备ID