Эта проблема не является согласованный, и я попытался перехватить события документа, чтобы увидеть, что происходит, когда он не срабатывает, и я понял, что это связано с тем, что событие 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
?
:
}
);
}
Я также пробовал все из этот пост, который здесь кажется устаревшим -> Как обнаружить в веб-приложении iOS переключение обратно в Safari из фонового режима?
У кого-нибудь есть другие предложения?
Подробнее здесь: https://stackoverflow.com/questions/783 ... -detect-th