【问题标题】:How to disable Facebook codeless events programmatically?如何以编程方式禁用 Facebook 无代码事件?
【发布时间】:2019-03-28 15:23:02
【问题描述】:

问题

几个月来我们一直有一个运行良好的实时应用程序,然后突然这段代码坏了:

ViewController.swift

self.tableView.delegate = self.viewModel.tableViewHandler

使用了这个代码

破码

component.swift

public override weak var delegate: UITableViewDelegate? {
     get { return super.delegate }
     set {
         if let del = newValue as? TableViewDelegateProxy {
             super.delegate = del
         } else if let del = super.delegate as? TableViewDelegateProxy {
             del.targetDelegate = newValue
         } else {
             super.delegate = newValue
         }
     }
 }

我们不知道为什么,但我们用这段代码修复了它:

固定代码

ViewController.swift

self.tableView.fixedDelegate = self.viewModel.tableViewHandler

component.swift

// IMPORTANT NOTE: That is the correct way to set a delegate,
//                 otherwise overriding `delegate` property fails
public var fixedDelegate: UITableViewDelegate? {
    get { return self.delegate }
    set {
        self.delegateProxy.targetDelegate = newValue
        self.delegate = self.delegateProxy
    }
}

最初我们认为这是后端的问题(格式错误的 JSON 或类似的东西),但后来我们意识到:

  • 损坏的代码在使用调试配置编译时可以工作,但在使用发布配置时会中断
  • 固定代码在使用调试配置编译时有效,并且在使用发布配置时也有效

我们回顾了 Git 历史中的许多版本,而且总是如此,这让我们相信我们的 Xcode 或 Objc/Swift 运行时库可能已经发生了一些变化,这导致了这种奇怪。

问题

在我们的 Xcode IDE 中可以进行哪些更改来解释这一点?它可以是远程或幕后改变的东西吗?我们如何进一步调试呢?

参考文献

1) Xcode 版本:版本 10.1 (10B61)
2) 斯威夫特版本:

xcrun swift -version
Apple Swift version 4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1)
Target: x86_64-apple-darwin18.2.0

3) obj-c 库:

 otool -L /usr/lib/libobjc.A.dylib
/usr/lib/libobjc.A.dylib:
        /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
        /usr/lib/libc++abi.dylib (compatibility version 1.0.0, current version 400.17.0)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)

更新

首先看到这个answer,我们需要以编程方式关闭this标志

_serverConfiguration.isCodelessEventsEnabled

不确定如何从 sdk(Android 或 iOS)获取

我们尝试过的

1) 我们找不到任何通过 FB SDK 执行此操作的方法,例如:https://developers.facebook.com/docs/reference/androidsdk/current/facebook/com/facebook/facebooksdk.html/

2) 我们尝试对通过 curl 联系 FB API 进行逆向工程,它适用于电子邮件等场景:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"app_events_feature_bitmask":0}' \
  "https://graph.facebook.com/***?access_token=<app_secret>"

返回这个

{"success":true}

但对于应用事件功能没有任何改变:

curl -i -X GET "https://graph.facebook.com/***?fields=app_events_feature_bitmask&access_token=<app_secret>"

它返回旧值:

{"app_events_feature_bitmask":37,"id":"***"}

3)ask FB tech support

【问题讨论】:

    标签: ios objective-c swift xcode


    【解决方案1】:

    如果我们注释掉this code

      //  UITableView
      void (^tableViewBlock)(UITableView *tableView,
                             SEL cmd,
                             id<UITableViewDelegate> delegate) =
      ^(UITableView *tableView, SEL cmd, id<UITableViewDelegate> delegate) {
        if (!delegate) {
          return;
        }
    
        [self matchView:tableView delegate:delegate];
      };
      [FBSDKSwizzler swizzleSelector:@selector(setDelegate:)
                             onClass:[UITableView class]
                           withBlock:tableViewBlock
                               named:@"match_table_view"];
    

    它工作得很好。一旦此标志为turned on,此功能似乎就会打开:

    #if !TARGET_OS_TV
    - (void)enableCodelessEvents {
      if (_serverConfiguration.isCodelessEventsEnabled) { <-----
        if (!_eventBindingManager) {
          _eventBindingManager = [[FBSDKEventBindingManager alloc] init];
        }
    
        if ([FBSDKInternalUtility isUnity]) {
          [FBSDKAppEvents sendEventBindingsToUnity];
        } else {
          [_eventBindingManager updateBindings:[FBSDKEventBindingManager
                                                parseArray:_serverConfiguration.eventBindings]];
        }
      }
    }
    #endif
    

    问题是:是什么开启了这个标志? (即来自一些 fb 远程配置)

    _serverConfiguration.isCodelessEventsEnabled
    

    这就是我们试图找出的原因

    更新:简短回答:您不能(以编程方式、通过仪表板,甚至通过联系 fb 支持自己)

    Facebook 技术支持人员用简单的英语回复我说这个选项根本不可能:

    长话短说:通过安装FB App Events SDK,您将自动打开启用无代码事件的 FB 远程配置,并且无法将其关闭。

    结论

    我们能够重现该问题(具体来说,通过在 facebook 管理员上执行几个步骤来打开 fb 远程事件标志)

    首先运行一个示例应用并测试标志是否打开/关闭:

    转到事件管理器并点击 + 添加新数据源 > 应用事件

    当你点击那个按钮时,你会看到这个

    那就是标志开启的时候!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 2010-10-04
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多