技术 – 523326 http://www.523326.com 写想写的东西 Wed, 28 Nov 2018 05:33:14 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.9.8 适用于egret引擎的jquery库 http://www.523326.com/?p=388 http://www.523326.com/?p=388#respond Wed, 28 Nov 2018 05:27:11 +0000 http://www.523326.com/?p=388 实用方法:可参考egret官方通用的外部库的方式

点击下载

]]>
http://www.523326.com/?feed=rss2&p=388 0
AS3针对SDK中悬浮窗的问题,或者说如何去降低targetSdkVersion http://www.523326.com/?p=371 http://www.523326.com/?p=371#respond Wed, 13 Jun 2018 16:22:29 +0000 http://www.523326.com/?p=371 继续阅读 AS3针对SDK中悬浮窗的问题,或者说如何去降低targetSdkVersion]]> 近日,在对接ANE的东西,不过用的是易接来接入渠道的SDK。

当一切准备,一切工作做完之后,发觉接入的渠道,在登录的时候都必须要求悬浮窗,但是这个时候在安卓8.0 或者 在7.1 上会出现一些问题,具体表现为要么不显示悬浮窗,要么调用之后直接奔溃。当然这个可能和渠道有关。总之也是咨询过渠道商以及易接,也走了不少怨路,最后个的答案基本是降低一下targetSdkVersion  到23以下。

然后尝试使用如下的方式去降低 在xx-app.xml里面的manifest 里面 加上

<uses-sdk
android:minSdkVersion=”8″
android:targetSdkVersion=”22″ />

然而并没有什么效果。依然会出现一样的问题。

最后在群里的大佬的指点下,让去修改adt.jar。不过遗憾的是解包然后修改里面的AndroidManifest.xml 的targetSdkVersion  然后在打包成jar 始终会报  没有主清单文件 之类的提示。然后将修改后的jar 解压确实能够发现里面的 Main-Class 并没有。尝试手动添加然后再打包依然出错。所以怀疑可能在打包成jar的过程中会修改掉。

 

所以修改这条路暂时好像没戏,不过本人并没有放弃,而是去降低了AIR SDK的版本号。出问题的是AIR 29 而targetSdkVersion = 27.

所以换成了 AIR SDK 22  targetSdkVersion = 21 结果成功调出 悬浮窗。不过问题在于 我不可能换成AIR 22 。所以事实证明,降低 targetSdkVersion是可行的。

 

不过,功夫不负有心人,通过查看jar的用法。找到一个巧妙的办法,那就是直接更新jar包里面的AndroidManifest.xml 而不是 解包 jar再打包,最后完美解决。

 

具体更新方法为:

将adt.jar包解压之后,去com\adobe\air\apk\ 下面找到AndroidManifest_template.xml 修改其targetSdkVersion 为22.

然后再按照这个同样的文件结构创建文件夹,并将上面的xml放进去。大概如下

com\adobe\air\apk\AndroidManifest_template.xml

 

最后把 AIR SDK 里面的adt.jar 复制过来 和 com文件夹在同一目录下。接着执行命令

jar uf adt.jar com

这样就把AndroidManifest_template.xml给更新了,最后打包,大功告成

 

 

 

 

 

 

]]>
http://www.523326.com/?feed=rss2&p=371 0
记录接入微信登录、分享ANE时的一些关键知识点 http://www.523326.com/?p=361 http://www.523326.com/?p=361#respond Mon, 02 Apr 2018 05:33:08 +0000 http://www.523326.com/?p=361 继续阅读 记录接入微信登录、分享ANE时的一些关键知识点]]> 此文只做关键知识点的记录,不做详细流程。

安卓方面

1、回调的时候需要增加WXEntryActivity,这个名字必须和他一样,其次就是包名写成你申请的app的包名再加上wxapi 就行,不用和创建的ane项目的包名一致。

如下图我在没有对包进行去除air前缀的情况的 包名 是 air.com.xmooon.collision。而我创建的ane的包名 是com.nick.wechatane。

wechat01

然后在xx-app.xml的配置里面需要加上


&amp;lt;activity

