Каналы платформы не возвращают быстрое закрытие при первом запуске - PullRequest
0 голосов
/ 01 марта 2019

Я занимаюсь разработкой приложения Flutter, в котором мне нужно использовать собственный плагин Firebase Messaging для каждой платформы.Я следовал руководству Флаттера по каналам платформы , чтобы иметь возможность реализовать собственный код.Моя проблема в том, что когда я впервые устанавливаю приложение на любое устройство iOS, каналы платформы ничего не получают от Swift.Метод Callall оставляет меня в покое.Однако при переустановке приложения токен возвращается.Я довольно новичок в Swift и, видимо, с трудом понимаю, как правильно реализовать замыкания и параметр @escaping.

Я сузил проблему до строчки GeneratedPluginRegistrant.register(with: self) (что очень важно для приложения Flutter).Когда строка пропущена, я получаю токен каждый раз, но заставка никогда не отображается (приложение останавливается на пустом экране, что не является приемлемым решением).

Сначала я подумал, что на приложение повлиял тот факт, что оно запрашивает разрешения на отображение уведомлений при первом запуске, но даже когда я не отвечаю на всплывающее окно перед переустановкой приложения, я получаю токен.Я попытался запустить приложение, не запрашивая разрешения на показ уведомлений, но это не повлияло на результат.

Клиент / Флаттер

Следующий код вызывается из initState ():

  Future<void> getTokenNatively() async {
    print("inside getTokenNatively()");
    try {
      userToken = await getFirebaseTokenChannel.invokeMethod("getTokenNatively");
      print("-- FLUTTER -- userToken: $userToken");
    } catch (error) {
      print("getTokenNatively() resulted in an error: $error");
    } finally {
      print("Finally has run.");
    }
  }

Хост / iOS

Следующий метод вызывается внутри didFinishLaunchingWithOptions

            let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
            let tokenChannel = FlutterMethodChannel(name: "com.example.obscured/getTokenNatively",
                                                    binaryMessenger: controller)

            tokenChannel.setMethodCallHandler({
                [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
                print("just inside our FlutterMethodCall closure")
                guard call.method == "getTokenNatively" else {
                    result(FlutterMethodNotImplemented)
                    return
                }

                print("I will be printed every time")

                InstanceID.instanceID().instanceID(handler: { (res, error) in
                    print("First line after 'in' inside InstanceID.instanceID().instanceID")
                    if let error = error {
                        print("Error fetching remote instance ID: \(error)")
                        result(error.localizedDescription)
                    } else if let res = res {
                        print("Remote instance ID token: \(res.token)")
                        result(res.token)
                    } else {
                        print("neither a error or result. What are you?")
                        result("none of the above")
                    }
                    print("Outside if/else if/else")
                })

                print("That seems to be the case for me as well")
            })

    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}

Журнал для новой установки (приложение еще не загружено на устройство):

2019-03-29 10:47:39.215103+0100 Runner[2334:1001337] 5.7.0 - [Firebase/Analytics][I-ACS023007] Analytics v.50101000 started
2019-03-29 10:47:39.215323+0100 Runner[2334:1001337] 5.7.0 - [Firebase/Analytics][I-ACS023008] To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see "some fancy google link")
2019-03-29 10:47:39.219380+0100 Runner[2334:1001347] flutter: Observatory listening on http://127.0.0.1:60398/
APNs token retrieved: 32 bytes
2019-03-29 10:47:39.953629+0100 Runner[2334:1001340] flutter: didChangeDependencies() root_page
2019-03-29 10:47:39.959653+0100 Runner[2334:1001340] flutter: getDevice() result: IOS
2019-03-29 10:47:39.960416+0100 Runner[2334:1001340] flutter: inside getTokenNatively()
just inside our FlutterMethodCall closure
I will be printed every time
That seems to be the case for me as well
2019-03-29 10:47:40.177060+0100 Runner[2334:1001340] flutter: _authStatus: AuthStatus.signedIn
2019-03-29 10:47:40.177195+0100 Runner[2334:1001340] flutter: _homeStatus: null
2019-03-29 10:47:41.174878+0100 Runner[2334:1001340] flutter: Has [USER] accepted an invitation? Answer: true
2019-03-29 10:47:41.175041+0100 Runner[2334:1001340] flutter: crudMethods.hasHome(): true
2019-03-29 10:47:43.853516+0100 Runner[2334:1001355] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301) [C4.1:2][0x1133cd2b0] get output frames failed, state 8196
2019-03-29 10:47:43.853858+0100 Runner[2334:1001355] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301) [C4.1:2][0x1133cd2b0] get output frames failed, state 8196
2019-03-29 10:47:43.854425+0100 Runner[2334:1001355] TIC Read Status [4:0x0]: 1:57
2019-03-29 10:47:43.854485+0100 Runner[2334:1001355] TIC Read Status [4:0x0]: 1:57

