W項目資料彙總 (轉)

W項目資料彙總

quick

注:以下資料在實際寫代碼過程中都不如看quick源代碼來得直接有效!

quick官網,主要用於下載,教程有一定參考價值: http://cn.cocos2d-x.org/?v=CN

quick-cocos2d-x 文檔,很全面,配置環境時需要參考: http://quick.cocoachina.com/wiki/doku.php?id=zh_cn

quick-cocos2d-x API 文檔,有一定參考價值: http://quick.cocoachina.com/wiki/doku.php?id=zh_cn:api

Quick-Cocos2d-X 捋一捋框架流程,說了一些重點需要注意的框架方面的問題: http://www.cocos2dev.com/?p=535

quick github: https://github.com/chukong/quick-cocos2d-x

luaj是這個博主寫的: http://dualface.github.io

Quick-Cocos2d-x 加密: http://cn.cocos2d-x.org/tutorial/show?id=1447 http://cn.cocos2d-x.org/tutorial/show?id=1507

Quick在Cocos Code IDE中實現代碼提示: http://cn.cocos2d-x.org/tutorial/show?id=1715

Android FATAL 11無堆棧信息調試方法:

  cd $ANDROID_NDK_ROOT

adb logcat | ./ndk-stack -sym  /Users/hellosure/Develop/pincollage/branches/wallet_1-1-6-BRANCH/frameworks/runtime-src/proj.android/obj/local/armeabi/

動態更新: http://my.oschina.net/SunLightJuly/blog/180639 https://groups.google.com/forum/#!topic/quick-x/ni6Nf50jzfo http://my.oschina.net/u/1785418/blog/283043 http://zengrong.net/post/2131.htm https://github.com/chukong/quick-cocos2d-x/tree/master/samples/2048

quick-cocos2d-x 多分辨率適配詳解: http://quick.cocoachina.com/?p=1436

animation

animation的效果,很容易通過transition.lua實現

lua

Lua Style Guide,編程風格: https://github.com/Olivine-Labs/lua-style-guide

Lua 5.1 參考手冊,用的不多,需要知道什麼寫法直接google再終端試一下即可: http://www.codingnow.com/2000/download/lua_manual.html

Lua的點號和冒號用lua進行面向對象的編程,聲明方法和調用方法統一用冒號,對於屬性的調用全部用點號。

Lua 中關於函數稍微難以理解的是函數也可以沒有名字,匿名的。當我們提到函數 名(比如 print),實際上是說一個指向函數的變量,像持有其他類型值的變量一樣:

   a = {p = print}
a.p("Hello World") --> Hello World
print = math.sin -- `print' now refers to the sine function

a.p(print(1)) sin = a.p sin(10,20)

--> 0.841470
-- `sin' now refers to the print function -->10 20

cocos2dx

cocos2dx文檔,沒怎麼看過: http://cn.cocos2d-x.org/doc/cocos2d-x-3.0/index.html

Parse

parse文檔,主要就是看這個: https://www.parse.com/docs

Offerwall

Fyber: http://developer.fyber.com/content/android/offer-wall/offer-api/

SponsorPay: https://github.com/SponsorPay/mobile-sdk

TapJoy: https://github.com/kalpeshhpatel/cordova-tapjoy-plugin

Aarki: https://portal.aarki.com/account/library https://portal.aarki.com/docs/webapi/

Adcolony: https://github.com/AdColony/AdColony-Android-SDK/wiki/API-Details

Google Play

develop console https://play.google.com/apps/publish/?dev_acc=00903166301840771912#AppListPlace

crash https://play.google.com/apps/publish/?dev_acc=00903166301840771912#ErrorClusterDetailsPlace:p=gift.wallet&et=CRASH&sh=false&lr=LAST_7_DAYS&ecn=Native+crash&tf=unknown&tc=unknown&tm=unknown&nid=251b7bf0b0d31bd2&an&c&s=new_status_desc

Hacker Defense

emulator: http://stackoverflow.com/questions/2799097/how-can-i-detect-when-an-android-application-is-running-in-the-emulator

  "google_sdk".equals(Build.PRODUCT) || "sdk".equals(Build.PRODUCT) || "sdk_x86".equals(Build.PRODUCT) || "vbox86p".equals(Build.PRODUCT)

