10

私は外部アクセサリフレームワークを使用しています。アプリがバックグラウンドになり、フォアグラウンドに戻った後、 EASessionを再確立する際に問題が発生します。アプリを終了して再起動すると、予想どおりBluetooth接続が再確立されます。分解の一部に欠けている部分があるのではないかと思います。または、露出されていない部分があります(??)。

[EAAccessoryManager sharedAccessoryManager] connectedAccessories]]は接続されたアクセサリを返し、名前やmodelNumberなどを取得するためにクエリを実行できます。ただし、次の行では_sessionがnilに設定されています。

_session = [[EASession alloc] initWithAccessory:_accessory forProtocol:_protocolString];

EASessionの初期化に失敗した理由を診断する方法はありますか?

古いEASessionをクリアするためのマントラはありますか?

この質問はこれに関連してますが、私はどの道をたどるべきかについてアドバイスを求めていません。なぜこの道にこの大きな落とし穴があるのか​​、そしてそれをどのようにナビゲートするのかを尋ねています。

4

5 に答える 5

8

私は(iOS4.1以降の世界で)アプリを終了すると(バックグラウンドまたは終了)、DidDisconnectNotificationが起動することを発見しました。電源ボタンを押すか、デバイスをスリープ状態にする場合。接続がダウンすることはありません。

ここで、BTデバイスが範囲外になるか、それ自体がスリープ状態になった場合。その後、接続がダウンします。

その結果、ConnectionNotifications以外には依存しなくなりました。[[EAAccessoryManager sharedAccessoryManager] connectedAccessories]このリストには、Bluetoothシステム全体がダウンした後でも接続され、書き込み可能なイベントを取得できるストリームが接続されていることを示す「ゴーストアクセサリ」が含まれている場合があるため、このリストは信頼できません。 (BTアイコンがオフ)

ConnectionNotificationsはバックグラウンドにいるときにキャッシュされるため、アプリを再起動すると新しい状態になるはずです。

もちろん、最初のエントリで。すべてのリスナー(など)が適切に設定されていることを確認する必要があります。

于 2010-12-16T05:21:20.983 に答える
2

私の知る限り、古いEASessionインスタンスをクリアすることはできません。仮説を立てることはできますが、なぜそうなのかはよくわかりません。確立されたEASessionは、そのアクセサリとの関連付けを解放しないと思われます。これにより、後続のEASessionインスタンスが同じアクセサリに正常に関連付けられなくなります。

アプリがアクティブになったら、EASessionをそのままにしておくことにしました。これは機能しているようです。テストでは、Bluetoothアクセサリに接続し、アプリを起動し、アクセサリにアクセスし、アプリをバックグラウンドに送信し、BTアクセサリを切断/再接続し、アプリをフォアグラウンドに移動して、アクセサリに再度アクセスできるようにしました。これは私が望むことができる限りです。

注意点:iOS 4.0では、複数のアクセサリを使用できます。たとえば、ビデオケーブルとBluetoothデバイスはどちらもアクセサリです。

于 2010-12-14T20:11:42.647 に答える
2

私は同じ問題を抱えていて、ちょっとしたトリックでそれを解決しました。セッションを開いたときにアクセサリのシリアル番号を記録し、セッションを閉じたときに記録しました。

そういうわけで、私はいくつかのセッションが閉じられていないのを見ました。そのため、アプリがバックグラウンドモードになると、開いているすべてのセッションをデバイスごとに確実に閉じます。

-(void) closeSessionForDevice:(EAAccessory*) device{
EASession *lclSession = (EASession*) [sessionDictionary valueForKey:[device serialNumber]];
[[lclSession inputStream] close];
[[lclSession inputStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[[lclSession inputStream] setDelegate:nil];

[[lclSession outputStream] close];
[[lclSession outputStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[[lclSession outputStream] setDelegate:nil];

lclSession = nil;

NSLog(@"Session Closed for : %@", [device serialNumber]);

[device setDelegate:nil];
}

それが他の誰かを助けることを願っています。

于 2014-05-06T15:05:35.133 に答える
2

私も同じ問題を抱えていました。私は、一定の間隔で外部Bluetoothアクセサリを開き、いくつかのデータを読み取ってから、ストリームを閉じるアプリケーションを開発していました。これは数日間は正常に機能していましたが、ある日突然、この正確な問題で機能しなくなりました。メッセージもコンソールに記録されました。

2015-06-20 23:54:43.371 MyApp[2083:404019] ERROR - opening session failed
1 2015-06-20 23:54:43.371 MyApp[2083:404019] ERROR - /SourceCache/ExternalAccessory/ExternalAccessory-288.20.7/       EASession.m:-[EASession dealloc] - 141 unable to close session for _accessory=0x174018750 and sessionID=65536

Appleのドキュメントは明確であり、各プロトコルの1つのインスタンスのみを一度に開くことが許可されており、以前のインスタンスは自動的に割り当てが解除されます。しかし、iOSが何日も正常に機能していたときに、以前のEASessionの割り当てを解除できなかったのはなぜ突然だったのでしょうか。

私は困惑し、3日間壁に頭をぶつけて過ごしました。私はグーグルを検索してここに行き着きました。外部アクセサリとの通信に関するアップルのガイドとNSStreamプログラミングガイドを読みました。コードはすべて正しかった。

ついに3日目に、机の隅からビープ音が聞こえたので、Androidフォンのジュースが不足していました。頭の中で電球が消えた。電話をオフにしてビオラをオフにすると、iOSデバイスの問題は解決しました。

これは実際にはRFの問題であり、プログラミングの問題ではありませんが、他の誰かがこの問題に遭遇した場合に備えて、ここに私の話を含めます。Googleがあなたをここに連れてきます。ノイズの原因であり、この問題を引き起こす可能性があるため、近くにある他のすべてのBluetooth無線をオフにしてください。

于 2015-06-21T19:33:23.827 に答える
-1

私は同じ問題を抱えていました。私の場合、作成直後のセッションオブジェクトはretainCount = 3であるため、DidDisconnectNotificationを受信するときに[セッションリリース]を1回呼び出すだけでは不十分でした。DidDisconnectNotification通知を受け取った後、セッションオブジェクトを実際に解放したことを確認してください。

于 2011-01-15T13:40:22.477 に答える