APP功能模組實現之思路歷程(基於iOS端)

weixin_34337265發表於2018-05-21

寫在前面:

  不知道各位童鞋是否有過和我相似的經歷:某天突然想到一個APP的功能模組,但是苦於自己的技術水平,一時想不出具體的實現方式呢?如果有的話,那本文就是適合你的菜啦~
  接下來,筆者將由實現一個具體功能模組的思路歷程出發,逐步展示這個概念是如何成型落地的
  筆者希望本文能對讀者有所啟發,同時由於筆者技術水平有限,文中難免有所紕漏、錯誤,還請各位多多包涵。

具體功能模組描述:

  1. 匯入Excel檔案,並根據Excel表格的姓名列手機號列建立接收人群組。
  2. 選擇可編輯的模板並用當前手機傳送簡訊。如:{name}同學你好,歡迎報名百步梯技術部,一面面試地點將在......其中{name}標籤將在傳送簡訊時被Excel表中的真實姓名替換,從而使得簡訊更加親切。最終,每一條簡訊將被髮送至姓名所對應的手機號上。

正文:

  鏘鏘鏘!功能明確好了,就讓我們開始想法子去實現它吧~首先我們心中要有這麼一個概念:

3980026-032a0ea744be285e.jpg
一般的idea從產生到失敗流程

  芥川龍之介就曾寫過:“必要的思想或許早在三千年前就已窮盡,我們現在只是給舊柴添把新火罷了”。Amazing!這在我們程式碼界中也是一樣的,我想要做的功能,往往已經有人做過了,我不知道只是因為我搜尋資料還不夠多不夠全,這對個人資訊檢索能力的要求還蠻高的。
  因此,在不要求100%創新性的前提下,已經被別人實現過反而是一件大好事情,我們不妨找到這些實現的demo、投入使用的APP來觀摩觀摩,作為參考,降低自己摸索的成本,也避免去重複造輪子。
  接下來,我將從iOS應用ExcelSMSgithub(全球最大的同性交友網站)站內檢索結果出發,進一步明確功能模組的實現。

ExcelSMS(APP):

  以“excel匯入”“簡訊群發”作為關鍵詞Google一下,馬上就能找到ExcelSMS。ExcelSMS給出了幾個示例excel表格格式,匯入方式可以為用該APP開啟檔案或者WIFI上傳,其中一種格式如下所示:

3980026-b29f9e8065d61bbc.jpg
匯入的Excel表格形式

  我們可以看出第一行為標籤行,之後的每一行都有名字、手機號、簡訊內容。可以猜到{}標籤最終會被相應的內容所替換。

  匯入完上述Excel檔案後將如下圖左一所示,我們可以看到ExcelSMS根據上述excel表格建立了兩個收件人資訊,每個收件人資訊欄裡是對應的資訊展示:

3980026-551b6c6f5edd1b34.png
匯入excel後群發簡訊流程,從左至右依次為圖1-4

  我也可以點選每一行收件人,檢視相關的資訊,並進行編輯,如左二所示。當我最終確認好資訊後,可以對簡訊做一個傳送前的預覽,這時候,就可以看到將要傳送的簡訊內容啦~如左三
  最後,我點選傳送的飛機圖示,ExcelSMS就自動開啟了系統的iMessage應用,填充好了第一個收件人和簡訊內容,我只需確認後點選傳送;傳送完後,會再次跳回ExcelSMS,讀取下一個收件人和簡訊內容,又跳到iMessage,依此類推。也就是說有N條簡訊,就需要我點選N次傳送的綠色箭頭,並且忍受約為2N次的跳轉。
  我知道讀者和我會有同樣的想法:有點不太合理啊......但是,人家開發者應該也想得到,興許是蘋果爸爸對於系統應用iMessage介面的呼叫就只給了這麼點許可權吧……本文後續會對此進一步分析。

ExcelSMS的啟示:
  1. 它實現了我所構思的功能,最起碼可以印證我想法的技術可行性。另一方面,我可以借鑑它的事件流並看出所需的技術:Excel檔案匯入後儲存在APP本地(APP間檔案匯入及本地儲存),開啟excel表後做一個tableView展示(excel表讀取[可能需要藉助開源庫],UITableViewController的使用),在傳送前可以提供一個預覽(對字串進行處理,用內容將{}標籤進行替換,是邏輯部分),最後呼叫系統應用iMessage傳送簡訊(需要檢視iMessage的相關API及文章)。
  2.倘若ExcelSMS是開源APP,在github上可以找到相關程式碼那就再好不過啦~~然而,ExcelSMS是收費的呢,正式版還要68元軟妹幣,當然是閉源的啦。

