2012/03/17

iOS 加入 Vpon + AdWhirl

AdWhirl我們在前一篇有介紹過了,主要是可以一次輪播好幾種Ad (AdMob、IAd、Google AdSense),今天我們試著來接Vpon。

早先接Vpon比較麻煩,還要自己在AdWhirl內新增Custom Event,然後自己實作event的內容,但現在Vpon已經有跟AdWhirl整合在一起了,連結在此 (注意下面網址的差異):

AdWhirl http://www.adwhirl.com/
Vpon + AdWhirl http://med.adon.vpon.com/

使用第二個連結來註冊,進去後就會發現已經有現成的欄位,只要填上Vpon的Key就可以了!



程式的部份
1. 把Vpon SDK 拉到 project內,並加入framework。參考iOS App + Vpon 廣告商

2. 加入AdWhirl的adapter

3. AdWhirl network type 裡面要有Vpon的

4. 新增AdWhirlView到想呈現廣告的地方。參考在iOS App 中加入 AdWhirl (以AdMob為例)

5. 跑跑看摟


參考資料
AdWhirl iPhone SDK Manual
IPhone AdWhirl SDK Document - Vpon官方文件
Google AdWhirl with Vpon » 蛙齋 - Android平台

2012/03/07

iOS App + Vpon 廣告商

可以參考官方文件 - IPhone SDK,寫得還算清楚

1. 註冊Vpon

2. 新增應用程式與版位
和 AdMob 不一樣的地方,Vpon 在同一個應用程式內可以規劃不同版位。例如:首頁的banner、列表上的banner,使用者可以藉此觀察哪個版位曝光率比較高。
每個版位都有自己的版位ID,記下來等下程式裡面會用到。

3. 下載SDK
For iPhone最新的版本為 3.2.3


在 UIScrollView 裡面的 UITextView 會 auto scrolling?

很奇怪的問題,我把 UITextView 放在 UIScrollView 裡面,當我 assign 文字給 UITextView 時,捲軸會自動跳到 UITextView 的位置!

Google 一下,發現其他人也會遇到一樣的問題:
好像是 assign 的時候觸發 becomes first responder 所造成的


試了網路上的解法都沒有用,最後我的做法是:
  1. 把原本畫面上的 UITextView 改用 UIView 取代
  2. 自己 alloc 一個 UITextView 然後把 text 與 style 都設定好
  3. 最後用 addSubview 的方式加到畫面裡
UITextView *txtView = [[UITextView alloc] initWithFrame:self.tempView.frame];
txtView.text = @"Message what you want";
txtView.backgroundColor = [UIColor clearColor];
txtView.editable = NO;
txtView.font = [UIFont systemFontOfSize:16];
[self.view addSubview:txtView];
[txtView release];

It's work! 供大家參考一下

2012/03/04

實現網頁即時傳訊 Web instant message (IM)

最近想弄一個Web IM,在web上做即時聊天有一定的困難,因為受限在http協定原生的特性:
client:request -> server:response -> 結束
傳輸一定要從client開始,而且一來一往誰也不能多,想做到server push有一定的難度,不像tcp raw socket自由度那麼高。


早期的聊天室會使用polling的方式定期 refresh (post back) 來更新頁面,同步的時間取決於refresh的頻率,但server loading也隨著頻率上升而增加。後來有了Ajax,頁面更新不用再一直閃爍,但還是有原本耗資源的問題。

近期較廣泛被使用的是Ajax搭配long polling,做到省資源又可以與server同步的效果。
Polling就是client定期的發request,long polling就是定期發request,但server不馬上response,而是等到有需要的時候再response (例如有人傳新訊息給你時),通常browser timeout都蠻長的,所以這段等待的期間相對polling就很省資源。如果還不是很懂,可以參考這一篇:Browser 與 Server 持續同步的作法介紹。

要做到long polling這個效果需要server support,server必需要把request object先keep住,等到有需要的時候再抓出來回應給client。用Tornado來舉例,就是RequestHandler被call時,先把Handler存起來,等到時機到了再執行finish() function。


