开发微博Flash应用详解(转)

来源:互联网 发布:php异步执行 编辑:程序博客网 时间:2024/04/26 09:26
不少开发者在使用Flash sdk的过程中遇到了不少问题,主要集中在登陆方式的选择和不同开发环境(Flash CS5/Flash Builder等等)本地调试的问题上。本篇主要是为了帮助开发者使用Flash SDK开发微博应用,从本地调试到上线的整个过程。

一、准备阶段
1、获得Flash SDK库
准备阶段主要是下载到最新的Flash sdk库,有两个选择:
(1) 使用svn checkout(推荐,能及时得到最新的代码)
地址: https://weibosdk.googlecode.com/svn/trunk/
(2) 从Flash SDK测试app直接下载(右上角有个下载按钮)

2、在新浪微博开放平台创建应用
根据应用创建向导,填入准备开发应用的各种信息。在此重点要说明一个开发者疑问最多的地方就是“绑定域名”。
针对Flash SDK的使用者(注意限定词哦):
Flash开发者都知道,网络应用跨域请求api会受到跨域文件的限制,新浪微博的开放平台接口,api.t.sina.com.cn,跨域文件crossdomain.xml:
现在三方开发能使用的信任域只有一个,就是 *.sinaapp.com (PS:不少开发者认为绑定域名后会出现在这个列表里,事实上,绑定域名并不是这个左右,稍后解释)。
先解释下*.sinaapp.com:这个域是新浪正对微博提供的一个服务,Sina App Engine,提供了空间,可以托管你的应用。免费的哦~,建议好好了解下。
如果你确实需要使用自己的域名,但是又想使用flash sdk方便开发应用,那简单的方式,就是,只将你的应用swf在Sina App Engine托管,然后外链到你的站点中去,也是没有问题的。
转回绑定域名的事情。那如果我就是想用自己的域名,如何跳过这个跨域文件请求到数据呢?官方给提供了一个代理接口:api.t.sina.com.cn/flash/proxy.jsp 这个接口的请求被封装在flash sdk中。如果你的flash应用请求来源是非信任域,此时,通过设置Flash SDK,就会请求这个代理接口(PS:flash sdk的此部分设置稍后会详细说明)。代理接口会做一件事情,就是判断是否你的请求来源refer和你App Key绑定的绑定的域名是否一致,如果不一致,将无视请求,不会返回任何内容。所以,如果你绑定了域名,恰巧又设置了flash sdk调用这个代理接口,那你在本地调试的时候除非设置调试环境,保证flash请求和绑定域名一致,否则会无响应。所以绑定域名,对于Flash sdk的开发者来说,只是限定了代理接口检测请求来源。本地测试中,不受跨域文件限制,所以即使绑定域名也无所谓,因为你的请求不经过代理接口。所以在应用创建的时候,确认你的应用是在自己的域还是SAE上。绑定到你目标域即可,不会影响到你的本地测试

二、本地调试
所谓的本地调试,实际上就是走通第一步,保函两部分:1、登陆成功,2、请求到当前授权登陆用户的信息(走通一个接口)

1、对于Flash SDK提供的几种登录方式的说明
Flash SDK有一个登陆函数login(…),这个函数根据传的参数不同会选择不同的登陆,假设你的MicroBlog类的实例是_mb,即private var _mb:MicroBlog = newMicroBlog();
首先需要说明的是认证方式,也就是接口是如何判断你的应用请求接口是合法的。现有的认证方式有两种,一种是:cookie认证,另一种使用accesstoken + accesstokensecret的OAuth认证。

1.1 _mb.login()
● 过程:1、弹出官方授权登陆页面 2、用户输入用户名密码 3、_mb发出MicroBlogEvent.LOGIN_RESULT
● 认证方式:cookie认证
● 适用范围:网络应用(不适用于桌面Ari应用或者手机等移动终端应用)
● 注意事项:
  • 应用调用次函数,需要用户触发,例如用户点击登陆按钮触发,不可以在应用开始就调用
  • _mb只需要设置source(也就是app key)其余均不用设置
  • 如果用户已经授权过你的应用,并且在相同浏览器下已经在新浪微博首页登陆,应用能收到一个事件,告知当前的登陆状态。_mb.addEventListener(MicroBlogEvent.ANYWHERE_TOKEN_RESULT, onLoginResult); ///如果在别处已经登录,此时不用调用login()
