কোনও আইওএস অ্যাপ্লিকেশন কোনও টেস্টফ্লাইট বিটা ইনস্টলের মাধ্যমে চলছে কিনা তা রানটাইমে কীভাবে বলা যায়


123

টেস্টফ্লাইট বিটা (আইটিউনস কানেক্টের মাধ্যমে জমা দেওয়া) অ্যাপ্লিকেশন স্টোরের মাধ্যমে কোনও অ্যাপ্লিকেশন ইনস্টল করা হয়েছে কি রানটাইমে সনাক্ত করা সম্ভব? আপনি একটি একক অ্যাপ্লিকেশন বান্ডেল জমা দিতে পারেন এবং এটি উভয়ের মাধ্যমে উপলব্ধ করতে পারেন। এমন কোনও এপিআই রয়েছে যা এটি সনাক্ত করতে পারে যে এটি কীভাবে ইনস্টল করা হয়েছিল? বা প্রাপ্তিতে এমন তথ্য রয়েছে যা এটি নির্ধারণ করতে দেয়?


4
শুধু আপনি স্পষ্ট করেই কথা বলছেন আইটিউনস কানেক্টের মাধ্যমে নতুন টেস্টফ্লাইট বিটা টেস্টিংয়ের কথা? বা আপনি যখন সরাসরি টেস্টফ্লাইটে আপলোড করেছেন সে সম্পর্কে কথা বলছেন?
কেজি

নতুন TestFlight বিটা, নির্মল হবে
সংযুক্তিকরণ

1
দেখে মনে হচ্ছে - [এনএসএস স্ট্রিং রয়েছে স্ট্রিং:] একটি আইওএস 8 সংযোজন। যদি অ্যাপ স্টোরের অটো পরীক্ষার এটি আইওএস 7 এ চালানোর চেষ্টা করে তবে যান না। ([রসিদ URL টি স্ট্রিং রেঞ্জ অফ স্ট্রিং: @ "স্যান্ডবক্সআরসিপেট"] location অবস্থান! = এনএসএনটফাউন্ড) কৌশলটি করা উচিত।
rgeorse

@ বড়ো ধন্যবাদ, এটি একটি বোবা ভুল ছিল!
সংযুক্তি

2
আমি আইওএস 6 সনাক্ত করার বিষয়ে জিজ্ঞাসা করতে যাচ্ছিলাম যার অ্যাপস্টোরআরসিপটিআরএল নেই, তবে মনে হচ্ছে টেস্টফ্লাইট অ্যাপটি কেবল আইওএস 8; সুতরাং - [এনএসএস স্ট্রিং রয়েছে স্ট্রিং] সর্বোপরি ভাল হতে পারে। এ কারণে আমি অ্যাপ স্টোর বিটা পরীক্ষাটি আটকে রেখেছি, তবে আমার ধারণা, কিছু লোক লিগ্যাসি পরীক্ষার জন্য অ্যাড-হক এবং পাবলিক বিটার জন্য অ্যাপস্টোর বিটা দিয়ে হাইব্রিড টেস্টিং কৌশল ব্যবহার করছে, সুতরাং রেঞ্জঅফ স্ট্রিং এখনও জেতে।
গর্ডন ডভ

উত্তর:


117

TestFlight বিটা মাধ্যমে ইনস্টল কোনো অ্যাপ্লিকেশনের জন্য রসিদ ফাইল নামকরণ করা হয় StoreKit\sandboxReceiptবনাম স্বাভাবিক StoreKit\receipt[NSBundle appStoreReceiptURL]আপনি ব্যবহার করে ইউআরএল শেষে স্যান্ডবক্সের রিসিপট সন্ধান করতে পারেন।

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSString *receiptURLString = [receiptURL path];
BOOL isRunningTestFlightBeta =  ([receiptURLString rangeOfString:@"sandboxReceipt"].location != NSNotFound);

দ্রষ্টব্য যে sandboxReceiptস্থানীয়ভাবে বিল্ডগুলি চালনার সময় এবং সিমুলেটারে চালিত বিল্ডগুলির জন্য রসিদ ফাইলেরও নাম Note


7
যেমন উল্লেখ করা হয়েছে, এটি ডিভাইসে স্থানীয় পরীক্ষার জন্য কাজ করে তবে সিমুলেটারে নয়। আমি #if TARGET_IPHONE_SIMULATOR isRunningInTestMode = YES এর মতো কিছু যুক্ত করেছি; স্পষ্টতই, এটির জন্য # ইমপোর্ট <টার্গেটকন্ডিশনালস h> দরকার
গর্ডন

13
কমপ্যাক্ট সংস্করণ: [[[[NSBundle mainBundle] appStoreReceiptURL] lastPathComponent] isEqualToString:@"sandboxReceipt"](টেস্টফ্লাইট বিতরণ বাইনারি বিতরণ করা হলে সত্য) সুপারপট / হাড্ডাদের
নিক

