При переключении с Safari на другое, а затем обратно на Safari я не могу обнаружить, что Safari последовательно открывалIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 При переключении с Safari на другое, а затем обратно на Safari я не могу обнаружить, что Safari последовательно открывал

Сообщение Anonymous »

Я создаю реагирующее / выставочное приложение, которое запускаю как веб-приложение. Когда я выхожу из Safari, жду 10–15 секунд и возвращаюсь в него, мое приложение не постоянно повторно подключается к веб-сокету, к которому оно ранее было подключено.
Эта проблема не является согласованный, и я попытался перехватить события документа, чтобы увидеть, что происходит, когда он не срабатывает, и я понял, что это связано с тем, что событие VisibilityChange не вызывается дважды, когда возникает эта проблема. Вместо этого он вызывается один раз, когда приложение свернуто, и не снова, когда вы максимизируете Safari (из-за чего код не срабатывает).
Вот мой код ниже, в котором я могу обнаружить все различные события и их регистрация.
Мне было интересно, есть ли у кого-нибудь опыт создания приложений Expo и как они боролись с IOS 16, чтобы они могли последовательно обнаруживать, что Safari каждый раз сворачивается/разворачивается, а не с перерывами.

Код: Выделить всё

import { AppState, AppStateStatus, View } from 'react-native';
import LoginPage from './login';
import Header from '../components/Header';
import socket from '@/services/socketService';
import { useEffect, useState } from 'react';
import { Spinner } from '@gluestack-ui/themed';
import DeviceService from '@/services/deviceService';

socket

export default function Home() {
const [isLoading, setLoading] = useState(false);

useEffect(() => {
const handleAppStateChange = (nextAppState: AppStateStatus) => {
setLoading(true)
if (nextAppState === 'active') {
DeviceService.getGameState()
} else if (nextAppState === 'background') {
const currentTime = new Date();
localStorage.setItem("lastBackgroundTime", currentTime.toString())
}
setLoading(false)
};

socket.emit('log', 'useEffectTriggered')

const eventNames: any = [
'load',
'focus',
'blur',
'change',
'close',
'error',
'haschange',
'message',
'offline',
'online',
'pagehide',
'pageshow',
'popstate',
'resize',
'submit',
'unload',
'beforeunload',
'visibilitychange',
'hidden',
'visible',
'webkitHidden'
];
eventNames.forEach(function(eventName: any) {
document.addEventListener(eventName, function(evt) {
const now = new Date();
const timeStr = now.getHours().toString().padStart(2, '0') + ':' +
now.getMinutes().toString().padStart(2, '0') + ':' +
now.getSeconds().toString().padStart(2, '0') + '.' +
now.getMilliseconds();
DeviceService.getGameState()
const logString = eventName + ' ' + timeStr.toString() + evt

socket.emit('log', logString)
})})

const subscription = AppState.addEventListener('change', handleAppStateChange);

return () => {
subscription.remove();
};
}, []);

return (


{isLoading
? 
: 
}

);
}
В настоящее время я пытался все это отладить, регистрируя все события, которые вызываются на BE, отправляя их через сокет. Я также пытался использовать встроенный в EXPO AppStateStatus, который определяет, активно ли приложение или находится в фоновом режиме, однако в 100% случаев это также не удается обнаружить.
Я также пробовал все из этот пост, который здесь кажется устаревшим -> Как обнаружить в веб-приложении iOS переключение обратно в Safari из фонового режима?
У кого-нибудь есть другие предложения?

Подробнее здесь: https://stackoverflow.com/questions/783 ... -detect-th
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»