0

アプリがシャットダウンした後にプッシュ通知を送信するアプリを作成しています。サーバーとの通信に AFNetworking を使用しています。これが私の AFNetworking 関数です。

-(void)sendPushNotification:(NSMutableDictionary *)params onCompletion:(JSONResponseBlock)completionBlock{
    NSLog(@"%@%@",kAPIHost,kAPIPush);
    NSMutableURLRequest *apiRequest = [self multipartFormRequestWithMethod:@"POST" path:kAPIPush parameters:params constructingBodyWithBlock:^(id <AFMultipartFormData>formData){
        //TODO: attach file if needed
    }];
    NSLog(@"Till here");
    AFJSONRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:apiRequest];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){
        //success !
        NSLog(@"SUCCESSSS!");
        completionBlock(responseObject);
    }failure:^(AFHTTPRequestOperation *operation, NSError *error){
        //Failure
        NSLog(@"FAILUREE!");
        completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]);
    }];
    NSLog(@"tille here 2");
    [operation start];
    NSLog(@"till here 3");
}

次に、プッシュ通知を送信するために、次のコードがあります。

- (IBAction)changeEnglish:(id)sender {
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    NSString *alertCancel = NSLocalizedString(@"Home_alertCancel", nil);
    NSString *message = @"  Do you wish to change the language? The application will shut down after this. Next up you can restart it again.";

    BlockAlertView *alert = [BlockAlertView alertWithTitle:@"Change language" message:message];

    [alert setCancelButtonWithTitle:alertCancel block:nil];
    [alert setDestructiveButtonWithTitle:@"Ok" block:^{
        [self sendPush];
        exit(0);
    }];
}
-(void)sendPush{
    [[API sharedInstance]sendPushNotification:NULL onCompletion:^(NSDictionary *json){
        //completion
        if(![json objectForKey:@"error"]){
            NSLog(@"notification send");
        }else {
            NSLog(@"Cannot connect to the server");
        }
    }];

}

まず、ブラウザでプッシュ通知を実行すると (ブラウザにリンクを入力して Enter キーを押します)、正常に動作します。しかし、コードで実行したいとき。次のログが表示されます。

2012-12-12 13:44:43.695 doktersApp[666:907] http://linkexample/simplepush.php
2012-12-12 13:44:43.702 doktersApp[666:907] till here
2012-12-12 13:44:43.705 doktersApp[666:907] till here2
2012-12-12 13:44:43.706 doktersApp[666:907] till here3
4

1 に答える 1

0

あなたは出口でそれをしたいですか?問題は、リクエストが非同期であることです。OSはそれを待たずにアプリを強制終了し、操作は終了しませんが、開始を呼び出した直後に強制終了されます。

1 つの解決策は、それを backgroundTask でラップし、終了後にもう少し時間が必要であることを iOS に伝えることです。

例:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    //begin
    UIBackgroundTaskIdentifier identifier = [application beginBackgroundTaskWithExpirationHandler:^{
        NSLog(@"expired");
    }];
    assert(identifier != UIBackgroundTaskInvalid);

    //this simulates a request
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        //THIS is your completion handler
        NSLog(@"done");
        [application endBackgroundTask:identifier];
    });
}

あなたの具体的なケースでは:(これは明らかにテストされていません、上記はテストされています)

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    //begin
    UIBackgroundTaskIdentifier identifier = [application beginBackgroundTaskWithExpirationHandler:^{
        NSLog(@"expired");
    }];
    assert(identifier != UIBackgroundTaskInvalid);

    [[API sharedInstance]sendPushNotification:NULL onCompletion:^(NSDictionary *json){
        //completion
        if(![json objectForKey:@"error"]){
            NSLog(@"notification send");
        }else {
            NSLog(@"Cannot connect to the server");
        }
        NSLog(@"done");
        [application endBackgroundTask:identifier];
    }];
}
于 2012-12-12T13:17:35.043 に答える