iOS SDK: சர்வைவிங் சஸ்பென்ஷன்
ஆப்பிளின் CoreLocation கட்டமைப்பு பின்னணி கண்காணிப்புக்கான சக்திவாய்ந்த கருவிகளை வழங்குகிறது, ஆனால் நினைவகம் மற்றும் பேட்டரி ஆயுளைச் சேமிக்க பயன்பாடுகளை இடைநிறுத்துவதில் iOS மிகவும் தீவிரமானது.
ஆப்பிளின் கண்டிப்பான பின்னணி செயலாக்கக் கொள்கைகளுடன் Tracelet எவ்வாறு தொடர்பு கொள்கிறது மற்றும் உங்கள் குறிப்பிட்ட சூழ்நிலையில் அதை எவ்வாறு உள்ளமைக்கலாம் என்பதை இந்தப் பக்கம் சரியாக விளக்குகிறது.
அனுமதிகள் & Info.plist அமைப்பு
ஆப்பிள் கடுமையான தனியுரிமை தேவைகளை செயல்படுத்துகிறது. ட்ரேஸ்லெட்டை திறம்பட பயன்படுத்த, உங்கள் ios/Runner/Info.plist இல் உங்களுக்கு ஏன் சில அனுமதிகள் தேவை என்பதை நீங்கள் சரியாக அறிவிக்க வேண்டும். ஆப் ஸ்டோர் மதிப்பாய்வின் போது இந்த ஸ்டிரிங்க்களைக் காணவில்லை என்றாலோ அல்லது பயன்பாட்டு வழக்கை தெளிவாக விளக்கவில்லை என்றாலோ உங்கள் பயன்பாட்டை Apple நிராகரிக்கும்.
1. தேவையான பயன்பாட்டு விளக்கங்கள்
உங்கள் Info.plist இல் பின்வரும் விசைகளைச் சேர்க்கவும்:
<!-- Required for basic tracking -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>We need your location to track your route while the app is open.</string>
<!-- Required for background tracking when the app is minimized or killed -->
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>We need background location to record your route even when the app is closed.</string>
<!-- Required for the smart motion-detection battery saving engine -->
<key>NSMotionUsageDescription</key>
<string>Motion detection allows battery-efficient tracking by pausing GPS when stationary.</string>2. பின்னணி முறைகள்
ட்ரேஸ்லெட் பின்னணியில் இயங்குவதற்கு (மற்றும் ஆப்ஸ் அழிக்கப்படும் போது ஹெட்லெஸ் டார்ட் குறியீட்டை இயக்கவும்), நீங்கள் Xcode இல் சரியான பின்னணி முறை திறன்களை அறிவிக்க வேண்டும்.
மாற்றாக, அவற்றை உங்கள் Info.plist இல் நேரடியாகச் சேர்க்கவும்:
<key>UIBackgroundModes</key>
<array>
<string>location</string>
<string>fetch</string>
<!-- Only add 'audio' if you are using 'preventSuspend: true' (See Scenario 1 below) -->
</array>3. விருப்ப அம்சங்களை நீக்குதல் (சிதைவுகள் இல்லை)
உங்கள் கிளையன்ட் குறிப்பிட்ட அம்சங்களை விரும்பவில்லை என்றால் (எ.கா., அவர்கள் இயக்கம் அல்லது செயல்பாட்டு வகைகளைக் கண்காணிக்க விரும்பவில்லை), உங்கள் Info.plist இலிருந்து தொடர்புடைய விசையை நீங்கள் பாதுகாப்பாகத் தவிர்க்கலாம். டிரேஸ்லெட்டின் நேட்டிவ் ஸ்விஃப்ட் குறியீடு, அம்சங்களைக் கோரும் முன், முக்கிய இருப்பை பாதுகாப்பாகச் சரிபார்க்கிறது.
| அம்ச விசை | Info.plist இலிருந்து அகற்றப்படும் போது விளைவு |
|---|---|
| நோட்ரான்ஸ்0லேட் | பாதுகாப்பானது. இயக்கத்திற்கான இருப்பிட மாற்றங்களைச் சரிபார்க்க iOS அமைதியாகத் திரும்பும். CMMotionActivityManager செயல்படுத்தப்படாது, மேலும் மோஷன் அனுமதிகளுக்கு பயனர் கேட்கப்படமாட்டார். |
| நோட்ரான்ஸ்0லேட் -> நோட்ரான்ஸ்1லேட் | பாதுகாப்பானது. டார்ட் ஐசோலேட் இடைநீக்கத்தைத் தடுக்க, உங்கள் கட்டமைப்பு preventSuspend: true ஐ அமைத்தால் மட்டுமே தேவைப்படும். |
| நோட்ரான்ஸ்0லேட் | பாதுகாப்பானது. ஆப்ஸ் முன்புறத்தில் இருக்கும் போது மட்டுமே (அல்லது தற்காலிகமாக நீல மாத்திரை வழியாக) கண்காணிக்கும். ட்ரேஸ்லெட் அழகான சீரழிவை உள்நாட்டில் கையாளுகிறது. |
காட்சி 1: ஃபிட்னஸ் ஆப் (அதிக துல்லியம், இடைநிறுத்தம் இல்லை)
கருத்துகள் ஆராயப்பட்டன: செயல்பாட்டு வகைகள், இடைநீக்கம், ஆடியோ வேக்
பிரச்சனை
உங்கள் பயனர் ஒரு மராத்தான் ஓடுகிறார். அவர்கள் உங்கள் பயன்பாட்டைத் திறந்து, இயக்கத்தைத் தொடங்கி, ஐபோனைப் பூட்டுகிறார்கள். ஐந்து நிமிடங்களுக்குப் பிறகு, பின்னணி iCloud காப்புப்பிரதியை இயக்க ரேம் தேவை என்று iOS முடிவு செய்கிறது, எனவே இது உங்கள் பயன்பாட்டின் டார்ட் தனிமைப்படுத்தலை முழுவதுமாக இடைநிறுத்துகிறது. ட்ரேஸ்லெட்டின் நேட்டிவ் ஸ்விஃப்ட் குறியீடு தொடர்ந்து GPS புள்ளிகளைச் சேகரிக்கிறது, ஆனால் டார்ட் தனிமைப்படுத்தப்பட்டதால், உங்கள் Flutter UI தொலைவு கவுண்டரைப் புதுப்பிப்பதை நிறுத்துகிறது, மேலும் டார்ட்டில் நீங்கள் இயங்கும் லைவ்-டிராக்கிங் வெப்-சாக்கெட்டுகள் அழிக்கப்படும்.
ட்ரேஸ்லெட் அதை எவ்வாறு தீர்க்கிறது: இடைநீக்கத்தைத் தடுக்கவும்
திரை முடக்கத்தில் இருக்கும் போது Flutter Dart ஐசோலேட்டை காலவரையின்றி இயங்க வைக்க, ஆப்ஸ் மீடியாவை தீவிரமாக இயக்குகிறது என்று நினைத்து iOSஐ ஏமாற்ற வேண்டும்.
ios: tl.IosConfig(
activityType: tl.LocationActivityType.fitness, // Optimizes GPS filtering for running
preventSuspend: true,
)preventSuspend: true ஐ அமைப்பதால் ட்ரேஸ்லெட் ஒரு கண்ணுக்குத் தெரியாத, அமைதியான ஆடியோ கிளிப்பை லூப்பில் இயக்குகிறது. பயனர் இசையைக் கேட்பதாக iOS நினைப்பதால், அது டார்ட் ஐசோலேட்டை ஒருபோதும் இடைநிறுத்தாது.
ஆப் ஸ்டோர் மதிப்பாய்வு குறிப்பு: preventSuspend ஐப் பயன்படுத்துவதற்கு Xcode இல் audio பின்னணி பயன்முறைத் திறன் தேவைப்படுகிறது. முறையான பயனர் எதிர்கொள்ளும் காரணமின்றி (எ.கா., ஃபிட்னஸ் டிராக்கர் குரல் குறிப்புகளை இயக்கும் அல்லது டர்ன்-பை-டர்ன் டைரக்ஷன்ஸ் பேசும் நேவிகேஷன் ஆப்) பின்னணி ஆடியோவைப் பயன்படுத்தினால் Apple உங்கள் பயன்பாட்டை நிராகரிக்கும். அமைதியான கடற்படை கண்காணிப்புக்கு இதைப் பயன்படுத்த வேண்டாம்!
இதைச் செயல்படுத்த: Xcode இல் உங்கள் iOS திட்டத்தைத் திறக்கவும், Signing & திறன்கள் -> + திறன் -> பின்னணி முறைகள் -> என்பதற்குச் செல்லவும் Audio, AirPlay மற்றும் Picture in Picture.
காட்சி 2: சமூக ரேடார் (குறைந்த சக்தி, கரடுமுரடான)
கருத்துகள் ஆராயப்பட்டன: குறிப்பிடத்தக்க மாற்றங்கள், அங்கீகார நிலைகள்
பிரச்சனை
நண்பர் அருகில் இருக்கும்போது பயனருக்குத் தெரிவிக்கும் சமூக வலைப்பின்னல் பயன்பாட்டை உருவாக்குகிறீர்கள். உங்களுக்கு டர்ன் பை டர்ன் துல்லியம் தேவையில்லை; அவர்கள் எந்தப் பகுதியில் இருக்கிறார்கள் என்பதை நீங்கள் தோராயமாக அறிந்து கொள்ள வேண்டும். பயமுறுத்தும் “எப்போதும் அனுமதி” அனுமதி வரியில் காட்ட விரும்பவில்லை, ஏனெனில் பயனர்கள் அதை நிராகரிப்பார்கள்.
ட்ரேஸ்லெட் அதை எவ்வாறு தீர்க்கிறது: குறிப்பிடத்தக்க மாற்றங்கள்
ஜிபிஎஸ் சிப்பை இயக்குவதற்குப் பதிலாக, ட்ரேஸ்லெட் செல்-டவர் ஹேண்ட்ஆஃப்களை முழுவதுமாக நம்பலாம்.
ios: tl.IosConfig(
useSignificantChangesOnly: true,
locationAuthorizationRequest: tl.LocationAuthorizationRequest.whenInUse,
disableLocationAuthorizationAlert: true,
)- குறிப்பிடத்தக்க மாற்றங்கள் மட்டும்: இதை இயக்குவதன் மூலம், சாதனம் முற்றிலும் மாறுபட்ட செல் கோபுரத்திற்கு (வழக்கமாக 500மீ முதல் பல கிலோமீட்டர் வரை) தாவும்போது மட்டுமே ஆப்ஸை எழுப்புமாறு ட்ரேஸ்லெட் iOSக்கு சொல்கிறது. பேட்டரி வடிகால் நடைமுறையில் பூஜ்ஜியமாகும்.
- பயன்படுத்தும் போது அங்கீகாரம்: நீங்கள் “பயன்படுத்தும் போது” அனுமதியை மட்டுமே கேட்கிறீர்கள். ட்ரேஸ்லெட் இதை மதிக்கிறது மற்றும் “எப்போதும்” என்பதை இயக்க, அமைப்புகளுக்குச் செல்லும்படி பயனர் கூறும் நேட்டிவ் ஆப்பிள் ப்ராம்ட்டைத் தூண்டாது. (டார்ட்டிலிருந்து இந்த அனுமதித் தூண்டுதல்களை எவ்வாறு தூண்டுவது என்பதை அறிய, Flutter SDK: Permissions பக்கத்தைப் பார்க்கவும்)
காட்சி 3: நீல இருப்பிடக் காட்டி (showsBackgroundLocationIndicator)
கருத்துகள் ஆராயப்பட்டன: பின்னணி இருப்பிடக் காட்டி
இந்தக் கொடி உண்மையில் என்ன செய்கிறது
showsBackgroundLocationIndicator நேரடியாக ஆப்பிளுக்கு வரைபடங்கள்
CLLocationManager.showsBackgroundLocationIndicator. பெயர் எதிர்-உள்ளுணர்வு - இது குறிகாட்டியைக் *காண்பதற்கான தேர்வு, அதை மறைப்பதற்கான சுவிட்ச் அல்ல:
| மதிப்பு | பொருள் |
|---|---|
| நோட்ரான்ஸ்0லேட் | காண்பி நீல ஸ்டேட்டஸ் பார் மாத்திரை / டைனமிக் ஐலேண்ட் இண்டிகேட்டர், ஆப்ஸ் பின்னணியில் இருப்பிடத்தைப் பயன்படுத்தும் போது. |
false (இயல்புநிலை) | மறைப்பதற்கான கோரிக்கை பின்னணி இருப்பிட பயன்பாட்டிற்கான காட்டி. |
பொதுவான தவறான கருத்து: showsBackgroundLocationIndicator: true ஐ அமைப்பது இல்லை நீல குறிகாட்டியை ஆஃப் - அது ஆன் செய்யும். அதை மறைப்பதே உங்கள் இலக்காக இருந்தால், அதை false (இயல்புநிலை) விடவும். மாத்திரையை நீங்கள் விரும்பினால் true அமைப்பது பயனுள்ளதாக இருக்கும் (எ.கா. “பயன்படுத்தும் போது” பின்னணி கண்காணிப்பை திருப்திப்படுத்த, கீழே).
நீங்கள் மாத்திரையை விரும்பும்போது (“பயன்படுத்தும் போது” தற்காலிக பின்னணி கண்காணிப்பு)
உங்களிடம் “பயன்படுத்தும் போது” அனுமதி மட்டுமே உள்ளது, ஆனால் பயனர் ஒரு பணியை முடிக்கும்போது (எ.கா. ரைடுஷேர் பிக்-அப்) கண்காணிக்க வேண்டும். ஐஓஎஸ் இதை இண்டிகேட்டர் தெரிந்தால் மட்டுமே அனுமதிக்கிறது, எனவே கண்காணிப்பு நடப்பதை பயனருக்குத் தெரியும்:
ios: tl.IosConfig(
showsBackgroundLocationIndicator: true,
)இதைச் செயல்படுத்த: location பின்னணி பயன்முறை Xcode இல் இருக்க வேண்டும் (கையொப்பமிடுதல் மற்றும் திறன்கள் → பின்னணி முறைகள் → இருப்பிட புதுப்பிப்புகள்).
ஏன் false எப்போதும் அதை மறைப்பதில்லை
showsBackgroundLocationIndicator: false இல் கூட, இந்தச் சமயங்களில் iOS காட்டியை கட்டாயப்படுத்துகிறது — கொடியால் அவற்றை மீற முடியாது:
- “பயன்படுத்தும் போது” அங்கீகாரம் — பின்புல இருப்பிடம் எப்போதும் காட்டி காட்டும். முழு “எப்போதும்” அங்கீகாரம் மட்டுமே அதை அடக்க முடியும்.
useBackgroundActivitySession: true(iOS 17+) —CLBackgroundActivitySessionசெயலில் இருக்கும்போது Apple க்கு இண்டிகேட்டர் தேவைப்படுகிறது (காட்சி 4).- நேரடி செயல்பாடுகள் செயலில் (காட்சி 5).
- தொடர்ச்சியான பின்னணி இருப்பிட அமர்வு — ஆப்ஸ்
startUpdatingLocationஇடைவிடாமல் இயங்கினால், கொடியைப் பொருட்படுத்தாமல் காட்டி இயக்கத்தில் இருக்கும்.
உண்மையில் காட்டி மறைத்து வைக்க
- முழு “எப்போதும்” அங்கீகாரத்தைப் பெறுங்கள் (குறிப்பிடவும் iOS முதலில் தற்காலிக “பயன்படுத்தும் போது” என்பதை பயனர் பின்னர் “எப்போதும் மாற்றவும்” என்பதை உறுதிப்படுத்தும் வரை - அதுவரை மாத்திரை தோன்றும்).
showsBackgroundLocationIndicator: falseஆக வைக்கவும் (அதைtrueஎன அமைக்க வேண்டாம்).- தேவையற்ற தொடர்ச்சியான பின்னணி இருப்பிடத்தைத் தவிர்க்கவும். ஜியோஃபென்ஸ்-மட்டும் பயன்முறையானது நேட்டிவ் பிராந்திய கண்காணிப்பைப் பயன்படுத்துகிறது (தொடர்ச்சியான ஜிபிஎஸ் இல்லை), எனவே இது எந்தக் குறிகாட்டியையும் காட்டாது —
startGeofences()நிலையான பயன்முறையில் தொடர்ச்சியான புதுப்பிப்புகளை இயக்காது.
காட்சி 4: டைனமிக் ஐலேண்ட் இண்டிகேட்டர் (iOS 17+)
கருத்துகள் ஆராயப்பட்டன: பின்னணி செயல்பாட்டு அமர்வு
பிரச்சனை
ப்ளூ மாத்திரை இண்டிகேட்டரின் பலன்களை நீங்கள் விரும்புகிறீர்கள், ஆனால் நவீன ஐபோன்களில் டைனமிக் தீவுடன் மிகவும் நவீனமான, பூர்வீக ஒருங்கிணைப்பை நீங்கள் விரும்புகிறீர்கள், மேலும் OS உங்கள் பின்னணி அமர்வைக் கொல்லும் வாய்ப்புகளைக் குறைக்க விரும்புகிறீர்கள்.
ட்ரேஸ்லெட் அதை எவ்வாறு தீர்க்கிறது
Tracelet ஆப்பிளின் CLBackgroundActivitySession உடன் ஒருங்கிணைக்கிறது (iOS 17 இல் அறிமுகப்படுத்தப்பட்டது). இது ஒரு முக்கிய டைனமிக் ஐலேண்ட் இண்டிகேட்டரை வழங்குகிறது மற்றும் OS உடன் ஒரு முறையான அமர்வை உருவாக்குகிறது, உங்கள் பயன்பாட்டை இடைநிறுத்த வேண்டாம் என்று கூறுகிறது.
ios: tl.IosConfig(
useBackgroundActivitySession: true,
)ஆப் ஸ்டோர் மதிப்பாய்வு தேவைகள்: உங்கள் பயன்பாட்டிற்கு ஏன் தொடர்ந்து பின்னணி இருப்பிடம் தேவைப்படுகிறது என்பதற்கான தெளிவான விளக்கம் Apple க்கு தேவைப்படுகிறது. நீங்கள் CLBackgroundActivitySession ஐப் பயன்படுத்தினால், மூன்று இடங்களில் நீங்கள் வேண்டும் நியாயத்தை வழங்க வேண்டும் அல்லது உங்கள் பயன்பாடு நிராகரிக்கப்படும்:
- ஆப் ஸ்டோர் கனெக்ட் மதிப்பாய்வு குறிப்புகள்: செயலியில் உள்ள அம்சத்தைக் காட்டும் டெமோ வீடியோவிற்கான இணைப்புடன், பயன்பாட்டிற்கு இந்த அம்சம் ஏன் தேவை என்பதைப் பற்றிய தெளிவான எழுத்துப்பூர்வ விளக்கத்தை மதிப்பாய்வாளருக்கு வழங்க வேண்டும்.
- ஆப் ஸ்டோர் விளக்கம்: ஆப்ஸ் பின்னணி இருப்பிடத்தைப் பயன்படுத்துகிறது என்பதை உங்கள் பொது ஆப்ஸ் விளக்கம் தெளிவாகக் குறிப்பிட வேண்டும் (எ.கா., “இந்த ஆப்ஸ், ஆப்ஸ் மூடப்பட்டிருந்தாலும், உங்கள் ரன்களைக் கண்காணிக்க பின்னணி இருப்பிடத்தைப் பயன்படுத்துகிறது.”).
- ஆப்-இன்-ஆன்போர்டிங்: இருப்பிட அனுமதிகளைக் கோருவதற்கு முன், பின்னணி இருப்பிடம் ஏன் தேவை என்பதை உங்கள் பயன்பாட்டின் UI தெளிவாகப் பயனருக்கு விளக்க வேண்டும்.
காட்சி 5: நேரலை செயல்பாடுகள் (லாக் ஸ்கிரீன் & டைனமிக் ஐலேண்ட் UI)
கருத்துகள் ஆராயப்பட்டன: ActivityKit, Lock Screen Widgets, Dynamic Island
பிரச்சனை
iOS 17+ இல் பின்னணியில் கண்காணிக்கும் போது, லாக் ஸ்கிரீன் மற்றும் டைனமிக் ஐலேண்டில் ஒரு பணக்கார, கண்ணுக்குத் தெரியும் இண்டிகேட்டர் தேவை - எனவே, சிறிய நீல இருப்பிட மாத்திரைக்குப் பதிலாக, கண்காணிப்பு செயலில் உள்ளது என்பதை பயனர் எப்போதும் அறிவார்.
ட்ரேஸ்லெட் அதை எவ்வாறு தீர்க்கிறது
Tracelet ஆப்பிளின் ActivityKit உடன் ஒருங்கிணைக்கிறது. நீங்கள் liveActivityConfig ஐ அளித்து, விட்ஜெட் நீட்டிப்பைச் சேர்த்தால், டிராக்கிங் தொடங்கும் போது ட்ரேஸ்லெட் தானாகவே நேரலைச் செயல்பாட்டைத் தொடங்கி, கண்காணிப்பு நிறுத்தப்படும்போது அதை முடிக்கும்.
லைவ் ஆக்டிவிட்டி என்பது ட்ரேஸ்லெட்டின் நிலையான பின்னணி பைப்லைனின் மேல் UI லேயர் ஆகும். பேட்டரி செயல்திறன் தானாகவே நிலையாக இருக்கும் போது GPS ஐ இடைநிறுத்தும் இயக்கம்-கண்டறிதல் இயந்திரம் மற்றும் பின்னணி-அமர்வு ஒருங்கிணைப்பு (காட்சி 4) - செயல்பாட்டு விட்ஜெட்டிலிருந்து அல்ல. ட்ரேஸ்லெட் இல்லை இரண்டாவது CLLocationUpdate.liveUpdates() ஸ்ட்ரீமை திறக்காது, இது ஜிபிஎஸ் வேலையை நகலெடுக்கும்.
ios: tl.IosConfig(
liveActivityConfig: tl.LiveActivityConfig(
title: 'Ride in progress',
body: 'Tracking your route to the destination...',
),
)கண்காணிக்கும் போது நேரடி செயல்பாட்டைப் புதுப்பித்தல் (updateNotification())
ட்ராக்கிங் தொடங்கிய பிறகு, நேரலை செயல்பாடு காட்டுவதை மாற்ற, setConfig() வழியாக liveActivityConfig ஐப் புதுப்பித்து, Tracelet.updateNotification() ஐ அழைக்கவும். v3.6.8 இது சமீபத்திய கட்டமைப்பிலிருந்து டிராக்கிங் பைப்லைனை மறுதொடக்கம் செய்யாமல் நேரலைச் செயல்பாட்டைப் புதுப்பிக்கிறது — Android முன்புற-சேவை அறிவிப்பைப் புதுப்பிப்பதற்கான குறுக்கு-தளம்:
await Tracelet.setConfig(
const tl.Config(
ios: tl.IosConfig(
liveActivityConfig: tl.LiveActivityConfig(
title: 'Ride in progress',
body: 'Arriving in 2 minutes',
),
),
),
);
await Tracelet.updateNotification();இயங்கும் செயல்பாட்டில் உடல் மட்டுமே புதுப்பிக்கப்படும் - title மாறாத ActivityAttributes இல் வாழ்கிறது மற்றும் செயல்பாட்டை முடிக்காமல் மற்றும் மீண்டும் கோராமல் மாற்ற முடியாது (ஒரு ActivityKit கட்டுப்பாடு).
நேரலைச் செயல்பாடு நகரும் துணை நிலை (நிலையான நிலையில் இருக்கும் GPS ஐ ட்ரேஸ்லெட் இடைநிறுத்தும்போது அது நிராகரிக்கப்படும்), எனவே நீங்கள் அதைப் புதுப்பிக்கும் நேரத்தில் அது திரையில் இருக்காது. கண்காணிப்பு அமர்வு செயலில் இருக்கும்போது, updateNotification() இதை உங்களுக்காகக் கையாளும்: இது இயங்கும் செயல்பாட்டைப் புதுப்பிக்கிறது அல்லது அது நிராகரிக்கப்பட்டால் சமீபத்திய உள்ளடக்கத்துடன் அதை மீண்டும் வழங்குகிறது. liveActivityConfig அமைக்கப்படாதபோது அல்லது கண்காணிப்பு நிறுத்தப்படும்போது இது பாதுகாப்பான நோ-ஆப் ஆகும்.
Xcode விட்ஜெட் நீட்டிப்பு அமைப்பு (தேவை)
இது எதற்காக? கண்காணிப்பு செயலில் இருக்கும் போது, iOS லாக் ஸ்கிரீன் மற்றும் டைனமிக் ஐலேண்டில் நேரடிச் செயல்பாட்டைக் காண்பிக்க இந்த அமைப்பு உங்கள் பயன்பாட்டை அனுமதிக்கிறது. செயலியைத் திறக்காமலேயே பயனர்களுக்கு அவர்களின் தற்போதைய அமர்வைப் பற்றிய தெளிவான தகவலை இது வழங்குகிறது.
இது பேட்டரியைச் சேமிக்கிறதா? இல்லை. நேரலை செயல்பாடு முற்றிலும் UI லேயர் மற்றும் பேட்டரியைச் சேமிக்காது. பேட்டரி செயல்திறன் முற்றிலும் ட்ரேஸ்லெட்டின் முக்கிய பின்னணி இயந்திரத்திலிருந்து வருகிறது (இயக்கத்தைக் கண்டறிதல், நிலையாக இருக்கும்போது ஜிபிஎஸ் இடைநிறுத்தம் மற்றும் பின்னணி அமர்வுகள்).
இது கட்டாயமா? இல்லை. இந்த அமைப்பு முற்றிலும் விருப்பமானது. நீங்கள் இதைத் தவிர்த்தால், Tracelet தொடர்ந்து பின்னணியில் சரியாகக் கண்காணிக்கும், ஆனால் பயனர்கள் உங்கள் தனிப்பயன் UIக்குப் பதிலாக நிலையான கணினி குறிகாட்டிகளை (நீல இருப்பிட மாத்திரை போன்றவை) மட்டுமே பார்ப்பார்கள்.
Android போலல்லாமல், Flutter செருகுநிரல்கள் மாறும் வகையில் iOS விட்ஜெட்களை உருவாக்க முடியாது. நேரடி செயல்பாடுகளை இயக்க, Xcode இல் உங்கள் iOS பயன்பாட்டில் விட்ஜெட் நீட்டிப்பு இலக்கைச் சேர்க்க வேண்டும்:
- Xcode இல்
ios/Runner.xcworkspaceஐ திறக்கவும். - File -> New -> Target… என்பதற்குச் சென்று Widget Extension என்பதைத் தேர்ந்தெடுக்கவும்.
- இதற்கு
TraceletWidgetஎன்று பெயரிடுங்கள். நேரலைச் செயல்பாட்டைச் சேர்ப்பது சரிபார்க்கப்பட்டுள்ளதா என்பதை உறுதிப்படுத்தவும். - உங்கள் பயன்பாட்டின்
Info.plistமற்றும் உங்கள் புதிய விட்ஜெட் நீட்டிப்புInfo.plistஆகிய இரண்டிலும் (Xcode -> திற -> மூலக் குறியீட்டில் வலது கிளிக் செய்யவும்), முக்கிய<dict>க்குள் பின்வரும் விசையை கட்டாயம் சேர்க்க வேண்டும்:
<key>NSSupportsLiveActivities</key>
<true/>- நீட்டிப்புப் பதிப்பை ஒத்திசைக்கவும் (ஆப் ஸ்டோர் சமர்ப்பிப்பிற்கு மட்டுமே முக்கியம்): ஹோஸ்ட் ஆப்ஸுடன்
CFBundleShortVersionString/CFBundleVersionபொருந்தாத ஆப்ஸ் நீட்டிப்பை Apple நிராகரிக்கிறது. உங்கள் பயன்பாட்டைப் பொருத்த விட்ஜெட்டின் இலக்கின் பதிப்பு மற்றும் பில்ட் ஆகியவற்றை அமைக்கவும்: ட்ரேஸ்லெட் விட்ஜெட் இலக்கு → பொது → அடையாளம் என்பதைத் தேர்ந்தெடுத்து, பதிப்பு உங்கள் ஆப்ஸின் பதிப்பில் அமைக்கவும் மற்றும் பதிப்பு உங்கள் ஆப்ஸின் உருவாக்கம் (உங்கள் OTRA களின் மதிப்பை உருவாக்கவும்**)
$(FLUTTER_BUILD_NAME) / $(FLUTTER_BUILD_NUMBER) ஐ விட்ஜெட்டின் Info.plist இல் ஒட்டுவதன் மூலம் இவற்றை அமைக்க வேண்டாம் முயற்சிக்க வேண்டாம். அந்த மாறிகள் ரன்னர் இலக்குக்கு மட்டுமே வரையறுக்கப்படுகின்றன (Flutter’s Generated.xcconfig வழியாக); விட்ஜெட் இலக்கில் அவை காலியாகத் தீர்க்கின்றன, எனவே பதிப்புகள் அமைதியாகப் பொருந்தாது. மேலே குறிப்பிட்டுள்ளபடி இலக்கின் உருவாக்க அமைப்புகளை (MARKETING_VERSION / CURRENT_PROJECT_VERSION) பயன்படுத்தவும். இது சமர்ப்பிப்பதற்கான தேவை மட்டுமே — பொருந்தாதது இயக்க நேரத்தில் பயன்பாட்டை செயலிழக்கச் செய்யாது.
- Flutter சார்புகளை இணைக்க வேண்டாம்:
FlutterGeneratedPluginSwiftPackageஅல்லது Flutter இயந்திரத்தை உங்கள் விட்ஜெட் நீட்டிப்புடன் இணைக்க வேண்டாம். அவ்வாறு செய்வது வெளியீட்டு பயன்முறையில் வெளியீட்டு நேரdyldசெயலிழப்பை (Library not loaded) ஏற்படுத்துகிறது, ஏனெனில் Flutter அதன் டைனமிக் SPM கட்டமைப்பை பயன்பாட்டு நீட்டிப்புகளில் உட்பொதிக்காது. - தானாக உருவாக்கப்பட்ட
TraceletWidgetLiveActivity.swiftஉள்ளடக்கத்தை பின்வருவனவற்றுடன் மாற்றவும். SDK ஐ இறக்குமதி செய்வதற்குப் பதிலாக, ** கைமுறையாகTraceletActivityAttributesகட்டமைப்பை இங்கு வரையறுத்துள்ளோம் என்பதைக் கவனியுங்கள் — ActivityKit, struct இன் (தகுதியற்ற) பெயர் மற்றும் வடிவத்தின் மூலம் செயல்பாட்டுடன் பொருந்துகிறது, எனவே இது உங்கள் விட்ஜெட்டை இலகுவாக வைத்திருக்கும் மற்றும் SDK ஐ நீட்டிப்புடன் இணைப்பதைத் தவிர்க்கிறது:
import ActivityKit
import WidgetKit
import SwiftUI
// Define the exact struct expected by Tracelet's native core
public struct TraceletActivityAttributes: ActivityAttributes {
public struct ContentState: Codable, Hashable {
public var status: String
public init(status: String) { self.status = status }
}
public var title: String
public init(title: String) { self.title = title }
}
@main
struct TraceletWidgetBundle: WidgetBundle {
var body: some Widget {
TraceletWidgetLiveActivity()
}
}
struct TraceletWidgetLiveActivity: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: TraceletActivityAttributes.self) { context in
// Lock Screen / banner UI — fully self-contained (no SDK import needed)
HStack(spacing: 12) {
Image(systemName: "location.fill").foregroundColor(.blue)
VStack(alignment: .leading) {
Text(context.attributes.title).font(.headline)
Text(context.state.status).font(.subheadline).foregroundColor(.secondary)
}
Spacer()
}
.padding()
} dynamicIsland: { context in
DynamicIsland {
DynamicIslandExpandedRegion(.leading) {
Text("Tracking")
}
DynamicIslandExpandedRegion(.trailing) {
Text("Live")
}
DynamicIslandExpandedRegion(.bottom) {
Text(context.state.status)
}
} compactLeading: {
Image(systemName: "location.fill").foregroundColor(.blue)
} compactTrailing: {
Text("Live")
} minimal: {
Image(systemName: "location.fill").foregroundColor(.blue)
}
}
}
}இந்த SwiftUI காட்சியானது தனிப்பயனாக்க முழுவதுமாக உங்களுடையது - ActivityConfiguration பிளாக்கில் நீங்கள் விரும்பும் வகையில் ஸ்டைல் செய்து, context.attributes.title மற்றும் context.state.status இலிருந்து தரவை மேப்பிங் செய்யவும்.
விட்ஜெட் நீட்டிப்பின் வரிசைப்படுத்தல் இலக்கை iOS 16.2 க்கு அமைக்கவும். Xcode இன் “விட்ஜெட் நீட்டிப்பு” டெம்ப்ளேட் அடிக்கடி @main WidgetBundle இல் கட்டுப்பாட்டு விட்ஜெட்கள் மற்றும் @available(iOS 18.0, *) சிறுகுறிப்பை சேர்க்கிறது. அந்த சிறுகுறிப்பு நீட்டிப்பின் வரிசைப்படுத்தல் இலக்கை விட அதிகமாக இருந்தால், விட்ஜெட் தொகுப்பு (எனவே உங்கள் நேரடி செயல்பாடு) பதிவு செய்யத் தவறிவிடும் - கணினி Activity had no descriptor ஐப் பதிவு செய்கிறது - மேலும் நீட்டிப்பு பழைய OS பதிப்புகளில் செயலிழக்கக்கூடும். நீட்டிப்பின் வரிசைப்படுத்தல் தளத்தில் @main தொகுப்பை வைத்திருங்கள் மற்றும் if #available(iOS 18.0, *) இல் iOS-18-க்கு மட்டும் விட்ஜெட்களை (எ.கா. கட்டுப்பாட்டு விட்ஜெட்டுகள்) மடிக்கவும்.
காட்சி 6: நிறுத்தப்பட்ட நிலை (App Force-Quit)
கருத்துகள் ஆராயப்பட்டன: ஆப் லைஃப்சைக்கிள், ஃபோர்ஸ்-க்விட் vs ஓஎஸ் சஸ்பென்ஷன்
பிரச்சனை
உங்கள் பயனர் ஆப்ஸ் ஸ்விட்ச்சரிலிருந்து மேலே ஸ்வைப் செய்து, பயன்பாட்டை முழுவதுமாக கட்டாயப்படுத்தி வெளியேறுகிறார். பின்னணியில் ட்ரேஸ்லெட் தொடர்ந்து கண்காணிக்கும் என்று நீங்கள் எதிர்பார்க்கிறீர்கள், ஆனால் இருப்பிடங்கள் வருவதை நிறுத்துகின்றன.
ஆப்பிள் அதை எவ்வாறு கையாள்கிறது
ஆண்ட்ராய்டைப் போலல்லாமல், முன்புறச் சேவையானது ஸ்வைப்-டு-டிஸ்மிஸ் செய்தாலும் உயிர்வாழ முடியும், iOS கண்டிப்பாக பயனர் நோக்கத்தை செயல்படுத்துகிறது.
ஆப்பிளின் அதிகாரப்பூர்வ மைய இருப்பிட ஆவணம் படி:
“பயனர் உங்கள் பயன்பாட்டிலிருந்து வெளியேறினால், புதிய இருப்பிட நிகழ்வுகள் வரும்போது கணினி தானாகவே அதைத் தொடங்காது. கணினி இருப்பிட நிகழ்வுகளை வழங்குவதைத் தொடங்கும் முன், பயனர் உங்கள் பயன்பாட்டை வெளிப்படையாக மறுதொடக்கம் செய்ய வேண்டும்.”
ஒரு பயனர் கைமுறையாக பயன்பாட்டை விட்டு வெளியேறும்போது:
- நிலையான இருப்பிட புதுப்பிப்புகள்: முற்றிலும் நிறுத்தப்பட்டது.
- குறிப்பிடத்தக்க இட மாற்றங்கள் (SLC): முற்றிலும் நிறுத்தப்பட்டது.
- பிராந்திய கண்காணிப்பு (ஜியோஃபென்ஸ்): முற்றிலும் நிறுத்தப்பட்டது.
அது நிறுத்தப்பட்ட நிலைத்தில் வேலை செய்யுமா?
- OS பயன்பாட்டை நிறுத்தினால் (எ.கா., பின்னணியில் உள்ள நினைவக அழுத்தம் காரணமாக): ஆம். இருப்பிட நிகழ்வு நிகழும்போது (குறிப்பிடத்தக்க மாற்றம் அல்லது ஜியோஃபென்ஸ் தூண்டுதல் போன்றவை) பின்னணியில் ஆப்பிள் தானாகவே உங்கள் பயன்பாட்டை மீண்டும் தொடங்கும். ட்ரேஸ்லெட்டின் பூர்வீக ரஸ்ட் கோர் எழுந்து அதை தடையின்றி கையாளும்.
- பயனர் வெளிப்படையாக பயன்பாட்டிலிருந்து வெளியேறினால்: இல்லை. ஆப்ஸை மீண்டும் திறக்க பயனர் கைமுறையாக ஆப்ஸ் ஐகானைத் தட்டும் வரை ஆப்ஸ் செயலற்ற நிலையில் இருக்கும்.
ட்ரேஸ்லெட் அதை எவ்வாறு தீர்க்கிறது
Tracelet ஆப்பிளின் அடிப்படை OS கட்டுப்பாடுகளைத் தவிர்க்க முடியாது. இருப்பினும், ட்ரேஸ்லெட் உறுதி செய்கிறது:
- அனைத்து ஒத்திசைக்கப்படாத இடங்களும் ரஸ்ட் SQLite தரவுத்தளத்தில் ஆப் அழிக்கப்படுவதற்கு முன் பாதுகாப்பாக இருக்கும்.
- பயனர் மீண்டும் பயன்பாட்டைத் திறந்தவுடன், ட்ரேஸ்லெட் உடனடியாக கண்காணிப்பைத் தொடங்கும் மற்றும் எந்த ஆஃப்லைன் தரவையும் தவறவிடாமல் ஒத்திசைக்கிறது.