Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于Android实现的Pusher_Android_Pusher - Fatal编程技术网

用于Android实现的Pusher

用于Android实现的Pusher,android,pusher,Android,Pusher,我正在尝试在我的Android应用程序中实现一个推送服务,它没有访问服务器的权限,只是从以前的iOS应用程序实现中复制。连接过程中一切正常,但当订阅专用通道时,身份验证失败: "com.pusher.client.AuthorizationFailureException: java.io.FileNotFoundException: https://authorization_url" 实现如下所示: HttpAuthorizer authorizer = new HttpAutho

我正在尝试在我的Android应用程序中实现一个推送服务,它没有访问服务器的权限,只是从以前的iOS应用程序实现中复制。连接过程中一切正常,但当订阅专用通道时,身份验证失败:

"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版本中有一个函数调用,它将一些头设置为频道订阅或类似的内容:

(void)pusher:(PTPusher *)pusher willAuthorizeChannel:(PTPusherChannel *)channel withRequest:(NSMutableURLRequest *)request;
{
    [request addAuthorizationHeadersForUser:self.credentials.user];

}
我试图找出在android中添加标题的位置,尝试将其添加到授权人,但没有任何更改:

authorizer.setHeaders(addMapAuthorizationHeaders());

你知道Android中iOS功能的等价物是什么吗:WillAuthorizationChannel???

好的解决了,这就是我所想的,HttpAuthorizer需要一组标题,你可以在创建它时直接设置,如:

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);
如果有人有类似的问题,这样做很好

编辑: 这是如何设置授权标头的。它是设置为“键”“值”对的映射,例如:

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;
    }
}

好的,解决了,这就是我所想的,HttpAuthorizer需要一组标题,您可以在创建它时直接设置,如:

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);
如果有人有类似的问题,这样做很好

编辑: 这是如何设置授权标头的。它是设置为“键”“值”对的映射,例如:

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并用您自己的代码覆盖authorize方法,就这样,您可以得到与iOS相同的结果

让您开始(使用自定义构造函数)的一些代码段:


我也一直在努力解决这个问题。。。解决办法很简单

首先看看这个:

然后实现抽象接口Authorizer并用您自己的代码覆盖authorize方法,就这样,您可以得到与iOS相同的结果

让您开始(使用自定义构造函数)的一些代码段:


假设
https://authorization_url
实际上是您代码中的正确url,很可能是您没有internet,或者您没有包含
internet
权限。不,这不是问题所在,请求正常,服务器返回异常,我很清楚这是一个授权问题。现在更新问题。@labreu您是否有机会分享
addAuthorizationHeadersForUser:
的实现?我正在尝试让推送认证在iOS上工作,我相信这可能是我遗漏的部分。@erik这是我回答的第二部分,另外请看一下我的答案的注释以及iOS代码的另一个答案。但基本上它是一个带有key/value的地图,假设
https://authorization_url
实际上是您代码中的一个正确url,很可能您没有internet,或者您没有包含
internet
权限。不,这不是问题所在,请求进展顺利,服务器返回异常,我很清楚这是授权问题。现在更新问题。@labreu您是否有机会分享
addAuthorizationHeadersForUser:
的实现?我正在尝试让推送验证在iOS上工作,我相信这可能是我缺少的部分。@erik这是我答案的第二部分,也看看我答案的注释和iOS代码的另一个答案。但基本上这是一个带有键/值的映射。你能举一个例子说明我的验证头包含的内容吗?我正试图解决与您完全相同的问题—(void)pusher:(PTPusher)pusher-willAuthorizeChannel:(PTPusher-channel*)channel-withRequest:(NSMutableURLRequest*)request{NSString-authString=[NSString-stringWithFormat:@“Token-Token=\“%@\”,self.userAccessToken];[request-setValue:authString-forHTTPHeaderField:@“Authorization”]HttpAuthorizer authorizer=新的HttpAuthorizer(baseUrl+“pusher/auth”);HashMap pusherAuthHeaders=新HashMap();pusherAuthHeaders.put(“授权”,“令牌令牌=\”+会话。getAccessToken()+“\”);authorizer.setHeaders(pusherAuthHeaders)仍然没有找到文件,没有什么特别的,如果您得到一些身份验证错误,应该是头的问题,我想,在我的例子中,我使用“Authorization”头发送“Basic”+Base64.encodeToString((“username”+:“+”password”).getBytes(),Base64.NO_);但这是特定于我的服务器的,可能它与pusher有关,我不知道,因为我不是在处理服务器端代码,但如果您有一个iOS对应程序,那么两个PushPusherAuthHeaders的头应该是相同的。put(“Authorization”,“Token Token=\”“+session.getAccessToken()+”\);检查标题,我觉得这个值很奇怪。无论如何,至少你知道问题出在授权上,检查标题值,正确的应该没问题。我得到的是无效的签名:预期的HMAC SHA256十六进制摘要是{十五}十五}十五}。十五}十五}:私有在线会话-{十六进制GUID在这里},但是得到了{另一个没有破折号的十六进制GUID}所有的公共订阅和状态订阅都正常工作,我无法让私人会话正常工作。您可以发布一个示例,说明MY_AUTH_头包含的内容吗?我正试图解决与您完全相同的问题—(void)pusher:(PTPusher)pusher-willAuthorizeChannel:(PTPusher-channel*)channel-withRequest:(NSMutableURLRequest*)request{NSString-authString=[NSString-stringWithFormat:@“Token-Token=\“%@\”,self.userAccessToken];[request-setValue:authString-forHTTPHeaderField:@“Authorization”]HttpAuthorizer authorizer=新的HttpAuthorizer(baseUrl+“pusher/auth”);HashMap pusherAuthHeaders=新HashMap();pusherAuthHeaders.put(“授权”,“令牌令牌=\”+会话。getAccessToken()+“\”);authorizer.setHeaders(pusherAuthHeaders)仍然无法找到文件。如果您得到