paint-brush
ኣብ ኣፕካ ነጻ ፈተነታት ብ StoreKit 2 ኣተግብር: ደረጃ ብደረጃ መምርሒ@namaswic
471 ንባባት
471 ንባባት

ኣብ ኣፕካ ነጻ ፈተነታት ብ StoreKit 2 ኣተግብር: ደረጃ ብደረጃ መምርሒ

Namaswi Chandarana11m2024/09/17
Read on Terminal Reader

ኣዝዩ ነዊሕ፤ ንምንባብ

ኣፕል ምስ StoreKit 2 ኣቢሉ፡ ሓደ ተጠቃሚ ንመእተዊ ቅድመ-ምድላዋት ብቑዕ ምዃኑ ንምፍላጥ ዝሕግዙ ዝተማዕበሉ መሳርሒታት ኣተኣታትዩ ኣሎ። ኣብዚ ጽሑፍ፡ ብቑዕነት ተጠቃሚ ንምርግጋጽ፡ ብቑንጣሮ ኮድ ዝተማልአ፡ ኣብ ኣፕካ ነጻ ፈተነታት ኣብ ምትግባር ክንመርሓካ ኢና። ከምኡ'ውን ኣብ ምሉእ እቲ ጽሑፍ ፋሕ ኢሎም ዘለዉ "**ፕሮ ቲፕስ**" ምክትታልኩም ኣረጋግጹ፡ ኣብኡ ድማ ካብ ተመኩሮይ ገለ ውልቃዊ ርድኢታት የካፍለኩም።
featured image - ኣብ ኣፕካ ነጻ ፈተነታት ብ StoreKit 2 ኣተግብር: ደረጃ ብደረጃ መምርሒ
Namaswi Chandarana HackerNoon profile picture
0-item
1-item


ነጻ ፈተነ ምቕራብ ተጠቀምቲ ንፕሪምየም ባህርያት ናይ ኣፕካ ንኽፍትኑ ንምትብባዕ ብሉጽ መገዲ ኮይኑ፡ ናብ ዝኸፍሉ ተኸታተልቲ ናይ ምቕያር ዕድሎም ይውስኽ። ኣፕል ምስ StoreKit 2 ኣቢሉ፡ ሓደ ተጠቃሚ ንመእተዊ ቅድመ-ምድላዋት ብቑዕ ምዃኑ ንምፍላጥ ዝሕግዙ ዝተማዕበሉ መሳርሒታት ኣተኣታትዩ ኣሎ። ኣብዚ ጽሑፍ፡ ብቑዕነት ተጠቃሚ ንምርግጋጽ፡ ብቑንጣሮ ኮድ ዝተማልአ፡ ኣብ ኣፕካ ነጻ ፈተነታት ኣብ ምትግባር ክንመርሓካ ኢና። ብተወሳኺ ንብቑዓትን ዘይብቑዓትን ተጠቀምቲ ናይ ፈተነ ስናርዮታት ክንሽፍን ኢና። ከምኡ'ውን ኣብ ምሉእ እቲ ጽሑፍ ፋሕ ኢሎም ዘለዉ " ፕሮ ቲፕስ " ምክትታልኩም ኣረጋግጹ፣ ኣብኡ ድማ ካብ ተመኩሮይ ገለ ውልቃዊ ርድኢታት የካፍለኩም!


ከመይ ጌርና ኣብ App Store Connect ንኣፕና ነጻ ፈተነታት ንሰርዕ

ቅድሚ ኮዲንግ ምጅማርካ፡ ኣብ App Store Connect ናይ ውሽጢ ኣፕ ዕድጊ ቅጥዕታትካ ምውቃርካ ኣረጋግጽ፤

  1. ናብ App Store Connect ብምእታው ናብቲ "My Apps" ዝብል ክፍሊ ንኺድ።
  2. ኣፕካ ምረጽ እሞ ናብቲ "Features" ዝብል ትብ ንኺድ።
  3. ኣብ ትሕቲ "In-App Purchases" ሓድሽ Auto-Renewable Subscription ፍርያት ፍጠር።
  4. ዝርዝር ምዝገባኻ ግለጽ፣ ዋጋን ነጻ ናይ ፈተነ ግዜን (ንኣብነት፣ 7 መዓልታት) ሓዊስካ፣ መእተዊ ቅድመ-ምድላው ብምድላው።
  5. ለውጥታትካ ኣቐምጦ።

