Форум программистов, компьютерный форум, киберфорум
Наши страницы

Objective-C

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

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

05.09.2014, 22:10. Просмотров 999. Ответов 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 при сворачивании приложения?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2014, 22:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с сокетом и сворачивание приложения (Objective-C):

Сворачивание и разворачивание приложения при обновлении || установка иконки приложения - Java
1. Допустим у меня GUI свернут, мне нужно, что бы при обновлении GUI (добавились новые строки в текстовое поле) GUI разворачивался, и, если...

Совместимость процессора с 478 сокетом и материнской платы с 479 сокетом - Процессоры
Всем привет !! подскажите плизз будет похать проц с 478 сокетом на матке с 479 сокетом ?

Управление сокетом чужого приложения, как в WPE PRO - Delphi
Доброго времени суток! Пытаюсь написать программу для отправки пакетов на сервер "от имени" игры (а точнее её socket'а). Есть...

Работа с UDP сокетом - C++ Qt
Доброго времени суток. При сборке проекта QT выдает следующие ошибки: 1. main.obj:-1: ошибка: LNK2019: ссылка на неразрешенный...

Работа с tcp сокетом - C#
Добрый день. Возникла проблема при работе с сокетом. Есть клиент, который периодически отправляет данные, при чем неизвестно когда...

Сворачивание приложения - C++ Builder
Здравствуйте. Есть две формы: Главная Form1->FormStyle = fsStayOnTop; и вторичная (просто вторичная) открыта через Show(). Нужно...

4
Vorona
Peace 2 all shining faces
669 / 531 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
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
отличная фича
2
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:
Причем дело-то не в таймере. В обработчике таймера происходит еще опрос акселерометра и тестовый вывод результатов на экран. Так вот это работает "как часы". А вот сокет перестает отправлять данные.
0
Vorona
Peace 2 all shining faces
669 / 531 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
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
}
0
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.
Реализовал передачу пакетов нативным сокетом (Беркли), все заработало.
Плагиатил вот отсюда!
0
15.09.2014, 23:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2014, 23:14
Привет! Вот еще темы с ответами:

Сворачивание приложения в трей - C#
Всем привет, подскажите, как на C# написать сворачивание окна в трэй? Раньше у меня был проект написанный на VB вот код: /// написан...

.NET 4.x Сворачивание приложения в трей - C#
Собственно есть приложение, 4 формы. Запускается первая форма, ввожу логин и пас, тыкаю на кнопку - открывается основная форма, первая...

Сворачивание приложения в трей - Mono
Пишу на C# Mono маленькое приложение для linux'а. Необходимо сворачивать его в трей. Но не нашел как это сделать в mono.

Сворачивание приложения Win+D - C++ Builder
Добрый день уважаемые форрумчане! Прошу не банить тему ибо это не повтор, моя проблема не относится к классическим проблемам...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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