android:name=".wxapi.WXEntryActivity"

android:exported="true"

android:launchMode="singleTop"/&amp;gt;

其他权限配置 参考 官方接入文档即可。另外值得说明的是 在登录回调中取得授权码的话,安卓的是


SendAuth.Resp newResp = (SendAuth.Resp)

resp;newResp.token;

IOS的 是 code。

2、分享方面

我这里只做了网页分享,说下关键的 msg构建,title description 是必须的,然后的话就是图片,图片可选。如果不填 则会会自动分享向微信注册时上传的icon。分享图片的话,由于我是打算分享任意图片,并不只存在于安装目录下的图片,所以我用的下面的代码。然后图片存储的位置的话,安卓就存在File.desktopDirectory,然后拿file的url不要拿nativePath。


WXMediaMessage _msg = &amp;lt;strong&amp;gt;&amp;lt;b&amp;gt;new&amp;lt;/b&amp;gt;&amp;lt;/strong&amp;gt;&amp;nbsp;WXMediaMessage( _webObj );

_msg.title&amp;nbsp;= _title;

_msg.description&amp;nbsp;= _description;

Bitmap bmp = &amp;lt;strong&amp;gt;&amp;lt;b&amp;gt;null&amp;lt;/b&amp;gt;&amp;lt;/strong&amp;gt;;

&amp;lt;strong&amp;gt;&amp;lt;b&amp;gt;try&amp;lt;/b&amp;gt;&amp;lt;/strong&amp;gt;

{

InputStream _inputStream = &amp;lt;strong&amp;gt;&amp;lt;b&amp;gt;new&amp;lt;/b&amp;gt;&amp;lt;/strong&amp;gt;&amp;nbsp;URL(_imgUrl).openStream();

bmp = BitmapFactory.&amp;lt;em&amp;gt;&amp;lt;i&amp;gt;decodeStream&amp;lt;/i&amp;gt;&amp;lt;/em&amp;gt;(_inputStream);

_inputStream.close();

}

&amp;lt;strong&amp;gt;&amp;lt;b&amp;gt;catch&amp;lt;/b&amp;gt;&amp;lt;/strong&amp;gt;&amp;nbsp;(IOException e)

{

e.printStackTrace();

}

_msg.thumbData&amp;nbsp;= Util.&amp;lt;em&amp;gt;&amp;lt;i&amp;gt;bmpToByteArray&amp;lt;/i&amp;gt;&amp;lt;/em&amp;gt;(bmp,&amp;lt;strong&amp;gt;&amp;lt;b&amp;gt;true&amp;lt;/b&amp;gt;&amp;lt;/strong&amp;gt;);

IOS方面

文件结构大概如下

wechat02

红色圈中的是额外要导入的 同时coretelephony.framework 我们是要打入ane的。需要复制 出来。

其他代码部分就不贴了下面看源码。

分享的话 包含图片的地方 用 这个

_img&amp;nbsp;=&amp;nbsp;[UIImage&amp;nbsp;imageNamed:_imgUrl];

即可,但如果是任意的图片,需要将图片放在air的专门存储目录File.applicationStorageDirectory,然后取nativePath。

 

IOS的回调对于air有个问题是,不会走原生代码,比如我按照网友提供的 增加了一些这个

wechat03

然后并没有卵用。这个时候 我们需要用scheme的方式来获取微信端的回调。即监听

NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE,onInvokeHandler );

然后进行字符串的解析即可。

 

另外IOS在打包为ane的时候 或者是在打包ipa的时候容易出现


Error: Apple App Store allows only universal applications. "libwxane.a" is not a

universal binary. Please change build settings in Xcode project to "Standard Ar

chitecture" to create universal library/framework.

的问题,如果出现这个问题,首先检查静态库是否是通用二进制,lipo -info xx.a 如果看到输出的有 arm64 以及armv7的话,那说明是通用二进制了。

配置的话 大概这样

wechat04

这个时候如果还是会出现上述的问题,那么可更换AIR SDK。我用的是AIR SDK 18。

如果还是会出上面的问题,那么就是你使用的打包命令有问题。