Github站內搜尋:

  ExcelSMS是閉源的沒錯,但是誰知道會不會有什麼仿ExcelSMS程式碼、或者別人寫的相應demo呢。夢想還是要有的。
  於是我將“excel 簡訊(sms或message)”、“仿ExcelSMS”作為關鍵詞進行了github站內檢索,結果有很多,但是iOS端的沒有。JAVA語言Android實現倒是找到了一個:JAVA/Msgs。它實現了excel表讀取、資訊展示、呼叫系統簡訊應用傳送簡訊,這幾個功能,如果我是安卓開發的話……工作量應該就大大減小了……所以,轉行安卓開發吧

繼續Google和百度

  找不到的能直接參考的程式碼的話,就只能按照上述拆解的ExcelSMS實現技術,一個模組一個模組去踩坑去Google了。踩坑過程如下:
  1. 經過Google,APP間檔案匯入方案為UIDocumentInteractionController 。

  iOS中的沙盒可以讓平臺更加的安全,這也是沙盒給使用者帶來的最主要好處。不過由於沙盒的嚴格限制,導致程式之間共享資料比較麻煩。一般在程式間共享文件可以通過UIDocumentInteractionController類實現通訊。它支援在你的app中用其他app預覽和顯示文件。同時也支援檔案關聯,允許其他app通過你的程式開啟檔案。

  2. excel表讀取問題,這個問題我用不同的組合Google了多次,最後發現還是如“ios excel parse”的英語搜尋有用。最後,找到的實現方案比較多,我個人覺得難以輕易定奪。

方案一:XlsxReaderWriter 1.0.11,本地讀取方案。一個objC語言寫就的MicroSoft Excel(TM)檔案閱讀框架,但是最後更新是在2年前。
方案二:平臺不同,難易也不同。像PHP、Python其實可以很輕易就讀取xls、xlsx、csv等檔案,並且整理成json資料格式。所以可以通過http請求方式,將檔案上傳至伺服器,伺服器返回json資料到APP。其缺點在於聯網和流量損耗。
方案三:有一種說法是excel檔案如xlsx、xls本質上是壓縮檔案,可以利用第三方庫SSZipArchive,解壓檔案後用文字形式開啟,找到其中的標籤進行擷取。感覺有點旁門左道的趕腳……

  3.iMessage的介面呼叫方案:MessageUI框架。部分呼叫程式碼如下所示:

- (void)displaySMSComposerSheet 
{
    MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init];
picker.messageComposeDelegate = self;
    // You can specify one or more preconfigured recipients.  The user has
    // the option to remove or add recipients from the message composer view
    // controller.
    picker.recipients = @[@"10010",@"10086"];

    // You can specify the initial message text that will appear in the message
    // composer view controller.
    picker.body = @"Hello from California!";
    [self presentViewController:picker animated:YES completion:NULL];//顯示系統SMS介面
//    [self presentModalViewController:picker animated:YES];//老套的方法
}

  如果自定義簡訊,需要使用上述的框架MessageUI。它能返回原app;可以多人群發; 可以自定義訊息,訊息支援HTML格式的;具體的傳送操作還需要使用者完成。
  對於傳送短息,可定義傳送內容和接收方的號碼。但有一個問題,都是呼叫簡訊傳送介面,需要使用者點選傳送才行。由於蘋果對安全性的要求很高,所以暫時無法脫離其原生viewController來傳送簡訊,即無法後臺傳送簡訊。
  這就很好的解釋了ExcelSMS為什麼會是這麼一個傳送機制......都是蘋果爸爸定死的東西……還是安卓開放度高啊

3980026-8abd32c071b83521.jpg
戲說蘋果開發者協議

  至此,雖然我並沒有寫上一行程式碼,但基本捋清了該功能模組實現過程和最終會呈現出的效果。其實檢索的時候關鍵字的選擇蠻重要的,最好儲存一些程式碼網站如:code4app、csdn、github交友網站等。在這些網站進行站內檢索往往會有意外之喜哦~

寫在最後:

  總結一下,其實我的整個尋找實現思路的過程,其實也就是一個不斷資訊檢索的過程。尋找投入使用的APP(ExcelSMS),找程式碼(github站內檢索、google檢索),又或者是把功能拆分成一個個模組逐個查資料,最後查閱官方API文件學習,這些都是一個資訊檢索並獲取的過程。這就很考驗我們的資訊搜尋能力啦~~~
  在這裡筆者給一個很tiny的tip,如果你想快速提高自己的搜尋能力,最簡單的方式就是棄掉百度,使用Google。(手動滑稽
  希望本文對你有所幫助,如果你有什麼想與筆者討論的,歡迎評論區留言哈~

相關文章