Build.FINGERPRINT.contains("generic")

Genymotion

Installing ARM Translation and GApps http://forum.xda-developers.com/showthread.php?t=2528952

SEO

https://www.woorank.com

appannie

http://www.appannie.com/apps/google-play/app/gift.wallet/?account_id=222547

Texture

用來將多張圖打包成一張大圖plist

這種技術叫做CSS Sprite,本質是:

這種技術有好處也有壞處,好處是由於圖片都放在一起,請求時只需請求一張圖片,減少了與服務器的交互次數,提高了頁面性能是它最大的好處,還可以解決hover延遲加載的問題。能減少圖片的字節,曾經比較過多次3張圖片合併成1張圖片的字節總是小於這3張圖片的字節總和。還有就是更換風格方便,只需要在一張或少張圖片上修改圖片的顏色或樣式,整個網頁的風格就可以改變。維護起來更加方便。

壞處就是不好控制,擴展性不太好,以後有改動,可謂是牽一髮而動全身,而且有時會因爲屏幕分辨率不同出現背景斷裂現象。CSS Sprites在開發的時候比較麻煩,你要通過photoshop或其他工具測量計算每一個背景單元的精確位置,這是針線活,沒什麼難度,但是很繁瑣;幸好騰訊的鬼哥用ADOBE AIR開發了一個CSS Sprites 樣式生成工具,雖然還有一些使用上的不靈活,但是已經比photoshop測量來的方便多了,而且樣式直接生成,複製,拷貝就OK!

技術選型 - Hybrid App

最開始想參考的是FeaturePoint,它是用hybrid app的方式做的,因此調研了一些關於hybrid app的知識。

hybrid app 的技術選型包括兩個方面:

  1. 與native mobile的交互層。

主流選用cordova,而titanium相對而言不夠成熟,學習曲線高。

  1. 前端ui framework展示層。

在整個系統中,服務提供方爲backend,1位於middle,2位於frontend。

對於前端技術選型,可選的方案有:

(1) ionic

ionic提供了ui,mvx集成了angular。

雖然angular做spa有天然優勢,不過上手沒有jquery快,而且更適合做更復雜的應用,另外angular對代碼侵入性較大如果未來想把它換掉那基本上只能重新開發。再就是感覺ionic的document不是非常詳細,ui也沒有感受到太多優勢,ionic creator對html原型快速搭建有用不過沒有必要使用它,另外對於它宣稱的性能優勢這方面估計並不能對咱們應用帶來多少實際好處。

(2) sencha touch

定製化比較高,對於當前應用來說稍顯重。

(3) jquery mobile

jqm被詬病較多的在於兩個方面,一是webapp中不能忍它庫文件太重,二是ui模版味太重。對於第一點在hybridapp中可以避免,對於第二點可以藉助bootstrap等ui框架來優化。

另外,jquery mobile和ionic都提供builder工具快速drag-and-drop,export可以快速得到html,可以減輕頁面初期開發工作量。

(1) jquery mobile

codiqa,另外可導入用themeroller自定義的theme http://themeroller.jquerymobile.com

(2) ionic

ionic-creator https://creator.ionic.io

hybrid app的選型結果:

  cordova + jquery mobile + bootstrap

但是後來把hybrid app方案斃掉的原因是: hybrid app有個最大的問題就是:安全性。hacker是可以從apk中獲取並反編譯得到源代碼的,這個太恐怖了。可能被很快的複製,也可能被釣魚。在產品角度又想跨平臺,因此採用lua來做,lua通過xxtea算法加密,再就是lua有動態更新這點很爽。

bybrid app用來自己做app快速上線,還有有點用處的,但是實際項目還是謹慎。

Cordova

http://rensanning.iteye.com/category/305123

Android

在android中彈出activity顯示market

   mActivity.runOnUiThread(new Runnable() {
	@Override
	public void run() {
		new AlertDialog.Builder(mActivity)
		.setMessage("Google play services out of date.")
            	.setPositiveButton("Update", new OnClickListener() {

		@Override
		public void onClick(DialogInterface dialog, int which) {
			mActivity.startActivity(new Intent(Intent.ACTION_VIEW,
							Uri.parse("market://details?id=com.google.android.gms")));
		}
	}).show();
	}
});

