Browsed by
分类:移动探索

QQ群加群助手web/iOS/Android/二维码

QQ群加群助手web/iOS/Android/二维码

官网地址:http://qun.qq.com/join.html

网页版:

<a target=”_blank” href=”http://shang.qq.com/wpa/qunwpa?idkey=【官网给的你的QQ群的Key】”><img border=”0″ src=”http://pub.idqqimg.com/wpa/images/group.png” alt=”Flash新手营内部学习” title=”Flash新手营内部学习”></a>

iOS:

– (BOOL)joinGroup:(NSString *)groupUin key:(NSString *)key{
NSString *urlStr = [NSString stringWithFormat:@”mqqapi://card/show_pslcard?src_type=internal&version=1&uin=%@&key=%@&card_type=group&source=external”, @”244675613″,@”【官网给的你的QQ群的Key】”];
NSURL *url = [NSURL URLWithString:urlStr];
if([[UIApplication sharedApplication] canOpenURL:url]){
[[UIApplication sharedApplication] openURL:url];
return YES;
}
else return NO;
}

 

Android:

/****************
*
* 发起添加群流程。群号:xxx key 为:【官网给的你的QQ群的Key】
* 调用 joinQQGroup(【官网给的你的QQ群的Key】) 即可发起手Q客户端申请加群
*
* @param key 由官网生成的key
* @return 返回true表示呼起手Q成功,返回fals表示呼起失败
******************/
public boolean joinQQGroup(String key) {
Intent intent = new Intent();
intent.setData(Uri.parse(“mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26k%3D” + key));
// 此Flag可根据具体产品需要自定义,如设置,则在加群界面按返回,返回手Q主界面,不设置,按返回会返回到呼起产品界面 //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
try {
startActivity(intent);
return true;
} catch (Exception e) {
// 未安装手Q或安装的版本不支持
return false;
}
}

 

 

不过Android版貌似有个坑爹的地方,跳转到加群页面后,如果用户进行了操作,返回只会返回到QQ主界面,无法返回到自己应用,关键是再点击自己的应用图标  依然打开的是QQ,必须杀掉自己的应用才可以,坑!

 

 

 

 

XCODE快速开发ANE步骤和一些常见错误的解决

XCODE快速开发ANE步骤和一些常见错误的解决

使用adobe air制作的移动应用,在对接第三方平台的时候,需要使用ANE来包装本机代码,在对接过程中,我积累了一些打包ANE的经验,记录下来,希望对看到的人有些帮助。
吐槽一下,ANE太难对付了,各种坑,调试也比较麻烦。

1、安装mac版本的AIR SDK
下载地址:http://www.adobe.com/devnet/air/air-sdk-download-mac.html

2、安装xcode的ANE项目模板(好东西~)
下载地址:https://github.com/divijkumar/xcode-template-ane

3、从模板新建项目:
snap (2).jpg
snap (3).jpg
项目建好了的样子:
snap (4).jpg
直接点左上角的小三角形编译,报错如下:
snap (5).jpg
提示不支持的编译器

解决:我们点击项目属性,选择 LLVM5.13
snap (6).jpg

继续点编译:
snap (7).jpg
成功了,生成的库文件是libhello.a

接下来我们开始生成ane,点击编译目标:
snap (8).jpg

选择hello.ane
snap (9).jpg

再点小三角编译,成功(在*.ane上右键选Show in Finder可以定位到这个ane文件):
snap (10).jpg

如果在项目创建页面没有填写这个个:
snap (11).jpg
则会提示错误:
snap (12).jpg

解决方法是,在项目属性里设置这个宏参数,填上swc文件所在的全路径:
snap (13).jpg

剩下的事情就是增加你自己需要的接口来,在hello.m文件里,可以看到模板示例方法:isSupported,自己写代码可以参照它。

另外如果需要使用C++和objec混编,则需要项目中至少有一个后缀为mm的源文件,你可以创建一个空mm文件即可。


在ios本机库,AIR SDK包含了以下系统库:
snap (14).jpg

如果项目依赖了除了上面列表之外的库,需要打开项目下的那个:platformoptions.xml
填上依赖的动态库(*.dylib)或者静态库framework(*.framework)
动态库用-l前缀,framework用-framework前缀
snap (15).jpg

如果不在上面xml中指定,打包ANE是不会报错的,但是在打包ipa的时候,会报类似下面的错:

Undefined symbols for architecture armv7:
  "_crc32", referenced from:
      _PyZlib_crc32 in libpython2.7.a(zlibmodule.o)
  "_inflateEnd", referenced from:
      _Decomp_dealloc in libpython2.7.a(zlibmodule.o)
      _PyZlib_decompress in libpython2.7.a(zlibmodule.o)
      _PyZlib_unflush in libpython2.7.a(zlibmodule.o)
  "_deflateInit_", referenced from:
      _PyZlib_compress in libpython2.7.a(zlibmodule.o)
  "_inflate", referenced from:
      _PyZlib_decompress in libpython2.7.a(zlibmodule.o)
      _PyZlib_objdecompress in libpython2.7.a(zlibmodule.o)
      _PyZlib_unflush in libpython2.7.a(zlibmodule.o)
  "_deflateEnd", referenced from:

在使用该ANE打包ipa的过程中,如果使用了多个ANE,且里面引用了同一个公用类,会提示重复的符号:
snap (1).jpg
解决方法是在调用adt打包ipa的时候,增加参数:-hideAneLibSymbols yes


如果打包ipa的出现错误(找不到___divmodsi4符号):

Packaging: ../hello.ipa
using certificate: hello.p12...

Warning: Resource zh-Hans.lproj has been skipped because of mismatch with suppor
ted languages information in application descriptor.
Undefined symbols for architecture armv7:
  "___divmodsi4", referenced from:
      _absc_solve in D:\\mobile\\wow_mobile\\..\\wow_app\\AOTBuildOutput62399389
92767853027.tmp\\com.q1.haima.o
ld: symbol(s) not found for architecture armv7
Compilation failed while executing : ld64

APK setup creation FAILED.

Troubleshooting:
- did you build your project in FlashDevelop?
- verify AIR SDK target version in bat\app-haima.xml

解决方案:
1、目标系统版本需要高一些,比如5.1或者6.0以上,在platformoptions.xml 文件的linkerOptions指定参数:-ios_version_min,如下:

<platform xmlns="http://ns.adobe.com/air/extension/3.1">
    <sdkVersion>5.0</sdkVersion>
    <description > An optional description</description>
    <copyright>2012 (optional)</copyright>
    <linkerOptions>
        <option>-ios_version_min 5.1</option>
        <option>-framework AdSupport</option>
        <option>-framework AudioToolbox</option>
        <option>-lstdc++.6</option>
    </linkerOptions>
</platform>

2、如果改sdk版本还不行,则使用下面方案,在.h头文件里增加下面的函数:

unsigned long ___udivmodsi4(unsigned long num, unsigned long den, int modwanted)
{
    if (modwanted)
        return num % den;
    else
        return num / den;
}

另外,引起APP闪退的可能原因:
1、调用API函数的参数类型不正确,objc的参数为NSString类型,但是传int类型,在编译时也不会报错,但是在手机运行时会崩溃!!!需要仔细检查是否有该问题

作者:YoYo,原文地址:http://yoyo.play175.com/p/xcode-ane.html

64-bit requirements for iOS apps

64-bit requirements for iOS apps

本文系转载:http://easynativeextensions.com/making-your-ios-apps-universal/

 

At the end of last year Apple announced their new requirements for submitting apps to the app store:

This doesn’t pose much of a problem for native apps, but we AIR developers were stranded… Until last week, when Adobe released AIR 16 beta in Adobe Labs. Let us go through the steps necessary for rebuilding your apps and ANEs to support 64 bits.

Step 1: Update your AIR SDK

1.1. Download AIR SDK 16 beta from Adobe Labs: http://labs.adobe.com/downloads/air.html

Note: if you use Flash Builder and/or the Flex SDK, you need the last download link, AIR 16 SDK for Flex Developers.

1.2. Make a backup copy of your AIR SDK folder.

1.3. Overlay the new SDK over the old one:

1.3.1 If you are a Windows user, unzip the download and copy the contents over your AIR SDK.

1.3.2. On Mac you can do the same and ask Finder to merge folders or, you can copy the archive in the root of your AIR SDK and run the following command in the Terminal:

Step 2: Update your app descriptor

If you are a veteran AIR developer, you are used to this, but here it is just in case. Open your app descriptor file – usually named your-app-name-app.xml and found in your project’s src/ folder and make sure the namespace at the top of the file points to 16.0:

Step 3: Rebuild your iOS ANEs

Any native extensions for iOS that your app uses will also need to be built with 64-bit support. If you have the source code for these ANEs, this is what you do:

3.1. Make sure you are using Xcode 6 and iOS SDK 8.

3.2. In your Xcode project, go to Build Settings > Architectures and first make sure that Architecturesis set to Standard architectures (armv7, arm64), then set Build Active Architecture Only toNo. Without the last change the compiler will default to building a binary that supports only one architecture, which matches the device that you have connected at the moment or the simulator version you have made active – good idea for a debug build, but not for release.

Xcode 64bit architecture setting

 

Now make a clean build of your ANE.

Here are a couple of resources that will help you automate your ANE building and packaging:

Step 4: How do you know if your app is now universal/64-bit?

… before submitting it to the Apple App Store, that is. There are a couple of things you can check.

First, if you build your app with AIR 16, you should NOT get an error message like this:

Error: Apple App Store allows only universal applications. “libMultiplatformANETemplateLib.a” is not a universal binary. Please change build settings in Xcode project to “Standard Architecture” to create universal library/framework.

Or like this:

[exec] Error: libCameraLibiOS.a are required to have universal iOS libraries. Please contact the ANE developer(s) to get the same.[exec] Result: 12

Then,  to double-check, do the following:

4.1. Rename your .ipa file to .zip and unzip it.

4.2. Use lipo in the Mac Terminal:

You want to see a message like this:

 4.3. You can also use the file command on Mac:

This should result in a message like this one:

Ta-da! Your app is now up to date with the 64-bit requirements.

关于Starling丢失纹理的半天折腾

关于Starling丢失纹理的半天折腾

在手机上调试自己开发的游戏时候,突然收到一条短信,结果造成了Starling的上下文丢失了,已经开启了Starling.handleLostContext = true; 结果恢复纹理的时候报错!!!

QQ截图20140218145830各种思考:

1.加载方式有问题?(没有用自带AssetManager,是自己写的加载)

2.atf版本有问题?(atf 有两个版本,老版本的Straling不能加载最新的atf格式)

3.没有更新到Starling 1.4.1版本?

…..

各种测试,各种折腾,最后终于发现:

原来是这样的:游戏里有个loading 转圈圈的,常见的那种 小白点组成的,在创建的时候是通过draw sprite得到的

bitmapData,创建完loading的时候,直接把小bitmapData.dispose()了,结果在恢复纹理的时候,找不到这一小块

bmd,所以报了“#2015 Invalid BitmapData”,所以报错了;

o(︶︿︶)o 唉,说多都是泪啊,教训深刻,中午都没休息!

大意不得!!!

总结:

虽然启用了Starling.handleLostContext = true;但是在游戏内通过代码创建的bmd要格外注意,这些个独立与加载系统之外的小杂毛,往往翻船到这阴沟里!

 

AIRSDK4.0之ADT打包IPA,速度快10倍

AIRSDK4.0之ADT打包IPA,速度快10倍

更新了最新的AIR SDK 4.0,加入参数-useLegacyAOT no 打包ipa,果然快了很多,官方说的是快10倍,貌似差不多!

 

[codesyntax lang=”actionscript3″]

@echo off
::
::   quickly package ipa
::    by nestor 2014.01.21
::
rem ------------------------
::change path(切换到当前目录下)
cd /d "%~dp0"
cd /d "%cd%\"
::cd /d ..

echo "%~dp0"

rem ------------ set adt variable(设置adt变量) ----------------------------
::key(证书)
set KEY_PATH="D:\keystore\wen\dev.p12"
set KEY_PASS=111111
set KEY_MOBILE_PROVISION="D:\keystore\wen\dev.mobileprovision"
::all files(所有文件路径设置)
set ROOT_PATH=

set FILE_SWF=%ROOT_PATH%sh.swf
set FILE_XML=%ROOT_PATH%sh-app.xml
set FILE_LOGO=%ROOT_PATH%bgLogo.png
set FILE_IPHONE4_DEFAULT=%ROOT_PATH%Default.png
set FILE_IPHONE5_DEFAULT=%ROOT_PATH%Default-568h@2x.png
set FILE_RES=%ROOT_PATH%res
::target ipa name(ipa包的名字)
set TARGET_NAME=sh%date:~5,2%%date:~8,2%.ipa

rem ------------package(打包)-----------------------------

echo begin:%time%
adt -package -target ipa-app-store -useLegacyAOT no -storetype pkcs12 -keystore %KEY_PATH% -storepass %KEY_PASS% -provisioning-profile %KEY_MOBILE_PROVISION% %TARGET_NAME% %FILE_XML% %FILE_SWF% %FILE_LOGO% %FILE_IPHONE4_DEFAULT% %FILE_IPHONE5_DEFAULT% %FILE_RES%
echo end:%time%
pause

[/codesyntax]

如果你用到了ane,别忘了加 -extdir . !

为什么注释写的也是英文呢?坑爹啊,批处理bat文件是ASNI编码格式,Fb里用的是UTF-8,本来像写中文的,结果要么编辑是中文乱码,要么运行时中文乱码,干脆拼几个英文单词算了!

 

 

后续:2014.03.06

这个功能目前还是测试版,打包demo或者小项目还是没问题的,但是打包公司的项目,各种bug,坐等adobe出正式版!

AIR p12转keystore证书签名apk

AIR p12转keystore证书签名apk

需求背景:向平台提交apk时提示该id已经存在,需要应用认领,可以认领的方式是使用java的keystore对平台提供的空白为签名apk进行签名上传验证,我们知道使用AIR开发的apk,所用的证书是p12的,如果进行签名认证呢?

猜想一:试图将p12证书直接转成keystore,各种找资料,耗时半天,没成功!(会遇到找不到证书链的问题)

猜想二:反编译了平台提供的未签名apk,获取id,版本等,通过Flash Builder创建一个类似的apk,企图骗过平台,结果被识破。

继续查找,终于在某篇文章的评论处找到解决办法了。

正确方法:将p12证书直接导入到一个keystore文件中,就可以正常签名了!(真TM的)

[codesyntax lang=”actionscript3″]

//讲p12导入至keystore
keytool -v -importkeystore -srckeystore temp.p12 -srcstoretype PKCS12 -destkeystore temp.keystore -deststoretype JKS
//查看keystore
keytool -v -list -keystore temp.keystore
签名(1-证书链别名)
jarsigner -verbose -keystore d:\key.keystore -signedjar d:\signed.apk d:\tap_unsign.apk 1
删除keystore中别名为help.com的证书链
keytool -delete -alias help.com -keystore key.keystore

[/codesyntax]

签名后上传平台果然OK了!

参考文章地址:http://www.shadowkong.com/archives/1359 这篇Rect的文章是介绍在adt命令里用keystore签名AIR生成的apk的方法,也很有用,建议还是通过keystore来进行签名,使AIR生成的apk更加接近java原生生成的!

以下是Rect大神关于AIR生成的apk以及ANE等的研究:https://github.com/recter/Anti-ADT/tree/master/RDT(都很实用!)

AIR使用Admob广告小结

AIR使用Admob广告小结

最近在研究移动应用,现在Andriod做点应用试试,花了一点时间做了个火车票查询的应用,上了几个平台看看效果,跑跑流程。

顾名思义,应用是实时查询火车票的官网余票信息,应用做好了,免费的,就也想着放点广告试试,这时候就发现AS3的苦逼。搞广告需要ANE,还好在网上找到了一个Admob的广告ANE,是个谷歌开源项目,具体我就不详细说了,做着写的有例子,就是替换下jar文件,添加ANE到项目直接调用就可以了,自己简单封装了一个工具类,顺便分享下(有待完善)。

[codesyntax lang=”actionscript3″]

package{
	import so.cuo.anes.admob.AdAlign;
	import so.cuo.anes.admob.AdEvent;
	import so.cuo.anes.admob.AdType;
	import so.cuo.anes.admob.Admob;

	public class ADAdmob
	{
		/**
		 *是否在显示广告
		 */
		public var isShowAd:Boolean=false;
		private var myAdmobId:String = "a150eeaece2a62e";
		private  static var m_instance:ADAdmob=null;
		public function ADAdmob(p:Param)
		{
		}

		public static function get instance():ADAdmob{
			return m_instance||=new ADAdmob(new Param());
		}

		/**
		 *显示广告
		 * @param x  X坐标
		 * @param y   Y坐标
		 * @param type 广告类型
		 * @param isAlgin 是否按照align来部分,如果true 以align为准  xy无效  否则false 则以 xy为准 align无效
		 * @param align 位置
		 *
		 */
		public function showAd(x:int=0,y:int=0,type:String=AdType.BANNER,isAlgin:Boolean=false,align:int = AdAlign.ALIGN_BOTTOM):void
		{
			var admob:Admob=Admob.getInstance();
			if(admob.isSupported){
				admob.setUnitId(myAdmobId);
				admob.dispatcher.addEventListener(AdEvent.onReceiveAd,this.adHandler);
				admob.dispatcher.addEventListener(AdEvent.onFailedToReceiveAd,this.ad2Handler);
				admob.dispatcher.addEventListener(AdEvent.onDismissScreen,c1Handler);
				admob.dispatcher.addEventListener(AdEvent.onPresentScreen,pressHandler);
				admob.dispatcher.addEventListener(AdEvent.onLeaveApplication,levelHandler);
				if(isAlgin){
					admob.showRelation(align,type);
				}else{
					admob.show(x,y,type);
				}
			}else{
				trace("not support");
			}
		}

		/**
		 *释放广告
		 *
		 */
		public function disposeAd():void{
			var admob:Admob=Admob.getInstance();
			admob.dispatcher.removeEventListener(AdEvent.onReceiveAd,this.adHandler);
			admob.dispatcher.removeEventListener(AdEvent.onFailedToReceiveAd,this.ad2Handler);
			admob.dispatcher.removeEventListener(AdEvent.onDismissScreen,c1Handler);
			admob.dispatcher.removeEventListener(AdEvent.onPresentScreen,pressHandler);
			admob.dispatcher.removeEventListener(AdEvent.onLeaveApplication,levelHandler);
			admob.dispose();
			isShowAd = false;
		}

		private function levelHandler(e:AdEvent):void
		{
			trace("level");
		}

		private function pressHandler(e:AdEvent):void
		{
			trace("press");

		}

		private function ad2Handler(e:AdEvent):void
		{
			trace("fail");
		}

		private function c1Handler(e:AdEvent):void
		{
			trace("Dismiss");
		}

		protected function adHandler(event:AdEvent):void
		{
			trace("receive ad");
			isShowAd = true;
		}
	}
}
class Param{}

[/codesyntax]

广告类,还有待完善,有需要的朋友可以直接拿走,至于广告id,可以到admob上注册下,建个项目就有id了,很简单的。

下面说下,我用Admob的时候遇到的问题,我按照作者的方法,做了demo,广告却一直出不来,不知道怎么回事,折腾了好几天也没搞明白,在我近乎放弃admob的时候,终于发现原因了,原来是因为我的手机刷了rom,然后host文件了加了一万多条广告屏蔽记录,当然,admob的广告就显示不出来了,改了host,终于,看广告条了,鸡冻啊!!!

如果你的广告也显示不出来,不妨看下是不是host被屏蔽了,另外360之类的手机杀毒软件也有可能会屏蔽你的广告。

下面是广告的效果,我直接截图我的应用:

0

train2

下面再贴一些相关的资料,有需要的朋友:

admobANE:(Andriod+ios)http://code.google.com/p/flash-for-mobile/

作者建的群:56892018   感谢作者[珠峰看雪]的无私奉献!

我的应用:火车票查询 http://www.mumayi.com/android-264372.html(木蚂蚁),实时查询火车票的,有兴趣的朋友也可以看下。

ANE作者的一篇admob的使用文章:

flash 加载admob广告ane  http://bbs.9ria.com/forum.php?mod=viewthread&tid=141414&fromuid=107509

还有一些其他的广告ANE:http://ane.qiow.net/ (这些没用过,有兴趣的朋友可以试试)

在使用广告的过程中有什么问题,也可以在此留言交流,抑或加作者的群一起讨论。