Войдите в систему для чистой установки, оставив следующую строку GeneratedPluginRegistrant.register(with: self):

2019-03-29 10:45:37.212943+0100 Runner[2327:1000780] flutter: Observatory listening on http://127.0.0.1:60265/
2019-03-29 10:45:37.214168+0100 Runner[2327:1000766] 5.7.0 - [Firebase/Analytics][I-ACS023007] Analytics v.50101000 started
2019-03-29 10:45:37.214855+0100 Runner[2327:1000766] 5.7.0 - [Firebase/Analytics][I-ACS023008] To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see "some shortened Google url")
APNs token retrieved: 32 bytes
2019-03-29 10:45:37.636480+0100 Runner[2327:1000772] [VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: MissingPluginException(No implementation found for method Firestore#settings on channel plugins.flutter.io/cloud_firestore)
#0      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:300:7)
<asynchronous suspension>
#1      Firestore.settings (file:///Users/[USER]/Library/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.9.5+2/lib/src/firestore.dart:145:19)
<asynchronous suspension>
#2      main (package:cue_app/main.dart:31:18)
<asynchronous suspension>
#3      _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:189:25)
#4      _rootRun (dart:async/zone.dart:1124:13)
#5      _CustomZone.run (dart:async/zone.dart:1021:19)
#6      _runZoned (dart:async/zone.dart:1516:10)
#7      runZoned (dart:async/zone.dart:1500:12)
#8      _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:180:5)
#9      _startIsolate.<anonymous closure> (dart:isolate/runtime/lib/isolate_patch.dart:300:19)
#10     _RawReceivePortImpl._handleMessage (dart:isolate/runtime/lib/isolate_patch.dart:171:12)
Firebase registration token: [OMITTED]

Я получаю токен, но приложение никогда не отображает заставку(следовательно, это не решение).

Журнал для повторной установки (на устройстве установлена ​​более ранняя версия приложения):

2019-03-29 11:30:28.125256+0100 Runner[2345:1004655] 5.7.0 - [Firebase/Analytics][I-ACS023007] Analytics v.50101000 started
2019-03-29 11:30:28.127196+0100 Runner[2345:1004655] 5.7.0 - [Firebase/Analytics][I-ACS023008] To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see "some google link")
2019-03-29 11:30:28.133468+0100 Runner[2345:1004666] flutter: Observatory listening on http://127.0.0.1:61630/
APNs token retrieved: 32 bytes
2019-03-29 11:30:28.590713+0100 Runner[2345:1004661] flutter: didChangeDependencies() root_page
2019-03-29 11:30:28.595299+0100 Runner[2345:1004661] flutter: getDevice() result: IOS
2019-03-29 11:30:28.596043+0100 Runner[2345:1004661] flutter: inside getTokenNatively()
just inside our FlutterMethodCall closure
I will be printed every time
That seems to be the case for me as well
First line after 'in' inside InstanceID.instanceID().instanceID
Remote instance ID token: [OMITTED]
Outside if/else if/else
2019-03-29 11:30:28.794378+0100 Runner[2345:1004661] flutter: _authStatus: AuthStatus.signedIn
2019-03-29 11:30:28.794446+0100 Runner[2345:1004661] flutter: _homeStatus: null
2019-03-29 11:30:28.796259+0100 Runner[2345:1004661] flutter: -- FLUTTER -- userToken: [OMITTED]
2019-03-29 11:30:28.796293+0100 Runner[2345:1004661] flutter: Finally has run.
2019-03-29 11:30:29.974120+0100 Runner[2345:1004661] flutter: Has [USER] accepted an invitation? Answer: true
2019-03-29 11:30:29.974453+0100 Runner[2345:1004661] flutter: crudMethods.hasHome(): true

ОБНОВЛЕНИЕ

Я упростил пример.Код Swift взят из репо Firebase .Когда я запускаю их пример как отдельный, это работает как очарование.Однако, когда я пытаюсь интегрировать его в свой проект Flutter, он разбивает его на различные сценарии, описанные выше.

По какой-то причине коду не разрешено возвращать код в methodChannel при первом запуске.Я думаю, что это как-то связано с @escaping в Swift, но я не знаю, как двигаться дальше.У кого-нибудь есть идея?

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