[討論] 寫iphone程式可以簡單也可以很難 - iPhone4.TW

會員登入



顯示結果從 1 到 6 共計 6 條
  1. #1
    mask 的頭像

    管理團隊

    註冊日期:10-13-2007
    文章:285
    謝謝你: 4
    在 3篇文章中獲得 3個感謝
    參照這裡
    sorry 底下又是我的半調子整理
    我到現在還是看不懂signature裡頭的意義 這篇裡頭我看不懂的太多神祕的語言了

    透過Cydia作者的努力(當然也有PyObjC群組的支援)
    現在iphone上頭可以執行 基於python開發的程式
    可以套用iphone SDK裡頭的UIKit
    解決一些問題
    而且 這些程式基本上不需要編譯
    只要丟到他預設的框架上面
    就可以用python來執行
    有興趣的可以參考我附件裡面的檔案 裡頭是個python腳本
    只要替換進去 馬上就是一個原生 可用的iPhone程式

    為什麼談到這個呢?
    因為說實話 我覺得 目前的Cydia上的 LM2 基本上只是堪用
    他並不支援 由iphone選取要載入哪個地圖的功能
    這對於有多個地圖檔需要替換的時候變得很不方便

    LM2是個shell script套件 而作者沒有設計讓他可以替換地圖的功能
    如果說有哪位大哥熟悉shell script 或許可以將他改成 循序替換目錄內的地圖
    而非限定在只有/var/mobile/Media/Maps/m/的被替換過去

    我現在想到的笨方法是這樣
    比方說某個目錄下面有四個地圖檔的資料夾
    先複製編號00的那個到系統資料那邊
    然後把mv 00 tmp;mv 01 00 ;mv 02 01; mv 03 02; mv tmp 03
    這樣 如果有四個地圖檔 這最衰你只需要按四下LM2的圖示 就可以把離線地圖換成你要的
    所以我把LM2.app底下的LM2.sh替換掉
    成為下面這個
    代碼:
    rm  /var/mobile/Library/Caches/MapTiles/MapTiles.sqlitedb
    rm  /var/mobile/Library/Preferences/com.apple.Maps.plist
    cp -r /var/mobile/Media/Maps/00/MapTiles.sqlitedb /var/mobile/Library/Caches/MapTiles/MapTiles.sqlitedb
    cp -r /var/mobile/Media/Maps/00/com.apple.Maps.plist /var/mobile/Library/Preferences/com.apple.Maps.plist
    
    #Swap db
    mv /var/mobile/Media/Maps/00 /var/mobile/Media/Maps/tmp
    mv /var/mobile/Media/Maps/01 /var/mobile/Media/Maps/00
    mv /var/mobile/Media/Maps/02 /var/mobile/Media/Maps/01
    mv /var/mobile/Media/Maps/03 /var/mobile/Media/Maps/02
    mv /var/mobile/Media/Maps/tmp /var/mobile/Media/Maps/03
    很呆....但是可以勉強符合我的需要
    但無論如何 還是不如用UIKit去寫有清單 有選項 這樣的東西來的好用
    shell script的Cocoa bridge法 網路上有...但是跟天書一樣 (我程度太差了 rubycocoa還沒port過去)

    所以不曉得有沒有人 擅長Python的人
    可以考慮看看從這邊著手
    開始port一些需要的東西過去(當然您擅長其他項目也ok啦)
    寫程式多半是為了解決問題
    有些問題是你個人的需要 有時候可能也剛好是大家的需要
    剛好是大家需要的時候 這個程式就更熱門
    像是目前火紅的iAcces (我十二萬分盼望2.0版本早點出來)
    即便不是如此 我想至少也會解決您目前的困擾 累積下次的經驗

    其實寫iphone 的程式 好像沒有那麼的難
    你可能已經掌握了一兩門擅長的程式語言
    只是沒有找到入口的門而已
    或許 現在門找到了 而鑰匙也在你手上
    此篇文章於 08-29-2008 07:19 被 mask 編輯。



  2. #2
    blueshadow 的頭像

    愛用者

    註冊日期:03-18-2008
    文章:106
    謝謝你: 0
    在 0篇文章中獲得 0個感謝
    我覺得最簡單的方法就是直接去Cydia裝iPhone 2.0的toolchain,然後就可以直接SSH到iPhone裡線上開發了,C++,C都可以

    當然妳makefile要加上self-signing的動作


  3. #3
    sm91kimo 的頭像

    剛加入我們

    註冊日期:07-05-2008
    文章:22
    謝謝你: 0
    在 0篇文章中獲得 0個感謝
    SSH到iPhone裡線上開發的最大限制是Ram,128MB無法compile或link較大的程式,
    像samba 或 perl 都不行。

    make perl 時光是 compile toke.c 就需 256MB 以上的 Ram,這會造成iPhone crash,reboot。

    Regards,
    chw


  4. #4
    blueshadow 的頭像

    愛用者

    註冊日期:03-18-2008
    文章:106
    謝謝你: 0
    在 0篇文章中獲得 0個感謝
    引用 作者: sm91kimo 查看文章
    SSH到iPhone裡線上開發的最大限制是Ram,128MB無法compile或link較大的程式,
    像samba 或 perl 都不行。

    make perl 時光是 compile toke.c 就需 256MB 以上的 Ram,這會造成iPhone crash,reboot。

    Regards,
    chw
    哈哈,您說的一點都沒錯,我沒有想到那麼遠就是了,原本只是想移植一下1.1.4的iPhone Debugger到2.0上,結果隔天Cydia上就出現GDB了


  5. #5
    mask 的頭像

    管理團隊

    註冊日期:10-13-2007
    文章:285
    謝謝你: 4
    在 3篇文章中獲得 3個感謝
    最近還是在想怎樣把offline Map給寫好
    畢竟老是默數現在切換到哪邊實在不是個好主意

    所以還是回到老路子
    跑跑看pyobjc

    底下是目前的進度(尚未完工)

    首先需要用Cydia安裝 iphone/python
    他會順便安裝python跟pyobjc這兩個套件

    然後我把改過的hellopython.py給放進去
    底下是我的code
    代碼:
    # Special thanks goes to Dave Arter (dave*minus-zero.org)
    # for actually writing most of this sample application!!
    
    # While I managed to get PyObjC working, I didn't actually
    # know any Python to go with it ;P. - Jay Freeman (saurik)
    
    import sys
    import os
    import objc
    import shutil
    from _uicaboodle import UIApplicationMain
    from objc import YES, NO, NULL
    from sqlite3 import dbapi2 as sqlite 
    
    objc.loadBundle("UIKit", globals(), "/System/Library/Frameworks/UIKit.framework")
    
    class PYApplication(UIApplication):
        def getName(self, contact):
    	name = contact["fullpath"]
            return name
    
        *objc.signature("i*:*")
        def numberOfSectionsInSectionList_(self, list):
            return len(self.sections_)
    
        *objc.signature("**:*i")
        def sectionList_titleForSection_(self, list, section):
            return self.sections_[section]["title"]
    
        *objc.signature("i*:*i")
        def sectionList_rowForSection_(self, list, section):
            return self.sections_[section]["row"]
    
        *objc.signature("i*:*")
        def numberOfRowsInTable_(self, table):
            return len(self.contacts_)
    
        *objc.signature("**:*i**")
        def table_cellForRow_column_reusing_(self, table, row, col, reusing):
            contact = self.contacts_[row]
            if reusing is not None:
                cell = reusing
            else:
                cell = UIImageAndTextTableCell.alloc().init()
            cell.setTitle_(self.getName(contact))
            return cell
    
        *objc.signature("c*:*i")
        def table_canSelectRow_(self, table, row):
            return NO
    
        *objc.signature("v*:*i")
        def navigationBar_buttonClicked_(self,navbar,button):
            if button == 0:
                self.navbar.setButton_enabled_(1,YES)
                self.setApplicationBadge_("oops")
            else:
                self.removeApplicationBadge()
    
        *objc.signature("v*:*")
        def applicationDidFinishLaunching_(self, unused):
            self.contacts_ = []
            self.sections_ = []
            self.pathway_ =""
    
            path = self.userHomeDirectory() + "/Media/Maps"
            dir_list = os.listdir(path)
            for name in dir_list:
                fullname=os.path.join(path,name)
                if os.path.isdir(fullname):
                    self.contacts_.append({"fullpath": fullname})
    
            outer = UIHardware.fullScreenApplicationContentRect()
            self.window = UIWindow.alloc().initWithFrame_(outer)
    
            self.window.orderFront_(self)
            self.window.makeKey_(self)
            self.window._setHidden_(NO)
    
            inner = self.window.bounds()
            navsize = UINavigationBar.defaultSize()
            navrect = ((0, 0), (inner[1][0], navsize[1]))
    
            self.view = UIView.alloc().initWithFrame_(self.window.bounds())
            self.window.setContentView_(self.view)
    
            self.navbar = UINavigationBar.alloc().initWithFrame_(navrect);
            self.view.addSubview_(self.navbar)
            self.navbar.setDelegate_(self)
            self.navbar.enableAnimation()
            self.navbar.showLeftButton_withStyle_rightButton_withStyle_("info",0,"ok",0)
            self.navbar.setButton_enabled_(1,NO)
            self.navbar.setBarStyle_(0)
    
            navitem = UINavigationItem.alloc().initWithTitle_("Maps folder")
            
            self.navbar.pushNavigationItem_(navitem)
    
            i = 0
            letter = u""
            for contact in self.contacts_:
                name = self.getName(contact)
                now = unicode(name[0])
                if letter != now:
                    letter = now
                    self.sections_.append({"row": i, "title": now})
                i += 1
    
            lower = ((0, navsize[1]), (inner[1][0], inner[1][1] - navsize[1]));
            self.list = UISectionList.alloc().initWithFrame_(lower)
            self.view.addSubview_(self.list)
    
            col = UITableColumn.alloc().initWithTitle_identifier_width_("Name", "name", 320)
    
            table = self.list.table();
            table.setSeparatorStyle_(1)
            table.addTableColumn_(col)
            table.setReusesTableCells_(YES)
    
            self.list.setDataSource_(self)
            self.list.reloadData()
    
    UIApplicationMain(sys.argv, PYApplication)
    因為是用改的
    說實話
    有些code是多餘的
    不過某種程度上
    他似乎快可以跑了 有按鍵可以點選 也會做出些反應(現在是在圖案上頭顯示oh!或是隱藏)
    現在只要能讓我抓到被選取的row
    我就可以跑shutil.copyfile(src,dst)了
    現在還是得回過頭來看toolchain的內容
    我想我還需要多一些的智慧


  6. #6
    mask 的頭像

    管理團隊

    註冊日期:10-13-2007
    文章:285
    謝謝你: 4
    在 3篇文章中獲得 3個感謝
    考慮到透過python bridge來跑UIKit速度的確是相當慢....
    或許這種寫程式的方法只適用於
    1.不想寫太複雜的程式碼
    2.沒有Xcode 或是toolchain可以跑
    3.寫給自己用 不在乎效率的東東


 

 

發文規則

  • 不可以發表新主題
  • 不可以發表回覆
  • 不可以上傳附件
  • 不可以編輯自己的文章
  •  
回到此頁頂端