為設定中心新增常用功能

xDEHANG發表於2018-04-01

OneSwift - iOS Tips Based On Swift

在我們開發所有的應用中,通常會提供包含多項功能的設定中心。這些功能可以包括,給使用者推薦自己的其他作品、邀請使用者好評、提供反饋通道、邀請使用者分享應用、開啟官網或某些其他地址。 這些功能雖然使用者使用頻率不高,但對於應用的設定中心是必備的。

1.跳轉到AppStore,邀請好評或推薦其他應用

2.提供系統郵件反饋通道

3.調取系統分享功能分享應用

4.在應用內開啟網頁,實現官方網址、應用更新說明或開啟其他網址

通常設定中心由TableViewCollectionView建立,在didSelectRowAt中新增不同的點選反饋即可,這裡就不再描述。

一、跳轉到AppStore

應用內跳轉到AppStore可以通過設定對應的應用地址即可,因此可以跳轉到其他應用介面實現推薦應用,也可以跳轉到自身應用的地址邀請使用者好評。OneX系列產品都擁有推薦和評價的入口,兩種入口的實現方式也都是一樣的。 在不同的情況下我們只需要改變urlString末尾的ID即可,當讓也可以封裝在某一個函式中,通過引數進行改變具體的跳轉地址。

let urlString = "itms-apps://itunes.apple.com/app/id1250290965"
if let url = URL(string: urlString) {
    //根據iOS系統版本,分別處理
    if #available(iOS 10, *) {
        UIApplication.shared.open(url, options: [:],
                                  completionHandler: {
                                    (success) in
        })
    } else {
        UIApplication.shared.openURL(url)
    }
}
複製程式碼

開啟AppStore

二、郵件反饋功能

第一,需要匯入框架MessageUI.framework,在專案設定Build PhasesLink Binary With Libraries中新增MessageUI.framework。 第二,在使用郵件反饋功能的頁面檔案中匯入標頭檔案import MessageUI。 第三,給所在Controller加上協議MFMailComposeViewControllerDelegate

完成以上步驟之後,我們就可以開始寫具體的使用程式碼了。 傳送反饋郵件時,為了方便我們收到郵件時辨別是使用者發來的反饋郵件,同時瞭解使用者的系統、版本等資訊,我們在傳送函式中設定好標題與預設正文。 mailComposeVC.setToRecipients中新增收件郵箱地址,mailComposeVC.setSubject中新增郵件標題,mailComposeVC.setMessageBody設定正文內容。

//郵件傳送函式
func configuredMailComposeViewController() -> MFMailComposeViewController {

    let mailComposeVC = MFMailComposeViewController()
    mailComposeVC.mailComposeDelegate = self

    //獲取裝置資訊
    let deviceName = UIDevice.current.name
    //        let deviceModel = UIDevice.current.model
    let systemVersion = UIDevice.current.systemVersion
    let deviceUUID = UIDevice.current.identifierForVendor?.uuidString

    //獲取APP資訊
    let infoDic = Bundle.main.infoDictionary
    // 獲取App的版本號
    let appVersion = infoDic?["CFBundleShortVersionString"] ?? "appVersion"
    // 獲取App的build版本
    let appBuildVersion = infoDic?["CFBundleVersion"] ?? "appBuildVersion"
    // 獲取App的名稱
    let appName = infoDic?["CFBundleDisplayName"] ?? "OneClock"

    //設定郵件地址、主題及正文
    mailComposeVC.setToRecipients(["<xdehang@gmail.com>"])
    mailComposeVC.setSubject("OneScreen "+String(describing: appVersion)+" - "+NSLocalizedString("FeedBack Mail From", comment: "FeedBack Mail From")+"  "+deviceName)

    let content:String = "\n \n \n \n Device:\(deviceName)\n System:\(systemVersion)\n App Version:\(String(describing: appVersion))"

    mailComposeVC.setMessageBody(NSLocalizedString("<Start To Write Mail>", comment: "<Start To Write Mail>")+content, isHTML: false)

    return mailComposeVC

}
複製程式碼

再需要新增郵件系統提示和郵件傳送檢測。

