顯示具有 ios 標籤的文章。 顯示所有文章
顯示具有 ios 標籤的文章。 顯示所有文章

2013/08/26

利用 ImageMagick 製作 App 所需的 icon size

以下是 Android / iOS 兩種平台的 icon 開發指南,裡面有條列解析度/機型對應的 icon size


在此我是利用 PhoneGap 建立 mobile 專案,預設就有一組 icon,我們只要準備相同解析度的圖片覆蓋過去就可以了

Android 各解析度 icon 分別放置在不同的資料夾底下
  • res/drawable/logo.png 96x96
  • res/drawable-xhdpi/logo.png 96x96
  • res/drawable-hdpi/logo.png 72x72
  • res/drawable-mdpi/logo.png 48x48
  • res/drawable-ldpi/logo.png 36x36

iOS 擺放 icon 的位置在專案資料夾底下的 {project-name}/Resources/icons/
  • icon-72.png 72x72
  • icon-72@2x.png 144x144
  • icon.png 57x57
  • icon@2x.png 114x114


利用 ImageMagick 搭配 shell script 就可以一次轉出所有解析度的 icon

安裝 ImageMagick 目前最新版本 6.8.6-8
$ ./configure --with-png=yes
$ make && make install

轉換解析度
$ convert logo-src.png -resize 72x72 logo-72.png

批次轉換 script: convert.sh
#/bin/sh

res=(144 114 96 72 57 48 36)
for i in "${res[@]}"
do
    echo "convert icon for ${i}x${i}"
    convert logo-src.png -resize ${i}x${i} logo-${i}.png
done

記得 icon 的來源檔案解析度至少要大於144,轉出來才不會糊掉

2013/08/19

PhoneGap + Sencha Touch Quickstart (Part III)


透過前兩篇(Part I, Part II)我們分別建立的 PhoneGap 專案與 Sencha Touch 專案,再來就是將他們合併,也就是讓 Sencha Touch 透過 PhoneGap run 在模擬器上



Part III:Sencha Touch 與 PhoneGap 的結合


1. 把 Sencha Touch web page 複製到 PhoneGap

我們可以把 PhoneGap 想像成一個載體 (webview),上面運行著 Sencha Touch web page,而透過 javascript 可以和底層的 device 溝通。

所以最快的方式就是把 build 出來的 Sencha Touch package 複製到 PhoneGap 底下的 www 資料夾,然後重新 build PhoneGap,再重新 build 各平台的專案。
(在此為了簡化示範流程,才會用手動的方式複製,真正在開發時應該使用 ST project 內的 build.xml 去描述此步驟)

編譯出來的 ST 程式碼
 
