Как отключить события без кода Facebook программно? - PullRequest
8 голосов
/ 28 марта 2019

Задача

В течение нескольких месяцев у нас было живое приложение, которое работало нормально, а потом вдруг этот код сломался:

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

1 Ответ

6 голосов
/ 28 марта 2019

Оказывается, это какая-то удаленная конфигурация 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 ответила мне, говоря простым языком, что эта опция просто невозможна:

enter image description here

Короче говоря: установив FB App Events SDK , вы автоматически включите удаленную конфигурацию FB, которая включает события без кода, и отключить ее невозможно.

Заключение

Нам удалось воспроизвести проблему (в частности, включить флаг удаленных событий fb, выполнив несколько шагов в админке facebook)

сначала запустите пример приложения и проверьте, включен ли флаг:

enter image description here

зайдите в менеджер событий и нажмите + добавить новый источник данных> события приложения

enter image description here

enter image description here

enter image description here

при нажатии на эту кнопку вы увидите

enter image description here

и вот когда флаг включен!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...