рдЯреЗрд╕реНрдЯрд░ рдХреЛ рдирдП рдмрд┐рд▓реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛ рджреЗрдВ


Firebase App Distribution рдХреЗ iOS рдФрд░ Android SDK рдЯреВрд▓ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ рд╣реИ. рдЗрдирдХреА рдорджрдж рд╕реЗ, рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдВ рджрд┐рдЦрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ. рдпреЗ рд╕реВрдЪрдирд╛рдПрдВ рддрдм рджрд┐рдЦрддреА рд╣реИрдВ, рдЬрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдирдИ рдмрд┐рд▓реНрдб рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрддреА рд╣реИрдВ. рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ, App Distribution iOS рдФрд░ Android SDK рдЯреВрд▓ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдЯреЗрд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдирдИ рдмрд┐рд▓реНрдб рд╕реВрдЪрдирд╛рдПрдВ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрд╕рдВрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ.

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ

рдЕрдЧрд░ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА A/B рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдирд╣реАрдВ рдмрдирд╛рдИ рд╣реИ, рддреЛ рдЕрдкрдиреЗ iOS рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ Firebase рдЬреЛрдбрд╝реЗрдВ.

рдкрд╣рд▓рд╛ рдЪрд░рдг: App Distribution Tester API рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдирд╛

  1. Google Cloud рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЕрдкрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪреБрдиреЗрдВ.

  2. Firebase App Testers API рдореЗрдВ рдЬрд╛рдХрд░, рдЪрд╛рд▓реВ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.

рджреВрд╕рд░рд╛ рдЪрд░рдг: рдЕрдкрдиреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ App Distribution рдЬреЛрдбрд╝рдирд╛

  1. рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ Podfile рдЦреЛрд▓реЗрдВ рдпрд╛ pod init рдЪрд▓рд╛рдХрд░ рдПрдХ рдмрдирд╛рдПрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЯрд╛рд░рдЧреЗрдЯ рд╕реЗрдХреНрд╢рди рдореЗрдВ рдпрд╣ рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ:

    pod 'FirebaseAppDistribution'
  2. рдЕрдкрдиреЗ рдкреЙрдбрдлрд╝рд╛рдЗрд▓ рдХреА рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рдореЗрдВ, pod install рдЪрд▓рд╛рдПрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдмрдирд╛рдИ рдЧрдИ .xcworkspace рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ.

  3. рдЕрдкрдиреЗ App рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдпрд╛ UIApplicationDelegate рдореЗрдВ Firebase рдореЙрдбреНрдпреВрд▓ рдЗрдВрдкреЛрд░реНрдЯ рдХрд░реЗрдВ:

    Swift

    import FirebaseCore
    import FirebaseAppDistribution
    

    Objective-C

    @import FirebaseCore;
    @import FirebaseAppDistribution;
    
  4. рдЕрдкрдиреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдбреЗрд▓рд┐рдЧреЗрдЯ рдХреЗ application(_:didFinishLaunchingWithOptions:) рддрд░реАрдХреЗ рдореЗрдВ, FirebaseApp рд╢реЗрдпрд░ рдХрд┐рдП рдЧрдП рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()
    

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
    
  5. рдЕрдЧрд░ рд╕реНрд╡рд┐рдЬрд╝рд▓рд┐рдВрдЧ рдмрдВрдж рд╣реИ, рддреЛ рдЦреЛрд▓реЗ рдЧрдП рдХрд┐рд╕реА рднреА рдпреВрдЖрд░рдПрд▓ рдХреЛ App Distribution SDK рдЯреВрд▓ рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, App Distribution рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:application(_:open:options:)

    Swift

    func application(_ app: UIApplication, 
                     open url: URL,
                     options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
       if AppDistribution.appDistribution().application(application, open: url, options: options) {
          return true
       }
    
       // Handle other non-Firebase URLs here.
    
       return false
    }
    

    Objective-C

    - (BOOL)application:(UIApplication *)app 
                openURL:(NSURL *)url 
                options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
       if ([[FIRAppDistribution appDistribution] application:app openURL:url options:options]) {
          return YES;
       }
    
       // Handle other non-Firebase URLs here.
    
       return NO;
    }
    
  6. рдЖрдЦрд┐рд░ рдореЗрдВ, рдЕрдкрдиреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрдВрдкрд╛рдЗрд▓ рдХрд░реЗрдВ.