Copy 到 PhoneGap 的www
注意來源跟目的,一個是 ST 一個是 PhoneGap。
另外原本在 www 裡面的 config.xml 要留著,編譯時會用到!
$ cp -a SenchaTouch/hello/build/HelloWorld/package/* PhoneGap/hello/www/
$ phonegap build ios
$ phonegap build android

按照 Part I 的方式分別編譯 ios/android 並運行
Good! It works.


2. 加入 PhoneGap deviceready event

由於 Sencha Touch demo 程式中並未使用到 PhoneGap 提供的 API,為了證明它可以work,所以我們要修改 Sencha Touch project 中的 index.html,加入很簡單的程式碼:當 deviceready event 觸發時就在 debug window 印出 deviceready (註:device ready 就表示 API 可以呼叫了)
加在 <head></head>之間,include "touch/microloader/development.js" 之後
<script type="text/javascript" src="phonegap.js"></script>
<script type="text/javascript">
document.addEventListener('deviceready', function() {
  console.log('deviceready');
}, false);
</script>

重新編譯 Sencha Touch project 後產生 package,將其 copy 到 PhoneGap ... (重複步驟1)
還記得編譯 ST 的指令嗎
$ sencha app build package

若看到 demo 網頁出現,同時 console 也跑出 deviceready 字眼,表示我們成功結合 Sencha Touch 與 PhonaGap 了!

iOS 訊息
2013-08-19 23:51:55.016 HelloWorld[71208:c07] deviceready
Android 訊息
I/Web Console( 1291): deviceready at file:///android_asset/www/index.html:61

註:
ios 的 debug window 在 Xcode 裡面
android 可以透過下面指令觀看整個系統的 log
$ adb -s emulator-5554 logcat

PhoneGap + Sencha Touch Quickstart (Part II)


上一篇講完了如何建立 PhoneGap 專案並且 run 在模擬器上,再來要講 Sencha Touch 這個 mobile web framework



Part II: 建立 Sencha Touch 專案


1. 下載 Sencha Touch SDK 與 Sencha Cmd

SDK 有分兩種版本 GPL 與 Commercial,目前最新版本為 2.2.1 在此下載
解壓縮開之後可以得到 touch-2.2.1 資料夾

Sencha Cmd 有 Mac 專屬版本,最新版本為 3.1.2 在此下載
下載後是個安裝檔,請指定安裝路徑。安裝後請把 sencha 執行檔的路徑加到環境變數 $PATH

試一下是否 work
$ sencha help | head -n 1
Sencha Cmd v3.1.2.342


2. 建立專案

利用 Sencha CMD 來建立專案,請指定 sdk 路徑到剛剛下載的 touch-2.2.1,HelloWorld 為專案名,"./hello"是專案建立的位置
$ sencha -sdk ~/Development/touch-2.2.1 generate app HelloWorld ./hello
產生專案資料夾 hello,裡面的 index.html 就是 app 的首頁
app.js 是程式進入點,app 資料夾依據 MVC 的分類放置自己的程式碼
resources 擺放 css, image, icon 這些檔案
touch 放置 Sencha Touch 原始碼,編譯時會引用


3. 編譯專案

夠過編譯可以將引用到的 javascript 從 source 中抽出並壓縮,SCSS 的部分也是會經過 compass 編譯壓縮
$ sencha app build package
在 hello/build/HelloWorld/package 資料夾下可以看到編譯結果


4. 測試

啓動 MacOS 內建 apache
$ sudo apachectl start

將 hello/build/HelloWorld/package copy 到 apache 預設的 document root: /Library/WebServer/Documents/hello
瀏覽網頁 http://localhost/hello/ 即可看到 demo 網站

PhoneGap + Sencha Touch Quickstart (Part I)


PhoneGap + Sencha Touch 這是跨平台 mobile app 開發的一種組合,在開發速度與效能都能接受的情況下,我近期都投入在這個 framework。在此要與大家分享如何快速建立一個 mobile app,系列文章包含三部分:

基本需求

開發環境 MacOS
PhoneGap 3.0.0
SenchaTouch 2.2.1


Part I:建立 PhoneGap 專案


1. 安裝 Mobile SDK

PhoneGap 支援的 mobile 平台有很多種,在這邊只針對 iOS 與 Android 做說明。
iOS 需要安裝 Xcode,可以從 app store 下載,目前我使用的版本是 4.6.3。
而 Android 的部分請參照 Android Platform Guide 下載 ADT,裡面包含了 Eclipse 編輯器與 SDK,SDK 的路徑必須加到環境變數 $PATH,日後 command line 會使用到。


2. 安裝 PhoneGap

PhoneGap 3.0.0 開始的 command line tool 改由 npm 套件管理程式來維護,所以我們要先安裝 node。Node.js官方網站有提供 Mac 專屬的.pkg可以下載,不過我習慣抓 source code 下來編譯,node 安裝好之後自然也會有 npm 指令可以用

利用 npm 來安裝 phonegap
$ sudo npm install -g phonegap
$ phonegap -v
3.0.0-0.14.3


3. 建立 PhoneGap 專案

$ phonegap create hello com.example.hello HelloWorld
產生 hello 資料夾,裡面包含 merges, platforms, plugins, www
platform 擺放各 mobile 平台的專案,plugins 存放提供你存取 device-level API 的 plugin,而 www 就是 app 主程式,平時就是編譯這一份檔案,預設會有基本的 demo 程式在裡面

剛建立好的 phonegap project 是不包含任何 mobile 平台支援,我們要加入 ios, android
$ phonegap build ios
$ phonegap build android
可以看到 hello/platform/ 之下有這兩個平台的專案資料夾

再來我們安裝 device-level API 支援,在此僅安裝最基本的 console plugin,至少可以拿來 debug,其它像是 camera, geolocation... 日後都可以依需求再安裝
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-console.git


4. 編譯 PhoneGap 專案

PhoneGap 提供 command line 的方式可以編譯與運行,在此我則採用自己的方式
$ phonegap build
下達此指令後,PhoneGap 會從 hello/www 去建立各平台的必要資源,包含 app 原始碼與 plugin,可以在下面資料夾看到編譯結果
hello/platform/ios/www
hello/platform/android/assets/www


5. 編譯各平台的專案並運行

iOS 的部分,用 Xcode 開啓 hello/platform/ios/HelloWorld.xcodeproj,按下左上角的編譯就可以在模擬器上面運行了。同時間在 console window 也可以看到 deviceready 的字眼


Android 的部分程序比較多,請先參照 Android Platform Guide 設定模擬器並開啓

編譯 android 專案
$ cd platform/android
$ ant debug

列出可用的模擬器
$ adb devices
List of devices attached
emulator-5554   device

安裝到模擬器
$ adb -s emulator-5554 install -r bin/HelloWorld-debug.apk
337 KB/s (1579758 bytes in 4.565s)
        pkg: /data/local/tmp/HelloWorld-debug.apk
Success

2012/10/23

PhoneGap - Cross platform solution for mobile app - Hello world

跨平台的 mobile solution 越來越多種, google 一下就可以找到人家推薦或比較的文章:



其實大部分都是用純網頁的方式來開發:HTML5 + Javascript,好像只有 Titanium 會把 project 轉成 native code 再編譯,而 PhoneGap 則是為每個平台開發了 framework,提供存取硬體資源的界面,而 UI 層一樣用網頁的方式呈現。
效能理論上是 native code 好些,但目前我的需求在於呈現一些靜態的資料,不需要大量的運算或是圖形成像,選擇了 Phonegap + jQuery mobile 來玩玩看。



下列記錄一個專案產生及編譯的過程:

2.1.0 版 (目前最新版)

1. 安裝方式跟以往不同,沒有 dmg 檔,改採 command line 的方式,可以先看一下官網的 Getting Started with iOS,整理步驟如下:
  • 安裝 Xcode Command Line Tools
  • 下載 cordova source,並解壓縮
  • 進到目錄裡執行下列 script,創建 iOS 專案
$ cd ./phonegap-phonegap-26d211b/lib/ios/bin
$ ./create ~/my-phonegap com.phonegap my-phonegap
$ ./update_cordova_subproject ~/my-phonegap/my-phonegap.xcodeproj/

2. 編譯
開啟剛剛產生出來的 xcode project,從圖中可以看到裡面還包含 CordovaLib,先編譯 CordovaLib 再編譯自己的專案

順利的話就會 deploy 到模擬器上了

註:預設是把 ARC 打開的,所以如果 target iphone 上面沒有支援,就會有下面的錯誤發生。Disable ARC 不是一個好方法,如果有需要可以使用舊版的 library。
dyld: lazy symbol binding failed: Symbol not found: _objc_retain
  Referenced from: /var/mobile/Applications/81EB9778-1819-454F-BF09-5D7CA2706A1A/phonegap.app/phonegap
  Expected in: /usr/lib/libobjc.A.dylib
dyld: lazy symbol binding failed: Symbol not found: _objc_storeStrong
  Referenced from: /var/mobile/Applications/81EB9778-1819-454F-BF09-5D7CA2706A1A/phonegap.app/phonegap
  Expected in: /usr/lib/libobjc.A.dylib

3. 再來就可以參考 API 去撰寫自己的 app 了,資料放在 www 這 folder 底下即可



1.8.0 版

1. 下載 source 後直接執行 phonegap-phonegap-2b7ffca/lib/ios/Cordova-1.8.0.dmg 

2. 安裝後開啓 xcode 就可以看到 Cordova-based Application 的專案可以新增

3. 編譯並執行

出現了錯誤?
ERROR: Start Page at 'www/index.html' was not found
原來是 www 加進專案的方式有問題,正確的步驟如下:在專案按右建選擇"Add file to (project name)",選擇 www 資料夾,並勾選 "Copy items into destination group's" folder (if needed)",Folders 選擇 "Create folder references for any added folders"

再編譯一次就沒有問題了!

2012/08/22

在 iOS 平台加入 Flurry 廣告

Flurry

1. 註冊後,新增 Application,把 API Key 記下來

2. 建立 Ad space


3. 開始寫程式,先下載 SDK,裡面包含教學pdf 與 library
把 Flurry, FlurryAds 拖曳到 project 內

4. 在 app launch 的時候去初始化 flurry
AppDelegate.m
#import "Flurry.h"
#import "FlurryAds.h"

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    [Flurry startSession:@"YOUR_API_KEY"];
    [FlurryAds initialize:rvc];
}

5. 在想呈現廣告的 viewController 加入程式碼
ViewController.m
#import "FlurryAds.h"

- (void)viewWillAppear:(BOOL)animated
{
    [FlurryAds isAdAvailableForSpace:@"FrontPage" view:self.view 
        size:BANNER_TOP timeout:1000];
}

6. 加入額外的 framework
  • MediaPlayer.framework
  • SystemConfiguration.framework

7. Run


參考資料
Publisher/GettingStarted/TechnicalQuickStart - Flurry
iPhoneAgent: FlurryAds Class Reference

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,等下會用到
可以依據自己的需求設定廣告的文字/背景顏色

2011/07/19

透過NSURLConnection和NSMutableURLRequest上傳/POST一個檔案

直接來看code
NSURLConnection *conn;
NSMutableData *tempData;  /* Store response */

- (void)uploadFile {
    NSString *boundary = @"0xKhTmLbOuNdArY";
    NSData *imgData = UIImageJPEGRepresentation(image.image, 90);  /* Image data come from UIImageView */
    NSString *urlString = @"http://my_server/upload.php";
    NSURL *url = [[NSURL alloc]initWithString:urlString];

    /* Set up request */
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
    [urlRequest setHTTPMethod:@"POST"];
    [urlRequest setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"];

    /* Prepare content part */
    NSMutableData *postData = [NSMutableData dataWithCapacity:[imgData length] + 512];
    [postData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"file.bin\"\r\n\r\n", @"image"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postData appendData:imgData];
    [postData appendData: [[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    /* Assign content part */
    [urlRequest setHTTPBody:postData];

    tempData = [NSMutableData alloc];
    conn = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
}


Prepare 4 delegate
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [conn release];
    NSLog(@"Error occur");
}

- (void)connection: (NSURLConnection *)connection didReceiveResponse: (NSURLResponse *)aResponse {
    NSInteger status = (NSInteger)[(NSHTTPURLResponse *)aResponse statusCode];
    NSLog(@"%d", status);
}

-(void) connection:(NSURLConnection *)connection didReceiveData: (NSData *) incomingData {
 [tempData appendData:incomingData];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSString *loadData = [[NSMutableString alloc] initWithData:tempData encoding:NSUTF8StringEncoding];    
    NSLog(@"%@", loadData);
}


Server - PHP sample code
<?php 
    if (isset($_FILES["image"]))
    {
        print_r($_FILES["image"]);
    }
?>

參考資料
CocoaDev: HTTPFileUploadSample

2011/07/12

在iPhone上建立HTTP連線(GET/POST)

HTTP Get
Create request
NSString *str = @"http://my_server/get.php?name=brian&gender=male";
NSString *str_enc = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [[NSURL URLWithString:str_enc] retain];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];

Prepare delegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;


HTTP Post
NSString *content = @"name=brian&gender=male";
NSData *postData = [content dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
 
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:@"http://my_server/post.php"]];
[request setHTTPMethod:@"POST"];

/* Header */
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];

/* Content */
[request setHTTPBody:postData];

connect = [[NSURLConnection alloc] initWithRequest:request delegate:self];
// 跟GET一樣設定4組delegate去接response

參考資料

2011/07/07

架設 Apple Push Notification Provider Server

參考下列兩篇教學


針對製作pem的地方我再加強解說(這邊我搞超久的)。
延續上一篇Apple Push Notification Service - 推播服務,此時你手上會有下列東西:

  • CertificateSigningRequest.certSigningRequest (憑證申請書)
  • aps_development.cer (憑證,從Apple下載的)


原文是請你到Keychain Assistant(鑰匙圈存取)去製作apns-dev-cert.p12的檔案,不過我就是沒辦法export出來。還好找到另一個手動解法:HowToCreatePKCS12Certificate

1. 打開"鑰匙圈存取",找到自己的Private Key(專用密鑰),按右建選擇匯出成private_key.p12

2. 將 aps_development.cer 轉換為 aps_development.pem
openssl x509 -in aps_development.cer -inform DER -out aps_development.pem -outform PEM}

3. 將 private_key.p12 轉換為 private_key.pem
openssl pkcs12 -nocerts -out private_key.pem -in private_key.p12

4. 去除轉發密碼
openssl rsa -out private_key_noenc.pem -in private_key.pem

5. 合併 aps_development.pem 與 private_key_noenc.pem
cat aps_development.pem private_key_noenc.pem > apns_dev.pem

有了 apns_dev.pem 這個憑證就可以傳送推播了!



傳送時的 message payload 格式也可以參考上面兩篇文章。

最後提供幾個人家implement好的APNS


Production server
  • ssl://gateway.push.apple.com:2195
  • Development server
  • ssl://gateway.sandbox.push.apple.com:2195
  • 2011/07/06

    Facebook API with iPhone app

    最近在研究怎麼使用facebook API,看了蠻多的參考資料:
    Sorry 還蠻雜的,沒有太多時間做整理 ><


    簡單來說,有兩件事情要做
    • 學習使用 Facebook iOS SDK
    • API有哪些?要怎麼使用?
    Facebook API走HTTP協定,資料交換格式為JSON,採用OAuth方式來認證。
    Facebook iOS SDK其實就是幫你搞定這些事情,預設會開啓Safari或fb外掛來display login畫面,其中還包含了permission確認,如果上述兩項無法使用,則改用SDK裡面自己刻的dialog。使用者login後會拿到auth token,之後access API都要靠它。Request包成callback形式,接到response再做對應的事情。資料格式也幫你parse成NSData格式,存取相當方便。

    SDK下載按這裡

    稍微整理SDK使用方式 (不同時期的SDK使用方法不太一樣,下面敘述的是2011/7的版本)

    2011/06/22

    Apple Push Notification Service - 推播服務

    最近在研究怎麼收送push notification,以及怎麼架設notification server。


    推播服務的介紹及運作方式可以參考:
    簡單來說就是每個iOS的app第一次開啓時會向apple註冊推播服務,然後得到專屬的device token,可以想像成擁有專屬的tunnel,再來只要向apple的server傳送message(JSON格式),並帶上target device token,server就會自動幫你轉傳給對方。



    寫一個小小的測試程式
    網站說明非常清楚,大致上的流程如下:
    • 登入 iOS dev center 然後創建一個新的 App ID
    • 開啓 push notification service
    • 下載 "Development Push SSL Certificate" 及 "Provisioning Profile"
    Receiver (iOS app):
    • 安裝 provisioning profile
    • 設定 identifier
    • Write the code to register from remote notification server and get "device token"
    範例:
    要求使用者開啓 Push notification 服務
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        [[UIApplication sharedApplication]registerForRemoteNotificationTypes:
      (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
    }
    

    Implement 3個 delegate
    - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    { 
        /* Get device token */ 
        NSString *strDevToken = [NSString stringWithFormat:@"%@", deviceToken];
    
        /* Replace '<', '>' and ' ' */
        NSCharacterSet *charDummy = [NSCharacterSet characterSetWithCharactersInString:@"<> "];
        strDevToken = [[strDevToken componentsSeparatedByCharactersInSet: charDummy] componentsJoinedByString: @""];
        NSLog(@"Device token=[%@]", strDevToken);
    
        /* 可以把token傳到server,之後server就可以靠它送推播給使用者了 */
    }
    
    - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err
    {
        NSLog(@"Error=[%@]", err);
        // TODO: when user do not allow push notification service, pop the warning message.
    }
    
    // This function called when receive notification and app is in the foreground.
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
    {
        /* 把收到的推播列舉出來 */
        for (id key in userInfo) {
            NSLog(@"Key=[%@], Value=[%@]", key, [userInfo objectForKey:key]); 
        }
    
        /* 印出 Badge number */
        NSLog(@"Badge: %@", [[userInfo objectForKey:@"aps"] objectForKey:@"badge"];
    
    }
    

    Sender (MacOS app):
    • Base on sample code "PushMeBaby"
    • Install "Development Push SSL Certificate"
    • Set target device token then send

    參考資料


    至於要如何架設APNS,可以參考下一篇:架設 Apple Push Notification Provider Server