1

こんにちは、同じネットワーク内でアプリを使用しているすべての人を見つけたいと考えています。たとえば、wifi ネットワークの場合、その特定のネットワークでアプリを使用しているすべての人を取得したいと考えています。

私のデータベース(mySQL)に存在するプロファイルデータとその場所。場所ごとにユーザーを取得できますが、私の質問は、ネットワークごとにユーザーを見つけることです。それを始める方法はありますか?

4

2 に答える 2

1

Bonjour (Zeroconf) を使用することが目的を達成するための最良の方法であると言っているわけではありませんが、それを使用して目標を確実に達成することができます。

Bonjour は次の 2 つの方法で使用されます。 - サービスの公開 - 利用可能なサービスの検出 (参照)

あなたの仕事のために、あなたは両方をしなければならないでしょう。

基本的な説明の 1 つがここにあります: Bonjour の概要と iOS でのアプリケーション

Bonjour を使用する場合は、Bonjour for Developersに関する多くのドキュメントが見つかります。

基本的に、サービスを公開する必要があります: Bonjour プログラミング > セクション 18.2。サービスの公開

パブリッシング クラス (通常はappDelegate) もNSNetServiceデリゲートにする必要があります。

NSNetService *netService; //an ivar or a property

//creating and publishing a service
netService = [[NSNetService alloc] initWithDomain:@""
                                             type:@"_yourservicename._tcp."
                                             name:@""
                                             port:9876];
//if your app actually acts as a server port: should be it's port,
//otherwise it could be any free port

netService.delegate = self;
[netService publish];

デリゲート メソッド (およびいくつかのappDelegateメソッド)も処理する必要があります。

-(void)netService:(NSNetService *)aNetService
    didNotPublish:(NSDictionary *)dict
{
    NSLog(@"Service did not publish: %@", dict);
}

- (void)applicationWillTerminate:(UIApplication *)application {
    //---stop the service when the application is terminated---
    [netService stop];
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    //---stop the service when the application is paused---
    [netService stop];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [netService publish];
}

そして、既存のサービスをブラウズします: Bonjour! (cocoanetics) (ページの下部のみが必要です)

serviceBrowser = [[NSNetServiceBrowser alloc] init];
serviceBrowser.delegate = self;
[serviceBrowser searchForServicesOfType:@"_yourservicename._tcp." inDomain:@""];

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser 
    didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing
{
    [self willChangeValueForKey:@"foundServices"];
    [_foundServices addObject:aNetService];
    [self didChangeValueForKey:@"foundServices"];
 
    NSLog(@"found: %@", aNetService);
}
 
- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser 
    didRemoveService:(NSNetService *)aNetService moreComing:(BOOL)moreComing
{
    [self willChangeValueForKey:@"foundServices"];
    [_foundServices removeObject:aNetService];
    [self didChangeValueForKey:@"foundServices"];
 
    NSLog(@"removed: %@", aNetService);
}

PS: Bonjour を使い始めるのは難しいかもしれませんが、役に立つ知識であることは間違いありません。

まさにあなたが望むユーザーエクスペリエンスに依存します。Bonjour の優れた代替手段は、ユーザーが実際にどのデバイス (接続したいピア) を選択できるかGameKit( GKPeerPickerController ) であることは間違いありません。これは、Wi-Fi または BlueTooth 経由で動作するはずです。

于 2013-02-05T12:47:55.907 に答える
-1

サービス ディスカバリを行う 1 つの方法は、プログラムをポートでリッスンし、ディスカバリまたは他のエンティティのポーリングが必要なときにそのポートでブロードキャストを実行することです。これらの線に沿った何か。

 socket = listen_and_stuff()
 others = do_broadcast()
 while(run)
     if time to update
         others = do_broadcast
     if received request
         reply with info about self

ただし、ブロードキャストはルーターの設定やサブネットワークなどに少し依存するため、すべての場合に機能するとは限りません。

于 2013-02-05T09:04:53.950 に答える