尝试使用getstream for swift时,无法添加活动。
class MyActivity : Activity {}
...
let client = Client(apiKey: <MyApiKey>, appId: <MyApiKey>, token: <Token>)
let ericFeed = client.flatFeed(feedSlug: "user", userId: "eric")
let activity = MyActivity(actor: "eric", verb: "waves", object: "picture:10", foreignId: "picture:10")
ericFeed.add(activity) { result in
print("!result!")
print(result)
}
token
是在服务器端生成的,格式为eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZXJpYyJ9.AAAAAAAAAAAAAAAAA-AAAAAAAAAAAAAAAA-AAAAAAAA
并且:client.currentUserId
返回eric
(因此,令牌是否正确?)未调用
ericFeed.add(activity)
的回调在我的应用程序的仪表板日志中,我看到添加活动的尝试失败,出现错误403
我尝试了不同的id(使用不同的标记),包括
actor: "eric"
和actor: "user:eric"
。什么可能出了问题?生成令牌(php服务器)的代码是:
$userId = "eric";
$client = new GetStream\Stream\Client(<MyApiKey>, <MyAppSecret>);
$userToken = $client->createUserSessionToken($userId);
我收到仪表板上的日志:
最佳答案
有几件事需要记住。
首先,当请求结束时,可能您的客户机被释放了,这就是为什么没有调用回调,但是日志可以显示请求已经完成。我建议您使用一个共享的客户机实例,它将很容易使用。要设置共享客户端,您需要编写以下命令:
Client.config = .init(apiKey: "<MyApiKey>", appId: "<MyApiKey>", token: "<Token>")
有关wiki page中客户端设置的更多信息。
第二件重要的事情,你必须创建/更新你的流用户。从服务器端,您将获得流
userId
的令牌,并可以请求流用户。最简单的方法是调用Client.shared.create(user:)
来创建/更新用户。因此,它仍然是流客户端设置的一部分:Client.shared.create(user: GetStream.User(id: Client.shared.currentUserId!)) { result in
// Update the client with the current user.
Client.shared.currentUser = try? result.get()
// Do all your requests from here. Reload feeds and etc.
}
docs中的更多信息。
我建议您只使用
feedSlug
参数创建feed,流userId
将从令牌中获取。但它是可选的,因为currentUserId
是可选的。例如:let ericFeed = Client.shared.flatFeed(feedSlug: "user")
ericFeed?.add(activity)
对于您的活动,流客户端应该始终使用当前流用户作为参与者。因此,我们需要更新
MyActivity
的定义。最后,下面是您的代码:
// Define your activity.
class MyActivity: EnrichedActivity<GetStream.User, String, DefaultReaction> {
// ...
}
// Setup Stream Client.
Client.config = .init(apiKey: <MyApiKey>, appId: <MyApiKey>, token: <Token>)
// Setup the current user.
Client.shared.getCurrentUser {
let ericFeed = Client.shared.flatFeed(feedSlug: "user")
let activity = MyActivity(actor: Client.shared.currentUser!, verb: "waves", object: "picture:10", foreignId: "picture:10")
ericFeed?.add(activity) { result in
print("!result!")
print(result)
}
}