版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2020.11.18 星期三 |
前言
App Clips
是2020年WWDC新推出的功能了赌,它的功能非常強大墨榄,因為它使沒有您的應(yīng)用程序的用戶仍可以使用其功能。 從訂購咖啡到停車勿她,App Clips
有很多很好的用途袄秩。 下面我們就一起學(xué)習(xí)和看一下。感興趣的可以看下面幾篇文章逢并。
1. App Clips詳細(xì)解析(一) —— 基本概覽(一)
開始
首先看下主要內(nèi)容:
就是一起設(shè)計和實現(xiàn)
App Clips
之剧,內(nèi)容來自翻譯。
接著看下寫作環(huán)境:
Swift 5, iOS 14, Xcode 12
下面就是正文啦
在2020年蘋果全球開發(fā)者大會(WWDC)
上砍聊,蘋果發(fā)布了App Clips
:較小的按需版本的應(yīng)用程序背稼,允許用戶執(zhí)行特定任務(wù)。
App Clips
功能非常強大玻蝌,因為它們使沒有您的應(yīng)用程序的用戶仍然可以使用其功能蟹肘。從訂購咖啡到停車,App Clips
有很多很好的用途俯树。更好的是帘腹,App Clips
提供了發(fā)現(xiàn)新應(yīng)用的絕佳方法!
在本教程中许饿,您將為SwiftyLemonade
創(chuàng)建一個App Clip
體驗竹椒,SwiftyLemonade
是一個簡單的應(yīng)用程序,可讓您使用App Clip
購買檸檬水米辐。在此過程中胸完,您將學(xué)到:
- What an App Clip is.
- How to add an App Clip target.
- How to share assets and code.
- About App Clip experiences and how to make one.
- How to confirm a user’s location using the Location Confirmation API.
- Working with App Clip notifications.
注意:本教程假定您了解
SwiftUI
的基礎(chǔ)知識。如果您不熟悉SwiftUI
翘贮,請先查看SwiftUI: Getting Started tutorial赊窥。
注意:您必須安裝
Xcode 12
才能遵循本教程。您可以在本教程的大部分內(nèi)容中使用模擬器狸页,但是要測試Location Confirmation API
锨能,則需要一臺運行iOS 14
的設(shè)備扯再。為此,您需要先在Starter
應(yīng)用中更新bundle ID
址遇,然后才能開始按照本教程的說明進行操作熄阻。
打開入門項目。 在入門項目中倔约,您會找到SwiftyLemonade
秃殉,該應(yīng)用程序顯示了各大Major League Soccer (MLS)
體育場上檸檬水?dāng)偽坏牧斜怼?gòu)建并運行以檢出該應(yīng)用程序:
該應(yīng)用程序顯示了位于各個MLS
體育場的Swifty
檸檬水?dāng)偽坏牧斜怼?您還可以將一個攤位標(biāo)記為喜歡浸剩,并在單獨的標(biāo)簽中查看收藏夾列表:
要收藏檸檬水?dāng)偽患鼐堥L按列表中的一個項目:
在這里,您可以選擇檸檬水?dāng)偽痪钜⒂嗁?code>Swifty著名的檸檬水之一吏恭。 這對足球迷來說是一個真正的打擊:
在Xcode中,查看將要處理的主要文件:
- LemonadeStand.swift包含一個代表檸檬水?dāng)偽坏?code>struct以及要在應(yīng)用程序中顯示的一系列攤位重罪。
-
Lemonade.swift包含代表檸檬水的
struct
和兩個菜單數(shù)組樱哼。 - MenuList.swift顯示所選檸檬水?dāng)偽坏臋幟仕藛巍?/li>
- DetailView.swift顯示所選檸檬水的詳細(xì)信息。
- StandList.swift顯示一個可供選擇的檸檬水?dāng)偽涣斜怼?在這里剿配,您可以長按收藏夾或取消收藏唇礁。
-
StandTabView.swift是一個
TabView
,用于顯示檸檬水?dāng)偽换驑?biāo)記為收藏的檸檬水?dāng)偽坏耐暾斜怼?/li> -
LemonadeStandLocations是一個
Swift
軟件包惨篱,其中包含Swifty Lemonade
攤位的位置。
在本教程中围俘,您將構(gòu)建一個App Clip
砸讳,將您帶到LA Galaxy
菜單購買檸檬水。
What Exactly Is an App Clip?
App Clip
是應(yīng)用程序的輕量級版本界牡,它使用戶無需安裝完整版本的應(yīng)用程序即可執(zhí)行特定任務(wù)簿寂。這使用戶可以在需要時立即訪問應(yīng)用的正確部分。要啟動App Clip
宿亡,請掃描NFC
標(biāo)簽常遂,QR
碼或App Clip
代碼。此流程稱為App Clip experience
挽荠。
如果用戶安裝了您的應(yīng)用程序克胳,則App Clip
體驗將充當(dāng)該應(yīng)用程序的切入點。例如圈匆,Coffee
特許經(jīng)營應(yīng)用程序可能會具有App Clip
體驗漠另,在掃描時會轉(zhuǎn)到您所在的咖啡店的菜單≡咀或者笆搓,如果未安裝該應(yīng)用程序,則會從App Store
下載相關(guān)的App Clip
卡。然后將App Clip Card
呈現(xiàn)給用戶满败,以啟動此流程肤频。作為開發(fā)人員,您可以使用App Store Connect
配置App Clip Card
算墨,但請記紫摹:它們需要一個主應(yīng)用程序。
注意:如果您想了解有關(guān)配置
App Clip
的啟動體驗的更多信息米同,請查閱Apple’s documentation on Configuring Your App Clip’s Launch Experience骇扇。
Adding an App Clip Target
首先,將App Clip target
添加到項目中面粮,并將其命名為SwiftyLemonadeClip
:
確保將Interface
設(shè)置為SwiftUI
少孝,將Life Cycle
設(shè)置為SwiftUI App
。 然后熬苍,在出現(xiàn)提示時單擊Activate
稍走。 一個名為SwiftyLemonadeClip
的新組被添加到Project
導(dǎo)航器中:
此外,Xcode
為您的App Clip
設(shè)置名稱和bundle identifier
柴底。 您可能會注意到婿脸,bundle identifier
以.Clip
作為擴展名:
現(xiàn)在,您已經(jīng)添加了App Clip target
柄驻,現(xiàn)在該進行測試了狐树。 構(gòu)建并運行:
哇! 這里沒有太多的事情鸿脓。 在下一部分中抑钟,您將學(xué)習(xí)如何在app
和App Clip target
之間共享代碼和資源。
Sharing Assets and Code Between Targets
設(shè)置好項目后野哭,您就可以開始從App
到App Clip
共享資源和代碼了在塔!
注意:
App Clip
和App
可以共享很多內(nèi)容,但不應(yīng)共享敏感信息拨黔。 如果您想了解有關(guān)將數(shù)據(jù)提供給App Clip的相應(yīng)App
的信息蛔溃,請查閱Apple’s Documentation。
1. Sharing Code and Assets
由于App Clips
是主App
的輕量級版本篱蝇,因此將存在依賴性贺待。 返回Xcode,單擊SwiftyLemonadeClip target
零截,然后在Frameworks狠持,Libraries, and Embedded Content
部分中將LemonadeStandLocations Swift
軟件包添加為依賴項。 您的App Clip
現(xiàn)在可以訪問檸檬水?dāng)偽坏奈恢茫?/p>
接下來瞻润,共享一些Swift
文件喘垂。 App Clips
將需要了解有關(guān)檸檬水?dāng)偽坏男畔ⅰ?在項目導(dǎo)航器中單擊LemonadeStand.swift
甜刻,然后在文件檢查器中更新target membership
,以包括SwiftyLemonadeClip
:
完成此操作后正勒,您應(yīng)該看到很多error
:
不用擔(dān)心得院! 添加剩余的依賴項后,這些錯誤將消失章贞。
就像對LemonadeStand.swift
一樣祥绞,更新以下文件的target membership
:
- Lemonade.swift
- MenuList.swift
- DetailView.swift
- OrderPlacedView.swift
- StandList.swift
- Assets.xcassets in the SwiftyLemonade group
很好! 沒有更多的錯誤鸭限!
Designing the App Clip Experience
App Clip experience
是使用URL調(diào)用應(yīng)用程序的切入點蜕径。 一個應(yīng)用程序可能具有許多導(dǎo)致特定任務(wù)的App Clip
體驗URL
。 在本教程中败京,您將在Swifty
的一個檸檬水?dāng)偽簧蠁右粋€App Clip
體驗URL
兜喻,其中顯示了下訂單的菜單。
首先赡麦,在SwiftyLemonadeClip
下創(chuàng)建一個新的Swift
文件朴皆,并將其命名為SwiftyLemonadeClipModel.swift
。 禁用SwiftyLemonade target
泛粹,因為新文件只需要對您的App Clip
可用:
然后遂铡,在SwiftyLemonadeClipModel.swift
中,在import Foundation
下添加以下代碼:
class SwiftyLemonadeClipModel: ObservableObject {
@Published var selectedStand: LemonadeStand?
}
在這里晶姊,您創(chuàng)建了一個符合ObservableObject
的SwiftyLemonadeClipModel
類扒接。 您還添加了@Published
屬性,以將選定的攤位通知您的App Clip
们衙。
接下來钾怔,必須在SwiftyLemonadeClipApp.swift
中實例化模型。 將以下屬性添加到該結(jié)構(gòu)體:
@StateObject private var model = SwiftyLemonadeClipModel()
現(xiàn)在砍艾,您必須將此屬性提供給App Clip
的子視圖。 仍在SwiftyLemonadeClipApp.swift
中巍举,將body
替換為以下內(nèi)容:
var body: some Scene {
WindowGroup {
//1
ContentView()
.environmentObject(model)
}
}
在上面的代碼中脆荷,將model
設(shè)置為環(huán)境對象,使其可用于ContentView
視圖子層次結(jié)構(gòu)懊悯。 接下來蜓谋,您將確定要選擇clip
的正確攤位。
1. Getting App Clip Experience Data
數(shù)據(jù)通過App Store Connect
中的注冊URL
傳遞到App Clip
炭分。 注冊URL不在本教程的討論范圍之內(nèi)桃焕,但這并不意味著您是失敗的團隊! 要從URL獲取數(shù)據(jù)捧毛,您必須配置App Clip
才能這樣做观堂。
首先让网,單擊Signing & Capabilities
選項卡下的SwiftyLemonadeClip target
,然后添加一個名為appClips:swiftyLemonade.example
的新Associated Domain:
接下來师痕,App Clip
必須解釋數(shù)據(jù)溃睹。 返回SwiftyLemonadeClipApp.swift
,將body
替換為以下內(nèi)容以從URL獲取查詢項:
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(model)
.onContinueUserActivity(
NSUserActivityTypeBrowsingWeb,
perform: handleUserActivity) //1
}
}
// 2
func handleUserActivity(_ userActivity: NSUserActivity) {
//3
guard
let incomingURL = userActivity.webpageURL,
let components = URLComponents(
url: incomingURL,
resolvingAgainstBaseURL: true),
let queryItems = components.queryItems
else {
return
}
//4
guard
let latValue = queryItems.first(where: { $0.name == "lat" })?.value,
let lonValue = queryItems.first(where: { $0.name == "lon" })?.value,
let lat = Double(latValue),
let lon = Double(lonValue)
else {
return
}
//5
print("Latitude: \(lat), Longitude: \(lon)")
}
主要做了這些:
- 1) 注冊
NSUserActivityTypeBrowsingWeb
的處理程序胰坟。當(dāng)iOS遇到App Clip experience URL
時因篇,它將調(diào)用此處理程序。 - 2) 處理
URL
數(shù)據(jù)笔横。 - 3) 僅當(dāng)存在包含
queryItems
的URL
時才繼續(xù)執(zhí)行 - 4) 檢查是否存在名為
lat
和lon
的queryItems
竞滓,并將它們分配給latValue
和lonValue
。這些項目代表關(guān)聯(lián)的檸檬水?dāng)偽坏慕?jīng)度和緯度吹缔。如果這些值不存在商佑,則對于此App Clip
體驗無效。這些值是String
類型的涛菠,您可以將它們轉(zhuǎn)換為Double
類型莉御。 - 5) 將
lat
和lon
值打印到控制臺。
2. Simulating a Clip Launch
要對此進行測試俗冻,請創(chuàng)建啟動URL
礁叔。這使您可以模擬從App Clip experience URL
啟動App Clip
。要創(chuàng)建一個迄薄,將活動scheme
設(shè)置為SwiftyLemonadeClip
琅关。然后,編輯scheme
并通過單擊復(fù)選框啟用_XCAppClipURL
環(huán)境變量讥蔽。最后涣易,將其值設(shè)置為https://swiftyLemonade.example.com/order?lat=33.8644&lon=-118.2611
,如下所示:
您添加的URL的查詢參數(shù)是lat
和lon
冶伞,它們的值表示檸檬水?dāng)偽坏木暥群徒?jīng)度新症。
現(xiàn)在,構(gòu)建并運行响禽。 您會看到緯度和經(jīng)度值已打印到控制臺:
3. What Lemonade Stand Is This?!
是時候找到離您最近的檸檬水?dāng)偽涣恕?返回SwiftyLemonadeClipApp
徒爹,在import SwiftUI
下,添加以下內(nèi)容:
import CoreLocation
接下來芋类,在handleUserActivity(_ :)
中隆嗅,用以下代碼替換先前添加的print()
:
//1
let location = CLLocationCoordinate2D(
latitude: CLLocationDegrees(lat),
longitude: CLLocationDegrees(lon))
//2
if let stand = standData.first(where: { $0.coordinate == location }) {
model.selectedStand = stand
//3
print("Welcome to \(stand.title)! :]")
}
這段代碼:
- 1) 使用從URL獲得的
lat
和lon
值創(chuàng)建一個CLLocationCoordinate2D
變量 - 2) 查詢
standData
以查找具有匹配位置的第一個值。 如果找到位置侯繁,則將其設(shè)置為SwiftyLemonadeClipModel
中的selectedStand
胖喳。 - 3) 將
stand
名稱打印到控制臺
要進行檢查,請構(gòu)建并運行并查看打印到控制臺的歡迎消息:
您已將App Clip
配置為從URL獲取數(shù)據(jù)贮竟!
4. Ordering Some Lemonade
現(xiàn)在該為SwiftyLemonade
創(chuàng)建App Clip
體驗了丽焊。 在本部分中较剃,您將采用所選的stand
并顯示其相關(guān)菜單。 然后粹懒,用戶將能夠訂購一些檸檬水重付。
首先,在SwiftyLemonadeClip
下凫乖,打開ContentView.swift
确垫。 在ContentView
中添加以下屬性:
@EnvironmentObject private var model: SwiftyLemonadeClipModel
在這里,您已經(jīng)添加了先前創(chuàng)建的模型作為環(huán)境對象帽芽。
接下來删掀,將body
替換為以下內(nèi)容:
var body: some View {
//1
if let selectedStand = model.selectedStand {
//2
NavigationView {
//3
MenuList(stand: selectedStand)
}
}
}
這段代碼:
- 1) 檢查模型是否具有
selectedStand
。 - 2) 添加以
MenuList
作為根視圖的導(dǎo)航層次結(jié)構(gòu)导街。 - 3) 實例化
selectedStand
的MenuList
以顯示菜單項列表披泪。
要檢查這一點,構(gòu)建并運行:
現(xiàn)在搬瑰,您已將模型鏈接到內(nèi)容視圖款票,用戶可以通過掃描Swifty's LA Galaxy Lemonade Stand
上的URL
代碼訂購檸檬水。 App Clip
體驗應(yīng)專注于特定任務(wù)泽论,例如訂購檸檬水艾少。 因此,請注意屏幕底部缺少tab bar
翼悴,并且沒有可供選擇的stands
列表:
5. Can’t Find a Lemonade Stand?
如果該應(yīng)用找不到某個位置的檸檬水架怎么辦缚够? 向用戶顯示消息會很好。 打開SwiftyLemonadeClipModel.swift
并添加以下屬性:
@Published var locationFound = true
此屬性跟蹤應(yīng)用程序是否找到檸檬水?dāng)偽弧?默認(rèn)情況下是true
的鹦赎,因為它很可能會找到檸檬水?dāng)偽弧?/p>
接下來谍椅,打開SwiftyLemonadeClipApp
,并在handleUserActivity(_ :)
中古话,在可選綁定代碼之后添加else
子句雏吭,以找到檸檬水?dāng)偽唬?/p>
else {
model.locationFound = false
}
如果該位置沒有檸檬水?dāng)偽唬垖?code>locationFound設(shè)置為false
陪踩。 您還可以根據(jù)需要刪除print
語句杖们,這僅用于調(diào)試。
現(xiàn)在膊毁,回到SwiftyLemonadeClip
下的ContentView.swift
胀莹,將以下內(nèi)容添加到body
的末尾:
if model.locationFound == false {
Text("Error finding stand.")
}
如果附近沒有攤位基跑,則會顯示一條好消息婚温。
要對此進行測試,請更新_XCAppClipURL
以包含無效的緯度媳否。 將值設(shè)置為https://swiftyLemonade.example.com/order?lat=33.8644&lon=0
栅螟。
構(gòu)建并運行以查看錯誤消息:
很好荆秦!現(xiàn)在,您已經(jīng)更新了App Clip
力图,以處理無效的檸檬水?dāng)偽徊匠瘛T诶^續(xù)之前,請將_XCAPPClipURL
更改回有效URL:https://swiftyLemonade.example.com/order?lat=33.8644&lon=-118.2611
吃媒。
為了結(jié)束本節(jié)瓤介,您添加了一個App Clip
體驗,該體驗通過使用URL作為啟動參數(shù)來啟動赘那。該URL
提供您所處檸檬水?dāng)偽坏奈恢眯躺#@示其菜單。您可以從這里下訂單募舟。
但是祠斧,如果配送中心發(fā)生混亂,并且將錯誤的標(biāo)簽發(fā)送到錯誤的檸檬水?dāng)偽还敖福撛趺崔k琢锋?您可能會在其他攤位訂購檸檬水!或更糟糕的是呢灶,如果有人在商店放置了無效的標(biāo)簽進行欺詐吴超,該怎么辦?為避免這種情況填抬,Apple
引入了一個新的輕量級Location Confirmation API
烛芬,您將在下一節(jié)中對其進行了解。
Setting up Location Confirmation
蘋果與App Clip
一起飒责,引入了Location Confirmation API
赘娄。該框架提供了足夠的信息來驗證調(diào)用的App Clip
是否在預(yù)期的位置。Location Confirmation API
的工作原理是將App Clip
的激活負(fù)載與用戶的位置進行比較宏蛉。
注意:您需要至少運行
iOS 14
的設(shè)備來測試位置確認(rèn)API遣臼。在模擬器上,您只會在控制臺中看到一條錯誤消息拾并。
在SwiftyLemonade
中揍堰,如果您不在正確的位置,則將禁用下訂單的選項嗅义。為此屏歹,請打開SwiftyLemonadeClipModel.swift
并添加以下屬性:
@Published var paymentAllowed = true
此屬性確定用戶是否可以訂購檸檬水。
要設(shè)置位置確認(rèn)之碗,請打開App Clip
的Info.plist
蝙眶。 單擊App Clip
鍵旁邊的顯示三角形,以顯示Requests location confirmation
鍵褪那。 將其值更改為YES
:
接下來幽纷,打開SwiftyLemonadeClipApp.swift
式塌,并在import CoreLocation
下添加以下代碼:
import AppClip
這使您可以訪問App Clip
有效負(fù)載信息以驗證用戶的位置。
現(xiàn)在友浸,在SwiftyLemonadeClipApp.swift
的handleUserActivity(_ :)
底部添加以下內(nèi)容:
//1
guard let payload = userActivity.appClipActivationPayload else {
return
}
//2
let region = CLCircularRegion(
center: location,
radius: 500,
identifier: "stand_location"
)
//3
payload.confirmAcquired(in: region) { inRegion, error in
//4
guard error == nil else {
print(String(describing: error?.localizedDescription))
return
}
//5
DispatchQueue.main.async {
model.paymentAllowed = inRegion
}
}
這段代碼:
- 1) 通過啟動
App Clip
獲取有效載荷信息峰尝。 如果不存在,請停止執(zhí)行收恢。 - 2) 使用URL中找到的位置創(chuàng)建一個具有
500
米圓形邊界的區(qū)域武学。Core Location
使用國際單位制作為距離。 如果您不習(xí)慣使用這些單位伦意,那么一米就不止一碼了劳淆。 - 3) 檢查是否在
region
內(nèi)激活了App Clip
- 4) 如果有
error
,請將其記錄到控制臺進行調(diào)試默赂。 - 5)
inRegion
指示是否在正確的位置調(diào)用了App Clip
沛鸵。 使用此值啟用或禁用付款。
注意:如果您想了解
App Clips Activation
負(fù)載缆八,請查看關(guān)于APActivationPayload
的Apple’s Documentation曲掰。
1. Using Custom Flags
接下來,如果用戶不在預(yù)期的位置奈辰,則禁用下訂單的功能栏妖。 打開在SwiftyLemonade
下的Views
組中找到的DetailView.swift
。 此視圖允許您訂購檸檬水奖恰。 添加以下代碼:
@EnvironmentObject private var model: SwiftyLemonadeClipModel
此代碼使DetailView.swift
可以訪問App Clip
的模型吊趾。 但是該模型在SwiftyLemonade target
中不可用。 如果選擇此scheme
并嘗試構(gòu)建您的應(yīng)用程序瑟啃,則會看到以下錯誤:
要解決此問題论泛,請使用Swift Compilation Flag
將此代碼包裝在有條件的代碼中。 打開您的App Clip target
的Build Settings
蛹屿,然后將自定義標(biāo)志APPCLIP
添加到Debug
和Release schemes
中:
返回到DetailView.swift
颅眶,使用自定義標(biāo)志將model
包裝在條件中:
#if APPCLIP
@EnvironmentObject private var model: SwiftyLemonadeClipModel
#endif
現(xiàn)在价匠,選擇App Clip scheme
時使用條件中的代碼將只編譯。 編譯應(yīng)用程序授瘦,看看錯誤消失了卵洗!
接下來锚沸,App Clip
應(yīng)顯示一條警告笔时,提示您付款被禁用颓屑。 為此,請在條件之外添加一個屬性:
@State private var showWarningAlert = false
此屬性確定是否顯示警告彈窗识颊。
2. Disabling Ordering
接下來诚镰,在placeOrder()
內(nèi)部,在orderPlaced = true
之前添加以下代碼:
//1
#if APPCLIP
//2
guard model.paymentAllowed else {
//3
showWarningAlert = true
return
}
#endif
這段代碼:
- 1) 僅當(dāng)
scheme
中存在自定義標(biāo)志時,才在條件條件內(nèi)執(zhí)行代碼怕享。 - 2) 檢查
paymentAllowed
是否為true
。 這意味著App Clip
可以下訂單镰踏。 - 3) 如果不允許付款函筋,則將
showWarningAlert
設(shè)置為true
,并且不執(zhí)行placeOrder()
中的其余代碼奠伪。
3. Showing an Alert
要在調(diào)用placeOrder()
時顯示alert
跌帐,請在sheet
視圖修飾符的右括號后添加以下代碼到正文中:
//1
.alert(isPresented: $showWarningAlert) {
//2
Alert(
title: Text("Payment Disabled"),
message: Text("The QR was scanned at an invalid location."),
dismissButton: .default(Text("OK"))
)
}
這段代碼:
- 1) 如果
showWarningAlert
設(shè)置為true
,則發(fā)出alert
- 2) 將
alert
配置為具有標(biāo)題绊率,消息和關(guān)閉按鈕谨敛。 此alert
警告用戶不允許付款。
您可以再測試一步滤否。 除非您居住在洛杉磯銀河系所在地Dignity Health Sports Park
500米范圍內(nèi)脸狸,否則您將需要在設(shè)備上模擬自己的位置。 這樣一來藐俺,您無需在Swifty
的Lemonade Stand
附近就可以訂購檸檬水炊甲。
4. Simulating Location
要模擬在洛杉磯銀河體育場的身影,請在SwiftLemonadeClip
組中創(chuàng)建一個GPX
文件欲芹,并將其命名為LaGalaxy.gpx
卿啡。 確保選擇SwiftLemonadeClip target
:
打開LaGalaxy.gpx
并將其內(nèi)容替換為以下內(nèi)容:
<?xml version="1.0"?>
<gpx version="1.1" creator="Xcode">
<wpt lat="33.8644" lon="-118.2611">
<name>Dignity Health Sports Park</name>
<time>2014-09-24T14:55:37Z</time>
</wpt>
</gpx>
您添加的代碼代表Dignity Health Sports Park
的GPS
坐標(biāo)。
5. Putting it all Together
最后菱父,要測試每種情況颈娜,在構(gòu)建和運行應(yīng)用程序時必須設(shè)置默認(rèn)位置。 為此浙宜,您必須編輯App Clip
的scheme
并設(shè)置默認(rèn)位置官辽。
首先,在您不在預(yù)期位置的地方測試錯誤流粟瞬。 要設(shè)置默認(rèn)位置野崇,請選擇SwiftyLemonadeClip scheme
,然后選擇Edit Scheme
:
現(xiàn)在該檢查一下您添加的漂亮的錯誤alert
了亩钟。 構(gòu)建并運行該應(yīng)用程序乓梨,然后嘗試下訂單:
接下來是時候模擬在洛杉磯了。返回并編輯scheme
清酥,并將默認(rèn)位置設(shè)置為您先前創(chuàng)建的GPX
文件:
現(xiàn)在扶镀,在設(shè)備中設(shè)置了體育場的GPS
坐標(biāo)后,您應(yīng)該可以訂購一些檸檬水了焰轻。 構(gòu)建并運行:
恭喜你臭觉! 您已使用Location Confirmation API
來驗證用戶的位置并防止下錯訂單。
如果檸檬水準(zhǔn)備好時能收到通知,那不是很好嗎蝠筑? 這樣狞膘,您就可以觀看比賽而不會錯過任何動作。 當(dāng)短暫的通知在這里時什乙,請不要擔(dān)心挽封!
Using Ephemeral Notifications
像主應(yīng)用程序一樣,App Clip
可以接收通知臣镣。 通過在訂單準(zhǔn)備就緒時通知您辅愿,這些可以為App Clip
增添巨大價值。 App Clip
只能在啟動后的很短時間內(nèi)(最多八個小時)接收通知忆某。
打開您的App Clip
的Info.plist
并啟用臨時通知-它與位置確認(rèn)權(quán)限位于同一位置:
這將啟用App Clip
的通知点待,但用戶可以選擇加入App Clip Card
。 結(jié)果弃舒,在SwiftyLemonadeClipApp.swift
中癞埠,在handleUserActivity(_ :)
下面添加以下代碼:
func requestNotificationAuthorization() {
//1
let notifCenter = UNUserNotificationCenter.current()
notifCenter.getNotificationSettings { setting in
//2
if setting.authorizationStatus == .ephemeral {
return
}
//3
notifCenter.requestAuthorization(options: .alert) { result, error in
print("""
Authorization Request result: \(result) \
- \(String(describing: error))
""")
}
}
}
這段代碼:
- 1) 檢索應(yīng)用程序的通知設(shè)置
- 2) 檢查是否已授權(quán)該應(yīng)用接收短暫通知。 如果已經(jīng)授予訪問權(quán)限聋呢,則無需繼續(xù)燕差。 但是,如果未授予訪問權(quán)限坝冕,則再次請求它徒探。
最后,盡管仍在SwiftyLemonadeClipApp.swift
中喂窟,將以下代碼添加到body
的末尾测暗。 確保它出現(xiàn)在WindowGroup
的右括號內(nèi):
//1
.onAppear {
requestNotificationAuthorization()
}
出現(xiàn)此視圖時,此代碼調(diào)用requestNotificationAuthorization()
磨澡。
啟用通知后碗啄,您現(xiàn)在無需錯過所有足球比賽。
注意:如果您想了解有關(guān)
App Clip
通知的更多信息稳摄,請查閱 Apple’s Documentation或我們的Push Notifications Tutorial稚字。
在本教程中,您學(xué)習(xí)了如何:
- 1) Add an App Clip target
- 2) Share assets and code
- 3) Use the Location Confirmation API to verify you are at the correct location
- 4) Set up App Clip notifications
如果您喜歡本教程厦酬,請查看SwiftUI by Tutorials.胆描。 您將深入研究如何使用簡潔的聲明性語言來定義應(yīng)用程序的UI,以及告別大量令人困惑的UIKit
代碼仗阅。
如果您想了解有關(guān)App Clip
的更多信息昌讲,請查閱 Apple’s Documentation。
后記
本篇主要講述了
App Clips
的一個簡單示例减噪,感興趣的給個贊或者關(guān)注~~~