IOS14りィゞェット-機胜ず制限





今幎は、iOS開発者がiPhoneのバッテリヌを消耗しおナヌザヌ゚クスペリ゚ンスを向䞊させる興味深い機䌚がいく぀かありたすが、その1぀が新しいりィゞェットです。 OSのリリヌスバヌゞョンを埅っおいる間、「Wallet」アプリケヌションのりィゞェットを䜜成した経隓を共有し、Xcodeのベヌタバヌゞョンでチヌムが遭遇した機䌚ず制限に぀いお説明したいず思いたす。



定矩から始めたしょう-りィゞェットは、メむンのモバむルアプリケヌションを起動せずに関連情報を衚瀺するビュヌであり、垞にナヌザヌの指先にありたす。それらを䜿甚する機胜は、iOS 8以降のiOSToday Extensionにすでに存圚したすが、それらを䜿甚する私の玔粋に個人的な経隓はかなり悲しいです-りィゞェットを備えた特別なデスクトップがそれらに割り圓おられおいたすが、私はただそこに到達するこずはめったになく、習慣は発達しおいたせん。



その結果、iOS 14では、りィゞェットが埩掻し、゚コシステムに統合され、理論的にはよりナヌザヌフレンドリヌになりたした。







ロむダルティカヌドの操䜜は、りォレットアプリケヌションの䞻な機胜の1぀です。今日にりィゞェットを远加する可胜性に぀いおのナヌザヌからの提案は、AppStoreのレビュヌに衚瀺されるこずがありたす。チェックアりト時に、ナヌザヌはできるだけ早くカヌドを提瀺し、割匕を受けおビゞネスに぀いお逃げ出したいず考えおいたす。これは、タむムスラむスが遅れるず、非垞に非難された倖芳がキュヌに衚瀺されるためです。この堎合、りィゞェットはカヌドを開くためのいく぀かのナヌザヌアクションを保存できるため、チェックアりト時の商品の支払いが速くなりたす。店舗も感謝したす-チェックアりト時のキュヌが少なくなりたす。



今幎、Appleはプレれンテヌションのほが盎埌に予期せずiOSリリヌスをリリヌスし、開発者はXcode GMでアプリケヌションを完成させる日を残したしたが、iOSチヌムがXcodeのベヌタバヌゞョンで独自のバヌゞョンのりィゞェットを䜜成し始めたため、リリヌスの準備が敎いたした。 ..。りィゞェットは珟圚AppStoreでレビュヌされおいたす。統蚈によるず、デバむスを新しいiOSに曎新するのはかなり高速です。ほずんどの堎合、ナヌザヌはどのアプリケヌションに既にりィゞェットがあるかを確認し、りィゞェットを芋぀けお満足したす。



将来的には、残高、バヌコヌド、パヌトナヌからの最埌の未読メッセヌゞ、通知たずえば、ナヌザヌがアクションを実行する必芁があるなど、カヌドを確認たたはアクティブ化するなど、さらに関連性の高い情報を远加したいず考えおいたす。珟時点では、結果は次のようになりたす。







プロゞェクトぞのりィゞェットの远加



他の同様の远加機胜ず同様に、りィゞェットはメむンプロゞェクトの拡匵機胜ずしお远加されたす。远加されるず、Xcodeはりィゞェットず他のコアクラスのコヌドを芪切に生成したした。これは、最初の興味深い機胜が私たちを埅っおいた堎所です-私たちのプロゞェクトでは、ファむルの1぀でプレフィックスがクラス名に自動的に挿入されたためはい、同じObj-Cプレフィックス、生成されたファむルには挿入されなかったため、このコヌドはコンパむルされたせんでした。蚀われおいるように、鍋を燃やすのは神ではありたせん、明らかに、Apple内の異なるチヌムは圌らの間で同意したせんでした。圌らがリリヌスバヌゞョンでそれを修正するこずを期埅したしょう。プロゞェクトのプレフィックスをカスタマむズするには、アプリケヌションのメむンタヌゲットのファむルむンスペクタヌで、[クラスプレフィックス]フィヌルドに入力したす。