● 代码示例
复制代码
  1. public function init():void
  2. {
  3.     _mb.source = xxxxxx; ///source是你申请的app key
  4.     _mb.addEventListener(MicroBlogEvent.ANYWHERE_TOKEN_RESULT, onLoginResult); ///如果在别处已经登录,此时不用调用login()
  5.     btnLogin.addEventListener(MouseEvent.CLICK, onLoginClick); //也可以不侦听MicroBlogEvent.ANYWHERE_TOKEN_RESULT,直接调用login()去登录,为了浏览器不拦截授权弹出页,建议使用用户点击鼠标触发
  6. }
  7. private function onLoginClick(e:MouseEvent):void
  8. {
  9.     _mb.addEventListener(MicroBlogEvent.LOGIN_RESULT, onLoginResult);
  10.     _mb.login();
  11. }
  12. private function onLoginResult(evt:MicroBlogEvent):void
  13. {
  14.     var user:MicroBlogUser = evt.result as MicroBlogUser//事件获得的是MicroBlog当前登陆用户实例
  15.     //登录成功,可以访问微博数据了
  16. }


1.2 _mb.login(user, pass)
● 过程:1、应用内部带有输入用户名密码得输入框,2、调用此接口,3、接受到MicroBlogEvent.LOGIN_RESULT事件
● 认证方式:OAuth认证(XAuth)
● 适用范围:非网络应用,例如桌面Air,手机IOS等等应用类型
● 注意事项:使用此授权需要通过申请并审核,默认无法使用,详见:XAuth相关说明
● 代码示例
复制代码
  1. private var _mb:MicroBlog = new MicroBlog();
  2. public function init():void
  3. {
  4.     _mb.isTrustDomain = true;///设置为信任域
  5.     _mb.source = xxxxxx; ///source是你申请的app key
  6.     _mb.consumerKey = xxxxxx;
  7.     _mb.consumerSecret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
  8.     _mb.addEventListener(MicroBlogEvent.VERIFY_CREDENTIALS_RESULT, onVerifyResult);
  9.     _mb.addEventListener(MicroBlogErrorEvent.VERIFY_CREDENTIALS_ERROR, onVerifyError);
  10.     _mb.login(username, password); ///用户名密码登录后会请求用户数据,以确认是否输入有效
  11. }
  12. private function onVerifyResult(e:MicroBlogEvent):void
  13. {    _mb.removeEventListener(MicroBlogEvent.VERIFY_CREDENTIALS_RESULT, onVerifyResult);
  14.     _mb.removeEventListener(MicroBlogErrorEvent.VERIFY_CREDENTIALS_ERROR, onVerifyError);
  15.              //登录成功,可以访问微博数据了
  16. }
  17. private function onVerifyError(e:MicroBlogEvent):void
  18. {
  19.     //输入的用户名或者密码错误
  20. }


1.3 _mb.login(null, null, true)
● 过程:1、弹出官方授权登陆页面,2、用户输入用户名密码 3、用户将显示的PIN码复制粘贴到应用中 4、应用 verifyCredentials ()验证是PIN码是否有效
● 认证方式:OAuth认证(PIN认证)
● 适用范围:信任域下的网络应用,桌面Air应用
注意事项不建议在网络应用中使用,弹出框会被浏览器拦截。而且用户体验也不是很好,桌面Air应用可以给用户一种安全得感觉(可能-_-!)可以使用。

1.4 _mb.login(user, pass, false, true)
同:_mb.login(user, pass)
原因:原来开放平台接口支持BasicOAuth的时候,这个是区分使用BasicOAuth还是XAuth。BasicOAuth已经在今年(11年)6月份停止支持,所以只传入用户名密码的已经修改成默认使用XAuth

