【问题标题】:Swift - How sending a post notification from OneSignal SDK to specific username tag?Swift - 如何从 OneSignal SDK 向特定用户名标签发送发布通知?
【发布时间】:2017-01-10 10:43:11
【问题描述】:

如何从 Swift/iOS Native SDK 向特定标签(例如(用户名:“@john”))发送发布通知。我之前有 sendTag OneSignal。我在一个带有 playerID 的用户下面发送。但这还不够。有人可以使用不同的帐户登录。所以相同的 playerID 将适用于所有人。当我添加标语行时,它无法按预期工作。如何将玩家 ID 和用户名标签一起使用。

OneSignal.sendTag("username", value: "\(username)")

如果有人解释一下,那就太好了。

DataService.ds.REF_USERS.child(userUUID).child("playerID").observeSingleEvent(of: .value, with: { snapshot in

if let playerID = snapshot.value as? String {

    OneSignal.idsAvailable({ (userId, pushToken) in
        print("UserId:%@", userId ?? "")

        self.showErrorAlert("Player ID Here:", msg: "\(userId!)")

        if (pushToken != nil) {

            OneSignal.postNotification(["contents": ["en": "@username wrote a comment: \(trimmed)"],
                                        "include_player_ids": [playerID],
                                        "send_after": "2017-01-10 20:10:00 GMT+0300",
                                        "tag": ["field": "tag", "key": "username", "relation": "=", "value": "john",
                ])
        }

    })

} 
})

【问题讨论】:

    标签: ios swift push-notification onesignal


    【解决方案1】:

    出于安全原因,OneSignal 不允许您在应用代码中使用标签定位。

    不过,OneSignal 确实允许您使用应用内的 include_player_ids 字段来定位设备。

    请注意,OneSignal 也不允许您组合不同的定位参数。因此,您不能同时使用 include_player_idstags 定位。

    要根据用户名发送通知,请使用 OneSignal.sendTag 方法分配用户名,如您的示例中所示。接下来,在您的服务器端代码中,使用 filters 定位参数向具有该用户名的所有用户发送通知。

    例如,以下是如何在 Ruby 中执行此操作的示例:

    params = {"app_id" => "5eb5a37e-b458-11e3-ac11-000c2940e62c", 
              "contents" => {"en" => "English Message"},
              "filters" => [
                            {"field": "tag", 
                             "key": "username", 
                             "relation": "=", 
                             "value": "(username)"}
                           ]
            }
    uri = URI.parse('https://onesignal.com/api/v1/notifications')
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    
    request = Net::HTTP::Post.new(uri.path,
                                  'Content-Type'  => 'application/json;charset=utf-8',
                                  'Authorization' => "Basic NGEwMGZmMjItY2NkNy0xMWUzLTk5ZDUtMDAwYzI5NDBlNjJj")
    request.body = params.as_json.to_json
    response = http.request(request) 
    puts response.body
    

    您可以在 OneSignal 文档here 中找到更多示例。

    【讨论】:

    • 感谢您的详细解答。如果用户注销,我没有在服务器端,而是从数据库中删除 playerID 做了临时解决方案。这个答案将来也会派上用场。
    • 如果我不使用服务器端代码怎么办?我需要通过移动 SDK 定位标签
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    相关资源
    最近更新 更多