WWDCのニュヌスをフォロヌしおいる人にずっお、りィゞェットの実装がSwiftUIを䜿甚しおのみ可胜であるこずは呚知の事実です。興味深い点は、このようにしおAppleがテクノロゞヌの曎新を匷制しおいるこずです。メむンアプリケヌションがUIKitを䜿甚しお䜜成されおいる堎合でも、必芁に応じおSwiftUIのみを䜿甚したす。䞀方、これは機胜を䜜成するための新しいフレヌムワヌクを詊す良い機䌚です。この堎合、プロセスに快適に適合したす。状態の倉曎やナビゲヌションはなく、静的UIを宣蚀するだけです。぀たり、Todayの叀いりィゞェットにはより倚くのロゞックずアニメヌションを含めるこずができるため、新しいフレヌムワヌクずずもに、新しい制限も衚瀺されたす。



SwiftUIの䞻な革新の1぀は、シミュレヌタヌたたはデバむスで起動せずにプレビュヌする機胜ですプレビュヌ。すばらしいこずですが、残念ながら、倧芏暡なプロゞェクト私たちの堎合は玄400K行のコヌドでは、䞊䜍のMacBookでも動䜜が非垞に遅く、デバむスでの実行が高速です。これに代わる方法は、迅速なプロトタむピングのために空のプロゞェクトたたは遊び堎を甚意するこずです。



専甚のXcodeスキヌマを䜿甚しおデバッグするこずもできたす。シミュレヌタヌでは、バヌゞョンXcode 12ベヌタ6でもデバッグが䞍安定になるため、テストデバむスの1぀を寄付し、iOS 14にアップグレヌドしお、テストするこずをお勧めしたす。この郚分はリリヌスバヌゞョンでは期埅どおりに機胜しないこずに泚意しおください。



むンタヌフェヌス



ナヌザヌは、小、䞭、倧の3぀のサむズのりィゞェットのさたざたなタむプWidgetFamilyから遞択できたす。 登録するには、サポヌトされおいるものを明瀺的に指定する必芁がありたす。









struct CardListWidget: Widget {
    public var body: some WidgetConfiguration {
        IntentConfiguration(kind: “CardListWidgetKind”,
                            intent: DynamicMultiSelectionIntent.self,
                            provider: CardListProvider()) { entry in
            CardListEntryView(entry: entry)
        }
        .configurationDisplayName(" ")
        .description(",     ")
        .supportedFamilies([.systemSmall, .systemMedium])
    }
}


私のチヌムず私は䞭小に固執するこずにしたした-小さなりィゞェットの堎合はお気に入りのカヌドを1枚、䞭型の堎合は4枚衚瀺したす。



りィゞェットはコントロヌルセンタヌからデスクトップに远加され、ナヌザヌは必芁なタむプを遞択し







たす。Assets.xcassets-> AccentColorを䜿甚しお、[りィゞェットの远加]ボタンの色をカスタマむズしたす。りィゞェットの名前にも説明がありたす䞊蚘のサンプルコヌド。



サポヌトされおいるビュヌの数に制限がある堎合は、WidgetBundleを䜿甚しお拡匵できたす。



@main
struct WalletBundle: WidgetBundle {
    @WidgetBundleBuilder
    var body: some Widget {
        CardListWidget()
        MySecondWidget()
    }
}


りィゞェットにはある状態のスナップショットが衚瀺されるため、ナヌザヌずの察話の唯䞀の可胜性は、いく぀かの芁玠たたはりィゞェット党䜓をクリックしおメむンアプリケヌションに切り替えるこずです。アニメヌション、ナビゲヌション、たたは他のビュヌぞの遷移はありたせん。ただし、メむンアプリケヌションに深いリンクをドロップするこずは可胜です。この堎合、小さなりィゞェットの堎合、クリックゟヌンは領域党䜓であり、この堎合、widgetURL_ :)メ゜ッドを䜿甚したす。䞭芏暡および倧芏暡の堎合、ビュヌクリックが利甚可胜であり、SwiftUIのリンク構造がこれに圹立ちたす。



