Shake-to-Report — תבנית שבה משתמש או בודק מטלטל את המכשיר ומקבל טופס דיווח באגים. גישה זו, הידועה בשם "דיווח באגים על ידי טלטול", לוכדת צילום מסך ומידע דיאגנוסטי באופן אוטומטי. בתוך הצוות, זה נוח יותר ממשוב TestFlight, ועבור בודקי בטא סף הכניסה נמוך בהרבה ממילוי טופס ידני. יישמנו Shake-to-Report בעשרות פרויקטים, והשגנו הפחתה של 70% בזמן הדיווח הממוצע — מ-3 דקות ל-15 שניות. בפרויקט אחד עם 500,000 משתמשים, מספר הדיווחים האיכותיים גדל פי 3. נקודת כאב אופיינית: בודק רואה באג אך לא יכול לתאר את ההקשר במהירות. המפתח נאלץ לשאול שאלות המשך. Shake-to-Report פותר זאת אוטומטית, עם חיסכון של עד 50% במשאבי QA. לפי מחקר Instabug, עד 40% מזמנם של מהנדסי QA מושקע באיסוף הקשר שגיאה. Shake-to-Report הופך שלב זה לאוטומטי. עלויות היישום מתחילות מ-$2,500. קבלו ייעוץ על יישום Shake-to-Report לפרויקט שלכם.
זיהוי הטלטול עבור Shake-to-Report
כיצד פועל זיהוי הטלטול ב-iOS?
class FeedbackWindow: UIWindow {
override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
if motion == .motionShake {
FeedbackManager.shared.presentFeedbackForm()
}
super.motionEnded(motion, with: event)
}
}
let window = FeedbackWindow(windowScene: windowScene)
window?.rootViewController = UIHostingController(rootView: ContentView())
window?.makeKeyAndVisible()
דריסת class FeedbackWindow: UIWindow { override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) { if motion == .motionShake { FeedbackManager.shared.presentFeedbackForm() } super.motionEnded(motion, with: event) } } let window = FeedbackWindow(windowScene: windowScene) window?.rootViewController = UIHostingController(rootView: ContentView()) window?.makeKeyAndVisible() היא הגישה הסטנדרטית. היא אינה דורשת קוד ספציפי ל-SwiftUI ועובדת עם כל ארכיטקטורה.
Android — מד תאוצה
ב-Android אין אירוע "טלטול" מובנה — אנו מזהים אותו באמצעות מד התאוצה:
class ShakeDetector(private val onShake: () -> Unit) : SensorEventListener {
private val SHAKE_THRESHOLD_GRAVITY = 2.7f
private val SHAKE_SLOP_TIME_MS = 500
private var lastShakeMs: Long = 0
override fun onSensorChanged(event: SensorEvent) {
val gX = event.values[0] / SensorManager.GRAVITY_EARTH
val gY = event.values[1] / SensorManager.GRAVITY_EARTH
val gZ = event.values[2] / SensorManager.GRAVITY_EARTH
val gForce = sqrt(gX * gX + gY * gY + gZ * gZ.toDouble()).toFloat()
if (gForce > SHAKE_THRESHOLD_GRAVITY) {
val now = System.currentTimeMillis()
if (lastShakeMs + SHAKE_SLOP_TIME_MS > now) return
lastShakeMs = now
onShake()
}
}
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {}
}
val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
val shakeDetector = ShakeDetector { showFeedbackDialog() }
sensorManager.registerListener(
shakeDetector,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI
)UIWindow מונע קריאות מרובות מטלטול יחיד. הסף class ShakeDetector(private val onShake: () -> Unit) : SensorEventListener { private val SHAKE_THRESHOLD_GRAVITY = 2.7f private val SHAKE_SLOP_TIME_MS = 500 private var lastShakeMs: Long = 0 override fun onSensorChanged(event: SensorEvent) { val gX = event.values[0] / SensorManager.GRAVITY_EARTH val gY = event.values[1] / SensorManager.GRAVITY_EARTH val gZ = event.values[2] / SensorManager.GRAVITY_EARTH val gForce = sqrt(gX * gX + gY * gY + gZ * gZ.toDouble()).toFloat() if (gForce > SHAKE_THRESHOLD_GRAVITY) { val now = System.currentTimeMillis() if (lastShakeMs + SHAKE_SLOP_TIME_MS > now) return lastShakeMs = now onShake() } } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {} } val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager val shakeDetector = ShakeDetector { showFeedbackDialog() } sensorManager.registerListener( shakeDetector, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI ) הוא פשרה בין רגישות לבין חיובי שווא בזמן הליכה.
אילו נתונים נאספים אוטומטית?
בעת טלטול, לפני הצגת הממשק:
data class BugReport(
val screenshot: Bitmap,
val appVersion: String = BuildConfig.VERSION_NAME,
val buildNumber: String = BuildConfig.VERSION_CODE.toString(),
val osVersion: String = "Android ${Build.VERSION.RELEASE}",
val device: String = "${Build.MANUFACTURER} ${Build.MODEL}",
val currentScreen: String = screenTracker.currentScreenName,
val recentLogs: List<String> = LogBuffer.getLast(50),
val memoryInfo: String = getMemoryInfo(),
val networkType: String = getNetworkType()
)SHAKE_SLOP_TIME_MS = 500 — אם לאפליקציה יש מאגר לוג בזיכרון (עץ Timber הכותב למאגר טבעתי), דוח הבאג מכיל מיד את האירועים האחרונים. המפתח רואה כל מה שקרה ב-30 השניות שלפני הטלטול.
מצבי נגישות: טלטול אינו נוח למשתמשים עם רעד או לאלה שמחזיקים את המכשיר על שולחן. עבור תוכניות QA ובטא, אנו מוסיפים טריגרים חלופיים:
- לחיצה ארוכה על הלוגו או הגרסה ב"אודות"
- תפריט נסתר באמצעות שלוש הקשות על אזור מסך ריק
- מחוות שתי אצבעות (3 אצבעות, 3 הקשות) טלטול מושבת בדרך כלל בסביבת הייצור או הופך לאופציונלי דרך הגדרות מפתח.
מדוע Shake-to-Report מאיץ את תהליך הניפוי
לאחר היישום, בפרויקט אחד הזמן הממוצע משכפול הבאג ועד לתיקון ירד מ-4 שעות ל-90 דקות. זה קורה כי המפתח מקבל חתך נתונים מלא ללא דיאלוג חוזר עם הבודק. Shake-to-Report מהיר פי 3 מדיווח באגים ידני.
מה כלול בעבודה שלנו
אנו מספקים:
- קוד מקור של מודול Shake-to-Report עם הערות ב-Swift וב-Kotlin.
- הגדרה לאיסוף לוג אוטומטי (עץ Timber ב-Android, OSLog ב-iOS).
- אינטגרציה עם Jira, YouTrack או GitHub Issues (REST API).
- טופס ממשק דיווח עם עיצוב מותאם אישית התואם למותג שלכם.
- תיעוד על כוונון סף הרגישות והוספת טריגרים חלופיים.
- תמיכה ל-30 יום לאחר הפריסה.
- הדרכה לצוות ה-QA שלכם על שימוש בכלי.
- גישה למאגר הידע הפנימי שלנו לפתרון בעיות.
מדדי החברה והמומחיות
עם ניסיון של למעלה מ-5 שנים בפיתוח מובייל ו-15+ יישומים מוצלחים של Shake-to-Report (פינטק, קמעונאות וכו'), אנו מבטיחים שהקוד עובר בדיקת קוד ומוכן לשחרור לחנויות.
כלים מוכנים
| כלי | פלטפורמות | תכונות |
|---|---|---|
| Instabug | iOS, Android, Flutter, RN | טלטול + הקלטת מסך, אינטגרציות Jira/Slack |
| Shake.io | iOS, Android | מודל דיונים מובנה עם שרשורים |
| BugShaker | iOS (קוד פתוח) | פשוט, דוא"ל בלבד |
| יישום מותאם אישית | כל | שליטה מלאה, ללא תלות חיצונית |
Instabug הוא התקן התעשייתי עבור צוותי QA למובייל. יישום מותאם אישית מוצדק כאשר יש צורך לשלוט באילו נתונים יוצאים מהמכשיר. הניסיון שלנו כולל את שתי הגישות.
הערכות לוחות זמנים
יישום גלאי טלטול מותאם אישית עם לכידת צילום מסך ושליחה ל-Jira: 3–5 ימים. אינטגרציית Instabug עם ערכת נושא מותאמת אישית וניתוב דוחות: 1–2 ימים. אם כבר יש לכם איסוף לוג ומעקב באגים מוגדרים, לוחות הזמנים קצרים יותר. צרו קשר כדי להעריך את הפרויקט שלכם ולהציע את הפתרון האופטימלי.







