Facebookのコードレスイベントをプログラムで無効にする方法は?

abbood

問題

何ヶ月も問題なく動作するライブアプリがありましたが、突然このコードが壊れました。

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":"***"}

3)FBテクニカルサポートに問い合わせる

abbood

このコードをコメントアウトすると、これは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

それが私たちが見つけようとしていることです

更新:短い答え:できません(プログラムで、ダッシュボードを介して、またはfbサポートに連絡することによってさえ)

Facebookのテクニカルサポートから、このオプションは単純に不可能であると平易な英語で述べられました。

ここに画像の説明を入力してください

簡単に言うと、FB App Events SDKインストールすると、コードレスイベントを有効にするFBリモート構成が自動的にオンになり、オフにする方法はありません。

結論

問題を再現することができました(具体的には、Facebook管理者でいくつかの手順を実行してfbリモートイベントフラグをオンにします)

最初にサンプルアプリを実行し、フラグがオン/オフかどうかをテストします。

ここに画像の説明を入力してください

イベントマネージャーに移動し、[+新しいデータソースを追加]> [アプリイベント]をクリックします

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

そのボタンをクリックすると、これが表示されます

ここに画像の説明を入力してください

そしてそれは旗がオンになっているときです!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

アンドロイドでプログラムシークレットキーボードを有効または無効にする方法?

分類Dev

Pythonのキーリングのコマンドラインパスワードプロンプトを無効にする方法-ヘッドレスdebianlinux

分類Dev

コマンドラインから「スタートアップアプリケーション」でプログラムを無効にする方法

分類Dev

プラグイントレースログをプログラムで/ SDK経由で有効にする方法

分類Dev

レイアウトを介してグーグルマップのタッチイベントを無効にする方法は?(アンドロイド)

分類Dev

プログラムでサイドトーン/マイクのパススルーを有効にする方法

分類Dev

Javaプログラムでスタックトレース生成を無効にする方法は?

分類Dev

RESTfulエンドポイントのSpringフォームベースのログインを無効にするにはどうすればよいですか?

分類Dev

iOSでプログラムでスリープモードを無効/有効にする方法は?

分類Dev

プログラムでバイブレーションモードを有効または無効にする方法

分類Dev

Angularテンプレートでスラッシュのエンコードを無効にする方法

分類Dev

スプリングブートで特定のレストエンドポイントを有効/無効にする方法は?

分類Dev

bashループを使用して、コマンドラインで一重引用符を使用するプログラムを実行します。一重引用符はbashスクリプトの意図を無効にします。

分類Dev

プログラムでキープレスイベントを生成する方法

分類Dev

WindowsでC#を使用してプログラムでディスクドライブのライトビハインドキャッシュポリシーを無効にする方法はありますか?

分類Dev

フルカレンダー-React-マンスリービューでイベントのドラッグを無効にする方法

分類Dev

プログラムでナイトモードを有効にする方法は?

分類Dev

イントラネットで実行され、.xhtmlページをレンダリングするサイトのIE-8互換モードをプログラムで無効にするには

分類Dev

xbox oneコントローラーでさまざまなゲームをプレイするときに表示されるスクリーンキーボードでこれを無効にするにはどうすればよいですか?

分類Dev

テンプレートのインスタンス化が無効で、メタプログラムが正常にコンパイルされますか?

分類Dev

イベントディスパッチスレッドを無視すると、このプログラムはどのように機能しますか?

分類Dev

コマンドラインプロンプトでホームフォルダ記号(〜)を無効にする

分類Dev

プログラムでAndroidのソフト入力キーボードのテキストへの音声ボタン(マイク)を無効にする

分類Dev

再起動せずにWindows10デバイスでプログラムでアクションセンターの回転ロックを有効/無効(グレー表示)にする方法はありますか?

分類Dev

プログラムでレスト コントローラーのインポート/ロードを強制する方法

分類Dev

コントローラーレベルのリクエストマッピングが、Spring MVCコントローラークラスへの特定のメソッドに対して無効であることを指定できますか?

分類Dev

コマンドラインからXubuntu14.04でライトロッカーを無効にする方法は?

分類Dev

Windows 7:このウィンドウが属するプログラムを見つけて無効化/アンインストールできるようにする方法は?

分類Dev

ロボットフレームワークでテストを実行するときにChromeでFlashプラグインを無効にする

Related 関連記事

  1. 1

    アンドロイドでプログラムシークレットキーボードを有効または無効にする方法?

  2. 2

    Pythonのキーリングのコマンドラインパスワードプロンプトを無効にする方法-ヘッドレスdebianlinux

  3. 3

    コマンドラインから「スタートアップアプリケーション」でプログラムを無効にする方法

  4. 4

    プラグイントレースログをプログラムで/ SDK経由で有効にする方法

  5. 5

    レイアウトを介してグーグルマップのタッチイベントを無効にする方法は?(アンドロイド)

  6. 6

    プログラムでサイドトーン/マイクのパススルーを有効にする方法

  7. 7

    Javaプログラムでスタックトレース生成を無効にする方法は?

  8. 8

    RESTfulエンドポイントのSpringフォームベースのログインを無効にするにはどうすればよいですか?

  9. 9

    iOSでプログラムでスリープモードを無効/有効にする方法は?

  10. 10

    プログラムでバイブレーションモードを有効または無効にする方法

  11. 11

    Angularテンプレートでスラッシュのエンコードを無効にする方法

  12. 12

    スプリングブートで特定のレストエンドポイントを有効/無効にする方法は?

  13. 13

    bashループを使用して、コマンドラインで一重引用符を使用するプログラムを実行します。一重引用符はbashスクリプトの意図を無効にします。

  14. 14

    プログラムでキープレスイベントを生成する方法

  15. 15

    WindowsでC#を使用してプログラムでディスクドライブのライトビハインドキャッシュポリシーを無効にする方法はありますか?

  16. 16

    フルカレンダー-React-マンスリービューでイベントのドラッグを無効にする方法

  17. 17

    プログラムでナイトモードを有効にする方法は?

  18. 18

    イントラネットで実行され、.xhtmlページをレンダリングするサイトのIE-8互換モードをプログラムで無効にするには

  19. 19

    xbox oneコントローラーでさまざまなゲームをプレイするときに表示されるスクリーンキーボードでこれを無効にするにはどうすればよいですか?

  20. 20

    テンプレートのインスタンス化が無効で、メタプログラムが正常にコンパイルされますか?

  21. 21

    イベントディスパッチスレッドを無視すると、このプログラムはどのように機能しますか?

  22. 22

    コマンドラインプロンプトでホームフォルダ記号(〜)を無効にする

  23. 23

    プログラムでAndroidのソフト入力キーボードのテキストへの音声ボタン(マイク)を無効にする

  24. 24

    再起動せずにWindows10デバイスでプログラムでアクションセンターの回転ロックを有効/無効(グレー表示)にする方法はありますか?

  25. 25

    プログラムでレスト コントローラーのインポート/ロードを強制する方法

  26. 26

    コントローラーレベルのリクエストマッピングが、Spring MVCコントローラークラスへの特定のメソッドに対して無効であることを指定できますか?

  27. 27

    コマンドラインからXubuntu14.04でライトロッカーを無効にする方法は?

  28. 28

    Windows 7:このウィンドウが属するプログラムを見つけて無効化/アンインストールできるようにする方法は?

  29. 29

    ロボットフレームワークでテストを実行するときにChromeでFlashプラグインを無効にする

ホットタグ

アーカイブ