下面列出幾種IM的 model,我想實現的是最後一種 ── 跨平台而且server可以隨著loading scale-up。

2012/03/03

在iOS App 中加入 AdWhirl (以AdMob為例)

什麼是AdWhirl?
簡單來說就是一個廣告容器,讓你可以依據自己設定的百分比來播放各家廣告。你可能想知道哪種類型的廣告收益較大,較容易受到使用者點閱,藉由AdWhirl就可以統計出來。


我們先試著把AdMob整合到AdWhirl裡:

在開始之前請先參考:在 iOS App 加入 AdMob 廣告,把AdMob先申請起來

1. 申請AdWhirl
填寫一些基本資料

2. 加入Application
設定App的名字、URL、背景顏色。


在 iOS App 加入 AdMob 廣告

下面把我在iOS App上申請、使用AdMob的過程紀錄起來

1. 需要有一個google account

2. 用google account登入,開始申請AdMob。填入一些基本資料。

3. 設定帳戶資料,選擇付款方式(我是用Paypal)
帳戶類型:個人
企業名稱:(個人姓名)
本地稅務ID:(身分證字號)
付款詳細資料:輸入Paypal的帳號

4. 新增網站/應用程式
選擇應用程式類型為iPhone應用程式,並填一些App的基本資料

5. 進到應用程式設定頁面,記下自己的發佈商ID,等下會用到
可以依據自己的需求設定廣告的文字/背景顏色

2012/02/29

Tornado web framework + HTTPS

從官網得知 Tornado web framework 原本就有支援SSL協定
HTTPServer can serve SSL traffic with Python 2.6+ and OpenSSL. To make this server serve SSL traffic, send the ssl_options dictionary argument with the arguments required for the ssl.wrap_socket method, including “certfile” and “keyfile”:
    HTTPServer(applicaton, ssl_options={
        "certfile": os.path.join(data_dir, "mydomain.crt"),
        "keyfile": os.path.join(data_dir, "mydomain.key"),
    })

SSL Sample
import os
from tornado.httpserver import HTTPServer
from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop

class MainHandler(RequestHandler):
    def get(self):
        self.write("Hello world!")

def main():
    application = Application([
        (r"/", MainHandler), 
    ])  

    http_server = HTTPServer(application,  
        ssl_options={
            "certfile": os.path.join(os.path.abspath("."), "test.crt"), 
            "keyfile": os.path.join(os.path.abspath("."), "test.key"), 
        }   
    )

    http_server.listen(8080)
    IOLoop.instance().start()

if __name__ == "__main__":
    main()

過程中需要ssl certificate 與 private key,可以用openssl產生,不過過程很繁雜,建議可以利用online tool:Create self-signed SSL certificates online

測試
開啓 http://localhost:8080 遇到錯誤:
ERROR:root:Exception in I/O handler for fd 3 Traceback (most recent call last): File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/tornado-2.0-py2.6.egg/tornado/ioloop.py", line 287, in start self._handlers[fd](fd, events) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/tornado-2.0-py2.6.egg/tornado/stack_context.py", line 159, in wrapped callback(*args, **kwargs) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/tornado-2.0-py2.6.egg/tornado/httpserver.py", line 294, in _handle_events except ssl.SSLError, err: AttributeError: 'module' object has no attribute 'SSLError' 

少了甚麼module嗎?
重裝openssl 0.9.8t -> 不行


安裝ssl package
# pip install ssl
ValueError: This extension should not be used with Python 2.6 or later (already built in), and has not been tested with Python 2.3.4 or earlier.
python 2.6以後的版本已經內建了


安裝pyopenssl package
# pip install pyopenssl
安裝成功,但結果還是一樣。看起來該有的都有了阿!


最後把deploy系統從mac os換到centos 5,一模一樣的步驟就...成功了!上面的問題至今未解...


如果看到這個warning,表示client的request是用http不是https,並不是server的問題唷!
WARNING:root:SSL Error on 7: [Errno 1] _ssl.c:490: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request