5

アプリがバックグラウンドにある間にサーバーにデータを送信するアプリケーションがあります。データ送信を担当するコードは次のとおりです。

-(bool) sendStats: (MCStatsSender*) val{

    if(![self checkInternet]){ //Using Reachability here

        return false;
    }

    NSDictionary *inputData = [NSDictionary dictionaryWithObjectsAndKeys:
                               self.propertyA.value, "key1",
                               val.data, "key2",
                               nil];


    [myNetworkManager doRequest:[myRequestManager createWithStringAndDictionary:MY_URL Data:inputData handler:myHandler user:val]];
    return true;
}

したがって、inputDataは文字列を含む単純な辞書です。

メソッドdoRequestは NSURLSession に基づいており、基本的に次のようになります。

-(void) doRequest: (MCRequest*) request{

    [tasks addObject:request];

    if(m_session == nil){
        NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[NSString stringWithFormat:@"key-%lu",reqid]];
        m_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    }

    NSURLSessionDataTask* task = [m_session dataTaskWithRequest:request.generatedRequest];
    request.reqId = task.taskIdentifier;
    [task resume];  
}

前述したように、すべてが Wi-Fi を介して機能し、アプリがバックグラウンドになり、数分後にカスタム Bluetooth デバイスがデータを送信し、アプリケーションを一時停止モードから復帰させます。デバイスが 3G 経由で接続されている場合、データが iOS アプリケーションによって受信された後、サーバーへの送信に失敗します。Bluetooth経由で送信されたデータは、ローカルデータベースに保存されているため、受信されると確信しています.

また、もう一つ重要な事実があります。アプリケーションが Xcode を介して実行される場合、デバイスが 3G 経由で接続されていても、アプリケーションはバックグラウンドからデータを送信します。これを行うには、アプリを実行し、ホーム ボタンをタップしてバックグラウンドにします。

何が違うのか、ケーブルで Mac に接続したときにアプリの動作が異なる理由、データが 3G (または 2G) 経由で送信されない理由がわかりませんか?

追加情報:

ファイルをアップロードしようとしているのではなく、JSON をサーバーに送信するだけです。

4

1 に答える 1

4

これは電力使用量に関するものである可能性が高いと思われます。URL セッションによって提供されるバックグラウンド アップロードは便利であり、OS の裁量で提供されます。データを送信することを提案しますが、いつ送信するかを選択できます。

データが送信されるタイミングに影響を与えるものには、デバイスが電源に接続されているかどうか、データ接続の品質 (データを送信するのにどれくらいの時間と電力が必要か)、デバイスが他に何をしているか (それを組み合わせることができるか) が含まれます。複数のアップロード)...

そのため、バックグラウンドで特定の時間に実行されているタスクを推測したり、信頼したりすることはできません。

この種のテストは、テストに影響するため、実際にはデバイス上でのみ実行し、Xcode には接続しないでください。代わりに、Charles プロキシのようなものを使用してネットワーク リクエストをログに記録し、デバイスを使用して、一定期間放置し、他のアプリを開いて使用することもできます。最終的にデータが送信されるはずですが、待つ必要があります。

于 2016-11-13T10:19:39.713 に答える