こんにちは、同じネットワーク内でアプリを使用しているすべての人を見つけたいと考えています。たとえば、wifi ネットワークの場合、その特定のネットワークでアプリを使用しているすべての人を取得したいと考えています。
私のデータベース(mySQL)に存在するプロファイルデータとその場所。場所ごとにユーザーを取得できますが、私の質問は、ネットワークごとにユーザーを見つけることです。それを始める方法はありますか?
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 経由で動作するはずです。
サービス ディスカバリを行う 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
ただし、ブロードキャストはルーターの設定やサブネットワークなどに少し依存するため、すべての場合に機能するとは限りません。