Задача
В течение нескольких месяцев у нас было живое приложение, которое работало нормально, а потом вдруг этот код сломался:
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, чтобы объяснить это? Может ли это быть что-то, что меняется удаленно или за кадром? Как мы можем далее отладить это?
Ссылки
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) мы пытались провести обратный инжиниринг, связываясь с API FB через curl, это работало для сценариев, таких как электронная почта:
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) обратиться в техподдержку FB