11

ピアツーピア接続を可能にする iPhone アプリに取り組んでいます。私の理解では、GKPeerPicker と GKSession のどちらを使用するかを選択できます。カスタム インターフェイスを表示したいので、PeerPicker を使用するという考えは気に入らないので、GKSession を使用することにしました。おまけに、Wi-Fi でも動作しますが、Peer Picker は動作しません。

問題は、ユーザーが Bluetooth と Wi-Fi の両方をオフにしているとどうなるかということです。ピア ピッカーでは、アプリを終了せずに Bluetooth をオンにするプロンプトが表示されます。GKSessionにはそれがありません...しかし、ちょっと待ってください。Bluetoothがオンになっているかどうかをプログラムで確認することさえできないようです!

Carpe Cocoa は問題ないと主張しており、デリゲートのsession:didFailWithError:方法を使用するだけです。しかし、コメントで説明されているように...それはもう機能していないようです! そして私の経験上、私は同意します。

Bluetoothがオンになっているかどうかをプログラムで確認する他の方法はありますか? これは、到達可能性を活用する必要があるものですか? それとも、Apple がまだ修正していない単なるバグなのでしょうか?

より具体的には、次のようにセッションを作成しています。

GKSession *aSession = [[GKSession alloc] initWithSessionID:nil
                                                  displayName:user.displayName 
                                                  sessionMode:GKSessionModePeer];

self.gkSession = aSession;
[aSession release];

self.gkSession.delegate = self;
self.gkSession.available = YES;

[self.gkSession setDataReceiveHandler:self withContext:NULL];

このクラスは GKSessionDelegate を実装しています。ブルートゥースをオンにするとデリゲート メソッドが問題なく呼び出されるため、このクラスが機能していることはわかっています。私はそれらを次のように実装しました:

#pragma mark -
#pragma mark GKSessionDelegate methods

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state {
     if (GKPeerStateAvailable == state) {
          [session connectToPeer:peerID withTimeout:10];
     } else if (GKPeerStateConnected == state) {
          // gets user

          NSError *error = nil;
          [session sendData:user.connectionData
                      toPeers:[NSArray arrayWithObjects:peerID,nil]
                withDataMode:GKSendDataReliable error:&error];
          if (error)
               NSLog(@"%@",error);
     }
}



- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID {
     NSError *error = nil;
     [session acceptConnectionFromPeer:peerID error:&error];
     if (error)
          NSLog(@"%@",error);
}

- (void)session:(GKSession *)session connectionWithPeerFailed:(NSString *)peerID withError:(NSError *)error {
     NSLog(@"%@",error);
}

- (void)session:(GKSession *)session didFailWithError:(NSError *)error {
     NSLog(@"%@",error);
}

ログ ステートメントは出力されず、各メソッドにブレークポイントを設定しましたが、ユーザーが Bluetooth と Wi-Fi の両方をオフにしている場合、いずれもヒットしません。session:didFailWithError: をトリガーして、ユーザーに Bluetooth をオンにするか、Wi-Fi ネットワークに接続するように促すことができるようになることを期待していました。

4

6 に答える 6

2

iOS 5 では、これは次のように実現できます。

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil];
NSMutableArray * discoveredPeripherals = [NSMutableArray new];
CBCentralManager * manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
[manager scanForPeripheralsWithServices:discoveredPeripherals options:options];
[manager stopScan];

これには、iOS 5 で CoreBluetooth フレームワークをインポートする必要があります。Bluetooth がオフの場合、システムはアラート ビューをポップアップ表示し、Bluetooth をオンにする選択肢を提供します。それ以外の場合、周辺機器が見つかった場合は、対応するデリゲート メソッドが呼び出されますが、その実装に何もない場合は、心配する必要はありません。

于 2012-08-10T19:16:11.203 に答える
1

興味深いことに、Bluetooth OFF と WiFi ON でテストしてみましたか? 私のプログラムはこの「Bluetooth Unavailable」メッセージを呼び出していましたが、実際には Bluetooth AT ALL を使用しておらず、WiFi ネットワーク経由で接続していたことが最近わかりました。Apple の PeerPicker オブジェクトを使用せずに GKSession を強制的に Bluetooth 接続にする方法はわかりませんが、PeerPicker オブジェクトを使用すると、人々は独自のインターフェイスを作成できます。許可されていないように見えるのは、ピア以外の接続タイプであるため、クライアント/サーバーの配置が必要な場合は、あまり役に立ちません.

-灰

于 2010-10-07T11:01:27.597 に答える
1

私はMartin Gordonに同意しますが、回避策はAppleの到達可能性を使用することかもしれません.

于 2010-03-02T14:35:18.543 に答える
0

私はAppleの到達可能性を使用するという概念を2番目にしています。ボーナスとして、AppleAppStoreの提出ガイドラインの1つとしてリストされています。

必要なコードの多くがすでに作成されているので、実装するのはそれほど難しくありません。

Slfは、Reachabilityクラスを使用していくつかのソースコードへのリンクを提供しました。さらに、AppleDevの公式の到達可能性の例へのリンクもあります。

ただし、非同期で接続可能性をチェックしていることを確認してください。

私は自分のアプリでそれを使用しています。これは最善の解決策ではありませんが、少なくとも接続設定を調整する必要があること、またはネットワークが存在しないことをユーザーに通知します。

于 2011-09-21T18:44:42.683 に答える
0

AppleのプライベートAPI(私は思うBluetoothManger.h)を使用して、プログラムでBlutoothをオンにすることができますが、注意してください。AppleAppStoreのプッシュで拒否されます。

于 2011-08-10T07:16:15.933 に答える
-1

同じものを使用する必要がありますsessionID

于 2011-08-18T12:03:13.387 に答える