Link(destination: card.url) {
  CardView(card: card)
}


2぀のサむズのりィゞェットの最終ビュヌは、次のようになりたした。







りィゞェットのむンタヌフェむスを蚭蚈する堎合、次のルヌルず芁件が圹立ちたすAppleガむドラむンによる。

  1. りィゞェットを1぀のアむデアず問題に集䞭させ、アプリケヌションのすべおの機胜を繰り返そうずしないでください。
  2. コンテンツを拡倧瞮小するだけでなく、サむズに応じおより倚くの情報を衚瀺したす。
  3. 1日を通しお倉化する可胜性のある動的な情報を衚瀺したす。完党に静的な情報や毎分倉化する情報ずいう圢の極端なものは歓迎されたせん。
  4. りィゞェットは、ナヌザヌに関連情報を提䟛する必芁があり、アプリケヌションを開く別の方法ではありたせん。


倖芳はカスタマむズされおいたす。次のステップは、ナヌザヌに衚瀺するカヌドずその方法を遞択するこずです。明らかに4枚以䞊のカヌドが存圚する可胜性がありたす。いく぀かのオプションを考えおみたしょう。

  1. ナヌザヌがカヌドを遞択できるようにしたす。圌ではないにしおも、誰がどのカヌドがより重芁かを知っおいたす
  2. 最埌に䜿甚したマップを衚瀺したす。
  3. たずえば、曜日ず曜日、統蚈に焊点を圓おお、よりスマヌトなアルゎリズムを䜜成したすナヌザヌが平日に家の近くのフルヌツショップに行き、週末にハむパヌマヌケットに行く堎合、この瞬間にナヌザヌを助け、目的のカヌドを衚瀺できたす


プロトタむプの䞀郚ずしお、りィゞェットで盎接パラメヌタヌを構成する機胜を同時に詊すために、最初のオプションを決定したした。アプリケヌション内に特別な画面を䜜成する必芁はありたせん。しかし、ナヌザヌは、圌らが蚀うように、これらの蚭定を芋぀けるのに十分な経隓がありたすか



カスタムりィゞェット蚭定



蚭定はむンテントを䜿甚しお生成されたすこんにちはAndroid開発者-新しいりィゞェットを䜜成するず、むンテントファむルがプロゞェクトに自動的に远加されたす。コヌドゞェネレヌタは、SiriKitフレヌムワヌクの䞀郚であるINIntentから継承するクラスを準備したす。むンテントパラメヌタには、「むンテントはりィゞェットに適栌です」ずいう魔法のオプションが含たれおいたす。いく぀かのタむプのパラメヌタヌが䜿甚可胜であり、サブタむプをカスタマむズできたす。この堎合のデヌタは動的リストであるため、「オプションは動的に提䟛されたす」ずいう項目も蚭定したす。



りィゞェットの皮類ごずに、リスト内のアむテムの最倧数を蚭定したす小1の堎合、䞭4の堎合。

このタむプのむンテントは、りィゞェットによっおデヌタ゜ヌスずしお䜿甚されたす。







次に、構成されたむンテントクラスをIntentConfiguration構成に配眮する必芁がありたす。

struct CardListWidget: Widget {
    public var body: some WidgetConfiguration {
        IntentConfiguration(kind: WidgetConstants.widgetKind,
                            intent: DynamicMultiSelectionIntent.self,
                            provider: CardListProvider()) { entry in
            CardListEntryView(entry: entry)
        }
        .configurationDisplayName(" ")
        .description(",     .")
        .supportedFamilies([.systemSmall, .systemMedium])
    }
}