ከመይ ጌርና Subscription view ንሰርዕን እቲ ተጠቃሚ ንነጻ ፈተነ ብቑዕ ድዩ ኣይኮነን ንምርግጋጽን?

ነዚ ቀሊል ክገብሮ እየ ነቲ ናይ ኮድ ስኒፐት ብምርኣይካ፣ ንተጠቃሚ ናይ ፈተነ ብቕዓት ብኸመይ ክትሕስቦ ከም እትደሊ

ነቲ ነጻ ናይ ፈተነ ቅድመ-ምድላው ንምርኣይን ንናይ ተጠቃሚ ርክባት ንምሕላውን SwiftUI ትርኢት ፍጠር። ኣብ ቁንጣሮ ኮድ ብዙሕ ርእይቶታት ክገድፍ እየ ንዓኻትኩም ንኽመላለሰኩም።


 import StoreKit2 // StoreManager is responsible to communicate with Storekit Framework provided by Apple for monetization class StoreManager: ObservableObject { @Published var message: String = "" // We will use this property to display the right message to the user @Published var products: [Product] = [] // This will be responsible to store the products fetched that we defined // in App Store Connect // Fetch products from the App Store func fetchProducts() { Task { do { // product_id is the id that you would have defined in App Store Connect. let storeProducts = try await Product.products(for: ["product_id"]) products = storeProducts } catch { message = "Failed to fetch products: \(error.localizedDescription)" } } } // Initiate purchase func purchase() { guard let product = products.first else { // There is a possibility of products not being fetched from App Store Connect. // Pro Tip: From experience, even though we defined the products on App Store Connect, it is possible // that the products are not found post attempting to fetch. So, it is important to handle this case. message = "No product available." return } Task { do { let result = try await product.purchase() switch result { case .success(let verification): switch verification { case .verified: message = "Purchase successful!" case .unverified: message = "Could not verify the purchase." } case .userCancelled: message = "Purchase cancelled." case .pending: message = "Purchase is pending." @unknown default: message = "Unknown result." } } catch { message = "Purchase failed: \(error.localizedDescription)" } } } // Check if the user is eligible for a free trial func checkTrialEligibility() async -> Bool { guard let product = products.first else { return false } do { // So when you define a auto renewable subscriptions, there are usually bond in a group. The group can again be // found in App Store Connect let eligibility = try await product.subscription?.isEligibleForIntroOffer(for groupID: 111111) return eligibility ?? false } catch { message = "Error checking trial eligibility: \(error.localizedDescription)" return false } } }


 import SwiftUI import StoreKit struct SubscriptionView: View { @StateObject private var storeManager = StoreManager() @State private var isEligibleForFreeTrial = false var body: some View { VStack { Text("Unlock Premium Features") .font(.title) .padding() Text("Get a 7-day free trial of our premium subscription.") .multilineTextAlignment(.center) .padding() Button(action: { storeManager.purchase() }) { // Based on user status, we can display the text Text(isEligibleForFreeTrial ? "Start Free Trial" : "Start Subscription") .bold() .frame(width: 200, height: 50) .background(Color.blue) .foregroundColor(.white) .cornerRadius(10) } Text(storeManager.message) .padding() } .onAppear { storeManager.fetchProducts() checkTrialEligibility() } } private func checkTrialEligibility() { Task { isEligibleForFreeTrial = await storeManager.checkTrialEligibility() } } }

ፈተና ነጻ ናይ ፈተነ ብቑዕነት ሃገራት ኣብ Xcode

ኣፕል ኣብ Xcode StoreKit Testing ብምጥቃም ዝተፈላለዩ ናይ ተጠቃሚ ኩነታት (ንኣብነት፡ ንነጻ ፈተነ ብቑዓት ወይ ዘይብቑዓት) ንምፍታን ድልዱላት መሳርሒታት ይህብ :

  • ናይ ስቶርኪት ውቅር ፋይል ምፍጣር፤
    • ናብ ፋይል > ሓድሽ > ፋይል... > ፋይል ውቅር ስቶርኪት ኣብ ኤክስኮድ ኪድ።

    • ናይ ምዝገባ ፍርያትካ ኣዳልዉ፣ ናይ ፈተነ ግዜን ናይ ብቕዓት ኩነታትን ሓዊስካ።


  • Pro Tip : ካብ App Store Connect ናይ configuration ፋይል ንምትእስሳር ሓድሽ ናይ ውቅር ፋይል ክትፈጥር እውን ትኽእል ኢኻ በዚ መንገዲ ድማ ኩሎም ፍርያት ምድላው ኣየድልየካን እዩ።


  • ዝተፈላለዩ ስናርዮታት ምምሳል፤

    • ኣብቲ ኣብ ትሕቲ ኣማራጺታት ዘሎ ስኬም ኤዲተር ፡ ነቲ ናይ StoreKit ውቅር ፋይል ምረጽ።
    • ዝተፈላለዩ ስናርዮታት ንምምሳል ኣብቲ ናይ ስቶርኪት ናይ ፈተነ ሃዋህው ኣፕካ ኣካይድ፤
      • ንነጻ ፈተነ ብቑዕ፤

        ንሓደ ነጻ ናይ ፈተነ ተጠቃሚ ንምምሳል፡ ኣብቲ ትራንዛክሽን ኣካያዲ ዝኾነ ትራንዛክሽን ከምዘይህልወካ ኣረጋግጽ።

        ነቲ ናይ ትራንዛክሽን ኣካያዲ ንምርኣይ። ናብ ዲባግስቶርኪትትራንዛክሽን ምምሕዳር ኪድ


  • ንነጻ ፈተነ ብቑዕ ዘይኮነ፤

    ንነጻ ፈተነ ብቑዕ ዘይኮነ ተጠቃሚ ንምምሳል። ካብቲ ትራንዛክሽን ማናጀር ኣብቲ ትራንዛክሽን ማናጀር ብኢድካ ምዝገባ ክትውስኽ ትኽእል ኢኻ። ኣብቲ ናይ ትራንዛክሽን ኣመሓዳሪ ስክሪን ኣብ ዘሎ add ዝብል ቁልፊ ክትጥውቕ ትኽእል ኢኻ ድሕሪኡ ነቲ ክትውስኾ እትደሊ ትራንዛክሽን ክትመርጽ ትኽእል። ኣብዚ፡ ንተጠቃሚ ወርሓዊ ምዝገባ ክውቅሮ ይፍትን ኣለኹ። ነቲ ትራንዛክሽን ድሕሪ ምውሳኽን ነቲ ኣፕ እንደገና ድሕሪ ምዝዋርን፡ እቲ ናይ ፈተነ ብቕዓት ከም ሓሶት ምልክት ክግበረሉ ክትሪኦ ይግባእ።


    ፕሮ ምኽሪ፦ ምስቲ ዕድጊ UUID እውን ከተካትት ትኽእል ኢኻ፣ ነዚ ዓውዲ ተጠቒምካ ናይቲ ተጠቃሚ መለለዪ ክትዕቅቦ ትኽእል ኢኻ። በዚ መንገዲ ኣየናይ ተጠቃሚ ኣብ ኣፕካ ዕድጊ ከም ዝገበረ ከተረጋግጽ ትኽእል። እዚ ሓበሬታ ድሒሩ ካብ ታሪኽ ትራንዛክሽን ተጠቃሚ ክውሰድ ይኽእል።

ሳንድቦክስ ቴስቲንግ ምፍጻም

ሳንድቦክስ ፈተነ ንናይ ኣፕካ ኣብ ውሽጢ ኣፕ ዝግበር ዕድጊታትን ምዝገባን ኣብ ሃዋህው ምፍራይ ኣፕ ስቶር ዝመስል ሃዋህው ክትፍትኖ የኽእለካ ኣብ ርእሲኡ ድማ ሓደ ክልተ ወሰናስን ጉዳያት ከም ዝተቛረጸ ዕድጊ፡ ምክፋል ስድራቤት፡ ከምኡ’ውን ካብ... app ወይ ኣብ ካልእ መሳርሒ። ከምኡ ውን የኽእለካ


ቅድሚ ዝኾነ ነገር ግን፡ ከመይ ጌርካ ሳንድቦክስ ቴስቲንግ ትሰርዕን ትጥቀመሉን እንሆ፤

  1. ሳንድቦክስ ቴስተር ኣካውንት ምፍጣር፤

    • ናብ ኣፕ ስቶር ኮኔክት > ተጠቀምትን መእተዊን > ሳንድቦክስ ቴስተርስ ኪድ።
    • ፍሉይ ናይ ኢመይል ኣድራሻ፣ ምልክት ቃልን ካልእ ዘድሊ ዝርዝራትን ብምቕራብ ሓድሽ ናይ ሳንድቦክስ ቴስተር ኣካውንት ምፍጣር።
  2. ብናይ ሳንድቦክስ ቴስተር ኣካውንት ምእታው፤

    • ኣብቲ ናይ ፈተነ መሳርሒኻ፡ ናብ ቅጥዕታት > ኣፕ ስቶር > ሳንድቦክስ ኣካውንት ኪድ።
    • በቲ ዝፈጠርካዮ ናይ ሳንድቦክስ ፈታኒ መረጋገጺታት እቶ።
  3. ኣፕካ ኣብ ሳንድቦክስ ሞድ ኣካይድ፤

    • ኣፕካ ኣብ ፊዚካዊ መሳርሒ ሃንጽን ኣካይድን (ፈተነ ሳንድቦክስ ኣብቲ ሲሙለተር ኣይሰርሕን እዩ)።
    • ነቲ ነጻ ፈተነ ክትጅምሮ ወይ ድማ ነቲ ናይ ሳንድቦክስ ቴስተር ኣካውንት ተጠቒምካ ዕድጊ ክትገብር ፈትን። እቲ ትራንዛክሽን ኣብ ሃዋህው ሳንድቦክስ ክቕጽል እዩ፣ እዚ ድማ ነቲ ምሉእ ዋሕዚ ክትፍትኖ የኽእለካ፣ እዚ ድማ ንነጻ ፈተነታት ብቑዕነት፣ ዓወት ዕድጊ፣ ምስራዝን ካልኦት ግዝኣታትን ሓዊሱ እዩ።
  4. ዝተፈላለዩ ስናርዮታት ፈትኑ፤

    • ንመጀመርታ ግዜ ተጠቃሚ፦ እቲ ነጻ ፈተነ ብትኽክል ከም ዝቐረበ ንምርግጋጽ፡ ንመጀመርታ ግዜ ንዝዕድግ ናይ ሳንድቦክስ ኣካውንት ተጠቐም። ንሓደ ዓይነት ሳንድቦክስ ኣካውንት ንተኸታታሊ ፈተነታት QA ንምጥቃም፡ ብሓቂ ነቲ ብቑዕነት ናይቲ ተጠቃሚ ዳግማይ ክትሰርዖ ትኽእል ኢኻ ከምኡ’ውን ኩሉ ትራንዛክሽን ናይቲ ሳንድቦክስ ኣካውንት ከተጽርዮ ትኽእል ኢኻ። ነዚ ካብ ክልቲኡ App Store Connect ወይ Settings ክትገብሮ ትኽእል ኢኻ።
    • ዝተሰረዘ ዕድጊ፦ እቲ ኣፕ ኣብ እዋን ዋሕዚ ነቲ ዕድጊ ዝስርዝ ተጠቃሚ ብኸመይ ከም ዝሕዞ ፈትን።
    • ውድቀት መርበብ፦ እቲ ኣፕ ንዝፈሸለ ትራንዛክሽን ብኸመይ ከም ዝሕዞ ንምርኣይ፡ ነቲ መርበብ ብምቁራጽን ዳግማይ ብምትእስሳርን ንጉዳያት መርበብ ኣምሳል።
    • Free Trial Ineligible: እዚ ቁሩብ ብልሓት ዘለዎ ኮይኑ ግን ዘይከኣል ኣይኮነን። መጀመርታ Settings → App Store → ኣብቲ sandbox account ዝብል ጠውቕ → Manage ዝብል ንጥውቕ። ኣብዚ ንተጠቃሚ ኣብቲ ናይ ሳንድቦክስ ኣካውንት ብኢድካ ትራንዛክሽን ክትውስኽ ክትክእል ኣለካ። ሕጂ፡ ንተጠቃሚ ናይ ፈተነ ብቕዓት ዘይምህላው ክትፍትን ክትክእል ኣለካ።



ፕሮ ምኽሪ፦ ሓደ ናይ ኣፕል ኣካውንት ብዙሕ ንጡፍ ምዝገባ ክህልዎ ስለዘይክእል ክልተ ዝተፈላለዩ ተጠቀምቲ ሓደ ዓይነት ኣፕል ኣይዲ ተጠቒሞም ኣብቲ ኣፕ ዝተፈላለየ ዕድጊ ክገብሩ ኣይክእሉን እዮም። ነዚ ናይ ተጠቃሚ ጉዳይ ንዓኻ ኣፕ ምፍታሽካ ኣረጋግጽ።

መወከሲታት

https://developer.apple.com/documentation/storekit ዝብል ጽሑፍ ኣሎ።

https://developer.apple.com/documentation/xcode/ኣብ-xcode-ምፍታን-ስቶርኪት-ምቕማጥ/

https://developer.apple.com/ኣፕ-ስቶር-ምትእስሳር/