App Clips詳細(xì)解析(二) —— 一個簡單示例(一)

版本記錄

版本號 時間
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í)如何在appApp Clip target之間共享代碼和資源。


Sharing Assets and Code Between Targets

設(shè)置好項目后野哭,您就可以開始從AppApp Clip共享資源和代碼了在塔!

注意:App ClipApp可以共享很多內(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)建了一個符合ObservableObjectSwiftyLemonadeClipModel類扒接。 您還添加了@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)存在包含queryItemsURL時才繼續(xù)執(zhí)行
  • 4) 檢查是否存在名為latlonqueryItems竞滓,并將它們分配給latValuelonValue。這些項目代表關(guān)聯(lián)的檸檬水?dāng)偽坏慕?jīng)度和緯度吹缔。如果這些值不存在商佑,則對于此App Clip體驗無效。這些值是String類型的涛菠,您可以將它們轉(zhuǎn)換為Double類型莉御。
  • 5) 將latlon值打印到控制臺。

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ù)是latlon冶伞,它們的值表示檸檬水?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獲得的latlon值創(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) 實例化selectedStandMenuList以顯示菜單項列表披泪。

要檢查這一點,構(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 ClipInfo.plist蝙眶。 單擊App Clip鍵旁邊的顯示三角形,以顯示Requests location confirmation鍵褪那。 將其值更改為YES

接下來幽纷,打開SwiftyLemonadeClipApp.swift式塌,并在import CoreLocation下添加以下代碼:

import AppClip

這使您可以訪問App Clip有效負(fù)載信息以驗證用戶的位置。

現(xiàn)在友浸,在SwiftyLemonadeClipApp.swifthandleUserActivity(_ :)底部添加以下內(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)于APActivationPayloadApple’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 targetBuild Settings蛹屿,然后將自定義標(biāo)志APPCLIP添加到DebugRelease 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è)備上模擬自己的位置。 這樣一來藐俺,您無需在SwiftyLemonade 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 ParkGPS坐標(biāo)。

5. Putting it all Together

最后菱父,要測試每種情況颈娜,在構(gòu)建和運行應(yīng)用程序時必須設(shè)置默認(rèn)位置。 為此浙宜,您必須編輯App Clipscheme并設(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 ClipInfo.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)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末短绸,一起剝皮案震驚了整個濱河市车吹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌醋闭,老刑警劉巖窄驹,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異证逻,居然都是意外死亡乐埠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門瑟曲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人豪治,你說我怎么就攤上這事洞拨。” “怎么了负拟?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵烦衣,是天一觀的道長。 經(jīng)常有香客問我掩浙,道長花吟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任厨姚,我火速辦了婚禮衅澈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谬墙。我一直安慰自己今布,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布拭抬。 她就那樣靜靜地躺著部默,像睡著了一般。 火紅的嫁衣襯著肌膚如雪造虎。 梳的紋絲不亂的頭發(fā)上傅蹂,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音算凿,去河邊找鬼份蝴。 笑死,一個胖子當(dāng)著我的面吹牛氓轰,可吹牛的內(nèi)容都是我干的搞乏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼戒努,長吁一口氣:“原來是場噩夢啊……” “哼请敦!你這毒婦竟也來了镐躲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤侍筛,失蹤者是張志新(化名)和其女友劉穎萤皂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匣椰,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡裆熙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了禽笑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片入录。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖佳镜,靈堂內(nèi)的尸體忽然破棺而出僚稿,到底是詐尸還是另有隱情,我是刑警寧澤蟀伸,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布蚀同,位于F島的核電站,受9級特大地震影響啊掏,放射性物質(zhì)發(fā)生泄漏蠢络。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一迟蜜、第九天 我趴在偏房一處隱蔽的房頂上張望刹孔。 院中可真熱鬧,春花似錦娜睛、人聲如沸芦疏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酸茴。三九已至,卻和暖如春兢交,著一層夾襖步出監(jiān)牢的瞬間薪捍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工配喳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酪穿,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓晴裹,卻偏偏與公主長得像被济,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子涧团,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容