我正在尝试在我的 Android 应用程序中实现推送服务,无法访问服务器,只能从 iOS 应用程序之前的实现中复制。连接过程中一切正常,但是当订阅私有(private) channel 时,身份验证失败:
"com.pusher.client.AuthorizationFailureException: java.io.FileNotFoundException: https://authorization_url"
实现是这样的:
HttpAuthorizer authorizer = new HttpAuthorizer(PUSHER_AUTH_URL);
PusherOptions options = new PusherOptions().setEncrypted(true).setWssPort(443).setAuthorizer(authorizer);
pusher = new Pusher(PUSHER_KEY, options);
pusher.connect(new com.pusher.client.connection.ConnectionEventListener() {
@Override
public void onConnectionStateChange(ConnectionStateChange change) {
if (change.getCurrentState() == ConnectionState.CONNECTED) {
Channel channel = pusher.subscribePrivate(PUSH_CHANNEL, new PrivateChannelEventListener() {
@Override
public void onAuthenticationFailure(String s, Exception e) {
Log.w("PUSHER", "Channel subscription authorization failed");
}
@Override
public void onSubscriptionSucceeded(String s) {
Log.w("PUSHER", "Channel subscription authorization succeeded");
}
@Override
public void onEvent(String s, String s2, String s3) {
Log.w("PUSHER", "An event with name " + s2 + " was delivered!!");
}
}, "my-event");
}
}
@Override
public void onError(String message, String code, Exception e) {
Log.w("PUSHER", "There was a problem connecting with code " + code + " and message " + message);
}
}, ConnectionState.ALL);
更新
我确定问题出在身份验证上,在 iOS 版本中有一个函数调用将一些 header 设置为 channel 订阅或类似的东西:
(void)pusher:(PTPusher *)pusher willAuthorizeChannel:(PTPusherChannel *)channel withRequest:(NSMutableURLRequest *)request;
{
[request addAuthorizationHeadersForUser:self.credentials.user];
}
我试图找出在 android 中添加 header 的位置,尝试将其添加到授权方但没有任何变化:
authorizer.setHeaders(addMapAuthorizationHeaders());
知道在 Android 中与 iOS 功能等效的是什么:willAuthorizeChannel?
最佳答案
好的,这就是我的想法,HttpAuthorizer 需要一组 header ,您可以在创建它时直接设置这些 header ,例如:
HttpAuthorizer authorizer = new HttpAuthorizer(PUSHER_AUTH_URL);
authorizer.setHeaders(MY_AUTH_HEADERS); //a HashMap with the headers
PusherOptions options = new PusherOptions().setEncrypted(true).setWssPort(443).setAuthorizer(authorizer);
pusher = new Pusher(PUSHER_KEY, options);
如果有人有类似的问题,那可以正常工作。
编辑: 这是设置授权 header 的方法。例如,它是一个设置为“键”“值”对的映射:
public static HashMap<String, String> getMapAuthorizationHeaders() {
try {
HashMap<String, String> authHeader = new HashMap<>();
authHeader.put("HeaderKey1", "HeaderValue1");
authHeader.put("HeaderKey2", "HeaderValue2");
return authHeader;
} catch (Exception e) {
return null;
}
}
因此推送器配置如下:
authorizer.setHeaders(getMapAuthorizationHeaders());
关于android - Android 实现的推送器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25369483/