【iOS学习】为设置中心添加常用功能

在我们开发所有的应用中,通常会提供包含多项功能的设置中心。这些功能可以包括,给用户推荐自己的其他作品、邀请用户好评、提供反馈通道、邀请用户分享应用、打开官网或某些其他地址。

这些功能虽然用户使用频率不高,但对于应用的设置中心是必备的。

1.跳转到AppStore,邀请好评或推荐其他应用

2.提供系统邮件反馈通道

3.调取系统分享功能分享应用

4.在应用内打开网页,实现官方网址、应用更新说明或打开其他网址

通常设置中心由TableView或CollectionView创建,在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)

}

}

二、邮件反馈功能

第一,需要导入框架MessageUI.framework,在项目设置Build Phases的Link 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([""])

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("", comment: "")+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页面,因此需要先添加带有WebView的Controller。

在其他页面打开Web时,通过传递参数来告诉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

}

}

这样就实现了所有相关网址的打开。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容