我们已经有一个可以运行几个月的实时应用程序,并且运行良好,然后突然这段代码破裂了:
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)Swift版本:
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)
_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":"***"}
答案 0 :(得分:6)
事实证明,如果我们注释掉this code,这是一些Facebook远程配置:
// 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
这就是我们要找出的
Facebook技术支持人员以简明的英语回到我身边,说这根本不可能:
长话短说:通过安装FB App Events SDK,您将自动打开启用无代码事件的FB远程配置,并且无法将其关闭。
我们能够重现该问题(具体而言,通过在Facebook管理员上执行几个步骤来打开fb远程事件标志)
当您单击该按钮时,您会看到
那就是标志打开的时候!