以前我是将adt.jar 直接复制到打包目录,然后 代码是 java -jar adt.jar -package.这样的前缀,始终会出现上面的不是通用二进制的问题,后面采用了绝对路径的方式打包 就解决了

D:/softs/fb4.7/AIRSDK/bin/adt -package。这样既可

全部打包命令


D:/softs/fb4.7/AIRSDK/bin/adt -package -target ane WXAne.ane extension.xml -swc WXAne.swc -platform Android-ARM -platformoptions platformoptions_android.xml -C Android-ARM . -platform iPhone-ARM -platformoptions platformoptions_ios.xml -C iPhone-ARM .

其实还有个要注意的是-C Android-ARM . 这里Android-ARM后面 的那个句号,必须要和Android-ARM 间隔一个空格,不然的话就会一直提示缺少library.swf的提示,即便你确定存在。

补上 安卓的platform.xml


&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;

&amp;lt;platform xmlns="http://ns.adobe.com/air/extension/18.0"&amp;gt;

&amp;lt;packagedDependencies&amp;gt;

&amp;lt;packagedDependency&amp;gt;libammsdk.jar&amp;lt;/packagedDependency&amp;gt;

&amp;lt;/packagedDependencies&amp;gt;

&amp;lt;packagedResources&amp;gt;

&amp;lt;packagedResource&amp;gt;

&amp;lt;packageName&amp;gt;com.nick.wechatane&amp;lt;/packageName&amp;gt;

&amp;lt;folderName&amp;gt;res&amp;lt;/folderName&amp;gt;

&amp;lt;/packagedResource&amp;gt;

&amp;lt;/packagedResources&amp;gt;

&amp;lt;/platform&amp;gt;

上面的res 就直接在ane项目里面拷过来即可

 

Ios的


&amp;lt;platform&amp;nbsp;xmlns=&amp;lt;em&amp;gt;&amp;lt;i&amp;gt;"http://ns.adobe.com/air/extension/18.0"&amp;lt;/i&amp;gt;&amp;lt;/em&amp;gt;&amp;gt;

&amp;lt;description&amp;nbsp;&amp;gt;&amp;nbsp;An optional description&amp;lt;/description&amp;gt;

&amp;lt;copyright&amp;gt;2012 (optional)&amp;lt;/copyright&amp;gt;

&amp;lt;sdkVersion&amp;gt;6.0&amp;lt;/sdkVersion&amp;gt;

&amp;lt;linkerOptions&amp;gt;

&amp;lt;option&amp;gt;-ios_version_min 6.0&amp;lt;/option&amp;gt;

&amp;lt;option&amp;gt;-framework CoreTelephony&amp;lt;/option&amp;gt;

&amp;lt;/linkerOptions&amp;gt;

&amp;lt;/platform&amp;gt;

2018/4/8 更新记录:
以上ane经过测试再air18能够正常打包ipa 但是在air29 air18中打包ipa不成功 会出现

ld: in C:\Users\nick\AppData\Local\Temp\0bb73f21-b3f1-4bd4-bcc2-b7c0c2aec5dc\libcom.nick.wxane.a(WechatAuthSDK.o), unsupported address encoding (5A) of personality function in CIE for architecture arm64
Compilation failed while executing : ld64

这样的报错提示,但是经过lipo -info 确认微信的静态库 也确实是支持64位,但是我们也不可能去用air18 毕竟后面11个版本更新的东西 也是挺多的。最后通过使用微信的 1.7.5版本的sdk解决此问题。而上面的ane使用的是 1.8.2版本。如果你也遇到这个问题,也许换个微信的sdk 就好了。


安卓项目源码下载

IOS项目源码下载

打包文件+ane下载

as3库项目下载

测试项目下载

微信sdk 1.7.5下载

 

]]>
http://www.523326.com/?feed=rss2&p=361 0
AIR For Andorid使用Intent-based URI记录 http://www.523326.com/?p=352 http://www.523326.com/?p=352#respond Fri, 16 Dec 2016 08:27:44 +0000 http://www.523326.com/?p=352 继续阅读 AIR For Andorid使用Intent-based URI记录]]> 一、通过AIR 直接使用Intent-based URI 来打开外部APP,而不需任何的配置。不过要想同时支持IOS还是老老实实的用URI Schame的方式吧

