何ヶ月も問題なく動作するライブアプリがありましたが、突然このコードが壊れました。
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)次のようなFBSDKを介してこれを行う方法が見つかりませんでした: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":"***"}
このコードをコメントアウトすると、これは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"];
それはうまく機能します。このフラグをオンにすると、この機能がオンになるようです。
#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リモートイベントフラグをオンにします)
そのボタンをクリックすると、これが表示されます
そしてそれは旗がオンになっているときです!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加