Bartłomiej Semańczyk
Bartłomiej Semańczyk

Reputation: 61774

Swinject returns nil because object is wrong registered

This is how I register object for FirebaseMessaging:

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

and then I need to use it:

    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)
    }

But I receive an error:

Swinject: Resolution failed. Expected registration: { Service: FIRMessaging, Factory: Resolver -> FIRMessaging } Available registrations: { Service: FIRMessaging, Factory: Resolver -> FIRMessaging, ObjectScope: graph } Fatal error: Unexpectedly found nil while unwrapping an Optional value: file ToolsAssembly.swift, line 72

Why it happens?

Upvotes: 0

Views: 822

Answers (3)

ViTUu
ViTUu

Reputation: 1204

Could I invite you to check a new fresh DIContainer for Swift?

In this lib, you can access your dependencies using a property wrapper.

@Injected(.githubService)
var githubService: FetchService

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

@InjectedSafe
var externalService: ExternalSingletonService?

I hope it fits well with your necessities.

Upvotes: 1

cap-slow
cap-slow

Reputation: 71

You should call FirebaseApp.configure() before resolving your dependencies.

Upvotes: 0

all.herranz
all.herranz

Reputation: 153

Maybe the problem is that you have to register a FIRMessaging instead Messaging

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

Like this:

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

And then:

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)
    }

Upvotes: 1

Related Questions