//其中data=12345是传递过去的参数,AIR中 通过InvokeEvent.Invoke可以获取到
var url:String = ("intent:data=12345#Intent;" +
 "action=android.intent.action.VIEW;" +
 "category=android.intent.category.BROWSABLE;" +
 "component=air.com.xx.openApp/.AppEntry;" +
 "end");

navigateToURL(new URLRequest(url));

二、通过AIR 直接使用Intent-based URI打开设置信息界面,这个功能无疑是一个福音啊
url = ("intent:#Intent;" +
 "action=android.intent.action.MAIN;" +
 "category=android.intent.category.LAUNCHER;" +
 "component=com.android.settings/.Settings;" +
 "end");
navigateToURL(new URLRequest(url));
如果要打开具体的某个选项,将.Settings换成下面的这些就行了,不过好像不是全部都能用。wifi设置是可以的。
.AccessibilitySettings
 .ActivityPicker
 .AirplaneModeEnabler
 .ApnEditor
 .ApnPreference
 .ApnSettings
 .AppWidgetPickActivity
 .ApplicationSettings
 .BandMode
 .BatteryInfo
 .BrightnessPreference
 .ChooseLockPattern
 .ChooseLockPatternExample
 .ChooseLockPatternTutorial
 .ConfirmLockPattern
 .CreateShortcut
 .CredentialInstaller
 .DateTimeSettings
 .DateTimeSettingsSetupWizard
 .DebugIntentSender
 .DefaultRingtonePreference
 .DevelopmentSettings
 .DeviceInfoSettings
 .Display
 .DockSettings
 .EditPinPreference
 .IccLockSettings
 .IconPreferenceScreen
 .InstalledAppDetails
 .LanguageSettings
 .LauncherAppWidgetBinder
 .LocalePicker
 .LocalePickerInSetupWizard
 .ManageApplications
 .MasterClear
 .MediaFormat
 .PhysicalKeyboardSettings
 .PrivacySettings
 .ProgressCategory
 .ProxySelector
 .RadioInfo
 .RingerVolumePreference
 .RunningServices
 .SdCardIntentReceiver
 .SdCardSettings
 .SecuritySettings
 .Settings
 .SettingsLicenseActivity
 .SettingsSafetyLegalActivity
 .SoundAndDisplaySettings
 .TestingSettings
 .TestingSettingsBroadcastReceiver
 .TextToSpeechSettings
 .UsageStats
 .UserDictionarySettings
 .Utils
 .WirelessSettings
 .ZoneList
 .ZonePicker
 .bluetooth.BluetoothDevicePreference
 .bluetooth.BluetoothDiscoverableEnabler
 .bluetooth.BluetoothEnabler
 .bluetooth.BluetoothEventRedirector
 .bluetooth.BluetoothNamePreference
 .bluetooth.BluetoothPairingDialog
 .bluetooth.BluetoothPairingRequest
 .bluetooth.BluetoothSettings
 .bluetooth.CachedBluetoothDevice
 .bluetooth.CachedBluetoothDeviceManager
 .bluetooth.ConnectSpecificProfilesActivity
 .bluetooth.DockEventReceiver
 .bluetooth.DockService
 .bluetooth.LocalBluetoothManager
 .bluetooth.LocalBluetoothProfileManager
 .bluetooth.RequestPermissionActivity
 .bluetooth.RequestPermissionHelperActivity
 .bluetooth.SettingsBtStatus
 .vpn.AuthenticationActor
 .vpn.L2tpEditor
 .vpn.L2tpIpsecEditor
 .vpn.L2tpIpsecPskEditor
 .vpn.PptpEditor
 .vpn.Util
 .vpn.VpnEditor
 .vpn.VpnProfileActor
 .vpn.VpnProfileEditor
 .vpn.VpnSettings
 .vpn.VpnTypeSelection
 .wifi.AccessPointDialog
 .wifi.AccessPointPreference
 .wifi.AccessPointState
 .wifi.AdvancedSettings
 .wifi.WifiEnabler
 .wifi.WifiLayer
 .wifi.WifiSettings
 .wifi.WifiStatus
]]>
http://www.523326.com/?feed=rss2&p=352 0
通过外部APP打开AIR流程记录 http://www.523326.com/?p=348 http://www.523326.com/?p=348#respond Tue, 13 Dec 2016 10:02:20 +0000 http://www.523326.com/?p=348 继续阅读 通过外部APP打开AIR流程记录]]> 通常我们可能会通过其他的应用打开需要打开的应用。以前考虑到可以用ANE来解决这个问题。但是其实AIR自身是提供这个功能的。不仅仅可以通过AIR打开其他的APP 还可以通过其他APP打开自身 以及通过网页链接打开自己。

