【发布时间】: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":"***"}
【问题讨论】:
标签: ios objective-c swift xcode