Cody Blog

使用 linphone 函式庫發生 exc_bad_access 的除錯經驗

exc_bad_access

在叫用 linphone 的函式庫時,發生 exc_bad_access的錯誤,因為這個錯誤往往發生的地方跟掛掉的地方是不一樣的,所以比較難除錯。

EXC_BAD_ACCESS

是因為對已經釋放的記憶體進行了非法操作,程式會直接 Crash,無法用 error handle catch 來處理。

exc_bad_access

Crash 片段

zombie

記錄發生 crash 的地方不只有一處,共同的特色就是都是掛在 linphone 的函式庫:

發生位置1 linphone_core_iterate():

@objc func iterate(){
    let lc = LinphoneManager.getLc()
    if  lc != nil{
        linphone_core_iterate(lc); /* first iterate initiates registration */
    }
}

發生位置2 linphone_core_iterate():

if let phone = phoneNumber, lc = LinphoneManager.lc {
    nameLabel.text = calleeName!
    linphone_core_invite(lc, phone)
}

透 Debug build 測試

因為預設從 linphone 網站下載的 iphone sdk 是沒有 debug symbol 的,所以在發生 crash 的時侯,只能看到看組合語言: acc EXC_I386_GPFLT

雖然有 linphone 的函式名稱,但是對於問題的幫助不大。所以我就直接 build 一個 有 debug symbol 的 liblinphone-sdk,build debug sdk 步驟記錄在另一篇

經過有 debug build 的協助之後, crash 的資訊從原本的組合語言變成了 c 語言 …

Build liblinphone-sdk for iOS

Install git, homebrew

install git, homebew if you have no one.

Clone ios-linphone

$ git clone git://git.linphone.org/linphone-iphone.git --recursive

Remember add --recursive to download submodule

Excute .prepare.py

$ ./prepare.py

You may need execute this command many time until you install all dependecies.

In my case, I installed these tools:

$ brew install imagemagick doxygen cmake intltool yasm automake coreutils wget optipng nasm 
$ brew install intltool

If it works, you will get the following message:

-- Configuring done
-- Generating done
-- Build files have been written to: /Users/cwliu/Dev@Local/WiAdvance/1603_GoodWox/liblinphone/linphone-iphone/WORK/ios-armv7 …

Using Haneke for Image Cache in Swift

如果要在 iOS 上,圖片是從網路下載回來的話,勢必要需要做快取,以避免每一次顯示都要重新載入,今天要介紹一套叫 Haneke的 Swift Library, Haneke 是使用 extension 的方法讓 UIImageView 多了一些方法可以做快取。

首先, 安裝可以透過 CocoPods,這邊不多詳述。使用之前記得要先 import:

import Haneke

如果想顯示一張網路上的圖片: http://i.imgur.com/thfn9Ml.jpg,最簡單用法就是

imageView.hnk_setImageFromURL("http://i.imgur.com/thfn9Ml.jpg")

它就會幫你做完下載、快取、重載的動作,相當的方便。另外,若想刪除所有的 image ache,可執行:

Haneke.Shared.imageCache.removeAll()

另外比較進階的用法,像是有一些圖片需要帶 HTTP Header 才有權限存取的話,這邊以加一個 Authorization 的 header 為例,先新增一個自訂的 NetworkFetcher

public class BearerHeaderNetworkFetcher<T: DataConvertible> : NetworkFetcher<T> {

    var token: String

    public override var session : NSURLSession {
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        configuration.HTTPAdditionalHeaders = [
            "Authorization": self.token
        ];

        return NSURLSession(configuration: configuration)
    }

    override init(URL : NSURL) {
        self.token …

在iOS/Swift中使用 liblinphone 函式庫

本文記錄了我在 ios 上面使用 Liblinphone 的過程。

基於 Github basefx/linphone-swift 上面的這個專案,StackOverflow 討論 為基礎來修改的。另外,我把這篇的結果也放到 github 上面給大家參考: https://github.com/cwliu/linphone-swift-demo

把 linphone iOS 加入 Swift 的 Project

下載 liblinphone SDK: http://www.linphone.org/releases/ios/liblinphone-iphone-sdk-latest.zip

解壓縮之後,裡面是一個liblinphone-sdk的資料夾,把這個資料夾複製到 swift 的專案之中。

新增 objective-c bridging header

因為 liblinphone 是 c 的 library,所以要在 swift 的專案中使用的話,要設定bridging header。在 Project Navigator中新增一個 .h Header 設定一個檔名,例如 linphone-swift-demo-Bridging.h。並在 project setting 的 Build Settings > Swift Compiler - Code Generation 中設定Objective-C Bridging Header為這個檔案:

linphonedemo3/bridge.h

http://i.imgur.com/N5UbxNy.png

在這個檔案中加入以下的內容:

#import "linphone/lpconfig.h"
#import "linphone/linphonecore.h …