рддреАрд╕рд░рд╛ рдЪрд░рдг: рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рд╕реВрдЪрдирд╛рдПрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛

App Distribution SDK рдЯреВрд▓, рдЯреЗрд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдмрд┐рд▓реНрдб рд╕реЗ рдЬреБрдбрд╝реА рд╕реВрдЪрдирд╛рдПрдВ рд╕реЗрдЯ рдЕрдк рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИ: рд╕реВрдЪрдирд╛ рдХреЛ рдмреБрдирд┐рдпрд╛рджреА рддреМрд░ рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛. рдЗрд╕рдореЗрдВ, рдЯреЗрд╕реНрдЯрд░ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдкрдбреЗрдЯ рдФрд░ рд╕рд╛рдЗрди-рдЗрди рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рдмрдиреЗ рдбрд╛рдпрд▓реЙрдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ. рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рд╣реИ, рд╕реВрдЪрдирд╛ рдХреЛ рдРрдбрд╡рд╛рдВрд╕ рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛. рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдорд┐рд▓рддреА рд╣реИ. рдЕрдЧрд░ рдЖрдкрдиреЗ App Distribution рдПрд╕рдбреАрдХреЗ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдкрд╣рд▓реЗ рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╕реВрдЪрдирд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рддрд░реАрдХреЗ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ.

рдмреБрдирд┐рдпрд╛рджреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди

checkForUpdate рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдЯреЗрд╕реНрдЯрд░ рдХреЛ рд╕реВрдЪрдирд╛рдПрдВ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛ рд╣реБрдЖ рдбрд╛рдпрд▓реЙрдЧ рджрд┐рдЦрд╛рдПрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рджреЗрдЦреЗрдВ рдХрд┐ рдХреЛрдИ рдирдпрд╛ рдмрд┐рд▓реНрдб рдЙрдкрд▓рдмреНрдз рд╣реИ рдпрд╛ рдирд╣реАрдВ. рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░, рдпрд╣ рддрд░реАрдХрд╛ рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

  1. рдЗрд╕ рдХреБрдХреА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯреЗрд╕реНрдЯрд░ рдиреЗ рд╕реВрдЪрдирд╛рдПрдВ рдкрд╛рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдЪрд╛рд▓реВ рдХреА рд╣реИ рдпрд╛ рдирд╣реАрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЙрд╕реЗ рдЕрдкрдиреЗ Google рдЦрд╛рддреЗ рд╕реЗ App Distribution рдореЗрдВ рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ.

  2. рдЕрдЧрд░ рдЯреЗрд╕реНрдЯрд░ рдиреЗ рдЕрдм рддрдХ рд╕реВрдЪрдирд╛рдПрдВ рдкрд╛рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдЪрд╛рд▓реВ рдирд╣реАрдВ рдХреА рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛ рд╣реБрдЖ рдбрд╛рдпрд▓реЙрдЧ рджрд┐рдЦрддрд╛ рд╣реИ.

    рдЪреЗрддрд╛рд╡рдиреА рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЯреЗрд╕реНрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╕рд┐рд░реНрдлрд╝ рдПрдХ рдмрд╛рд░ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ. рдпрд╣ рд╕реБрд╡рд┐рдзрд╛, рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рднреА рдЕрдкрдбреЗрдЯ рдореЗрдВ рдЪрд╛рд▓реВ рд░рд╣рддреА рд╣реИ. рдпрд╣ рд╕реБрд╡рд┐рдзрд╛, рдЯреЗрд╕реНрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рддрдм рддрдХ рдЪрд╛рд▓реВ рд░рд╣рддреА рд╣реИ, рдЬрдм рддрдХ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдпрд╛ signOutTester рддрд░реАрдХреЗ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛. рдЬрд╝реНрдпрд╛рджрд╛ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░реАрдХреЗ рдХрд╛ рд░реЗрдлрд╝рд░рдВрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВ (Swift рдпрд╛ Objective-C).

  3. рдпрд╣ рдЯреЗрд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП, рдирдИ рдЙрдкрд▓рдмреНрдз рдмрд┐рд▓реНрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЯреЗрд╕реНрдЯрд░ рдЙрдиреНрд╣реЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХреЗ.

рдЕрдкрдиреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдордп checkForUpdate() рдХреЛ рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдЯреЗрд╕реНрдЯрд░ рдХреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ рджреМрд░рд╛рди, рдирдИ рдЙрдкрд▓рдмреНрдз рдмрд┐рд▓реНрдб рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдЯ рд╡реНрдпреВ рдХреЗ onAppear(perform:) рдореЗрдВ checkForUpdate() рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ.

рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯреЗрд╕реНрдЯрд░ рдиреЗ рд╕реВрдЪрдирд╛рдПрдВ рдкрд╛рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдЪрд╛рд▓реВ рдХреА рд╣реИ рдпрд╛ рдирд╣реАрдВ. рд╕рд╛рде рд╣реА, рдЙрд╕рдХреЗ рдкрд╛рд╕ рдирдИ рдмрд┐рд▓реНрдб рдХрд╛ рдРрдХреНрд╕реЗрд╕ рд╣реИ рдпрд╛ рдирд╣реАрдВ. рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ, рддреЛ рдмрд┐рд▓реНрдб рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░, рдПрдХ рдбрд╛рдпрд▓реЙрдЧ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

Swift

рдзреНрдпрд╛рди рджреЗрдВ: рдпрд╣ рдкреНрд░реЙрдбрдХреНрдЯ, macOS, Mac Catalyst, tvOS рдпрд╛ watchOS рдЯрд╛рд░рдЧреЗрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ.
AppDistribution.appDistribution().checkForUpdate(completion: { release, error in
  if error != nil {
      // Handle error
      return
  }

  guard let release = release else {
    return
  }

  // Customize your alerts here.
  let title = "New Version Available"
  let message = "Version \(release.displayVersion)(\(release.buildVersion)) is available."
  let uialert = UIAlertController(title: title,message: message, preferredStyle: .alert)

  uialert.addAction(UIAlertAction(title: "Update", style: UIAlertAction.Style.default) {
    _ in
    UIApplication.shared.open(release.downloadURL)
  })
  uialert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel) {
    _ in
  })

  // self should be a UIViewController.
  self.present(uialert, animated: true, completion: nil)
})

Objective-C

рдзреНрдпрд╛рди рджреЗрдВ: рдпрд╣ рдкреНрд░реЙрдбрдХреНрдЯ, macOS, Mac Catalyst, tvOS рдпрд╛ watchOS рдЯрд╛рд░рдЧреЗрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ.
[[FIRAppDistribution appDistribution]
  checkForUpdateWithCompletion:^(FIRAppDistributionRelease *_Nullable release,
                                 NSError *_Nullable error) {
  if (error) {
    // Handle error
    return;
  }

  if (release) {
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"New Version Available"
message:[NSString stringWithFormat:@"Version %@ (%@) is available.", release.displayVersion,
release.buildVersion] preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *updateAction = [UIAlertAction actionWithTitle:@"Update"
style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
      [[UIApplication sharedApplication] openURL:release.downloadURL options:@{}
completionHandler:nil];
    }];
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel"
style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {}];
    [alert addAction:updateAction];
    [alert addAction:cancelAction];
    [self presentViewController:alert animated:YES completion:nil];
  }
}];

рдРрдбрд╡рд╛рдВрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди

signInTester() рдФрд░ isTesterSignedIn рддрд░реАрдХреЛрдВ рд╕реЗ, рдЯреЗрд╕реНрдЯрд░ рдХреЗ рд╕рд╛рдЗрди-рдЗрди рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝реНрдпрд╛рджрд╛ рд╕реБрд╡рд┐рдзрд╛ рдорд┐рд▓рддреА рд╣реИ. рдЗрд╕рд╕реЗ, рдЯреЗрд╕реНрдЯрд░ рдХреЗ рд╕рд╛рдЗрди-рдЗрди рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡, рдЖрдкрдХреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓реБрдХ рдФрд░ рдлрд╝реАрд▓ рд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдореЗрд▓ рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ.

рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯреЗрд╕реНрдЯрд░ рдиреЗ рдЕрдкрдиреЗ Firebase App Distribution рдЯреЗрд╕реНрдЯрд░ рдЦрд╛рддреЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╕рд╛рдЗрди рдЗрди рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ. рдЗрд╕рд╕реЗ рдпрд╣ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рд╛рдЗрди-рдЗрди рдХрд░рдиреЗ рдХрд╛ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рд╕рд┐рд░реНрдлрд╝ рдЙрди рдЯреЗрд╕реНрдЯрд░ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЕрдм рддрдХ рд╕рд╛рдЗрди рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ. рдЯреЗрд╕реНрдЯрд░ рдХреЗ рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, checkForUpdate() рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЯреЗрд╕реНрдЯрд░ рдХреЗ рдкрд╛рд╕ рдирдИ рдмрд┐рд▓реНрдб рдХрд╛ рдРрдХреНрд╕реЗрд╕ рд╣реИ рдпрд╛ рдирд╣реАрдВ.

Swift

рдзреНрдпрд╛рди рджреЗрдВ: рдпрд╣ рдкреНрд░реЙрдбрдХреНрдЯ, macOS, Mac Catalyst, tvOS рдпрд╛ watchOS рдЯрд╛рд░рдЧреЗрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ.
// Sign in a tester without automatically checking for update
if (!AppDistribution.appDistribution().isTesterSignedIn) {
  AppDistribution.appDistribution().signInTester (completion: { error in
    // completion block for signInTester
     if (error != nil) {
       // handle failed sign in
      return
     }
    // handle successful sign in
  })
}

// Only check for update if tester is already signed in - do not prompt
if (AppDistribution.appDistribution().isTesterSignedIn) {
  AppDistribution.appDistribution().checkForUpdate(completion: { release, error in
      // completion block for check for update
  })
}

Objective-C

рдзреНрдпрд╛рди рджреЗрдВ: рдпрд╣ рдкреНрд░реЙрдбрдХреНрдЯ, macOS, Mac Catalyst, tvOS рдпрд╛ watchOS рдЯрд╛рд░рдЧреЗрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ.
// Sign in a tester without automatically checking for update
if(![[FIRAppDistribution appDistribution] isTesterSignedIn]) {
  [[FIRAppDistribution appDistribution]
    signInTesterWithCompletion:^(NSError *_Nullable error) {
      // completion block for signInTester
     if (error) {
       // handle failed sign in
       return;
     }
      // handle successful sign in
  }];
}

// only check for update if tester is already signed in - do not prompt
if([[FIRAppDistribution appDistribution] isTesterSignedIn]) {
  [[FIRAppDistribution appDistribution]
        checkForUpdateWithCompletion:^(FIRAppDistributionRelease *_Nullable release,
                                       NSError *_Nullable error) {
     // completion block for check for update
  }];
}

рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, signOutTester(), Swift рдФрд░ Objective-C рдХреЗ рд▓рд┐рдП App Distribution рд░реЗрдлрд╝рд░рдВрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВ.

рдЪреМрдерд╛ рдЪрд░рдг: рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдкреНрд░реЛрд╕реЗрд╕ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдФрд░ рдЙрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛

рдЖрдЦрд┐рд░ рдореЗрдВ, рдЕрдкрдирд╛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдФрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, Firebase рдХрдВрд╕реЛрд▓ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдЯреЗрд╕реНрдЯрд░ рдХреЛ рдмрд┐рд▓реНрдб рдбрд┐рд╕реНрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдХрд░реЗрдВ.

рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, App Distribution рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЧрд╛рдЗрдб рдкрд░ рдЬрд╛рдПрдВ. рдЬреИрд╕реЗ:

  • рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдВ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ
  • рдЯреЗрд╕реНрдЯрд░ рдХреЛ рдПрдХ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдмрд╛рд░ Google рдореЗрдВ рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