handler

java.lang.RuntimeException: Can’t create handler inside thread that has not called Looper.prepare() android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 解決方式都是放到ui線程中:

   mActivity.runOnUiThread(new Runnable() {
	@Override
	public void run() {
		myDialog = ProgressDialog.show(mActivity, "title", "body", true);
	}
});

另外,handler是用來在UI線程中修改界面的。

轉菊花

   class MyTask extends AsyncTask<Void, Void, Void> {
 ProgressDialog pd;
    @Override
    protected void onPreExecute() {
      super.onPreExecute();
       pd = new ProgressDialog(MainActivity.this);
       pd.setMessage("loading");
       pd.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
      // Do your request
    }

    @Override
    protected void onPostExecute(Void result) {
      super.onPostExecute(result);
      if (pd != null)
      {
         pd.dismiss();
      }
    }
  }

調試記錄

http header

lua中cc.httprequest在模擬器中是會到CCHTTPRequest.cpp 但是在安卓真機上會到CCHTTPRequestAndroid.cpp 然後它裏面會調用框架的QuickHTTPInterface.java

從CCHTTPRequestAndroid.cpp的start方法中可以看到,比如對於header的處理,必須用=分割: int pos = val.find(‘=‘); 然後去調用addRequestHeaderJava,這個也就是QuickHTTPInterface.java中的addRequestHeader方法

最終達到的效果就是CCHTTPRequestAndroid.cpp和QuickHTTPInterface.java都不改,在lua中迎合它代碼的邏輯。

注意,CCHTTPRequest.cpp和CCHTTPRequestAndroid.cpp對HTTP的處理邏輯是不同的,以後直接在真機中調試比較好。

https

發現對https的api發送接收有問題。解決方案應該是把ssl關掉:比如python中

  httpClient = httplib2.Http(disable_ssl_certificate_validation=True)
promoeUrl = "https://api.zhaowowa.com/api/v1/promote"

這個問題的最終解決方法是:官網上說明是 https://developer.android.com/training/articles/security-ssl.html 實際解決是信任所有Https: http://www.nakov.com/blog/2009/07/16/disable-certificate-validation-in-java-ssl-connections/

getfollow那裏實現方式是改了quick cocos2dx框架底層的c++配置,這種方式簡單,但是不可擴展。

多分辨率適配

在一個分辨率中擺放東西是很簡單的。但是放到多設備上就會有各種問題。

  1. 按比例放置在640*1136,然後放到安卓大設備就會和設計圖有點出入,然後圖片會模糊一點,這是這種方案的缺點。 getlikes當時是這種方案做的。

  2. 在1440*2560中按比例放置,或者按絕對座標放置。然後這是在一個layer中放sprite,因爲這個分辨率是最大的了,放到其他分辨率的時候,就把這個layer整體scale縮放,這樣就不會有1的那種和設計圖不一致的問題,但是有另外的一個問題就是:可能有黑邊、或者界面在一個方向上出去了。因爲縮放是按照寬或者高來的,如果按照寬來,那麼在不同的設備上,高就有可能黑邊或者出去。反之如果按照高來,那麼在不同設備上,寬就可能黑邊或者出去。 getfollows是這種方案做的,貼邊的工作非常煩人,最好能避免。這裏還有一個技巧,就是底部的一排按鈕肯定必須完美佔滿,所以這排按鈕是在縮放的layer之上的,就是layer不管怎麼縮放,在layer縮放完了之後再把底部一排按鈕加上去。

  3. no border的方案,這種團隊裏還沒有采用過,就是設計的時候,就在一個方向上給出餘量,比如在高上給出餘量,那麼在縮放以寬爲基準就是把寬完美填滿時,高可以滿足各種設備:都不會出現黑邊,且就算超過了也不會影響效果。這種需要設計師來考慮怎麼設計比較合適。遊戲中很多是這樣做的,因爲遊戲的背景出去一點沒有什麼關係。

在代碼的組織上,先放一個layer,然後在上面放置各種sprite,這些sprite可以把一些有關聯的封裝在一起,這樣縮放時就是一個整體了。在addchild時可以在第二個參數設置是哪個層級。

座標原點肯定是在左下角,但是錨點可以放置在不同的位置,比如放置在最上方的中間位置。這樣就算縮放,兩邊的黑邊是一樣寬的。

