Socket

最近在接觸即時通訊相關的開發內容,撇除使用第三方服務的串接,
大多數都是建議使用 Socket 來和伺服器端進行連接和溝通。
而研究了一下,在 TCP / IP 架構下,sockets 可以分為兩種

  • Datagram sockets(connectionless)
  • Stream sockets(connection-oriented)

Datagram sockets(connectionless)

Datagram sockets 是使用 UDP 封包來進行傳送,
其主要的特色是速度快但不能保證資料的完整性以及次序有可能會有誤;
所以大多是使用在廣播資訊或是傳送一些較不是那麼重要的內容。

Stream sockets(connection-oriented)

而 Stream sockets 則是使用 TCP 封包來傳遞,
其因為會先需要確認 Server 和 Client 兩者連接狀態後再傳遞,
故速度較慢一些,但至少能確認資料的有序性以及完整度。

簡單的總結

以中華郵政的觀點來看,以結果來區分的話,
我們可以簡略地將 UDP 視為平信、TCP 視為掛號信。
而即時通訊的部分,依照上述的特色來看,就得選擇使用 TCP 的方式來進行溝通。

Server 和 Client 的溝通流程

首先,伺服器端和用戶端兩者必須使用同一類的封包才能互相通訊,
意思便是指 Server 建立了一個 UDP Socket,Client 也必須使用 UDP Socket 才能兩者打通。
而 Socket name 會需要包含 IP、Port、以及使用哪種協定;
當 Client 端的 Socket 成功聯繫上 Server 端的 Socket 時,
這兩者便形成一組 association。

iOS 上的 Socket 實作方式

我這邊是使用第三方套件的方式來協助實作,Github 上有不少相關的開源碼可以使用。

這篇就先以 CocoaAsyncSocket 作為內容主軸來當後面的說明。
比照上方的流程圖,首先我們要先建立一個 socket,再來進行 connect 的動作,
之後相關的 callback,會以 delegate 的方式來做處理。

不過這邊要比較注意到的是,會需要主動的執行 readData 的動作,
來告知底層,目前可以讀取傳輸進來的資料。

在 RxSwift 內的實作方式

讓 socket 的動作和事件是可被訂閱的,參考了一些實作的方式,
讓 CocoaAsyncSocket 和 RxSwift 結合在一塊:

有興趣的人可以參考參考!

AdMob 獎勵式廣告實作

AdMob

在 Google 的廣告投放服務之中,是以 AdSense 作為主軸,整合所有廣告相關的服務;
而 AdMob 則是其中一個專門針對行動裝置的部分。
所以若 iOS 的開發者想在其應用上放置廣告單元,則需要從 AdMob 著手。

建立廣告單元

首先,需要先到 AdMob 的控制台中,新建一個新的應用程式,
並將 app 的相關資訊填寫完整。

再者,則是建立一個廣告單元,而這篇所要分享的是「獎勵式廣告」的實作。

什麼是獎勵式廣告?

獎勵式廣告的意思就如其名,是一個可以在編輯時設定,
反饋給觀看玩廣告的使用者一些獎勵的一種廣告模式;
如大部分的手機遊戲,觀看影片後可以得到一些鑽石、金幣或者特殊加成等。

設定廣告獎勵

我們可以在這個畫面中,去設定使用者觀看頻率的限制以及獎勵數量。

而在後面程式實作的時候,會講解這邊設定會影響到什麼。

Framework 安裝

你可以透過 CocoaPods 或是直接下載拉進專案之中;
這邊由於我所加入廣告的 App 有整合 Firebase 的相關服務,
而 Firebase 官方並無支援 Carthage,所以在這就一併使用 CocoaPods 來做套件的管理。
因為使用 Firebase,所以只需要在原先的 Podfile 之中加上

並且執行 pod install,即可完成安裝。

AppDelegate.swift

先在上方 import GoogleMobileAds,並需要在 FirebaseApp.configure() 之後,加上 AdMob 的廣告設定:
GADMobileAds.configure(withApplicationID: Your_Ads_ApplicationID)

這樣便可以在一開啟 app 時,和 AdMob 做連結。

獎勵式廣告的流程

獎勵式廣告和一般掛在下方的簽入式廣告不同,它的流程為
一、先和 AdMob 發送獎勵式廣告的 request

二、主動式地去詢問 AdMob 的獎勵式廣告是否就緒;

三、影片完整備看完後,它會以 delegate 的方式告知你剛剛投放的獎勵式廣告,其相關內容設定

大致上的流程就是這樣,接著回到前面所說的設定;
若你有限制使用者觀看的頻率,在觀看完後的限制時間內,會在步驟二的地方得到 false,
所以在流程上需要稍作注意。
而獎勵數量則是會在廣告結束後的 delegate 之中,以 reward 這個物件回傳回來,
它底下會有 amount 這個的參數,便是剛剛所設定的獎勵數量。

KVOController

KVOController

有關 Observe 的相關做法,在 Swift 上我會選擇使用 RxSwift,那 Objective-C 呢?
在這邊簡單介紹一下 KVOController 的 solution 給 Objective-C 的開發者。
在 NSObject 的子類別下,都會繼承到一個 FBKVOController 的物件,名字為 KVOController;
而這邊要使用的 method 是這個:

  • object 是我們要觀察的物件
  • keyPath 是 object 底下的要觀察的值,它的名稱(key)
  • options 則是填入 NSKeyValueObservingOptions
  • block 再來決定當 object 的 keyPath 那物件有更動時,要做些什麼事

舉個例子

  • observe:self
  • keyPath:NSStringFromSelector(@selector(observeObjectName))

翻成白話文就是 self 去觀察 self.observeObjectName 的 value 變化。

  • block 裡頭的 observer = 觀察的物件,object 則是被觀察的物件

在這個例子之中,observer 剛好和 object 是同一個物件(self),
而我們可以在 //do something 裡頭寫些東西,像是當 observeObjectName 有值更動時,畫面上 UILabel 的 text 會跟著改變之類的。
不過這邊要注意兩點

  1. KVOController 不像 RxCocoa 一樣,有提供 observe UIKit 物件的功能。
  2. readonly 的物件,因為 observe 為監聽 set 的動作,若是直接使用 _observeObjectName = @""; 的方式,則不會被監聽到。
Bitnami