Swift - 如何从OneSignal SDK向特定用户名标签发送发布通知?

3

如何在Swift/iOS Native SDK中向特定标签(如用户名:“@john”)发送帖子通知?我之前使用过OneSignal的sendTag。我已经发送了以下带有playerID的用户。但这还不够。有些人可能会用不同的账户登录。因此,相同的playerID将适用于所有用户。当我添加标签行时,它并没有像我期望的那样工作。如何同时使用Player 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",
                ])
        }

    })

} 
})
1个回答

1
出于安全原因,OneSignal不允许您在应用程序代码中使用标签定位。但是,OneSignal确实允许您使用“include_player_ids”字段从应用程序内部定位设备。请注意,OneSignal还不允许您组合不同的定位参数。因此,您不能同时使用“include_player_ids”和“tags”定位。要基于用户名发送通知,请使用“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文档这里找到更多示例。

感谢您详细的回答。我没有采用服务器端的解决方案,而是通过从数据库中删除玩家ID来实现临时解决方案,以便在用户注销时使用。此外,这个答案将在未来很有用。 - iamburak
1
如果我没有使用服务器端代码怎么办?我需要通过移动SDK定位一个标签。 - vikzilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接