通过ANE来打开如 安卓


//如果配置了不显示air前缀 那么就不需要加

String appPackage = "air.com.xx.myapp";
String appID = "air.com.xx.myapp.AppEntry";

Intent myIntent = new Intent();

myIntent.addCategory(Intent.CATEGORY_LAUNCHER);
myIntent.setAction(Intent.ACTION_MAIN);
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
myIntent.setData(Uri.parse("name=xmk&psd=123"));
myIntent.setClassName(appPackage, appID);
MainActivity.this.startActivity(myIntent);

对于AIR打开其他的APP 以及网页链接打开自己 就需要配置一下了

安卓:


<application>
<activity>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>

<!--myapp是自定义的字符串-->
<data android:scheme="myapp"/>
</intent-filter>
</activity>
</application>

上面的两个Itent 必须加上 本打算精简一下 然而打包的时候 会报错

另外不需要配置也能打开的 点击这里

苹果:


<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>

<!--和安卓一样myapp是自定义的字符串-->
<string>myapp</string>
</array>
<key>CFBundleURLName</key>

<!--此处的就是我们填写在ID标签里面的东西 不需要加上air前缀-->
<string>com.xx.myapp</string>
</dict>
</array>

通过上面的方式配置好后就可以写代码了

不带参数 air内 as3实现。

navigateToURL( new URLRequest("myapp://"));

网页实现

<a href="myapp://">打开app</a>

可以看出 只要使用能够打开url的api 就可以实现这种功能了。

带参数

navigateToURL( new URLRequest("myapp://name=xm&psd=123"));

即在//后面添加的字符串 就是我们传递给app的参数,比如点击网页直接打开app登录。
但是问题来了,air怎样能够获取到参数呢? 不卖关子,同样adobe提供了方法
监听事件InvokeEvent.INVOKE

private function onGetOtherAppInfoHandler( e:InvokeEvent ):void
{
   trace( e.arguments );//此处的arguments就是包含了我们传过来的参数 name=xm&psd=123 同时还有其他的数据。
}
NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE,onGetOtherAppInfoHandler );

注:上述获取参数的方式同样适合于通过原生的方式打开并传参

 

 

 

 

 

 

 

 

]]>
http://www.523326.com/?feed=rss2&p=348 0
一招解决AIR因StageText引发的下拉通知栏不隐藏的问题 http://www.523326.com/?p=342 http://www.523326.com/?p=342#respond Tue, 22 Nov 2016 07:59:47 +0000 http://www.523326.com/?p=342 继续阅读 一招解决AIR因StageText引发的下拉通知栏不隐藏的问题]]> 发现 在AIR23中 如果使用StageText的时候 当输入法面板弹出 或者是 进行输入确定之后,安卓里面的下拉通知栏不会完全隐藏,总是会留下部分,如下图所示labar

这种情况 只有再次手动下拉 然后隐藏才能成功隐藏。

通过测试发现,如果是竖屏的情况下 是不会出现这个问题的。所以考虑是因为AIR在对StageText进行渲染的时候,与横屏 竖屏相关。故采用暴力一点的方式进行解决。

既然竖屏不会出现这个问题,那么我们在xx-app.xml里面的aspectRatio 设置为 <aspectRatio>portrait</aspectRatio>  竖屏。

