Sencha Touch 2.1 と PhoneGap 2.5.0 を使用して、ネイティブの Android アプリ内から SignalR に接続しようとしています。
これが私がこれまでに持っているものです:
私の SignalR サーバーは、Windows Server 2012 で実行されている ASP.NET MVC3 アプリケーションです。global.asax.vb でクロス ドメイン アクセスが有効になっています。
グローバル.asax.vb
Sub Application_Start()
Dim config As New HubConfiguration
config.EnableCrossDomain = True 'Allow cross domain (for native apps)
RouteTable.Routes.MapHubs(config)
AreaRegistration.RegisterAllAreas()
RegisterGlobalFilters(GlobalFilters.Filters)
RegisterRoutes(RouteTable.Routes)
End Sub
SignalR 1.0.1 ハブを使用しています。Sencha Touch アプリケーションが呼び出す「認証」メソッドを実装しました。
送信機.vb
Public Class Transmitter
Inherits Hub
Public Sub authenticate(ByVal sClientId As String, _
ByVal sPassword As String)
Try
Dim bRegistered As Boolean = ValidateUser(sClientId, sPassword)
If bRegistered Then
Clients.Caller.isAuthenticated(True)
Else
Clients.Caller.isAuthenticated(False)
End If
Catch ex As Exception
LogEvent("Authenticate: " & ex.Message)
End Try
End Sub
End Class
SignalR サーバーに接続して「認証」機能を呼び出す Sencha Touch 2.1 アプリケーションを開発しました。これは、Chrome Web ブラウザーでうまく機能します。次のように、index.html ファイルに SignalR への参照を追加しました。
index.html
<script src="https://www.mySite.com/SignalRServer/Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
<script src="https://www.mySite.com/SignalRServer/Scripts/jquery.signalR-1.0.1.js" type="text/javascript"></script>
<script src="https://www.mySite.com/SignalRServer/signalr/hubs"></script>
以下は、SignalR に接続し、Sencha Touch アプリケーション内から「authenticate」メソッドを呼び出すために使用されるコードです。
MySenchaTabPanel.js
listeners: {
activate: function () {
$.connection.hub.logging = true;
$.connection.hub.url = 'https://www.mySite.com/SignalRServer/signalr';
var transmitterProxy = $.connection.transmitter;
transmitterProxy.client.isAuthenticated = function (bAuthenticated) {
console.log('isAuthenticated: ' + bAuthenticated);
};
console.log('Connecting to server...');
$.connection.hub.start()
.done(function () {
console.log('Connected to Server: Transport: ' + $.connection.hub.transport.name);
transmitterProxy.server.authenticate(sClientId, sPassword);
})
.fail(function (error) {
console.log('Could not connect to server:' + error);
});
}
}
私は現在、Sencha Touch 2.1 アプリケーションをラップするために PhoneGap 2.5.0 を使用しており、それを Android 4.2.2 シミュレーターにデプロイしています。アプリケーションは、接続を開始するときに、done コールバック関数で見つかった「Connected to Server」ログを表示します。しかし、「認証」機能を呼び出そうとしても何も起こりません。ログは次のとおりです。
03-26 05:29:38.631: D/CordovaLog(1758): exception firing pause event from native
03-26 05:29:49.978: D/CordovaLog(1758): Connecting to server...
03-26 05:29:51.330: D/CordovaLog(1758): exception firing destroy event from native
03-26 05:29:51.688: D/CordovaLog(1758): [05:29:51 GMT+0000 (GMT)] SignalR: Auto detected cross domain url.
03-26 05:29:51.688: D/CordovaLog(1758): [05:29:51 GMT+0000 (GMT)] SignalR: Negotiating with 'https://www.mySite.com/SignalRServer/signalr/negotiate'.
03-26 05:29:52.840: D/CordovaLog(1758): [05:29:52 GMT+0000 (GMT)] SignalR: SignalR: Initializing long polling connection with server.
03-26 05:29:53.988: D/CordovaLog(1758): [05:29:53 GMT+0000 (GMT)] SignalR: Attempting to connect to 'https://www.mySite.com/SignalRServer/signalr/connect?transport=longPolling&connectionToken=fW1SyP5V9Qwq7d0WF3FBn8Fr9rXvNJZ-VryuonW7LlsUyIbUlQ5LlW9gTRJNGch9t8yO4te8fbyZW2ZPKY_eAdnvIz6tHKxX0rmq8qNa8tv0budwIBjwD6YM1j4pSDTs0&connectionData=%5B%7B%22name%22%3A%22transmitter%22%7D%5D&tid=2' using longPolling.
03-26 05:29:54.258: D/CordovaLog(1758): Connected to Server: Transport: longPolling
03-26 05:29:54.358: D/CordovaLog(1758): [05:29:54 GMT+0000 (GMT)] SignalR: Longpolling connected
03-26 05:29:54.799: D/CordovaLog(1758): [05:29:54 GMT+0000 (GMT)] SignalR: Triggering client hub event 'joined' on hub 'Transmitter'.
03-26 05:29:54.808: D/CordovaLog(1758): [05:29:54 GMT+0000 (GMT)] SignalR: Attempting to connect to 'https://www.mySite.com/SignalRServer/signalr?transport=longPolling&connectionToken=fW1SyP5V9Qwq7d0WF3FBn8Fr9rXvNJZ-VryuonW7LlsUyIbUlQ5LlW9gTRJNGch9t8yO4te8fbyZW2ZPKY_eAdnvIz6tHKxX0rmq8qNa8tv0budwIBjwD6YM1j4pSDTs0&connectionData=%5B%7B%22name%22%3A%22transmitter%22%7D%5D&messageId=B%2C45%7CBo%2C0%7CBp%2C0%7CBq%2C0&tid=10' using longPolling.
Samsung Galaxy Android 4.1.2 デバイスにアプリを展開すると、同じ結果が得られます (Android と SignalR の既知の問題を回避するためにトランスポート プロトコルを指定した後)。誰かがSignalRをAndroidで動作させるのを手伝ってもらえますか?