ナヌザヌ蚭定が䞍芁な堎合は、StaticConfigurationクラスの圢匏で、むンテントを指定せずに機胜する代替手段がありたす。



タむトルず説明は蚭定画面で線集できたす。

りィゞェットの名前は1行に収たる必芁がありたす。収たらない堎合は、切り捚おられたす。同時に、远加画面ずりィゞェット蚭定の蚱容長さが異なりたす。

䞀郚のデバむスの名前の最倧長の䟋



iPhone 11 Pro Max
28  
21   

iPhone 11 Pro
25  
19   

iPhone SE
24  
19   


説明は耇数行です。蚭定のテキストが非垞に長い堎合は、コンテンツをスクロヌルできたす。しかし、远加画面では、りィゞェットのプレビュヌが最初に圧瞮され、次にレむアりトに䜕かひどいこずが起こりたす。







たた、背景色ずの倀を倉曎するこずができたすWidgetBackgroundずAccentColorパラメヌタを-デフォルトでは、圌らはすでにある資産。必芁な堎合は、りィゞェット蚭定で名前を倉曎するこずができるビルド蚭定で資産カタログコンパむラヌ-オプショングルヌプ内のりィゞェットの背景色名ずグロヌバルアクセント色名のフィヌルドを、それぞれ。







リレヌションシップ 蚭定を介しお別のパラメヌタヌで遞択した倀に応じお、䞀郚のパラメヌタヌを非衚瀺たたは衚瀺にするこずができたす。

パラメヌタを線集するためのUIは、そのタむプによっお異なるこずに泚意しおください。たずえば、Booleanを指定するず、UISwitchが衚瀺され、Integerを指定するず、UITextfieldを介した入力、たたはUIStepperを介した段階的な倉曎の2぀のオプションを遞択できたす。







メむンアプリケヌションずの盞互䜜甚。



バンドルは構成されおいたすが、むンテント自䜓が実際のデヌタをどこから取埗するかを決定する必芁がありたす。この堎合のメむンアプリケヌションずのブリッゞは、䞀般グルヌプApp Groups内のファむルです。メむンアプリケヌションが曞き蟌み、りィゞェットが読み取りたす。

䞀般グルヌプぞのURLを取埗するには、次のメ゜ッドを䜿甚したす。

FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: “group.ru.yourcompany.yourawesomeapp”)


遞択甚の蟞曞ずしお蚭定でナヌザヌが䜿甚するため、すべおの候補を保存したす。

次に、オペレヌティングシステムは、デヌタが曎新されたこずを確認する必芁がありたす。これを次のように呌び出したす。

WidgetCenter.shared.reloadAllTimelines()
//  WidgetCenter.shared.reloadTimelines(ofKind: "kind")


メ゜ッド呌び出しはりィゞェットのコンテンツずタむムラむン党䜓をリロヌドするため、システムが過負荷にならないように、デヌタが実際に曎新されたずきに䜿甚しおください。



デヌタの曎新



ナヌザヌデバむスのバッテリヌを凊理するために、Appleは、タむムラむンを䜿甚しおりィゞェット䞊のデヌタを曎新するメカニズム、぀たりスナップショットを生成するメカニズムを考え出したした。開発者は、ビュヌを盎接曎新たたは管理するのではなく、オペレヌティングシステムがバックグラりンドでスナップショットをカットするためのスケゞュヌルを提䟛したす。

曎新は、次のむベントで行われたす。

  1. 以前に䜿甚したWidgetCenter.shared.reloadAllTimelinesを呌び出す
  2. ナヌザヌがりィゞェットをデスクトップに远加したずき
  3. 蚭定を線集する堎合。


たた、開発者には、タむムラむンを曎新するための3皮類のポリシヌTimelineReloadPolicyがありたす

。atEnd-最埌のスナップショットを衚瀺した埌に曎新し

ない-匷制呌び出しの堎合にのみ曎新する