但是我们的游戏是横屏怎么办。那么就在程序里面加上 stage.setAspectRatio( “landscape” );  这样的话 就不会出现上述的问题了。不过在非真机上测试的话 稍微有点麻烦了。

另一种方案是 降低SDK版本 目前测试AIR22没有这个问题,截止此文章 AIR24 beta版本已经给出,同样会出现这个问题

注:今天(2016/12/14)更新的AIR24版本此问题得到解决 但和AIR22的差异在于 当StageText获得焦点的时候24版本会出现状态栏 而22不会

PS:不过想想 应该可以用ANE来解决。但个人觉得没有必要。是否有其他解决方式,待续…

 

 

 

]]>
http://www.523326.com/?feed=rss2&p=342 0
Iphone锁屏导致Socket断开 http://www.523326.com/?p=337 http://www.523326.com/?p=337#respond Tue, 18 Oct 2016 10:18:18 +0000 http://www.523326.com/?p=337 继续阅读 Iphone锁屏导致Socket断开]]> iphone锁屏之后会将应用的socket断开。当然这样的好处能够更好的省电。

所以当我们解锁之后要么重新登录游戏 要么做短线重连。有时候我们想要使应用在锁屏的状态下也能接收服务端的消息,那么我们可以直接调用as3的一个api

NativeApplication.nativeApplication.executeInBackground = true;

但是这种方式只能让app在锁屏状态下执行3分钟或者其他什么时间 亲测 iphone6 ios9 锁屏下3分多钟 socket照样断开。

好在iphone 允许音频不受此限制 当然还有其他方式 笔者 也是通过网上得知。

于是选择最简单的方式 采用播放无声音频来达到在锁屏状态下永久的socket链接

在xx-app.xml中的InfoAdditions标签里面 加上以下键值对


&lt;key&gt;UIBackgroundModes&lt;/key&gt; 
 &lt;array&gt; 
 &lt;string&gt;audio&lt;/string&gt; 
 &lt;/array&gt; 


&lt;/pre&gt;
private function&nbsp;onDeactivateHandler( e:Event ):void{

//监听到锁屏 便播放无声音频

}

NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, onDeactivateHandler);

当然了 还得监听Event.ACTIVATE事件 即当解锁的时候 咱们得把音频给清除掉。这样就能实现锁屏状态下 也不会断开socket了

——————————————————分割线————————————————————–

遗憾的是 以上方法 在starling中有很大的问题 虽然同样能够达到预防socket 立马断开的问题,但是会出现游戏内表现异常 以至于难以恢复正常的问题

而目前 还未找到方案。(具体异常 是 图层混乱)

测试机型 iphone 5c

//starling中 目前的方案是在DEACTIVATE的时候 将Starling stop掉  ACTIVATE的时候恢复即可解决上诉的问题。不过此时可能会出现的问题就是游戏不同步的情况,所以解决同步就是关键了— 更新于2018/4/8

]]>
http://www.523326.com/?feed=rss2&p=337 0
IOS inhouse方式安装,更新 http://www.523326.com/?p=335 http://www.523326.com/?p=335#respond Tue, 18 Oct 2016 10:03:40 +0000 http://www.523326.com/?p=335 继续阅读 IOS inhouse方式安装,更新]]> inhouse方式打包需要用到企业证书,就不描述了。

当然这个安装也没什么 如果通过数据线那么就是直接用pp助手之类的 即可 包括制定测试UID的app也可以直接用助手安装。

但是通常我们可以通过网页进行安装。

相关代码

itms-services://?action=download-manifest&url=https://域名/xx.plist

在AIR中我们可以直接用navigateToURL 导向即可弹出提示 是否安装

同时这里的关键是https协议 以及.plist文件 plist其实就是一个xml文件


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>https://xxx/xxx.ipa</string>
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>url</key>
<string>https://xxx/xxx_57.png</string>
</dict>
<!-- full-size-image: the large 512x512 icon used by iTunes. -->
<dict>
<key>kind</key>
<string>full-size-image</string>
<key>url</key>
<string>https://xxx/xxx_512.png</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string></string>
<key>bundle-version</key>
<string>1.0.0</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string></string>
</dict>
</dict>
</array>
</dict>
</plist>

plist里面设置的 图片其实可以不要,但是如果你想让应用在下载的过程中显示你的logo那么最好加上 否则将会显示默认的图标

 

]]>
http://www.523326.com/?feed=rss2&p=335 0
AIR for IOS 无法请求http协议的解决办法 http://www.523326.com/?p=333 http://www.523326.com/?p=333#respond Tue, 18 Oct 2016 09:43:29 +0000 http://www.523326.com/?p=333 继续阅读 AIR for IOS 无法请求http协议的解决办法]]> 最近发现同样的项目 放到不同iphone上面有的设备没法成功的请求http协议 sockt正常。一度怀疑设备问题,哪只同样的设备也会出现。

最终发现是IOS系统版本问题。原来在IOS9的时候增加了 安全限制 对于https协议的请求是完全可以的。但是有时候也不可能为了这个而去修改http为https。好在apple提供了一个解决方案。

在air的 xml配置里面的 InfoAdditions 标签中加入键值对 即可


<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

]]>
http://www.523326.com/?feed=rss2&p=333 0
Adobe Air For Android 接入Amazon Iap 流程整理 http://www.523326.com/?p=320 http://www.523326.com/?p=320#comments Fri, 25 Mar 2016 03:42:46 +0000 http://www.523326.com/?p=320 继续阅读 Adobe Air For Android 接入Amazon Iap 流程整理]]> Amazon Iap即Amazon的内支付。可实现通过调用amazon的支付接口来进行内购。

而amazon本身提供了iap ANE 包括GameCircle,amazon Ads。GameCircle类似于IOS的GameCenter。后面的是广告。这两个由于项目没用到,也没接入。主要是接入IAP

就Amazon而言,如果要上Amazon Appstore的话,并且没有用到支付,那么也可以不用接入,但是如果用到了支付,那就一定要接入他的支付SDK了。下图是我咨询的结果  : amazoniapimg00

然而,纵然Amazon是一个大平台,而且还主动提供了ANE这不是很爽歪歪的事儿吗?然而值得一提的是,Amazon的咨询服务以及文档确实不敢恭维。没有在线咨询,有问题只能通过邮件,或者FAQ。

闲话不多说了,下面开始记录接入的具体过程:

注册账号什么的就不多说了,www.amazon.com

注册好开发者账号之后 就是下载ANE

https://developer.amazon.com/public/resources/development-tools/sdk 这里面有个列表里面包含了各种SDK

以及ane接入的参考文档

https://developer.amazon.com/public/apis/earn/in-app-purchasing/docs-v2/using-the-iap-plugin-for-adobe-air

下载的ANE 压缩包里面包含了V1 和V2版本。文件夹是独立开的。使用最新V2即可。但是V2版本完全没有完整项目Demo。所以就得到上面提供的参考文档里面去参考参考。

当然也很简单,直接复制即可

AmazonIapV2.getUserData();

即获取到用户数据,因为要使用iap你得先下载Amazon Appstore,所以这个用户数据就是你的appstore里面的用户数据。获取之后会有一个回调,一些东西可能会用到,比如做数据校验什么的。

var request:SkuInput = new SkuInput();

request.sku = "MAS-123456";

var requestOutput:RequestOutput = AmazonIapV2.purchase(request);

上面的代码就是支付相关的东西,sku就和其他平台的计费点ID一样,这个是在创建项目之后-添加商品信息时会创建,自定义。

同样有返回。

 

AmazonIapV2.getProductData(request);

获取商品信息,这个不用多说

AmazonIapV2.getPurchaseUpdates(request);

说说这个,这个的作用就是,如果我们做的单机游戏,那么如果我们有一项功能是玩家购买之后就能够永久无限红心。当然我们的数据可能是保存在本地的,但是如果玩家换了手机或者其他什么的导致本地数据丢失。那么我们就需要用到这个接口了,这样就相当于Amazon用我们在appstore里面的账号在Amazon的服务里端存储了我们所购买的这个权限,一般这个就是Entitlement(即授权类商品,一次购买享受终生)。这样的话调用这个接口会返回一串数据,可以根据提供的商品ID进行筛选。从而得到当前玩家是否购买过这个权限。很实用 不是。

 