2
কেবলমাত্র হোস্ট বান্ডেলের জন্য প্রাপ্তিটি বিদ্যমান থাকায় এই পদ্ধতিটি এক্সটেনশন বান্ডিলগুলিতে ব্যবহার করা যাবে না।
jeeeyul

2
StoreKit/sandboxReceiptডিভাইস বা সিমুলেটারে এক্সকোডের মাধ্যমে ডিবাগ বিল্ড হিসাবে ইনস্টল হওয়ার পরে আমার আইওএস 8 পরীক্ষার ফলাফল । সুতরাং এটি টেস্টফ্লাইট বিল্ডগুলি অন্য সমস্ত বিল্ড থেকে সঠিকভাবে আলাদা করতে পারে না ।
পেকম্ব

3
অ্যাডহক বিতরণ সহ একটি বিল্ড ইনস্টল করার সময় হ্যাঁ ফিরে আসবে বলে মনে হয়।
কেলার 13

75

সম্মিলনের উত্তরের ভিত্তিতে আমি নীচের সুইফট সহায়ক শ্রেণি তৈরি করেছি। এই শ্রেণীর সাহায্যে আপনি নির্ধারণ করতে পারবেন এটি কোনও ডিবাগ, টেস্টফ্লাইট বা অ্যাপস্টোর বিল্ড কিনা।

enum AppConfiguration {
  case Debug
  case TestFlight
  case AppStore
}

struct Config {
  // This is private because the use of 'appConfiguration' is preferred.
  private static let isTestFlight = Bundle.main.appStoreReceiptURL?.lastPathComponent == "sandboxReceipt"
  
  // This can be used to add debug statements.
  static var isDebug: Bool {
    #if DEBUG
      return true
    #else
      return false
    #endif
  }

  static var appConfiguration: AppConfiguration {
    if isDebug {
      return .Debug
    } else if isTestFlight {
      return .TestFlight
    } else {
      return .AppStore
    }
  }
}

পরিবেশের জন্য বিভিন্ন ট্র্যাকিং আইডি বা সংযোগের স্ট্রিং সরবরাহ করতে আমরা আমাদের প্রকল্পে এই পদ্ধতিগুলি ব্যবহার করি :

  func getURL(path: String) -> String {    
    switch (Config.appConfiguration) {
    case .Debug:
      return host + "://" + debugBaseUrl + path
    default:
      return host + "://" + baseUrl + path
    }
  }

বা:

  static var trackingKey: String {
    switch (Config.appConfiguration) {
    case .Debug:
      return debugKey
    case .TestFlight:
      return testflightKey
    default:
      return appstoreKey
    }
  }

আপডেট 05-02-2016: #if DEBUG এর মতো একটি প্রিপ্রেসেসর ম্যাক্রো ব্যবহার করার পূর্বশর্ত হ'ল কিছু সুইফ্ট সংকলক কাস্টম ফ্ল্যাগ সেট করা। এই উত্তরে আরও তথ্য: https://stackoverflow.com/a/24112024/639227


1
@ আরকম্যান নিশ্চিত করুন যে আপনি -D DEBUGপতাকাটি স্থাপন করছেন । আরও তথ্য এখানে পাওয়া যাবে
কালেব

থানেক্স @ কালেব, আমি উত্তরের পূর্বশর্তগুলিতে আরও ব্যাখ্যা যুক্ত করেছি।
LorenzoValentijn

1
আপনার উত্তরের জন্য ধন্যবাদ, আমি এটি খুব সহায়ক বলে মনে করি! #if targetEnvironment(simulator)আপনি একটি সিমুলেটর চালাচ্ছেন কিনা তা নির্ধারণ করে আপনিও জেনে রাখা ভাল । সুতরাং আমার কাছে বিকল্প রয়েছে সিমুলেটর / টেস্টফ্লাইট / অ্যাপস্টোর (যা আমার ক্ষেত্রে বেশি পছন্দ Debug) :-)
জেরোএনজেকে

39

আধুনিক সুইফ্ট সংস্করণ, যা সিমুলেটরগুলির জন্য অ্যাকাউন্ট করে (স্বীকৃত উত্তরের ভিত্তিতে):

private func isSimulatorOrTestFlight() -> Bool {
    guard let path = Bundle.main.appStoreReceiptURL?.path else {
        return false
    }
    return path.contains("CoreSimulator") || path.contains("sandboxReceipt")
}

সিমুলেটরটি অন্তর্ভুক্ত করে ভাল লাগছে তবে আপনি ফাংশনটির নামটি পরিবর্তন করতে পারেন কারণ এটি এখন সমস্ত ক্ষেত্রে সত্য নয়।
dbn

2
কি দারুন! এটি কাজ করে! অসাধারণ! একই বিল্ডের জন্য টেস্টফ্লাইটের জন্য সত্য এবং অ্যাপস্টোরের জন্য FALSE প্রদান করে (এক বিধানের সাথে এক স্কিমের মধ্যে একটি বিল্ড বিল্ড)) পারফেক্ট! ধন্যবাদ!
আরগাস

