2016-10-28 20 views
0

私のSwift 2.1アプリケーションは、別のサービスによって私の公開エンドポイントに到着したHTTP POSTを待ち受けるために必要です。 GCDWebserverの初期化方法が不明です。GCDWebserverがHTTP POSTをリッスンする

let webServer = GCDWebServer() 

私が試した:

webServer.addHandlerForMethod("POST", path: "https://myendpoint.com", 
    requestClass: GCDWebServerRequest.self, asyncProcessBlock: { request in 
    print("WebServer - POST detected") 
}) 
webServer.startWithPort(80, bonjourName: "Web Server") 

try! webServer.startWithOptions([GCDWebServerOption_BonjourName: "", GCDWebServerOption_BonjourType: "https://myendpoint.com", GCDWebServerOption_Port : 80, GCDWebServerOption_AutomaticallySuspendInBackground: false]) 

webServer.addHandlerForMethod("POST", path:"https://myendpoint.com", requestClass: GCDWebServerURLEncodedFormRequest.self, asyncProcessBlock: {request in 
    print("WebServer: POST captured") 
}) 
webServer.start() 

を、私はどこにもなっていません。

私が試してみても、URLプロパティは自分のlocalhostを指していて、publicURLは常にnilです。

ヒント?

+0

GCDWebServerに付属の「README」を読んで、例とともに使用する方法を説明しています。 – Pol

答えて

0
  1. あなたは、iOSデバイス上のポート80上のWebサーバを起動することはできません。 1024未満のポートを使用するには、あなたのアプリにはないルート特権が必要です。

  2. ウェブサーバーのパスにはドメイン名を含めることはできません。ウェブサーバーは常にデバイスのアドレスにバインドされます。エンドポイントのURLを追加するだけです。 "path"http://<yourdeviceip>:<port>/path

+0

ありがとうございます。 – Polis

+1

これは実際には真実ではありません。あなたのiPhoneアプリでポート80を開くことができます。root権限は必要ありません。彼らがそれを許してから数年が経ちました。私の混乱を解消するための – Pol

0

あなたの設定が正しくないだろう、その背後にある考え方は、あなたのアプリケーションは、あなたが着信要求を受け入れるように設定することができ、サーバ自体になるということです。

addHandlerForMethodには、パスを"https://myendpoint.com"に設定しています。意味がありません。

アプリケーションが新しいサーバーを作成するため、独自のサーバーURL(デバイスのipとそれに続くカスタムポート)が生成されます。

私はスウィフト2.3でそれを使用していますので、おそらく構文自体は少し異なりますが、アイデアは、このいずれかになります。

// Create the server 
let webServer = GCDWebServer() 

// Configure different paths 
let path = "/action" 
webServer.addHandlerForMethod("POST", path: action, requestClass: GCDWebServerRequest.self, asyncProcessBlock: { request in 
    print("WebServer - POST detected") 
    return GCDWebServerResponse(statusCode: 200) 
}) 

// Start server on port 8080 
webServer.startWithPort(8080, bonjourName: nil) 

// Print server url 
print("Server url: \(webServer.serverURL)") 

をこのような構成により、サーバーがPOSTリクエストを受け取ることができるようになりますパス上で

+0

thx。 「パブリック」経路の背後にある考え方は、アプリを実行しているすべてのデバイスが、単一のデバイスIPアドレスだけでなく、通知を受ける(つまりPOSTを取得する)ようにすることです。それが私が得ようとしているものです。それを行う方法はありますか? – Polis

+0

少なくとも、そのコンポーネントではないと思います。Webサーバーを作成するので、すべてのデバイスのすべてのサーバーが一意です。達成したいのは、ブロードキャストメッセージを送信する必要がありますが、別のプロトコルを実装する必要があります。 –

+1

@PolisあなたのiPhoneアプリでWebサーバーを稼働させることによってのみ行うことはできません。まず第一にサーバーはアプリケーションがフォアグラウンドにある間にのみ実行され、第二に、アプリケーションを実行しているiPhoneを追跡し、それらのすべてにリクエストを送信するサーバーが必要です。 Appleプッシュ通知や、https://pusher.com/、https://www.pubnub.com/のようなpub-subサービスを使用してください。 – Pol