Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
kostasoft
0 / 0 / 0
Регистрация: 22.10.2013
Сообщений: 15
#1

Работа с сокетом и сворачивание приложения - Objective-C

05.09.2014, 22:10. Просмотров 910. Ответов 4
Метки нет (Все метки)

В обработчике события таймера я периодически отправляю некие данные в строке string броадкастом примерно вот так:
Objective-C
1
2
3
4
    NSString * address = @"255.255.255.255";
    UInt16 port = 888888;
    NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];
    [udpSocket sendData:data toHost:address port:port withTimeout:-1 tag:1];
Все отлично, пока я не сворачиваю свое приложение, нажав кнопку домой.
После запуска приложения событие таймера обрабатываются, но вот данные уже не отправляются.
Приходится убивать процесс и заново его запускать.
Как сделать так, чтобы сокет не зависал на методе sendData при сворачивании приложения?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2014, 22:10     Работа с сокетом и сворачивание приложения
Посмотрите здесь:

Objective-C Тестирование приложения на девайсе
Objective-C Админ-клиент для приложения
Безопасность платного приложения Objective-C
Objective-C релизная сборка приложения под MAC
Objective-C Англоязычная версия приложения
Objective-C Создание БД для приложения
Сохранение данных приложения Objective-C
Можно ли получить исходный код приложения Objective-C
Objective-C Обнаружить момент падения приложения
Objective-C Как свернуть клавиатуру у приложения
Objective-C Скиньте исходники VK приложения
Цвета темы приложения MacOS Objective-C

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vorona
Peace 2 all shining faces
666 / 528 / 45
Регистрация: 05.03.2010
Сообщений: 1,271
06.09.2014, 06:04     Работа с сокетом и сворачивание приложения #2
Честно, не уверен на 100% насчет сокетов, но – как вариант, это запустить бэкграунд таск на фоне (относительно документациям работает не больше 10 минут)
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@interface AppDelegate()
 
@property (nonatomic, assign) UIBackgroundTaskIdentifier bgTask;
 
@end
 
 
@implementation AppDelegate
 
@synthesize bgTask;
 
- (void)applicationWillResignActive:(UIApplication *)application
{
    self.bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
        self.bgTask = UIBackgroundTaskInvalid;
    }];
    // do something
}
 
- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if (self.bgTask != UIBackgroundTaskInvalid)
    {
        [[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
        self.bgTask = UIBackgroundTaskInvalid;
    }
    // do something
}
 
// ...
 
@end
еще, как вариант, это копнуть в сторону targets (таргет проекта) -> capabilities -> background modes -> background fetch

p.s. если не ошибаюсь, то эта возможность доступна только в xcode >= 5
отличная фича
kostasoft
0 / 0 / 0
Регистрация: 22.10.2013
Сообщений: 15
06.09.2014, 12:02  [ТС]     Работа с сокетом и сворачивание приложения #3
2 Vorona
targets (таргет проекта) -> capabilities -> background modes -> background fetch
Спасибо огромное, помогло!

Добавлено через 6 минут
Дополнение:
Помогло, если закрыл и снова открыл через непродолжительный отрезок времени.
Если же приложение запускается через большой промежуток - такая же история.
Может как-то можно определить, что приложение свернуто и убивать таймер? А потом, опять же, определять, что приложение запущено вновь и запускать таймер?

Добавлено через 4 минуты
Дополнение 2:
Причем дело-то не в таймере. В обработчике таймера происходит еще опрос акселерометра и тестовый вывод результатов на экран. Так вот это работает "как часы". А вот сокет перестает отправлять данные.
Vorona
Peace 2 all shining faces
666 / 528 / 45
Регистрация: 05.03.2010
Сообщений: 1,271
07.09.2014, 20:04     Работа с сокетом и сворачивание приложения #4
Цитата Сообщение от kostasoft Посмотреть сообщение
targets (таргет проекта) -> capabilities -> background modes -> background fetch
Спасибо огромное, помогло!
ага, тогда нужно еще немного кода дописать в AppDelegate, чтобы указать интервал, с которым будет вызываться fetch метод, и, собственно его реализацию (можете поискать статейки по запросу ios background fetch)
реализация метода performFetchWithCompletionHandler за вами
Objective-C
1
2
3
4
5
6
7
8
9
10
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
    return YES;
}
 
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    // implementation here
}
kostasoft
0 / 0 / 0
Регистрация: 22.10.2013
Сообщений: 15
15.09.2014, 23:14  [ТС]     Работа с сокетом и сворачивание приложения #5
Вот ведь какая штука:
Я добавил проверку на статус приложения перед отправкой пакетов по UDP
Objective-C
1
2
if ([UIApplication sharedApplication].applicationState != UIApplicationStateBackground)
        [udpSocket sendData:data toHost:address port:port withTimeout:-1 tag:1];
И убрал автоблокировку экрана.
Теперь после сворачивания приложения (но при это сам телефон не блокируется) и последующего разворачивания через любой продолжительный период времени приложение после разворачивания работает отлично!
Но стоит заблокировать телефон (нажав однократно кнопку питания) - все, после разблокировки и разворачивания приложения UDP пакеты не отправляются, хоть само событие таймера, в котором это происходит - исправно срабатывает.
Как тут быть?

Добавлено через 4 часа 53 минуты
Я решил проблему!
Дело было в UDPsocket-е от Cocoa.
Реализовал передачу пакетов нативным сокетом (Беркли), все заработало.
Плагиатил вот отсюда!
Yandex
Объявления
15.09.2014, 23:14     Работа с сокетом и сворачивание приложения
Ответ Создать тему
Опции темы

Текущее время: 22:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru