如果你是APPLE的開發者,感到在這一年中很受挫,我可以體會的。
所有的object-c的開發者都有一段在iPhone上寫程式的痛苦經歷。
你是否曾經想找一兩篇iPhone開發的初級教學課程,但是它的C語言太難學了。
我不想說一些讓你放棄的消極的話:你可以放棄它,這意味著這些時間你可以做些別的。
你可以作一個native app 和別的app 一樣,並且,很大程度上,它看起來就是一個完美的仿冒的應用程式。現在只要你會HTML(5),CSS 和Javascript 就能做到。
我將在這裡分享如何製作一個離線的iPhone應用程序,說白點就是我會一步一步教你怎麼作一個俄羅斯方塊遊戲(Tetris game)。
Offline?什麼是離線?離線意味著,我們有一個自訂的icon和介面讓他們看起來像本機應用程式,無論手機是否連上了網路都能夠使用。
這個app就像手機中的普通應用程式一樣,當它離線時也是可以運作的。這雖然是一個詳細的iPhone教學,但更多的技術來自於所有手機都內嵌的支援HTML5瀏覽器。
看下面的圖片,它沒有URL 的輸入欄位也沒有瀏覽器導覽列,看起來就是一個本機的手機應用程式。
Prework
利用HTML5的offline caching,你瀏覽伺服器文件可以改變文件的HTTP Headers 。Apache對這個支援相容性非常好,你只要修改.htaccess 文件就行了。這有一個教學《使用htaccess修改HTTp headers》
還有一件事你需要做,你的iPhone unit中的Safari的網頁瀏覽器中需要打開debug bar,進入設置:.app > Safari > Developer on your iPhone,然後打開debug console。這可以方便你查看潛在的JavaScript 錯誤。
一旦你建立了你的app,你就應該將這個關閉以便於在測試你的HTML5 iPhone app時得到完整的體驗。
About the App
Icon and Startup Screen
icon需要是57px x 57px。iPhone會將所有的icon圖片做圓角處理,建立陰影效果。
其次圖片必須是PNG或者JPG格式。
這個是我在俄羅斯方塊遊戲中使用的圖片。
首頁需要320px x 460px 也必須是PNG或JPG格式。
這個是我用的首頁圖片。
Some tips before you start
保持小(small),少(sparse)和簡單(simple).- 小:手機程式開發需要暫存文件,所以要保持文件的大小。
- 少:需要處理的文件的數量越少越好.
- 簡單:從一些簡單的想法開始,在做的過程中把持住複雜度,這樣你會完成的更快。
Application Cache
這是一個新標準,點這裡查看更多。應用程式暫存允許瀏覽器檢測網頁是否需要網路才能工作。
它可以暫存你想暫存的文件,語法非常簡單:只要把每個文件(例如: http://yourwebserver.com/picture.png )的絕對目錄列在manifest文件(/picture.png)。瀏覽器會讓這些文件離線。
你也可以列出需要暫存文件的URL。但是這個對於離線應用沒有效果的(有興趣的朋友看這裡 )
透過manifest(需要暫存的文件列表)來暫存文件有一個棘手的問題,需要將filetype Header設置為text/manifest。這也是為什麼需要設置HTTP headers來瀏覽web服務器。
Screen Size
設計程式的一個提醒:當你在應用程式模式(app mode)時,螢幕大小為320px x 460px。當你在網頁模式(web mode)時,螢幕會變成320px x356px。這會影響你的HTML5程式的用戶介面。這裡你可以看到不同他們的不同。
HTML
iPhone瀏覽器是一個完全支援HTML5的瀏覽器,所以HTML程式碼完全相同。更多的詳細,請查看Safari Developer's corner:
Let's get coding
程式開始定義markup,下面是俄羅斯方塊app的markup。offline Tetris
首先,注意Doctype,這難道不值得為HTML5歡呼嗎?
其中標籤中的manifest=”cache.manifest” 屬性告訴瀏覽器,我們需要暫存這個離線頁面。
這些是蘋果在HTML5中獨有的markup,簡單的介紹下:
- apple-mobile-web-app-capable: 另一種聲明這是一個offline app。
- apple-mobile-web-app-status-bar-style: 當程式離線時隱藏status bar和nav bar。
- apple-touch-icon:指向需要成為icon的圖片。
- apple-touch-startup-image:指向首頁圖片的url。
CSS
與大多數網頁一樣,你還可以使用-webkit 規則的CSS做一些像動畫一樣非常酷的特效。但是這個話題有點超出本文的範圍了。下面的CSS很樸素
body {這個樣式只是為了確保div元素能適應iPhone的顯示界面。
overflow:hidden;
background: #d7d7d7;
margin:0;
padding:0;
}
#tetris {
width: 320px;
height: 460px;
background:#000;
}
JavaScript
我用了一個改裝過的javascript版本,來自於Dalton Ridenhour ;我在Github上發現的.JS本來是用在網頁瀏覽器中的。而我不得不做了一點點修改讓它支援鍵盤。一般來說,JS 方法在iPhone中運行正常-雖然有些小問題。想想一些類似mouseover在iPhone中存在的事件,我不確定當你沒有標準的點擊設備時(如:滑鼠)能幫到多少。 Quirksmode發表了一篇關於events on the iPhone的文章,受益良多。
當你全完成了,你可以在iPhone中打開index.html 測試,應該能夠可以見所有運行正常。
接著,下一步是從一個真實的伺服器上設置暫存manifest。
然後你可以新增到主桌面上,然後查看離線模式。
你可以參考一個可以運行的版本,我建立在:
Bonus Section: Offline Data
隨著需要離線的文件越來越複雜,你也可以講用戶數據存儲在一個離線資料庫中。有兩個主要的API,一個是保存每個用戶的數據,另一個是用來保存每個頁面的資料。第一種是localStorage。 localStorage,一種簡單的鍵值對存儲方式。
localStorage.dataToStore = 5;舉個例子,你可以用它來存儲用戶的得分。
console.log(localStorage.dataToStore);
// 5
第二種實際上時一個離線的SQL引擎,一個webdatabase 。 API更先進一些,這需要一點程式碼:
// Try and get a database object
var db;
try {
if (window.openDatabase) {
db = openDatabase("NoteTest", "1.0", "HTML5 Database API example", 200000);
if (!db)
alert("Failed to open the database on disk. This is probably because the version was /
bad or there is not enough space left in this domain's quota");
} else
alert("Couldn't open the database. Please try with a WebKit nightly with this feature enabled");
} catch(err) { }
// Check and see if you need to initalize the DB
db.transaction(function(tx) {
tx.executeSql("SELECT COUNT(*) FROM WebkitStickyNotes", [], function(result) {
loadNotes();
}, function(tx, error) {
tx.executeSql("CREATE TABLE WebKitStickyNotes (id REAL UNIQUE, note TEXT, timestamp /
REAL, left TEXT, top TEXT, zindex REAL)", [], function(result) {
loadNotes();
});
});
});
// Insert a test Note.
var note = {
id: "1",
text:" This is a test note",
timestamp: "112123000",
left:10,
top:10,
zIndex:2
};
db.transaction(function (tx)
{
tx.executeSql("INSERT INTO WebKitStickyNotes (id, note, timestamp, left, top, zindex) VALUES /
(?, ?, ?, ?, ?, ?)", [note.id, note.text, note.timestamp, note.left, note.top, note.zIndex]);
});
// Get all the notes out of the database.
db.transaction(function(tx) {
tx.executeSql("SELECT id, note, timestamp, left, top, zindex /
FROM WebKitStickyNotes", [], function(tx, result) {
for (var i = 0; i var row = result.rows.item(i);
var note = new Note();
note.id = row['id'];
note.text = row['note'];
note.timestamp = row['timestamp'];
note.left = row['left'];
note.top = row['top'];
note.zIndex = row['zindex'];
if (row['id'] > highestId)
highestId = row['id'];
if (row['zindex'] > highestZ)
highestZ = row['zindex'];
}
if (!result.rows.length)
newNote();
}, function(tx, error) {
alert('Failed to retrieve notes from database - ' + error.message);
return;
});
});
Wrap Up
離線HTML程式可以做很多東西,遊戲,像俄羅斯方塊,沒有什麼是不可能的,但是你需要事先考慮你想做什麼是否有必要做成離線程式。雷神之鎚3競技場,可能不行,做一個確信可行的to-do程序表。讓應用程序遍地開花吧!資料來源: Sixrevisions
全站熱搜
留言列表