More Related Content
Similar to 那些年被蘋果 Ban 掉的 API (7)
More from Weizhong Yang (20)
那些年被蘋果 Ban 掉的 API
- 8. UIDevice -uniqueIdentifier
• 在同⼀一台⼿手機上,每個 App 都可以取得相同的裝置 ID
• 不不同 App 各⾃自上傳 UDID 到同⼀一台 server,server 端就可
以知道同⼀一台裝置⽤用了了哪些 app
• 也可以⽐比對不不同網路路服務中不不同的帳號是不不是同⼀一個⼈人
• Deprecated in iOS 5
• 在 iOS 6 之後完全不不能呼叫
- 9. 官⽅方的 UUID 替代品:
IDFV & IDFA
• IDFV: UIDevice -identifierForVendor
• iOS 5
• 系統中,相同 Bundle ID 的 prefix 的 App(例例如都是)
com.kkbox.*),可以取得相同的 IDFV,限制只有屬於同
⼀一個開發商的 App 之間可以辨識⽤用⼾戶
• 如果所有相同 prefix 的 App 都被移除後,重新安裝⼀一次你
的 App,IDFV 會改變
- 10. 官⽅方的 UUID 替代品:
IDFV & IDFA
• IDFA:
ASIdentifierManager -
advertisingIdentifier
• 在上架時要特別勾選有⽤用
到 IDFA
• 讓廣告商可以追蹤⽤用⼾戶
• ⽤用⼾戶可以在設定中關閉提
供 IDFA,就無法取得 IDFA
- 11. 禁⽤用 UDID 的衝擊
• 有些 App 是拿 UDID 當做本地資料料加密的 Key
• 把 UDID 換成 IDFV 之後,就解不不開了了…
• 有些 App 的商業模式是只能在有限數數量量的裝置上使⽤用,並
且拿 UDID 判斷裝在幾台 iOS 裝置上
• App 刪掉重裝,IDFV 會改變,會誤判當做多⼀一台裝置,
然後就會接到⽤用⼾戶雪⽚片般的客訴…
• ⽽而且⼤大家還是很想跨 App 追蹤
- 15. UIPasteboard
• 剪貼版。在不不同 App 間做複製、貼上的 API
• ⼀一般我們只會使⽤用 Singleton 物件 UIPasteboard.general 做
複製貼上
• 但是可以⽤用 + pasteboardWithName: create: 建⽴立⾃自⼰己的剪
貼版,另⼀一個 App 可以從中取得資料料
• 在這裡產⽣生⼀一組字串串,就變成可以跨 App 的 ID
• 重開機也不不會被清掉
- 17. UIPasteboard
• iOS 6 之後,只有屬於同⼀一個 App Group 的 App,才可以
共⽤用⾃自⼰己創⽴立名稱的 UIPasteboard
• + pasteboardWithName: create: 傳⼊入的 name 必須是 App
Group 的名稱
- 19. 但是你就會遇到明明就同⼀一家公司
的 App,沒辦法放進 App Group…
• 同⼀一個集團底下有多家公司,不不同公司為了了財務獨⽴立,不不
想讓不不同公司的 IAP 資料料混在⼀一起,所以就是要⽤用另外⼀一
個 Developer Program 上架…
• ⼀一家⼤大公司的 App 發包給多家外包廠商做,該公司只提供
App Store 的 Provision Profile,平常開發階段要各⾃自的外
包公司⽤用⾃自⼰己的 Developer Program 做 Code Sign,但是
⼜又要求在開發階段就能測試跨 App 的資料料共⽤用…(最後兩
家公司⼜又⼀一起去買⼀一個新的個⼈人開發帳號,以及寫了了很複
雜的 entitlement 設定)
- 20. 怎樣解決 IDFV 會改變的問題?
• 把⼀一組 ID 寫進 Keychain 裡頭。Keychain 裡頭的資料料不不會
因為刪除 App ⽽而改變。
• 以前⽤用 UUID 加密資料料怎麼辦?
• 在 iOS 5/6 的年年代,我們⼀一路路 fallback…
• 如果還可以拿到 UUID,代表可能以前有⽤用過 UDID 加
密,把 UUID 先寫到 Keychain 以後留留著⽤用
• 如果拿不不到,Keychain 沒東⻄西,就⾃自⼰己產⽣生⼀一組
NSUUID,寫進 Keychain 裡
• 以後都⽤用 Keychain 裡頭存的這把 key
- 22. Custom URL Scheme
• 在 Info.plist 中設定
• 執⾏行行 fb:// 開頭的 URL,可以叫出 Facebook
• 執⾏行行 line:// 開頭的 URL,可以叫出 LINE 做指定的事情
• 執⾏行行 kkbox:// 開頭的 URL,可以叫出 KKBOX
- 26. Universal Links
• 如果你要另外⼀一個 App 做事,就呼叫另外⼀一個 App 對應的
網⾴頁的 https:// URL
• 系統可以判斷是否有對應到這個 https:// URL 的 App,然後
開啟 App,如果沒有對應的 App,就開啟對應的網⾴頁
• 在蘋果後台勾選 Associated Domain,產⽣生新的
entitlement,然後在網站上放置 apple-app-site-association
檔案
• 所以每個做 App 的⼈人就得同時做個網站,創造就業機會
- 27. Universal Links 也很兩光
• 在從 App Store 上安裝新 App 的時候,iOS 才會去你的網
站上下載 apple-app-site-association,開始讓你的 App 開
始⽀支援 Universal Links
• 如果⽤用⼾戶是升級安裝…好像就不不會去抓
• ⽽而且每次也都不不⾒見見得會下載成功
- 30. Safari View Controller
• ⼀一個 Cookie/Session、帳號密碼都可以與 Safari 共⽤用的
View Controller
• 如果在 App 中使⽤用 UIWebView 或 WKWebView,顯示⼀一
些 Web 內容,由於 Cookie/Session 不不⼀一樣,所以看到的
網⾴頁也跟 Safari 看到的不不⼀一樣
• 只能要求指定開啟某個 URL,沒有接收 Web 事件的
delegate method
- 31. Safari View Controller
• 我們於是可以⽤用 Safari View Controller 偵測裝了了哪些 App
• App A ⽤用 Safari View Controller 開啟某個特定網⾴頁,帶
上特定代表某服務的某帳號 GET 參參數數,⾴頁⾯面根據這個
GET 參參數數產⽣生 Cookie
• App B 後來來也做了了⼀一樣的事情,所以那個⾴頁⾯面就會知道
A、B 兩個 App 都在同⼀一個⾴頁⾯面留留下過 Cookie
• ⾴頁⾯面就可以反查出同⼀一個⽤用⼾戶同時⽤用過 A、B 兩個 App
- 32. Safari View Controller
• 我們還可以偷偷使⽤用 Safari View Controller 塞 Cookie
• iOS 9:Safari View Controller 的 frame 是 CGRectZero,
把 View 的位置放在 super view 之外,都會幫你載⼊入網⾴頁
• iOS 10:你可以把 Safari View Controller 設成只有⼀一個
pixel 的寬⾼高
- 33. Safari View Controller
• iOS 11 停⽌止 App 之間共⽤用 Session
• 如果要⽤用 Safari View Controller 做 OAuth 驗證時,需要呼
叫 SFAuthenticationSession,才能夠暫時拿到屬於某個網
站的 Cookie/Session
- 34. 兩個 Private API
• LSApplicationWorkSpace:可以查詢系統中所有的 App
Bundle ID
• MBAppManager:可以查詢符合某個 Bundle ID 的 App 是
否存在
- 39. 語⾳音輸⼊入法
• 有些 iOS 第三⽅方鍵盤提供「語⾳音輸⼊入」功能
• 從鍵盤按下「語⾳音輸⼊入」之後,會將 container app 帶到前景,
讓⽤用⼾戶在 container app 錄錄⾳音之後,再將原本的 app 帶回前景,
輸⼊入語⾳音辨識的內容
• 也就是,這些鍵盤知道⽤用⼾戶是從哪個 app 轉過來來的,就可以蒐集
⽤用⼾戶在⼿手機上使⽤用哪些 app
• https://github.com/zonble/EvilKeyboard
• 不不過輸⼊入法其實可以從你打了了什什麼字偷⾛走更更多東⻄西…
- 42. App 三法則
• App 不不可以傷害⼈人類類
• App 不不可以因為懶惰不不作為,導致⼈人類類受到傷害
• 在不不違背前兩點下,App 不不可以傷害⾃自⼰己