[iOS] OneSignal 推播服務
自從被Facebook收購的Parse三月宣布一年後關門大吉後,許多行動開發者陸續在找替代方案,於是OneSignal推播服務就出現在我面前XD~

儘管OneSignal只有推播服務,那也足夠我們開發者使用!不然萬一它像Parse有龐大的資料庫的話,哪天還得想辦法備份轉移呢~據說它支援至少14種開發平台。
自從被Facebook收購的Parse三月宣布一年後關門大吉後,許多行動開發者陸續在找替代方案,於是OneSignal推播服務就出現在我面前XD~

儘管OneSignal只有推播服務,那也足夠我們開發者使用!不然萬一它像Parse有龐大的資料庫的話,哪天還得想辦法備份轉移呢~據說它支援至少14種開發平台。
因為串接藍芽裝置,想要從藍芽裝置獲得資訊或是傳送指令到藍芽裝置,需要瞭解其溝通協定,才能順利互通有無。
因為資料長度的關係,需要把資料型別短的組合成長的,如轉 uint8_t 為 uint16_t。
原始資料:
uint8_t d1 = 0x01;
uint8_t d2 = 0x07;
轉成:
uint16_t wd = 0x0701;
此時需要瞭解點位元操作,就能寫程式實現。
程式實作:
uint16_t wd = ((uint16_t)d2 << 8) | d1;
原理:
(0x0007 << 8) | 0x01 = 0x0700 | 0x0001 = 0x0701
意思是d1向左位移8位元,再和d2結合。
參考:Combining two uint8_t as uint16_t。
看這標題應用查詢格式 (Application Query Schemes)不知在表達啥咪,那就用白話文解釋⋯⋯就是我們的App想要跳轉到他人App時,所要遵從的規範。在iOS 9之後Apple更改遊戲規則,必須在info.plist注明我們想要跳轉的格式,不然程式就會報錯:
This app is not allowed to query for scheme
比如我想要跳轉到Google Map App,我會在程式碼中設定開頭:
comgooglemaps://
iOS 9以後就要在info.plist加入:

果真加入後立馬編譯執行,就能跳轉到Google Map App,而不是到App Store App的Google Map App頁面呢~
參考:[iOS] 使用Google Map導航、[iOS] 使用Google Map顯示地點、Google SDK –
Google 地圖 URL 配置、canOpenUrl – This app is not allowed to query for scheme instragram iOS9。
有時候需要透過程式取得Youtube影片的標題,在網路上找了許久卻沒找到直接可用的API,方法是有很多種,比如使用Youtube的SDK,然而就要申請帳號來獲取API Key,明明是很簡單的任務,卻要大費周章來實現,最後我選擇較為簡潔的做法!
透過以下的Url Template,先取得該影片的所有資料,如下列網址帶入Video ID,我們將可取回一大串String。
字串截圖:

我們的目標字串為:
title=%E9%96%BB%E5%A5%95%E6%A0%BC+Janice+Yan+%5B+%E4%B9%9F%E5%8F%AF%E4%BB%A5+%5D+%28%E9%9B%BB%E5%BD%B1%E3%80%8C%E8%BF%BD%E5%A9%9A%E6%97%A5%E8%A8%98%E3%80%8D%E6%8F%92%E6%9B%B2%29+%E7%89%87%E8%8A%B1%E7%89%88Music+Video
我先找「title=」字眼,後面的字串到「&」之前,就是我要的標題。中文字被轉成百分比+字母(stringByRemovingPercentEncoding),所以要轉回去,最後還要取代掉「+」為「 (空白鍵)」。
Objective C可以這樣來剖析(Parse):
/**
Theme: fetch Title of Video from Youtube
IDE: Xcode 7
Language: C++
Date: 105/05/06
Author: HappyMan
Blog: https://cg2010studio.wordpress.com/
*/
NSString *title = [[[[[[string componentsSeparatedByString:@"title="] lastObject] componentsSeparatedByString:@"&amp;"] firstObject] stringByRemovingPercentEncoding] stringByReplacingOccurrencesOfString:@"+" withString:@" "];
我找的Video ID是PZGwZwGQTlk,經過上述程式碼剖析、解碼、取代,就得到追婚日記的插曲標題:閻奕格 Janice Yan [ 也可以 ] (電影「追婚日記」插曲) 片花版Music Video。

這裡要注意的是,並不是所有影片資料字串都會有title=喔!若有title=會出現在不一樣的位置,我找到的這個例子剛好是在最前面!
.
前一陣子介紹圖解APP訊息推播流程,是關於iOS和Android兩大平台從發送到接收的整個過程,現在我們想要實作處理推送通知 (Process Push Notification),iOS SDK已經包好方法只要註冊成功後,就能透過某個method來繼續接下來的處理。可以先參考圖解蘋果推播通知服務 (Apple Push Notification Service)。

JSON(JavaScript Object Notation)是一種輕量級的資料交換語言,以文字為基礎,且易於讓人閱讀。儘管JSON是Javascript的一個子集,但JSON是獨立於語言的文字格式,並且採用了類似於C語言家族的一些習慣。
不過目前C++並無內建函式可以解析JSON (Parse JSON),於是我便到GitHub找輕便好用的套件:JSON for Modern C++

上圖展示套件有四種方式來讀取JSON資料,因為我是要從檔案讀取來解析,所以足夠我使用囉~
先前介紹讀取檔案 (Read File),是以一行一行逐步讀取,現在我們想要一次讀取整個檔案為字串,再來做其它處理,這樣可以怎麼實作呢?

這個檔案內容是關於人臉資訊的JSON檔,包含年齡、性別、姿勢、種族、微笑等等量化資訊。
UIAlertView已經被棄用,iOS 8開始由UIAlertController取代它囉!如此變得更親切迷人~

過去能透過UIAlertView做出可填寫欄位UITextField,現在UIAlertController也能實現,而且更加方便好操作。
例如上圖程式碼這麼寫:
/**
Theme: UIAlertController
IDE: Xcode 7
Language: Objective C
Date: 105/03/30
Author: HappyMan
Blog: https://cg2010studio.wordpress.com/
*/
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"修改暱稱"
message:@""
preferredStyle:UIAlertControllerStyleAlert];
[alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
// optionally configure the text field
textField.keyboardType = UIKeyboardTypeDefault;
}];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"送出"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
UITextField *textField = [alert.textFields firstObject];
}];
[alert addAction:okAction];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}];
[alert addAction:cancelAction];
[self presentViewController:alert animated:YES completion:nil];
看要增加幾個選項按鈕都可以,而且都是用Block來做後續處理,不用再像過去還要跳來跳去的Delegate。
HappyMan・迴響