3

楽しみのために、私は小さなソケット ベースのチャット アプリケーションを作成しました。nodejsサーバーとtcpソケットを介して話しています。メッセージを正常に送受信しています。ただし、ホームボタンを押してアプリをバックグラウンドにすると問題が発生します。この時点で、ソケットは「一時停止」しているように見え、この間に送信されたすべてのメッセージが失われます。

アプリがバックグラウンドにあるときにプッシュ通知を設定しましたが、アプリでソケットがアクティブになっていないため、メッセージが実際にアプリに到達することはありません。

これをどのように処理すればよいですか?私のオプションは何ですか?私はいくつかのアイデアを持っていますが、人々がこれをどのように扱っているかについて、ここでいくつかの情報を提供したいと思います.

私のアイデア:

  1. チャネルのすべての履歴を送信する「loadHistory」メソッドを nodejs サーバーに追加します。私のアプリが特定の URL を呼び出して、すべてのメッセージで JSON 形式の応答を取得できるようにします。テーブル項目がタッチされるたびにこれを行うべきでしょうか?

  2. 新しい iOS7 バックグラウンド実行機能を利用しますか? (それでソケットを生かしておくことができるかどうかはわかりません)

  3. メッセージが配信されたかどうかをサーバーが知る方法を実装します。配信できなかった場合は、メッセージをデータベースに保存します。クライアントが再びオンラインになるとすぐに、TCP 経由でメッセージを送信します。これにはサーバーに多くの機能を追加する必要があるため、可能であればこれを避けたいと考えています。

4

2 に答える 2

3

オフライン メッセージが必要な場合は、3 番目の方法が必要です。取得するメッセージごとに、サーバーに通知を送信して、メッセージが配信されたことを伝える必要があります。接続されたら、失われたメッセージをフェッチする必要があります。

voip を使用できますが、アプリが強制終了された場合、アプリはメッセージを受信できません。(voipモードを追加しても、アプリが音声に関するものではない場合、Appleはアプリをブロックします)

于 2013-10-28T09:48:53.317 に答える
1

また、TCPソケットを介していくつかの作業を行いました。次の手順でバックグラウンド サポートを提供しました。

  1. plist ファイルに「必要なバックグラウンド モード」キーを追加します。

    ここに画像の説明を入力

  2. このコードを AppDelegate.m ファイルに追加します

    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
    #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 40000
        if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)] && [[UIDevice currentDevice] isMultitaskingSupported])
        {
            NSLog(@"Keep timeout alive");
    
            [application setKeepAliveTimeout:600 handler: ^{
                NSLog(@"applicationDidEnterBackground:: setKeepAliveTimeout:handler^");//task as you want to do
            }];
        }
    
    #else
        LogInfo(@"applicationDidEnterBackground (Not supported)");
    #endif
    }
    
  3. TCP 接続が成功した後、読み取りおよび書き込み CFStream ソケット オブジェクトを取得したら、次のコードを追加します。

    CFReadStreamSetProperty(yourCFReadStreamObj, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
    CFWriteStreamSetProperty(yourCFWriteStreamObj, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
    

これらの手順を実行した後、ソケットはバックグラウンドでもメッセージを受信する必要があり、「applicationDidEnterBackground」で指定するまで接続がアクティブになります。

これが役立つことを願っています。ありがとう

于 2013-10-28T09:42:08.660 に答える