2015-02-07 2 views
2

Я прочитал все Apple, документацию о фоновом режиме выборки и в настоящее время я использую это так:IOS фона пользовательского интервала

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:minimumBackgroundFetchInterval]; 

я позволяю OS решить, когда для выполнения выборки фона, но если установить его как это:

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:21600]; 

Означает ли это, что выборка произойдет каждые 6 часов?

ответ

2

Нет, это означает, что вы предлагаете к прошивке, что по крайней мере шесть часов должны пройти, прежде чем фон выборки выполняются, но документация для этого свойства состояний -

Минимального количество секунд, которое должна пройти перед другим можно выбрать фоновый выбор. Это значение является только рекомендательным, и не указывает точное количество ожидаемого времени между извлечением операций.

Таким образом, может быть более шести часов до того, как выполняется фоновое извлечение, но, вероятно, не будет меньше. iOS также принимает к сведению значение, которое вы возвращаете с помощью обработчика завершения, указав, были ли новые данные или нет, чтобы попытаться определить время дня, когда, вероятно, появятся новые данные для вашего приложения.

8

Я сделал некоторый эксперимент на iOS10 и iPhone6Plus, предоставив интервал UIApplicationBackgroundFetchIntervalMinimum. (Я, конечно, вызывается какой-то метод сети, связанные с получением IOS намек, что приложение действительно работает ... и вызывающую completionHandler (UIBackgroundFetchResultNewData);)

я получил: (запустить всю ночь)

00:35 01:03 01:31 01:59 02:27 02:55 03:13 03:23 03:51 04:19 04:35 05:04 05:25 05 : 59 06:27 06:56

поэтому Delta варьируется от 10 до 34 минут.

+1

Можете ли вы опубликовать код, который вы пишете, чтобы достичь этого? В моих тестах, в течение первого часа у меня частота, аналогичная вашей, но минус час, я не получаю больше звонков до трех или четырех часов. – OverMind

+0

Вы пытались вызвать без связанных с сетью вещей? – hyouuu

0

объявление Код просил:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    // You must invoke setMinimumBackgroundFetchInterval:. 
    [application setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum]; 

// default, iOS decides. seems between 5 and 15 minutes. 
// you cannot go below that time. 


    /* ADC: 
    (You can also enable this support by including the UIBackgroundModes key with the fetch value in your app’s Info.plist file.) Enabling this mode is not a guarantee that the system will give your app any time to perform background fetches. The system must balance your app’s need to fetch content with the needs of other apps and the system itself. After assessing that information, the system gives time to apps when there are good opportunities to do so. 

     When a good opportunity arises, the system WAKES or LAUNCHES your app into the background and calls the app delegate’s application:performFetchWithCompletionHandler: method. Use that method to check for new content and initiate a download operation if content is available. 
    */ 

    // UIApplicationState state = application.applicationState; 
    NSString * s = [NSString stringWithFormat:@"background=%d (didFinishLaunchingWithOptions)", application.applicationState == UIApplicationStateBackground]; 


    return YES; 
} 

перезванивают:

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler 
{  
    NSInteger n = application.applicationIconBadgeNumber; 
    application.applicationIconBadgeNumber = n+1; 

    // we invoke an sync method, so we should call handler AFTER getting answer... 

    BOOL isIpad = [self isIpad]; 
    NSString * ID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 

    NSString* msg = [NSString stringWithFormat: @"PFCH=%ld-ipad%d-%@", (long)n, isIpad, ID]; 
    // call a method on my server to send me back a mail. I add an ID for every device I tested in a battery of iPhone/iPads. 
    [self getTime: msg]; 

    // if ok... 
    completionHandler(UIBackgroundFetchResultNewData); 

    // or    completionHandler(UIBackgroundFetchResultNoData); 
    // or    completionHandler(UIBackgroundFetchResultFailed); 

} 

другой метод:

-(void) getTime:(NSString*)msg 
{ 
    NSString* urlS = [NSString stringWithFormat: @"https://www.ingconti.com/PFCH.php?msg=%@", msg]; 

    NSURL * URL = [NSURL URLWithString: urlS]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];  
    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
              completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

               NSString * s = [[NSString alloc]initWithData:data encoding: NSUTF8StringEncoding]; 
               NSLog(@"%@", s); 
              } 
            ]; 

    [task resume]; 
} 


    -(BOOL)isIpad; 
    { 
     UIUserInterfaceIdiom deviceType = [[UIDevice currentDevice] userInterfaceIdiom]; 
     if (deviceType == UIUserInterfaceIdiomPad) 
      return YES; 

     return NO; 
    } 

я использовать сервер как мои устройства могут быть в состоянии покоя, и я хочу почта назад на моем mac.

PHP-код на сервере просто анализирует GET и отправляет мне письмо с идентификатором устройства, поэтому я могу анализировать результаты на своем mac.