@dbn আপনি কি আরও প্রসারিত করতে পারেন কেন এটি এখন সব ক্ষেত্রে সত্য নয়?
ইথান

1
@ আমি আমার মন্তব্য করার পরে এই উত্তরটি সম্পাদিত হয়েছিল; পদ্ধতির নামটি ব্যবহৃত হতisTestFlight()
dbn

6

হালনাগাদ

এটি আর কাজ করে না। অন্যান্য পদ্ধতি ব্যবহার করুন।

আসল উত্তর

এটিও কাজ করে:

if NSBundle.mainBundle().pathForResource("embedded", ofType: "mobileprovision") != nil {
    // TestFlight
} else {
    // App Store (and Apple reviewers too)
}

অ্যাপলের টেস্টফ্লাইট থেকে আইওএস অ্যাপটি ডাউনলোড করা হয়েছে কিনা তা সনাক্ত করতে পাওয়া গেছে


2

আমি Bundle+isProductionসুইফট 5.2 এ এক্সটেনশন ব্যবহার করি :

import Foundation

extension Bundle {
    var isProduction: Bool {
        #if DEBUG
            return false
        #else
            guard let path = self.appStoreReceiptURL?.path else {
                return true
            }
            return !path.contains("sandboxReceipt")
        #endif
    }
}

তারপর:

if Bundle.main.isProduction {
    // do something
}

-3

আমার প্রকল্পগুলির জন্য আমি এটি ব্যবহার করার একটি উপায় রয়েছে। পদক্ষেপগুলি এখানে।

এক্সকোডে, প্রকল্প সেটিংসে যান (প্রকল্প, লক্ষ্য নয়) এবং তালিকায় "বিটা" কনফিগারেশন যুক্ত করুন:

এখানে চিত্র বর্ণনা লিখুন



তারপরে আপনাকে নতুন স্কিম তৈরি করতে হবে যা "বিটা" কনফিগারেশনে প্রকল্প চালাবে। স্কিম তৈরি করতে এখানে যান:

এখানে চিত্র বর্ণনা লিখুন



আপনি যা চান এই স্কিমটির নাম দিন। আপনার এই স্কিমের জন্য সেটিংস সম্পাদনা করা উচিত। এটি করতে, এখানে আলতো চাপুন:

এখানে চিত্র বর্ণনা লিখুন



সংরক্ষণাগারটি ট্যাবটি নির্বাচন করুন যেখানে আপনি নির্বাচন করতে পারেন Build configuration

এখানে চিত্র বর্ণনা লিখুন



তারপরে আপনার প্রকল্পগুলির তথ্য সম্পত্তি তালিকার Configমান সহ একটি কী যুক্ত করতে হবে $(CONFIGURATION):

এখানে চিত্র বর্ণনা লিখুন



তারপরে বিটা বিল্ডে সুনির্দিষ্ট কিছু করার জন্য কোডে আপনার যা দরকার তা ঠিক এটি:

let config = Bundle.main.object(forInfoDictionaryKey: "Config") as! String
if config == "Debug" {
  // app running in debug configuration
}
else if config == "Release" {
  // app running in release configuration
}
else if config == "Beta" {
  // app running in beta configuration
}

6
যদিও এটি একটি সহায়ক কৌশল এটি প্রশ্নের উত্তর দেয় না। অ্যাপ স্টোরটিতে একটি বাইনারি জমা দেওয়া হয় এবং হয় টেস্টফ্লাইটের মাধ্যমে ডাউনলোড করা বা অ্যাপ স্টোর থেকে ডাউনলোডের পরে অনুমোদিত রানের পরে চালানো যেতে পারে। প্রশ্নটি কোন সংস্করণটি চলছে তা সনাক্ত করার বিষয়ে।
সংযুক্তি

প্রথম স্থানে 2 টি সংরক্ষণাগার তৈরি করার বিকল্প নেই? অ্যাপ স্টোরের জন্য টেস্টফ্লাইটের জন্য একটি।
ক্লিমেন

এটি সম্ভব, তবে তাদের বিভিন্ন বিল্ড নম্বর থাকতে হবে। এবং এর অর্থ একটির পরিবর্তে দুটি বিল্ড পরিচালনা করা।
সংযুক্তি

ঠিক আছে, আমার মতে এটি মূল্যবান। বিশেষত যদি আপনি অবিচ্ছিন্ন সংহতকরণ সরঞ্জাম ব্যবহার করেন।
ক্লিমেন

ক্লিমেনজাগার, আপনার পদ্ধতিটি একটি সুপরিচিত এবং ভাল তবে এটি প্রশ্নের উত্তর দেয় না।
স্ট্যানিস্লাভ পাঙ্কেভিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.