وقتی برنامههای بازی براساس چارچوبهای مختلف رابط کاربری ساخته میشوند، خودکارسازی آزمایش بازی میتواند دشوار باشد. آزمایشهای «حلقه بازی» به شما امکان میدهد آزمایشهای بومیتان را با Test Lab ادغام کنید و بهراحتی آنها را در دستگاههای انتخابیتان اجرا کنید. این راهنما نحوه آماده کردن آزمایش «حلقه بازی» را برای اجرا بااستفاده از Firebase Test Lab شرح میدهد.
درباره آزمایشهای «حلقه بازی»
آزمایش «حلقه بازی» چیست؟
آزمایش «حلقه بازی» کنشهای بازیکن واقعی را شبیهسازی میکند تا تأیید کند بازی شما برای کاربران بهصورت سریع و مقیاسپذیر عملکرد خوبی دارد. حلقه یک اجرای کامل یا جزئی از آزمایش شما در برنامه بازیتان است. میتوانید آزمایش «حلقه بازی» را بهصورت محلی در شبیهساز یا در مجموعهای از دستگاهها در Test Lab اجرا کنید. از آزمایشهای «حلقه بازی» میتوان برای موارد زیر استفاده کرد:
- بازیتان را همانگونه که کاربر نهایی آن را بازی میکند اجرا کنید. میتوانید ورودی کاربر را برنامهریزی کنید، به کاربر اجازه دهید بیکار بماند، یا کاربر را با هوش مصنوعی جایگزین کنید (برای مثال، اگر هوش مصنوعی را در یک بازی مسابقه اتومبیلرانی پیادهسازی کردهاید، میتوانید یک راننده هوش مصنوعی را مسئول ورودی کاربر کنید).
- بازی را با بالاترین تنظیم کیفیت اجرا کنید تا ببینید کدام دستگاهها میتوانند از آن پشتیبانی کنند.
- آزمایش فنی اجرا کنید، مثلاً چندین سایهزن را گردآوری کنید، آنها را اجرا کنید، و بررسی کنید که برونداد همانطور که انتظار میرود باشد.
مرحله ۱: ثبت طرحواره نشانی وب سفارشی Test Lab
در Xcode، هدف پروژهای را انتخاب کنید.
روی برگه اطلاعات کلیک کنید، سپس نوع نشانی وب جدیدی اضافه کنید.
در فیلد طرحهای نشانی وب،
firebase-game-loopرا وارد کنید. همچنین میتوانید طرح نشانی وب سفارشی را با افزودن آن به فایل پیکربندی پروژهInfo.plistدر هر جایی درون برچسب<dict>ثبت کنید:<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string></string> <key>CFBundleTypeRole</key> <string>Editor</string> <key>CFBundleURLSchemes</key> <array> <string>firebase-game-loop</string> </array> </dict> </array>
برنامهتان اکنون برای اجرای آزمایش بااستفاده از Test Lab پیکربندی شده است.
مرحله ۲: پیکربندی اختیاری برنامه
اجرای چند حلقه
اگر قصد دارید چندین حلقه (یا سناریو) را در آزمونتان اجرا کنید، باید مشخص کنید کدام حلقهها را میخواهید در زمان راهاندازی در برنامهتان اجرا کنید.
در نماینده برنامه، روش application(_:open:options:) را ملغی کنید:
Swift
func application(_app: UIApplication,
open url: URL
options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let components = URLComponents(url: url, resolvingAgainstBaseURL: true)!
if components.scheme == "firebase-game-loop" {
// ...Enter Game Loop Test logic to override application(_:open:options:).
}
return true
}
Objective-C
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary <UIApplicationOpenURLOptionsKey, id> *)options {
if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
// ...Enter Game Loop Test logic to override application(_:open:options:).
}
}
وقتی چندین حلقه را در آزمایشتان اجرا میکنید، حلقه فعلی بهعنوان پارامتر به نشانی وب استفادهشده برای راهاندازی برنامه منتقل میشود. همچنین میتوانید با تجزیه کردن شیء URLComponents که برای واکشی طرح نشانی وب سفارشی استفاده میشود، شماره حلقه فعلی را بهدست آورید:
Swift
if components.scheme == "firebase-game-loop" {
// Iterate over all parameters and find the one with the key "scenario".
let scenarioNum = Int(components.queryItems!.first(where: { $0.name == "scenario" })!.value!)!
// ...Write logic specific to the current loop (scenarioNum).
}
Objective-C
if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
// Launch the app as part of a game loop.
NSURLComponents *components = [NSURLComponents componentsWithURL:url
resolvingAgainstBaseURL:YES];
for (NSURLQueryItem *item in [components queryItems]) {
if ([item.name isEqualToString:@"scenario"]) {
NSInteger scenarioNum = [item.value integerValue];
// ...Write logic specific to the current loop (scenarioNum).
}
}
}
پایان دادن زودرس به آزمایش
بهطور پیشفرض، آزمایش «حلقه بازی» تا زمانی که به مهلت زمانی پنج دقیقهای برسد ادامه مییابد، حتی اگر همه حلقهها اجرا شده باشند. وقتی زمان اتمام فرا میرسد، آزمایش پایان مییابد و هرگونه حلقه معلقه لغو میشود. با فراخوانی طرح نشانی وب سفارشی Test Lab در AppDelegate برنامه خود، میتوانید آزمایش را تسریع کنید یا زودتر آن را پایان دهید firebase-game-loop-complete. برای مثال:
Swift
/// End the loop by calling our custom url scheme.
func finishLoop() {
let url = URL(string: "firebase-game-loop-complete://")!
UIApplication.shared.open(url)
}
Objective-C
- (void)finishLoop {
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"firebase-game-loop-complete://"]
options:@{}
completionHandler:^(BOOL success) {}];
}
«آزمایش حلقه بازی» شما حلقه فعلی را خاتمه میدهد و حلقه بعدی را اجرا میکند. وقتی حلقه دیگری برای اجرا وجود نداشته باشد، آزمایش پایان مییابد.
نوشتن نتایج آزمایش سفارشی
میتوانید آزمون «حلقه بازی» را پیکربندی کنید تا نتایج آزمون سفارشی را در سیستم فایل دستگاهتان بنویسد. بهاینترتیب، وقتی آزمایش شروع به اجرا میکند، Test Lab
فایلهای نتیجه را در دایرکتوری GameLoopsResults در دستگاه آزمایشی شما (که باید خودتان ایجاد کنید) ذخیره میکند. وقتی آزمایش تمام میشود، Test Lab همه فایلها را از
دایرکتوری GameLoopResults به آبانباره پروژه شما منتقل میکند. هنگام راهاندازی آزمایش خود، موارد زیر را درنظر داشته باشید:
همه فایلهای نتیجه بدون توجه به نوع، اندازه، یا تعداد فایل بارگذاری میشوند.
Test Lab نتایج آزمایشتان را تا زمانی که همه حلقههای آزمایشتان اجرا نشدهاند پردازش نمیکند، بنابراین اگر آزمایشتان شامل چندین حلقه است که برونداد مینویسند، مطمئن شوید که آنها را به فایل نتیجه یکتا پیوست کنید یا برای هر حلقه فایل نتیجه ایجاد کنید. بهاینترتیب، میتوانید از بازنویسی نتایج از حلقه قبلی جلوگیری کنید.
برای تنظیم کردن آزمایش خود برای نوشتن نتایج آزمایش سفارشی:
در فهرست راهنمای
Documentsبرنامه، فهرست راهنمایی بهنامGameLoopResultsایجاد کنید.از هرجایی در کد برنامهتان (برای نمونه، نماینده برنامه)، موارد زیر را اضافه کنید:
Swift
/// Write to a results file. func writeResults() { let text = "Greetings from game loops!" let fileName = "results.txt" let fileManager = FileManager.default do { let docs = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) let resultsDir = docs.appendingPathComponent("GameLoopResults") try fileManager.createDirectory( at: resultsDir, withIntermediateDirectories: true, attributes: nil) let fileURL = resultsDir.appendingPathComponent(fileName) try text.write(to: fileURL, atomically: false, encoding: .utf8) } catch { // ...Handle error writing to file. } }Objective-C
/// Write to a results file. - (void)writeResults:(NSString *)message { // Locate and create the results directory (if it doesn't exist already). NSFileManager *manager = [NSFileManager defaultManager]; NSURL* url = [[manager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; NSURL* resultsDir = [url URLByAppendingPathComponent:@"GameLoopResults" isDirectory:YES]; [manager createDirectoryAtURL:resultsDir withIntermediateDirectories:NO attributes:nil error:nil]; // Write the result message to a text file. NSURL* resultFile = [resultsDir URLByAppendingPathComponent:@"result.txt"]; if ([manager fileExistsAtPath:[resultFile path]]) { // Append to the existing file NSFileHandle *handle = [NSFileHandle fileHandleForWritingToURL:resultFile error:nil]; [handle seekToEndOfFile]; [handle writeData:[message dataUsingEncoding:NSUTF8StringEncoding]]; [handle closeFile]; } else { // Create and write to the file. [message writeToURL:resultFile atomically:NO encoding:NSUTF8StringEncoding error:nil]; } }
مرحله ۳: امضا کردن برنامه
مطمئن شوید که همه آرتیفکتهای برنامه امضا شده باشند. برای مثال، میتوانید این کار را ازطریق Xcode با مشخص کردن تنظیمات امضا مثل نمایه تدارک و هویت انجام دهید. برای اطلاعات بیشتر، به این صفحه مراجعه کنید: امضای کد Apple
مرحله ۴: بستهبندی برنامه برای بارگذاری
فایل IPA برای برنامهتان تولید کنید (بعداً باید آن را پیدا کنید).
از منو کرکرهای که ظاهر میشود، روی محصول > بایگانی کلیک کنید. جدیدترین بایگانی را انتخاب کنید، سپس روی توزیع برنامه کلیک کنید.
در پنجرهای که نشان داده میشود، روی توسعه > بعدی کلیک کنید.
روی صادر کردن کلیک کنید، سپس دایرکتوریای را که میخواهید فایل IPA برنامه در آن بارگیری شود وارد کنید.
مرحله ۵: درستیسنجی امضای برنامه
- امضای برنامه را با باز کردن فایل .ipa و سپس اجرای
codesign --verify --deep --verbose /path/to/MyApp.appدرستیسنجی کنید، که در آن «MyApp» نام برنامه در پوشه بازشده است (برای هر پروژه متفاوت است). برونداد موردانتظارMyApp.app: valid on diskاست.
مرحله ۶: اجرای محلی آزمایش
میتوانید آزمایشتان را بهصورت محلی اجرا کنید تا رفتار آن را قبلاز اجرا کردن با Test Lab بررسی کنید. برای آزمایش محلی، برنامه بازیتان را در شبیهساز بار کنید و این را اجرا کنید:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
با اجرای فرمان
instruments -s devicesمیتوانید UDID شبیهسازتان را پیدا کنید.اگر فقط یک شبیهساز درحال اجرا است، رشته ویژه
"booted"را بهجای SIMULATOR_UDID وارد کنید.
اگر آزمایش شما شامل چندین حلقه است، میتوانید با ارسال شماره حلقه به پرچم scenario، حلقه موردنظرتان را برای اجرا مشخص کنید. توجه داشته باشید که هنگام اجرای آزمایش بهصورت محلی، فقط میتوانید یک حلقه را در هر زمان اجرا کنید. برای مثال، اگر میخواهید حلقههای ۱، ۲، و ۵ را اجرا کنید، باید برای هر حلقه فرمان جداگانهای اجرا کنید:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=1xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=2xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=5
مراحل بعدی
آزمایشتان را بااستفاده از کنسول Firebase یا gcloud CLI اجرا کنید.