一組組件封裝在一起,其座標是組件內部的座標系來定位。然後再把組件羣一起調價到layer中。

框架源代碼

lua其實就是把c++代碼封裝了一下,在quick2.2的版本中,可以看得很清楚,比如display.lua中的 function display.newLayer() 就是調用的c++代碼CCLayer,把它創建了一下然後返回一個CCLayer對象,然後在使用的時候就可以根據這個創建出的對象來調用CCLayer.h中提供的方法,比如: local layer = display.newLayer() layer:setColor(xxx) 注意,要用冒號,另外setColor必須在CCLayer.h中提供。

然後在quick3.2版本中,framework本身的封裝更復雜了,比如: function display.newLayer() return cc.Layer:create() end 那麼這個cc.Layer是什麼呢?在quick/lib/lua_bindings/auto/lua_cocos2dx_auto.cpp中:

   int lua_cocos2dx_Layer_create(lua_State* tolua_S)
{
    int argc = 0;
    bool ok  = true;

#if COCOS2D_DEBUG >= 1
    tolua_Error tolua_err;
#endif

#if COCOS2D_DEBUG >= 1
    if (!tolua_isusertable(tolua_S,1,"cc.Layer",0,&tolua_err)) goto tolua_lerror;
#endif

    argc = lua_gettop(tolua_S) - 1;

    if (argc == 0)
    {
        if(!ok)
            return 0;
        cocos2d::Layer* ret = cocos2d::Layer::create();
        object_to_luaval<cocos2d::Layer>(tolua_S, "cc.Layer",(cocos2d::Layer*)ret);
        return 1;
    }
    CCLOG("%s has wrong number of arguments: %d, was expecting %d\n ", "create",argc, 0);
    return 0;
#if COCOS2D_DEBUG >= 1
    tolua_lerror:
    tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Layer_create'.",&tolua_err);
#endif
    return 0;
}

那麼可以看到,創建的是cocos2d::Layer

在cocos2d.h中引入了cocos2d所有的c++代碼。

Parse

core中提供data存儲/config配置 push中提供消息推送 analytics中提供統計展示按照document中說的去做就可以。

比如首頁中的操作按鈕等這些信息都可以作爲config在parse中配置:在lua中通過parse.lua中的getStringConfig(key)等三個get方法來獲取。

統計也可以在parse中方便的統計,需要在代碼中進行打點:Parse.trackEvent(‘ClickOperate’, {target = name})

另外,對於config,lua中放默認值,以免用戶網絡不好的情況下取不到數據。然後最新的數據可以從parse中getStringConfig(“OperateList”)獲取。

登錄註冊管理

應用初始化的時候parse用戶登錄,如果登陸了說明是個原來有的用戶(可能是匿名的也可能是實名的,其實兩者沒有本質區別,都有parseuserid)。如果登陸了parse,然後看是否在ifun中註冊過,如果註冊過就通過parseuserid去parse中獲取name/email再去ifun中login。如果沒有註冊過,就去ifun中signup,name/email通過parseuserid構造。

如果沒有登錄parse,就構造匿名用戶登錄parse,這樣在parse的user表中就有了一條記錄,然後就可以獲取到parseuserid,然後同樣的用它來構造name/email去ifun中signup(signup之後都自動login了)。

後臺api發佈

chrome中的getpost工具

接入fyber調用順序

  1. init階段

整個應用的入口是wallet.onCreate(java)—> SPHelper.init(java)—> 開始load lua代碼,入口是MyApp.run(lua)—> SPHelper.init(lua)—> SPHelper.initWithOptions(java)並且這裏會指出如果積分牆被點擊了需要回調的lua方法是誰(這個會在第3步被調用)

  1. show階段

當界面中的list item被點擊時,會觸發SPHelper.showOfferwall(lua),然後它會調用SPHelper.showSponsorPay(java)起一個ui線程顯示出積分牆。

  1. 點擊階段

當積分牆中的項目被點擊實現後,觸發java中的listener,然後調用lua中第1步中提到的回調方法

在分析這個流程的時候,要注意一點是,積分牆界面是java sdk所以是java環境,其他界面是lua環境,所以存在java和lua跳來跳去的情況。

-EOF-

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章