AmazonIapV2.notifyFulfillment(request);

这个没怎么用,即通知Amazon支付已经完成。可能情况是对于购买功能需要服务器参与的项目会用到。

 

其实我们会发现这个版本的ANE没有初始化接口,是的。确实没对外开放,而是在ExtensionContext被创建的时候就自动执行了初始化。所以按照上面的一步一步的做完之后,接着就是设置xx-app.xml.

不过这里的文档里面并没有写xml的相关配置,如果我们以为不添加的话,到最后支付能成功,但是绝对没有回调,如果我们复制v1版本的权限,到最后肯定会报错。

所以我们只能跑到andorid接入文档里面去找如何配置。如下  权限就只添加INTERNET即可


<application>

<receiver android:name="com.amazon.device.iap.ResponseReceiver" >

<intent-filter>

<action

android:name="com.amazon.inapp.purchasing.NOTIFY"

android:permission="com.amazon.inapp.purchasing.Permission.NOTIFY" />

</intent-filter>

</receiver>

</application>

完成上面这些之后,就可以进行测试了。V2版本提供的是AppTester,和V1版本有区别。我们先要去下载一个Amazon Appstore,然后去下载AppTester。

安装好之后,咱们就去创建项目.

amazoniapimg0

测试的时候可以只填写基本信息即可,如果把所有带星号的填写完就会有一个绿色的勾勾。

Sku就是我们计费点的ID,需要用。后面描述 图像什么的 都是在购买界面会看到

amazoniapimg1

 

amazoniapimg2

创建好商品之后可以点击下载JSON数据文件,这个用于沙盒测试,正式测试或者提交版本审核的时候 一定要将商品提交一下,这个和应用是分开的。将下载好的amazon.sdktester.json直接复制到安卓设备SD卡根目录即可。

然后就可以执行支付测试啦。

调用支付接口不出意外 就会弹出这样的窗口,然后点击GetItem 会进行购买 成功之后关闭界面会触发购买的事件。

amazoniapimg3

接着打开AppTester 进入 In-App Purchasing API 找到 Manage Transactions  点开之后 如果看到这样一串数据那么证明支付成功了。

amazoniapimg4

沙盒测试已经成功了,接下来就是做一系列的其他事儿了。完成没完成的一些信息填写,上传APK之类的。

做完之后,可以对游戏进行 动态应用测试 动态测试 和 google play的测试基本类似,即发布一个beta版本然后邀请amazon用户进行测试。填写邀请者邮箱之后,amazon会发送一封邮件给测试者,此过程耐心等待,估计收到邮件的时间会有点长

下图即收到的邮件,有很多种语言  如 日语,德语,法语之类的 就是没有汉语!!呵呵!

amazoniapimg5

 

上面的网址 任意选择一个就好,以.com为例进入后如下所示

 

amazoniapimg6

 

点击GetApp 那么这个App 就同步到账号的云端去了

 

然后就可以到appstore里面的my apps 去下载这个app进行测试即可。

然而在测试的时候,发现一个问题是,调用支付接口,始终不能成功调出支付界面,但是有加载的进度,加载进度完成之后,就没反应了。貌似也有网友遇到这个情况,后来索性直接提交审核,并且审核还比较快。基本就几个小时,估计时差原因,可能就一天时间。最后就通过啦,可以在商店里面搜索到了。

PS:值得注意的是。

如果你的账号是开发者账号那么你完全可以在商店里面搜到。

如果账号所注册的地区包含在你App所售卖的地区也可以搜索到

但是账号所注册的地区未包含在你APP所售卖的地区,那么就搜索不到的。比如中国地区。

下图即上架之后能调用出来的支付界面,和沙箱测试的是不一样的。同时不同手机貌似也有不同的UI差别

amazoniapimg7

]]>
http://www.523326.com/?feed=rss2&p=320 6