Swinject возвращает ноль, потому что объект зарегистрирован неправильно

#ios #swift #swinject

#iOS #быстрый #свинжект

Вопрос:

Вот как я регистрирую объект для FirebaseMessaging :

     container.register(Messaging.self) { _ in
        return Messaging.messaging()
    }
 

и тогда мне нужно это использовать:

     container.register(NotificationSchedulerable.self) { resolver in
        let userNotificationCenter = resolver.resolve(UNUserNotificationCenter.self)!
        let messaging = resolver.resolve(Messaging.self)! //unexpectadly found nil
        return NotificationScheduler(userNotificationCenter: userNotificationCenter, messaging: messaging)
    }
 

Но я получаю сообщение об ошибке:

Swinject: ошибка разрешения. Ожидаемая регистрация: { Service: FIRMessaging, Factory: Resolver -> FIRMessaging } Доступные регистрации: { Service: FIRMessaging, Factory: Resolver -> FIRMessaging, ObjectScope: graph } Неустранимая ошибка: неожиданно обнаружено значение nil при развертывании необязательного значения: файл ToolsAssembly.swift, строка 72

Почему это происходит?

Ответ №1:

Возможно, проблема в том, что вам нужно зарегистрировать FIRMessaging вместо обмена сообщениями

https://firebase.google.com/docs/cloud-messaging/ios/client?hl=es

Вот так:

     container.register(FIRMessaging.self) { _ in
        return Messaging.messaging()
    }
 

И затем:

 container.register(NotificationSchedulerable.self) { resolver in
        let userNotificationCenter = resolver.resolve(UNUserNotificationCenter.self)!
        let messaging = resolver.resolve(FIRMessaging.self)! //unexpectadly found nil
        return NotificationScheduler(userNotificationCenter: userNotificationCenter, messaging: messaging)
    }
 

Ответ №2:

Могу ли я пригласить вас проверить новый свежий контейнер DIContainer для Swift?

В этой библиотеке вы можете получить доступ к своим зависимостям с помощью оболочки свойств.

 @Injected(.githubService)
var githubService: FetchService

@Injected(.by(type: FetchService.self, withKey: "gitlab"))
var gitlabService: FetchService

@InjectedSafe
var externalService: ExternalSingletonService?
 

Я надеюсь, что это хорошо соответствует вашим потребностям.

Ответ №3:

Вы должны позвонить FirebaseApp.configure() , прежде чем разрешать свои зависимости.