无论如何都要访问用户订阅的Firebase主题吗?

时间:2016-08-15 02:57:14

标签: swift firebase notifications firebase-cloud-messaging

我目前正在尝试将我的应用迁移到firebase,而且我正在寻找与Parse Installations和Channels等效的Firebase。

我发现我们应该在我的应用中使用主题"订阅"和"取消订阅"主题是常见的,但没有办法(我发现)看到用户订阅了哪些主题。有什么想法吗?

我查看了Firebase文档,但我是Firebase的新手,所以也许有经验丰富的人会知道:https://firebase.google.com/docs/cloud-messaging/android/topic-messaging#managing_topic_subscriptions_from_the_server

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

FCM主题订阅基于应用程序的实例ID,因此当您订阅或取消订阅主题时,会使用IID。

您可以使用Instance ID API获取有关特定IID的信息,此信息包括IID当前订阅的主题。请参阅reference

答案 1 :(得分:0)

您必须向Instance ID API发出请求。我创建了一个扩展

https://gist.github.com/eduardo22i/0ee8960c36659b17fbc538964e929cac

扩展消息{

static private let accessToken = "" //Server Web Key

struct Topic : Decodable {
    var name : String?
    var addDate : String?
}

struct Rel : Decodable {
    var topics = [Topic]()

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        let relContainer = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .rel)
        let topicsContainer = try relContainer.nestedContainer(keyedBy: CodingKeys.self, forKey: .topics )

        for key in topicsContainer.allKeys {
            var topic = Topic()
            topic.name = key.stringValue

            let topicContainer = try? topicsContainer.nestedContainer(keyedBy: CodingKeys.self, forKey: key)
            topic.addDate = try! topicContainer?.decode(String.self, forKey: .addDate)

            self.topics.append(topic)
        }
    }

    struct CodingKeys : CodingKey {
        var stringValue: String
        init?(stringValue: String) {
            self.stringValue = stringValue
        }
        var intValue: Int? { return nil }
        init?(intValue: Int) { return nil }

        static let rel = CodingKeys(stringValue: "rel")!
        static let topics = CodingKeys(stringValue: "topics")!
        static let addDate = CodingKeys(stringValue: "addDate")!
    }
}

func loadTopics(block : @escaping (_ topics: [Messaging.Topic]?, _ error: Error?) -> Void ) {
    if let token = InstanceID.instanceID().token() {
        let url = URL(string: "https://iid.googleapis.com/iid/info/\(token)?details=true")!
        var request = URLRequest(url: url)
        request.addValue("key=\(Messaging.accessToken)", forHTTPHeaderField: "Authorization")
        let dataTask = URLSession.shared.dataTask(with: request) { (data, response, error) in
        DataManager.shared.make(request: urlRequest, block: { (data, error) in
            if let data = data {
                let decoder = JSONDecoder()
                let rel = try? decoder.decode(Rel.self, from: data)
                block(rel?.topics, error)
            } else {
                block(nil, error)
            }
        }

        dataTask.resume()
    }
}
}

// Usage

Messaging.messaging().loadTopics { (topics, error) in
    topics?.forEach({ (topic) in
        print(topic.name)
    })
}

答案 2 :(得分:0)

这是@Eduardo's请求的@Nico的更新

2件事:

  • 您需要导入Firebase,因为您需要InstanceID和消息传递模块。
  • 确保您填写API密钥(accessToken)which can be found under: (gear-next-to-project-name)>项目设置> Cloud Messaging->服务器密钥是API密钥。

这是更新的代码:

Messaging.messaging().loadTopics { (topics, error) in
   topics?.forEach({ (topic) in
       print("Subscribed to topic: \(topic.name ?? "No name")")
   })
}

用法是这样的:

{{1}}