2016-05-27 8 views
1

毎時電話に接続してデータを渡すBLE周辺機器があります。ここでは、プロセスがどのように働くかある:iOSは着信BLE接続時に周辺機器からアプリケーションを起動させないようにします。

起動時に持つキーUIApplicationLaunchOptionsBluetoothCentralsKeyapplication(didFinishLaunchingWithOptions launchOptions)

    1. 中のアプリに渡されたIDを持つCBCentralManagerは再初期化します。
    2. その後、通常の復元サイクルを経て、BLEペリフェラルからデータを読み取ります。
    3. クラウド内のサービスに対してREST要求を実行します。

    携帯電話の再起動後にアプリが少なくとも1回起動されたとすると、アプリが実行されていないか、メモリが不足していると、iOSはユーザーが強制終了したと仮定して手動で)。

    しかし、数日おきに、iOSはBLEデバイスからの着信要求があったときにアプリの起動を停止します。ユーザーがアプリを再起動すると、数日間すべて正常に動作し、その後再び停止します。私たちの製品の性質上、アプリ/周辺機器を最も信頼性の高い方法で連携させることが不可欠です。それが起きている可能性がある理由として

    理論:
    (綿密に検討すると、それらのすべてを解雇されたが)

    • ユーザーが携帯電話を再起動して、アプリを再起動するのを忘れ。
      アップタイムのログが追加され、アプリの起動の間に電話機が再起動しなかったことが示されました。

    • メモリの警告により、アプリケーションが起動されます。
      はもう一度、ログを追加し、彼らはapplicationDidReceiveMemoryWarning

    • 接続不良がアップロードした結果とiOSはそれを終了したときに10秒より長い期間のために実行されているアプリにつながりませんがあったことを示したと私たちは、人為的に遅れ
      サーバーを怒りますこれをテストするための15秒単位の応答。テスト中はすべてが適切に機能し続けます。

    何が起こっているのか、またiOSが着信BLE接続についてアプリに通知しない理由については、何か考えてください。

    問題の1つは、問題を確実に再現する方法を見つけることができないということです。提案があればそれも大いに評価されます。

    ありがとうございました!


    UPDATE 1:ここでは たちはCBCentralManagerを初期化する方法である:

    self.centralManager = CBCentralManager(delegate: self, queue: nil, options: [ 
        CBCentralManagerOptionRestoreIdentifierKey : MyCentralManagerID, 
        CBCentralManagerOptionShowPowerAlertKey : 0]) 
    

    私はパラメータをキューにいくつかの提案がnilであってはならないました。私が問題を確実に再現することができないとすれば、その影響を自信を持って観察することができるまで、私はその変更を行うことをためらっています。

  • 答えて

    3

    私はCoreBluetoothで長年働いており、CoreBluetooth State PreservationとRestorationが確実に動作しないことに気づいたことから始めたいと思います。あなたはそれを「OK」のように動作させることができますが、Appleがいつか修正しない限り、確実に再接続することはありません。

    正常に動作しないように、これを原因となるが、私はあなたに私はあなたの問題を引き起こしていると考えているものを与えるので、多くのバグがあります。

    状態の回復が唯一のイベント場合は、関連する活動をブルートゥースによるあなたのアプリを再起動しますが、接続/切断イベントや特性通知など、通信している周辺機器アクセサリから発生します。他のイベント、最も重要なのは一般的なブルートゥースの状態変更イベントのために、あなたのアプリはこれを再起動し、通知することはありません。これが悪い理由は、すべてのBluetooth状態変更イベントが保留中または現在の接続をすべてキャンセルするためです。保留中の接続が破棄され、アプリケーションに通知されません。これは事実上、接続がまだ保留中であると依然としてアプリケーションが信じていることを意味します。あなたのアプリケーションはこの時点で終了するので、再度起動させる唯一の方法は、ユーザーが手動で再度起動させる方法です(または、この目的のために他のバックグラウンドモードを "ハック"する方法もあります)。ユーザーは、フライトモードを切り替えブルートゥース、パワーサイクルiOSデバイス、または多くの原因の状態が変化...

    しかし、これは唯一のバグであることを他の未定義の理由を切り替えた場合

    このことが起こります。 XPC接続が明白な理由のために異なる時間に中断されるなど、多くの他のものも存在する。私はまた、保留中の接続が周辺機器の状態が「接続」に設定されている「limbo」モードに入ることができることに気付きましたが、実際には接続状態を繰り返すまで接続しません。

    私はそれを言うのが悲しいですが、バックグラウンドで再接続された周辺機器に依存しなければならないアプリを開発しているなら、それをすることをお勧めしません。あなたはイライラされます。おそらくAppleが修正したくないCore Bluetoothのすべてのバグに関するエッセイを書くことができました。さらに奇妙なことは、デバイスが再起動されるまで、アプリケーションがBluetoothを使用できないように、単一のアプリケーションからデバイス上のBluetooth接続を簡単に全面的に破棄できることです。 Appleの独自のSandboxing原則に反しているので、これはかなり悪いことです。

    +0

    Antonこの問題に関するこのような徹底した思慮深いポストに感謝します。それを理解しようとするのは非常にイライラしています。あなたの答えは私たちが恐れていたことを確認します。その問題はiOS自体であり、アプリが何をしているのではなく、 – Maxim

    +0

    私はこれらの問題で「いくらかの」信頼性を得ることができました。私の投稿をここでチェックしてください。https://stackoverflow.com/questions/45738824/in-ios-10-is-there-any-way-to-reliably-wake -up-an-app/45799341#45799341 – GoreDefex

    関連する問題