//郵件系統提示
func showSendMailErrorAlert() {

    let sendMailErrorAlert = UIAlertController(title: NSLocalizedString("Unable To Send", comment: "Unable To Send"), message: NSLocalizedString("Your device has not been set up, please set in the mail application and then try to send.", comment: "Your device has not been set up, please set in the mail application and then try to send."), preferredStyle: .alert)
    sendMailErrorAlert.addAction(UIAlertAction(title: NSLocalizedString("Confirm", comment: "Confirm action title"), style: .default) { _ in })
    self.present(sendMailErrorAlert, animated: true){}

}
//郵件傳送檢測
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {

    switch result.rawValue {
    case MFMailComposeResult.cancelled.rawValue:
        print("取消傳送")
    case MFMailComposeResult.sent.rawValue:
        print("傳送成功")
    default:
        break
    }
    self.dismiss(animated: true, completion: nil)

}
複製程式碼

最後我們在呼叫郵件反饋的地方,需要先判斷是否能夠傳送,如果不能傳送通過提示資訊告訴使用者失敗原因,如果可以傳送將成功調取傳送視窗。 在需要郵件反饋的地方:

if MFMailComposeViewController.canSendMail() {
    //注意這個例項要寫在if block裡,否則無法傳送郵件時會出現兩次提示彈窗(一次是系統的)
    let mailComposeViewController = configuredMailComposeViewController()
    self.present(mailComposeViewController, animated: true, completion: nil)

} else {
    self.showSendMailErrorAlert()
}
複製程式碼

郵件反饋

三、系統分享功能

分享前,我們需要設定好分享的資訊:標題、圖片、連結。

var webUrl:String = "https://itunes.apple.com/cn/app/id1355476695"
var urlTitle:String = "OneScreen"
var urlImage:UIImage = #imageLiteral(resourceName: "onescreen_icon")
複製程式碼

這裡使用了var,是為了在特殊情況下改變他們的值,具體的呼叫方式如下:

let shareVC:UIActivityViewController = UIActivityViewController(activityItems: [self.urlTitle,self.urlImage,self.webUrl], applicationActivities: nil)

self.present(shareVC, animated: true, completion: {
    print("shareVC success")
})
複製程式碼

分享應用

四、開啟某些網址

開啟網址可以實現“官方網址”、“應用更新說明”功能,更新說明我們可以通過更新Web內容快速高速使用者更新列表。如果你的應用需要比較多的教程,也可以通過網頁的形式展現。為了方便使用者反饋,我通常會增加一個微博入口,讓使用者開啟微博地址快速與我聯絡進行反饋。

這個功能我們需要建立一個承載網頁內容的Web頁面,因此需要先新增帶有WebViewController。 在其他頁面開啟Web時,通過傳遞引數來告訴WebView具體呈現哪一個網址。

webView

例如在OneDay的WebViewController中:

override func viewDidLoad() {
       super.viewDidLoad()

       // Do any additional setup after loading the view.
       switch webIndex {
       case 0:
           self.urlString = "https://weibo.com/bujidehang"
       case 1:
           self.urlString = "http://www.ohweonline.com/oneday"
       case 2:
           self.urlString = "http://www.ohweonline.com/oneday/updateCN.html"
       case 3:
           self.urlString = "http://www.ohweonline.com/oneday/updateEN.html"
       default:
           self.urlString = "http://www.ohweonline.com/oneday"
       }

       let urlobj = URL(string:self.urlString)
       let request = URLRequest(url:urlobj!)
       webView.loadRequest(request)
       print(webView.isLoading)

}
複製程式碼

在設定頁面中,我們開始開啟Web:

print("to webview")
self.webIndex = 1
self.performSegue(withIdentifier: "viewWebView", sender: self)

複製程式碼

WebIndex傳遞給WebViewController,以方便判斷具體的網址。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  if segue.identifier == "viewWebView"{
            let dest = segue.destination as! WebViewController
            dest.webIndex = self.webIndex

  }
}
複製程式碼

這樣就實現了所有相關網址的開啟。實際在網頁載入頁面中還有一些特性和功能,將在下一期文章中詳細說明。

開啟網址

GitHub:OneSwift - iOS Tips Based On Swift

微博:xDEHANG

相關文章