получить общий объект, срок действия которого истекает после сеанса браузера во FLASH? - PullRequest
2 голосов
/ 11 января 2010

Я ищу способ воспроизведения флэш-анимационного контента один раз (даже если пользователь переходит на разные HTML-страницы с похожим флэш-контентом) и срок его действия истекает через определенное время или после закрытия браузера.

Я знаю, что могу использовать общий объект для этого, но не могу найти информацию о том, как их очистить в конце сеанса браузера.

Я открыт для использования javascript или PHP для помощи.

Ваша помощь приветствуется - спасибо -MW

Ответы [ 3 ]

4 голосов
/ 11 января 2010

Вместо использования SharedObject вы можете создать две простые серверные службы: одну, поддерживающую сеанс, и другую, предоставляющую сеанс через сгенерированный файл XML, который может использовать ваше флэш-приложение.

Первая служба установит некоторые переменные сеанса и должна вызываться при каждом воспроизведении видео. Это может выглядеть так:

<?php
// start-video.php
session_start();
$_SESSION['hasWatchedVideo'] = true;
$_SESSION['watchedVideoAt'] = time();
?>

Второй сервис - это тот, который генерирует XML-ответ на основе сеанса. Это может выглядеть так:

<?php
// flash-config.php
session_start();

// set expiration to 5 min
define(VIDEO_TIMEOUT, 300);

$playVideo = "true";
if($_SESSION['hasWatchedVideo']
    && (time() - $_SESSION['watchedVideoAt']) < VIDEO_TIMEOUT) {
    $playVideo = "false";
}

header("Content-Type: text/xml");

echo "<config><playVideo>{$playVideo}</playVideo></config>";

?>

Тогда из вашего приложения Flash вы можете сделать это:

/**
 * Called whenever the app is loaded.
 */
protected function init():void {
    var u:URLLoader = new URLLoader();
    u.addEventListener(Event.COMPLETE, onComplete);
    u.load(new URLRequest("http://example.com/flash-config.php"));
}

/**
 * Determines whether or not the video should play based on the
 * config service response.
 */
protected function onComplete(e:Event):void {
    var x:XML = new XML(e.target.data);
    if(x.playVideo == 'true') {
        playVideo();
    }
}

/**
 * Should be called either when the video starts playing. I just tied
 * it to a user click here.
 */
protected function playVideo():void {
    // call the service to update the session
    var u:URLLoader = new URLLoader();
    u.load(new URLRequest("http://example.com/start-video.php"));
    // ... play video code ...
}

Я думаю, что этот подход дает вам немного больше гибкости, чем использование SharedObject. Надеюсь, это поможет.

UPDATE

Вы также можете использовать сессионный cookie в браузере. В основном установите дату окончания срока действия на «0», и срок действия файла cookie истечет, когда пользователь закроет браузер. (Примечание: когда я проверял это в Firefox, закрытие вкладки было недостаточно, чтобы уничтожить cookie. Весь браузер должен был быть закрыт.)

Вы можете использовать ExternalInterface или служебную библиотеку, подобную этой . Используя библиотеку, вы можете иметь такой код в вашем приложении:

function playVideo():void {
    if(!CookieUtil.getCookie('playvideo')) {
        CookieUtil.setCookie('playvideo', 'true', 0);
        // ... play video code ...
    }
}

Каждый раз, когда пользователь закрывает браузер, cookie будет очищен. В следующий раз, когда они посетят ваш сайт, видео будет воспроизведено снова. Не уверен, что это больше соответствует тому, что вы ищете, но надеюсь, что это поможет.

0 голосов
/ 11 января 2010

Вам просто нужно закончить SharedObject самостоятельно.Это не сложно.Таким образом, ваш .swf будет полностью самодостаточным, не полагаясь на что-то внешнее, что хорошо для IMO.

package {

 import flash.display.Sprite;
 import flash.net.SharedObject;
 import flash.net.SharedObjectFlushStatus;

 public class SharedObjectExample extends Sprite {

  private var _so:SharedObject;
  private var _now:Date;
  private var _last_played:Number;
  private static const EXPIRE_TIME:Number = 1000 * 60 * 60 * 24; // 24hrs in msec

  public function SharedObjectExample() {
   // create a new date for the current time to compare against
   _now = new Date;

   // create a new shared object
   _so = SharedObject.getLocal("application-name", "/");

   // try read from the shared object
   if (_so.data.last_played) _last_played = _now;

   // if no value is set we play the video and set the current time
   if (!_last_played) {
    // play video here
    _last_played = _now.time;

   // check if the "cookie" has expired and it's time to play again
   } else if ( _now.time - _last_played > EXPIRE_TIME) {
    // play video here
    _last_played = _now.time;
   } else {
    // do nothing
   }

   // and finally, save
   saveValue();
  }

  private function saveValue(event:MouseEvent):void {
   // i've removed the code that asks the user for permission if the request for storage is denied
   _so.data.last_played = _last_played;
   var flushStatus:String = null;
   try {
    flushStatus = _so.flush(1000);
   } catch (error:Error) {
    trace("Could not write SharedObject to disk");
   }
  }
 }
}
0 голосов
/ 11 января 2010

Я немного изменил твой код, чтобы он был убит в конце сезона ...

PHP ...

<?php
//          flash_php_session_cookie.php

$cookie= "false";

if (isset($_COOKIE["cookie"]))
  $cookie= "true";
else
 setcookie("cookie", "true", 0);

echo "<config><cookie>{$cookie}</cookie></config>";

?>

ВСПЫШКА ...

// the folowing functions handle call coresponding PHP files to handle cookies ...    

// re-configure these to the location of the swf ... 
var flashConfigURL:String ="flash_php_session_cookie.php";

//Called whenever the app is loaded ...
function initCookieFunc():void {
    var u:URLLoader = new URLLoader();
    u.addEventListener(Event.COMPLETE, onComplete);
    u.load(new URLRequest(flashConfigURL));
}

// Determines whether or not the cookie exists / (assumes theres a text field named T on the stage) ... 
function onComplete(e:Event):void {
    var x:XML = new XML(e.target.data);
    if (x.cookie == 'false') {
        T.appendText("cookie doesn't exist yet");
    } else {
        // cookie exists ... 
        T.appendText("cookie exists");
    }
}

initCookieFunc();

Я собираюсь оставить свободную версию "TIMEOUT" версия также. Здорово иметь ответ на этот вопрос

Еще раз спасибо RJ за бесценный код

-MW

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...