1.5 已经有当前应用授权获得的accessToken和accessTokenSecret的情况下
即:在以前已经用户已经登陆受权过(不管你使用的是什么途径,可能使用别的sdk获得的),只要用户不在帐户设之中取消受权你的应用,这个token值是不会改变得。你可以保存起来,下次直接登陆。此时如果你要使用flash sdk,则可直接验证是否有效。通常情况下这种直接登录方式需要结合PHP开发完成。
● 代码示例
复制代码
  1. _mb.isTrustDomain = true;///设置为信任域
  2. _mb.source = xxxxxx; ///source是你申请的app key
  3. _mb.consumerKey = xxxxxx;
  4. _mb.consumerSecret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
  5. _mb.addEventListener(MicroBlogEvent.VERIFY_CREDENTIALS_RESULT, onVerifyResult);
  6. _mb.addEventListener(MicroBlogErrorEvent.VERIFY_CREDENTIALS_ERROR, onVerifyError);
  7. _mb.accessTokenKey = _accessTokenKey;
  8. _mb.accessTokenSecrect = _accessTokenSecret;
  9. _mb.verifyCredentials(); ///验证是否有效


2、各种开发环境的本地调试设置
经过这么多说明,大家应该大体了解整个的认证过程了。这里要重点说的是网络应用,主要是跨于文件和绑定域名导致很多疑惑,而桌面AIR应用和手机移动平台应用通常没有这种困惑。

2.1 简易通用
在说各种开发环境之前,最简单点一种形式,就是,如果你能获取到自己受权自己应用的accessToken和accessTokenSecret(如上节的1.5),那你直接设置后就走通流程了。完成应用逻辑之后,在上线前修改成正式的登陆逻辑即可。这种是最简单的,各种开发环境均可符合,当然虽说看着简易通用,那如何获取token值呢:
提供一个比较简单的自给自足的方式:
随便创建一个AIR应用(不管使用何种开发环境)、按照上节提到的PIN登陆流程(1.3)、在成功调用verifyCredentials()之后,输出token值即可。
这个token值就可以在本地调试的时候使用。
下面说一下除了这种方式,稍微真实的本地调试方法。仅限说明使用_mb.login()的登陆方式的情况

2.2 Flash IDE( CS5.5 / 5 / 4 / 3)
这是开发者最多疑问的。究其原因是,_mb.login()走的是cookie认证。而如果你直接Ctrl + Enter测试,没有浏览器,当然即使显示登陆成功,接口也是无法调用成功的。原因是Flash发出的请求没有带上受权登陆使用浏览器的cookie。
方法:只要发布一个页面即可(PS:这个页面所在的文件夹可以访问网络)
注意点:本地调试的时候,设置_mb.isTrustedDomain = true,这样直接访问api.t.sina.com.cn,不然默认走的是代理接口。上线到你非信任域的时候注释掉这行即可。

2.3 Flash Builder (Flex Builder)/ FDT
针对这类的开发环境,由于默认会产生一个html的外壳,所以基本上没太多问题,只需注意,本地调试设置_mb.isTrustedDomain = true,上线的时候注释掉即可。

2.4 Flash Develop
Flash Develop的本地调试也有些小技巧。Flash Develop中内部集成了浏览器,可以简单模拟当前发布的swf在浏览器运行的情况。在Project -> Properties -> Test Movie 其中有两项拥有这个特性1、Play in new tab,2、Play in popup
在调用_mb.login()之后,会调用你机器上的默认浏览器,这时候登陆之后,你再调用接口,由于这两个不是同一个浏览器,所以登陆就实效了。
方法:在Flash Develop中打开内部浏览器(例如Help -> Release Notes…),然后输入www.weibo.com并且登陆,此时你测试你的app,如果你已经授权过,会直接收到MicroBlogEvent.ANYWHERE_TOKEN_RESULT,告知你已经登陆,这样就继续你的应用逻辑即可。

三、上线
如果你的应用是非信任域的网络应用,只需注意一点,就是注释掉_mb.isTrustedDomain = true,发布release版本就可以了。

四、常见问题
1、IE6下,Flash Player9,请求接口报Error#2032的错误
这个是Player9的一个bug,修复方法是在请求返回值的头文件中添加一些信息,当然由于这块的api不是专为flash开放的,所以无法修改返回值头文件,也就是说这个bug是无法在flash开发者这边来解决的。
有些童鞋发现,我的ie6装的确实是Player10,为什么还是报一样的错。这里有个注意点:一定要在发布设置中设置Player10。

2、IE下使用第一种授权登录出错
在火狐等浏览器下没有问题,而在IE下登录的时候显示“脚本错误”(页面左下角提示)。解决的方法是在嵌入Flash的位置给一个id!由于那种是回调方式,在ie下没有给id会出现找不到flash引用的情况。
…有待补充


@flashache
http://weibo.com/ias3
原创粉丝点击