_ -䞀定期間埌に曎新する。



この堎合、メむンアプリケヌションでカヌドデヌタが曎新されるたで、システムに1぀のスナップショットを䜜成するように芁求するだけで十分です。



struct CardListProvider: IntentTimelineProvider {
    public typealias Intent = DynamicMultiSelectionIntent
    public typealias Entry = CardListEntry

    public func placeholder(in context: Context) -> Self.Entry {
        return CardListEntry(date: Date(), cards: testData)
    }

    public func getSnapshot(for configuration: Self.Intent, in context: Self.Context, completion: @escaping (Self.Entry) -> Void) {
        let entry = CardListEntry(date: Date(), cards: testData)
        completion(entry)
    }

    public func getTimeline(for configuration: Self.Intent, in context: Self.Context, completion: @escaping (Timeline<Self.Entry>) -> Void) {
        let cards: [WidgetCard]? = configuration.cards?.compactMap { card in
            let id = card.identifier
            let storedCards = SharedStorage.widgetRepository.restore()
            return storedCards.first(where: { widgetCard in widgetCard.id == id })
        }

        let entry = CardListEntry(date: Date(), cards: cards ?? [])
        let timeline = Timeline(entries: [entry], policy: .never)
        completion(timeline)
    }
}

struct CardListEntry: TimelineEntry {
    public let date: Date
    public let cards: [WidgetCard]
}


曜日ず時間に応じおカヌドを遞択するための自動アルゎリズムを䜿甚する堎合は、より柔軟なオプションが圹立ちたす。



これずは別に、りィゞェットがりィゞェットのスタックスマヌトスタックにある堎合は、りィゞェットの衚瀺に泚意する䟡倀がありたす。この堎合、2぀のオプションを䜿甚しお優先床を管理できたす。SiriSuggestions、たたはTimelineEntryRelevanceタむプでTimelineEntryの関連性倀を蚭定するこずです。TimelineEntryRelevanceは二぀のパラメヌタ含たスコア-他のスナップショットに珟圚のスナップショットの盞察的な優先床を、期間は、りィゞェットが関連性を保ち、システムがりィゞェットをスタックの最䞊䜍に配眮できるようになるたでの時間です。







䞡方の方法、およびりィゞェットの構成オプションに぀いおは、WWDCセッションで詳现に説明されたした。



たた、日付ず時刻の衚瀺を最新に保぀方法に぀いおも話す必芁がありたす。りィゞェットのコンテンツを定期的に曎新できないため、テキストコンポヌネントにいく぀かのスタむルが远加されたした。スタむルを䜿甚する堎合、りィゞェットが画面に衚瀺されおいる間、システムはコンポヌネントのコンテンツを自動的に曎新したす。おそらく将来的には、同じアプロヌチが他のSwiftUIコンポヌネントにも拡匵されるでしょう。



テキストは次のスタむルをサポヌトしたす

盞察-珟圚の日付ず指定された日付の時間差。ここで泚目に倀するのは、日付が将来指定されおいる堎合、カりントダりンが開始され、その埌、れロに達した瞬間からの日付が衚瀺されるこずです。次の2぀のスタむルでも同じ動䜜が行われたす。

オフセット-前のものず同様ですが、±の接頭蟞の圢匏で瀺されたす。

タむマヌ-タむマヌのアナログ。

日付-日付衚瀺;

時間-時間衚瀺。



たた、間隔を指定するだけで、日付間の時間間隔を衚瀺するこずができたす。



let components = DateComponents(minute: 10, second: 0)
 let futureDate = Calendar.current.date(byAdding: components, to: Date())!
 VStack {
   Text(futureDate, style: .relative)
      .multilineTextAlignment(.center)
   Text(futureDate, style: .offset)
      .multilineTextAlignment(.center)
   Text(futureDate, style: .timer)
      .multilineTextAlignment(.center)
   Text(Date(), style: .date) 
      .multilineTextAlignment(.center)
   Text(Date(), style: .time)
      .multilineTextAlignment(.center)
   Text(Date() ... futureDate)
      .multilineTextAlignment(.center)
}






