在APP开发中很多页面都有的用户协议&隐私政策, 使用SwiftUI来实现
幸运的是SwiftUI中的Text支持Markdown语法,so我们直接实现
Text(
"感谢您下载xxxxxx。在您开始使用本软件时,我们可能会对您的部分个人信息进收集、使用和共享。 \n\n请您务必仔细阅读 **[《用户协议》](mydemo:UserAgreement)** 与 **[《隐私政策》](mydemo:PrivacyPolicy)** 全文,并确定完全了解我们对您个人信息的处理规则。\n\n如您同意
**[《用户协议》](mydemo:UserAgreement)** 与
**[《隐私政策》](mydemo:PrivacyPolicy)** ,请点击\"同意\"开始使用我们的产品和服务,们会尽全力保护您的个人信息安全。 这个方法要在url type声明一个 mydemo, mydemo:UserAgreement 可以直接替换为链接, 不用实现下方的onOpenUrl的方法,会直接跳转到系统浏览器(推荐使用)")
.lineSpacing(13)
.padding(.horizontal, 30)
.font(.myFontRegular(size: 15).bold())
.foregroundStyle(MyStyle.blackColor)
.accentColor(MyStyle.mainColor)
.onOpenURL { url in
switch url.absoluteString {
case "myApp:UserAgreement":
//todo something
print("点击协议\(url)")
break
case "myApp:PrivacyPolicy":
//todo something
print("点击协议\(url)")
break
default:
print("点击协议\(url)")
break
}
}
需要注意是要在URLType中配置, 如下:
其他方案也可以实现:
var text1: AttributedString {
var text =
AttributedStrin
(localized:"感谢您下载xxxxxx。在您开始使用本软件时,我们可能会对您的部分个人信息进行收集、使用和共享。
\n\n请您务必仔细阅读 ")
text.foregroundColor = MyStyle.blackColor
return text
}
var text2: AttributedString {
var text = AttributedString(localized:"《用户协议》")
text.link = URL(string: "111")
text.foregroundColor = MyStyle.mainColor
return text
}
var text3: AttributedString {
var text = AttributedString(localized:"与")
text.foregroundColor = MyStyle.blackColor
return text
}
var text4: AttributedString {
var text = AttributedString(localized:"《隐私政策》")
text.link = URL(string: "222")
text.foregroundColor = MyStyle.mainColor
return text
}
var text5: AttributedString {
var text = AttributedString(localized:"全文,并确定完全了解我们对您个人信息的处理如您同意 ")
text.foregroundColor = MyStyle.blackColor
return text
}
var text: AttributedString {
text1 + text2 + text3 + text4 + text5
}
Text(text)
.lineSpacing(10)
.padding(.horizontal, 30)
.environment(\.openURL, OpenURLAction { url in
let path = url.absoluteString
if path.hasPrefix("111") {
print("111...")
} else if path.hasPrefix("222") {
print("222...")
}
return .handled
})
var body: some View {
Text(customDes
("感谢您下载欢心到家。在您开始使用本软件时,我们可能会对您的部分个人信息进行收集、使用和共享。\n\n请您务必仔细阅读《
户协议》与《隐私政策》全文,并确定完全了解我们对您个人信息的处理规则。\n\n如您同意 《用户协议》
与《隐私政策》,请点击”同意’开始使用我们的产品和服务,我们会尽全力保护您的个人信息安全。"))
.lineSpacing(10)
.padding(.horizontal, 30)
.environment(\.openURL, OpenURLAction { url in
let path = url.absoluteString
if path.hasPrefix("111") {
print("111...")
} else if path.hasPrefix("222") {
print("222...")
}
return .handled
})
}
func customDesc(_ text: String) -> AttributedString {
var attributedString = AttributedString(text)
attributedString.font = Font.system(size: 15, weight: .medium)
for range in text.ranges(of: "《用户协议》") {
// this converts Range<String.Index> to Range<AttributedString.Index>
if let lowerBound = AttributedString.Index(range.lowerBound, within: attributedString),
let upperBound = AttributedString.Index(range.upperBound, within: attributedString) {
let attrRange = lowerBound..<upperBound
attributedString[attrRange].font = Font.system(size: 15, weight: .regular)
attributedString[attrRange].foregroundColor = MyStyle.mainColor
attributedString[attrRange].link = URL(string: "111")
}
}
for range in text.ranges(of: "《隐私政策》") {
// this converts Range<String.Index> to Range<AttributedString.Index>
if let lowerBound = AttributedString.Index(range.lowerBound, within: attributedString),
let upperBound = AttributedString.Index(range.upperBound, within: attributedString) {
let attrRange = lowerBound..<upperBound
attributedString[attrRange].font = Font.system(size: 15).weight(.regular)
attributedString[attrRange].foregroundColor = MyStyle.mainColor
attributedString[attrRange].link = URL(string: "222")
}
}
return attributedString
}