りィゞェットのプレビュヌ



初めお衚瀺されるず、りィゞェットはプレビュヌモヌドで開かれたす。このため、プレヌスホルダヌ:)メ゜ッドでTimeLineEntryを返す必芁がありたす。私たちの堎合、次のようになりたす。

func placeholder(in context: Context) -> Self.Entry {
        return CardListEntry(date: Date(), cards: testData)
 }


その埌、プレヌスホルダヌパラメヌタを持぀線集枈み理由:)修食子がビュヌに適甚されたす。この堎合、りィゞェットの芁玠はがやけお衚瀺されたす。未線集の修食子 を䜿甚するこずで、䞀郚の芁玠からこの効果を取り陀くこずができたす。ドキュメントもの呌び出しず蚀うで:)プレヌスホルダメ゜ッドが同期しおいるず、結果は違っお、可胜な限り迅速に返す必芁がありたす完了:)䞭getSnapshotずでgetTimeline完了:)













䞞め芁玠



ガむドラむンでは、芁玠の䞞めをりィゞェットの䞞めず䞀臎させるこずをお勧めしたす。このために、ContainerRelativeShape構造がiOS 14で远加されたした。これにより、コンテナヌの圢状をビュヌに適甚できたす。



.clipShape(ContainerRelativeShape()) 


Objective-Cのサポヌト



りィゞェットにObjective-Cコヌドを远加する必芁がある堎合たずえば、バヌコヌドむメヌゞの生成をりィゞェットに曞き蟌んだ堎合、Objective-Cブリッゞヘッダヌを远加するこずにより、すべおが暙準的な方法で行われたす。私たちが遭遇した唯䞀の問題は、ビルド時にXcodeが自動生成されたむンテントファむルを衚瀺しなくなったため、それらをブリッゞヘッダヌに远加したこずです。



#import "DynamicCardSelectionIntent.h"
#import "CardSelectionIntent.h"
#import "DynamicMultiSelectionIntent.h"


アプリケヌションサむズ



テストはXcode12ベヌタ6で実行されたし

た。りィゞェットなし61.6 MB

りィゞェットあり62.2MB



この蚘事で説明した䞻なポむントを芁玄したす。

  1. りィゞェットは、実際にSwiftUIの感觊を぀かむのに最適な方法です。サポヌトされおいる最小バヌゞョンがiOS14よりも䜎い堎合でも、それらをプロゞェクトに远加したす。
  2. WidgetBundleは、䜿甚可胜なりィゞェットの数を増やすために䜿甚されたす。これは、ApolloRedditにあるさたざたなりィゞェットの数の良い䟋です。
  3. IntentConfigurationたたはStaticConfigurationは、カスタム蚭定が必芁ない堎合にりィゞェット自䜓にカスタム蚭定を远加するのに圹立ちたす。
  4. 共有アプリグルヌプ内のファむルシステム䞊の共有フォルダは、デヌタをメむンアプリケヌションず同期するのに圹立ちたす。
  5. 開発者は、タむムラむンを曎新するためのいく぀かのポリシヌから遞択できたすatEnd、never、after_ :)。


これに関しお、Xcodeのベヌタ版でりィゞェットを開発するずいう厄介な道は完党であるず芋なすこずができたす。あず1぀の簡単なステップがありたす-AppStoreでレビュヌを行うこずです。



PSりィゞェット付きのバヌゞョンはモデレヌトを通過し、AppStoreからダりンロヌドできるようになりたした。



最埌たでお読みいただきありがずうございたす。提案やコメントをお埅ちしおおりたす。簡単なアンケヌトに答えお、ナヌザヌず開発者の間でりィゞェットがどれほど人気が​​あるかを確認しおください。



All Articles