Post not yet marked as solved
Hi everyone. We try to implement background assets to our project. And and encountered this problem.
When try to send background event from terminal
xcrun backgroundassets-debug --simulate --app-periodic-check -d [DEVICE_ID] -b [APP_BUNDLE_IDENTIFIER]
In console.app in device log we saw this type of logs
Text version :)
Resetting extension runtime for: [APP_BUNDLE_IDENTIFIER]
Application info for ([APP_BUNDLE_IDENTIFIER]) is being updated based on URL:(N/A)
Failed to find represented extension point. (ID:[APP_BUNDLE_IDENTIFIER]
Event (7) dropped for client ([APP_BUNDLE_IDENTIFIER]) failed because the app and extension do not share any application groups.
Tried on Xcode 15, iOS 17.0.2, MacOS 14
App Info.plist (in yml style)
---- part
<key>app-group</key>
<string>group.com.*******.MobileFWDemo</string>
<key>app-group-asset</key>
<string>group.com.*******.BackgroundAsset.Container</string>
<key>BAInitialDownloadRestrictions</key>
<dict>
<key>BADownloadAllowance</key>
<integer>1610612736</integer>
<key>BADownloadDomainAllowList</key>
<array>
<string>devstreaming-cdn.apple.com</string>
<string>developer.apple.com</string>
<string>http://example.com/</string>
<string>https://www.learningcontainer.com/</string>
<string>https://file-examples.com</string>
</array>
<key>BAEssentialDownloadAllowance</key>
<integer>1073741824</integer>
</dict>
<key>BAManifestURL</key>
<string>https://developer.apple.com/sample-code/background-assets/SessionsManifest.plist</string>
<key>BAMaxInstallSize</key>
<string>1610612736</string>
----- part
In BAExtension info.plist
<dict>
<key>app-group</key>
<string>group.com.*******.MobileFWDemo</string>
<key>app-group-asset</key>
<string>group.com.*******.BackgroundAsset.Container</string>
<key>EXAppExtensionAttributes</key>
<dict>
<key>EXExtensionPointIdentifier</key>
<string>com.apple.background-asset-downloader-extension</string>
<key>EXPrincipalClass</key>
<string>BackgroundDownloadHandler</string>
</dict>
</dict>
App Entitlement
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.applesignin</key>
<array>
<string>Default</string>
</array>
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:******.onelink.me</string>
</array>
<key>com.apple.developer.game-center</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.******.BackgroundAsset.Container</string>
<string>group.com.******.MobileFWDemo</string>
</array>
</dict>
Extension Entitlement
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.*******.MobileFWDemo</string>
<string>group.com.*******.BackgroundAsset.Container</string>
</array>
</dict>
Method - not called
- (NSSet<BADownload *> *)downloadsForRequest:(BAContentRequest)contentRequest
manifestURL:(NSURL *)manifestURL
extensionInfo:(BAAppExtensionInfo *)extensionInfo
After add Background Asset Extension a new warning appeared in the logs:
Execution of the command buffer was aborted due to an error during execution. Insufficient Permission (to submit GPU work from background) (00000006:kIOGPUCommandBufferCallbackErrorBackgroundExecutionNotPermitted)
Maybe it wiil be connected to my problem.
Could someone help ?)
Post not yet marked as solved
Background Assets are integrated into our online Appstore. However, after launching the APP, we collected many crashes of Background Assets framework through our crash system.
1、BADownloadManager.sharedManager.fetchCurrentDownloadsWithCompletionHandler. Then, I am reinitiating the tasks through startForegroundDownload. However, occasionally there is a crash with EXC_BREAKPOINT
[BADownloadManager.sharedManager fetchCurrentDownloadsWithCompletionHandler:^(NSArray<BADownload *> * _Nonnull downloads, NSError * _Nullable error) {
if (error){
return;
}
for (BADownload *download in downloads) {
if ([urlList containsObject:download.identifier]){
if (download.state == BADownloadStateFailed) {
return;
}
NSError *downloadError;
BOOL succes = [BADownloadManager.sharedManager startForegroundDownload:download error:&downloadError];
if (downloadError) {
LogError(BADownloadLog,@"startForegroundDownload url:%@ error:%@",download.identifier,downloadError);
}else if(succes){
LogInfo(BADownloadLog,@"startForegroundDownload:%@",download.identifier);
[self addDowdloadingUrl:download.identifier];
}
}
}
}];
The following crashes exist:
Thread 3 (crashed)
0 BackgroundAssets!-[BADownloadManager startForegroundDownload:error:] + 0x100
Found by: given as instruction pointer in context
1 BackgroundAssets!-[BADownloadManager startForegroundDownload:error:] + 0xe0
Found by: previous frame's frame pointer
2 YYMobile!__46-[YYBADownloadManager executeDownload:finish:]_block_invoke [YYBADownloadManager.m : 180 + 0xc]
Found by: previous frame's frame pointer
3 libdispatch.dylib!_dispatch_call_block_and_release + 0x1c
Found by: previous frame's frame pointer
4 libdispatch.dylib!_dispatch_client_callout + 0x10
Found by: previous frame's frame pointer
5 libdispatch.dylib!_dispatch_lane_serial_drain + 0x298
Found by: previous frame's frame pointer
6 libdispatch.dylib!_dispatch_lane_invoke + 0x17c
Found by: previous frame's frame pointer
7 libdispatch.dylib!_dispatch_workloop_worker_thread + 0x284
Found by: previous frame's frame pointer
8 libsystem_pthread.dylib!_pthread_wqthread + 0x11c
Found by: previous frame's frame pointer
See attachment "iOS.crash" for the complete crash file.
iOS.crash
Ask what, do I need to use exclusive control when accessing BADownload?
2、Handling failed callbacks in background download extension, rearranging necessary resources crashed
- (void)backgroundDownload:(BADownload *)download failedWithError:(NSError *)error
{
// Extension was woken because a download failed.
// A download can be rescheduled with BADownloadManager if necessary.
if (![download isKindOfClass:[BAURLDownload class]]) {
return;
}
if (download.isEssential){
BADownload *nonEssential = [download copyAsNonEssential];
[BADownloadManager.sharedManager scheduleDownload:nonEssential error:nil];
}
}
Have a crash:
hread 1 Crashed:
0 BackgroundAssets 0x0000000245b47dac -[BADownload setPriority:] + 176 (BADownload.m:249)
1 BackgroundAssets 0x0000000245b47bb4 -[BADownload copyWithZone:] + 188 (BADownload.m:217)
2 BackgroundAssets 0x0000000245b46db0 -[BAURLDownload copyWithZone:] + 52 (BAURLDownload.m:127)
3 BackgroundAssets 0x0000000245b47f7c -[BADownload copyAsNonEssential] + 20 (BADownload.m:368)
4 YYBackgroundDownload 0x0000000100de8a88 0x100de4000 + 19080
5 BackgroundAssets 0x0000000245b3fd50 __88-[BADownloaderExtensionConnection backgroundDownload:failedWithError:completionHandler:]_block_invoke + 56 (BADownloaderExtensionConnection.m:178)
6 libdispatch.dylib 0x00000001d8080320 _dispatch_call_block_and_release + 32 (init.c:1518)
7 libdispatch.dylib 0x00000001d8081eac _dispatch_client_callout + 20 (object.m:560)
8 libdispatch.dylib 0x00000001d8089534 _dispatch_lane_serial_drain + 668 (inline_internal.h:2640)
9 libdispatch.dylib 0x00000001d808a0a4 _dispatch_lane_invoke + 384 (queue.c:3966)
10 libdispatch.dylib 0x00000001d8094cdc _dispatch_workloop_worker_thread + 648 (queue.c:6913)
11 libsystem_pthread.dylib 0x0000000230547ddc _pthread_wqthread + 288 (pthread.c:2618)
12 libsystem_pthread.dylib 0x0000000230547b7c start_wqthread + 8 (:-1)
Details see attachment
2023-09-19_09-46-22.4511_+0800-6c5f4b24bec7c04256c852d7a008978a886c15a3.crash
Post not yet marked as solved
I am starting the app and fetching the current downloading tasks through BADownloadManager.sharedManager.fetchCurrentDownloadsWithCompletionHandler. Then, I am reinitiating the tasks through startForegroundDownload. However, occasionally there is a crash with EXC_BREAKPOINT
[BADownloadManager.sharedManager fetchCurrentDownloadsWithCompletionHandler:^(NSArray<BADownload *> * _Nonnull downloads, NSError * _Nullable error) {
if (error){
return;
}
for (BADownload *download in downloads) {
if ([urlList containsObject:download.identifier]){
if (download.state == BADownloadStateFailed) {
return;
}
NSError *downloadError;
BOOL succes = [BADownloadManager.sharedManager startForegroundDownload:download error:&downloadError];
if (downloadError) {
LogError(BADownloadLog,@"startForegroundDownload url:%@ error:%@",download.identifier,downloadError);
}else if(succes){
LogInfo(BADownloadLog,@"startForegroundDownload:%@",download.identifier);
[self addDowdloadingUrl:download.identifier];
}
}
}
}];
Crash stack:
Crash reason: EXC_BREAKPOINT / EXC_ARM_BREAKPOINT
Crash address: 0x21be8f638
Process uptime: 2 seconds
Thread 3 (crashed)
0 BackgroundAssets!-[BADownloadManager startForegroundDownload:error:] + 0x100
Found by: given as instruction pointer in context
1 BackgroundAssets!-[BADownloadManager startForegroundDownload:error:] + 0xe0
Found by: previous frame's frame pointer
2 YYMobile!__46-[YYBADownloadManager executeDownload:finish:]_block_invoke [YYBADownloadManager.m : 180 + 0xc]
Found by: previous frame's frame pointer
3 libdispatch.dylib!_dispatch_call_block_and_release + 0x1c
Found by: previous frame's frame pointer
4 libdispatch.dylib!_dispatch_client_callout + 0x10
Found by: previous frame's frame pointer
5 libdispatch.dylib!_dispatch_lane_serial_drain + 0x298
Found by: previous frame's frame pointer
6 libdispatch.dylib!_dispatch_lane_invoke + 0x17c
Found by: previous frame's frame pointer
7 libdispatch.dylib!_dispatch_workloop_worker_thread + 0x284
Found by: previous frame's frame pointer
8 libsystem_pthread.dylib!_pthread_wqthread + 0x11c
Found by: previous frame's frame pointer
The crash occurred at BOOL succes = [BADownloadManager.sharedManager startForegroundDownload:download error:&downloadError];
Post not yet marked as solved
xcrun backgroundassets-debug --simulate --app-install -d 00008120-0014188636D8C01E -b com.testBackGround.photos
Application was installed event was sent for app identifier: (com.testBackGround.photos).
WWDC Sessions Background Assets Extension container_create_or_lookup_app_group_path_by_app_group_identifier: client is not entitled
backgroundassets.user Extension interrupted for identifier: com.testBackGround.photos
runningboardd Invalidating assertion 31-413-2850 (target:[xpcservice<com.testBackGround.photos.BackgroundDownloadExt([osservice<com.apple.backgroundassets.user>:413])>:1479]) from originator [osservice<com.apple.backgroundassets.user>:413]
backgroundassets.user Extension invalidated for identifier: com.testBackGround.photos
backgroundassets.user Extension for app identifier com.testBackGround.photos ran for 1.1 seconds.
backgroundassets.user Failed to send -[BADownloaderExtensionProxy requestDownloadsWithContentRequest:manifestURL:extensionInfo:completion:]_block_invoke for: com.testBackGround.photos error: Error Domain=NSCocoaErrorDomain Code=4099 "The connection to service named com.testBackGround.photos.BackgroundDownloadExt was invalidated from this process." UserInfo={NSDebugDescription=The connection to service named com.testBackGround.photos.BackgroundDownloadExt was invalidated from this process.}
backgroundassets.user Removing manifest download as extension did not handle manifest. BAManifestDownload (0xc2d2075c0): [ID:com.testBackGround.photos.Manifest-466C2F4F-60C7-494A-85EA-5E59F243C176, AppID:com.testBackGround.photos, Necessity:Essential]
Post not yet marked as solved
Failed to send -[BADownloaderExtensionProxy backgroundDownload:finishedWithSandboxToken:completionHandler:]_block_invoke for: com.xuhuiTest.photos error: Error Domain=NSCocoaErrorDomain Code=4097 "connection to service with pid 2085 named com.xuhuiTest.photos.BackgroundDownloadExt" UserInfo={NSDebugDescription=connection to service with pid 2085 named com.xuhuiTest.photos.BackgroundDownloadExt}
Client is missing signing identifier, client must be signed with an identifier to use BackgroundAssets. (null)
log.json
Post not yet marked as solved
If you can open source the code in this video, it will be a great help for learning this interface
Post not yet marked as solved
Background asstes are triggered before the APP is launched. At this time, if the current device is not connected to the WIFI network, it will directly consume the operator's network traffic.
Is there any way to limit this in order to avoid disputes over fees arising from the consumption of users' non-wifi traffic without their knowledge?
For example, after extension is triggered, determine the network status when scheduling downloads?
Post not yet marked as solved
Sometimes not able to get access to withExclusiveControl
I am not able to repro this, but once it can't get access, then killing the app also does not release the lock.
I have to restart the device to get the control.
Can we please fix this issue?
Post not yet marked as solved
The BAEssentiaMaxInstallSize key in the plist file indicates the installed maximum size of the necessary resources. Is this size the uncompression size, and is this size included in the size of the BAMaxInstallSize key?
Is BAEssentialDownloadAllowance included in BADownloadAllowance?
Post not yet marked as solved
I wrote the following code to schedule the download in extension:
AURLDownload *essentialDownload = [[BAURLDownload alloc] initWithIdentifier:url
request:[NSURLRequest requestWithURL:assetURL]
essential:true
fileSize:assetSize
applicationGroupIdentifier:YYBASharedSettings.appGroupIdentifier
priority:BADownloaderPriorityDefault];
NSLog(@"BackgroundAssetsTest extension Schedule essentialDownload url:%@",url);
and the delegate callback is implemented as follows:
- (void)backgroundDownload:(BADownload *)download failedWithError:(NSError *)error
{
NSLog(@"BackgroundAssetsTest extension failedWithError: %@",error);
}
The console outputs the following error:
BackgroundAssetsTest extension failedWithError: Error Domain=BAErrorDomain Code=202 "The requested URL is not permitted to be downloaded until the application is launched." UserInfo={NSLocalizedFailureReason=The requested URL is not permitted to be downloaded until the application is launched.}
What's the problem?
Scheduled downloads can only be triggered by launching the APP?
After receiving manifestURL in extension, I try to move it to the shared directory of APP group, as follows:
NSURL *url = [NSFileManager.defaultManager containerURLForSecurityApplicationGroupIdentifier:self.appGroupIdentifier];
NSURL *storageURL = [url URLByAppendingPathComponent:@"YYBAResCache" isDirectory:YES];
BOOL isDirectory;
BOOL isExists = [NSFileManager.defaultManager fileExistsAtPath:storageURL.path isDirectory:&isDirectory];
NSError *error = nil;
if (!isExists || !isDirectory) {
[NSFileManager.defaultManager createDirectoryAtURL:storageURL withIntermediateDirectories:YES attributes:@{NSFilePosixPermissions: [NSNumber numberWithShort:0777]} error:&error];
}
if (error){
NSLog(@"Failed to create session storage directory:%@",error);
}
NSURL *localManifestURL = [sessionStorageURL URLByAppendingPathComponent:@"manifest.json"];
Next, move the file:
NSError *error;
[NSFileManager.defaultManager moveItemAtURL:manifestURL toURL:localManifestURL error:&error];
if (error) {
NSLog(@"BackgroundAssetsTest extension saveMainifest:%@ to %@ error:%@",manifestURL,YYBASharedSettings.localManifestURL,error);
}
But I still received an error:
BackgroundAssetsTest extension saveMainifest:file:///var/tmp/com.apple.backgroundassets.downloadstaging/com.devinprogress2021/2cf0ae65-3058-4522-80d5-f4d76747ad15.json to file:///private/var/mobile/Containers/Shared/AppGroup/F466C6BA-35D7-4115-8D8E-E1726E3D3696/YYBAResCache/manifest.json
error:Error Domain=NSCocoaErrorDomain Code=513 "“2cf0ae65-3058-4522-80d5-f4d76747ad15.json” couldn’t be moved because you don’t have permission to access “YYBAResCache”." UserInfo={NSSourceFilePathErrorKey=/var/tmp/com.apple.backgroundassets.downloadstaging/com.yy.yymobile.devinprogress2021/2cf0ae65-3058-4522-80d5-f4d76747ad15.json, NSUserStringVariant=(
Move
), NSDestinationFilePath=/private/var/mobile/Containers/Shared/AppGroup/F466C6BA-35D7-4115-8D8E-E1726E3D3696/YYBAResCache/manifest.json, NSFilePath=/var/tmp/com.apple.backgroundassets.downloadstaging/com.devinprogress2021/2cf0ae65-3058-4522-80d5-f4d76747ad15.json, NSUnderlyingError=0x14520d2d0 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}
why?
Post not yet marked as solved
I want to understand BADownloadAllowance , BAMaxInstallSize properties.
Suppose my app size is 2 GB, and after install it will download 1 GB of content at start. And every month it might download 500MB of content. The 500MB will be cleared monthly. So total size it might go till 3.5 GB.
In this case, I hope we need to define
BADownloadAllowance - 1 GB (It should be Max of Install event content and Periodic event content, right? Or just Install event content?)
BAMaxInstallSize - 3.5 GB / 3 GB ?
Suppose at some month due to some more content, we send 1.5 GB periodic content. what happens now. As BADownloadAllowance is set to 1 GB, won't it download the complete content. will the framework restrict downloading the extra assets?
Suppose we missed clearing last months 500 MB content, so next month will the framework restrict downloading another 500 MB content as the total size of app will go beyond BAMaxInstallSize ?
Can someone please explain this ?
My Background Assets extension arranges to download image resources, as follows:
NSURL *assetURL = [NSURL URLWithString:@"https://***.png”];
NSUInteger assetSize = 6849;
switch (contentRequest) {
case BAContentRequestInstall:
case BAContentRequestUpdate:
{
BAURLDownload *essentialDownload = [[BAURLDownload alloc] initWithIdentifier:@"YYBADAsset"
request:[NSURLRequest requestWithURL:assetURL]
essential:true
fileSize:assetSize
applicationGroupIdentifier:appGroupIdentifier
priority:BADownloaderPriorityDefault];
[downloadsToSchedule addObject:essentialDownload];
break;
}
}
At the same time, the finishedWithFileURL method is implemented as follows:
- (void)backgroundDownload:(BADownload *)download finishedWithFileURL:(NSURL *)fileURL
{
NSLog(@"BackgroundAssetsTest extension finishedWithFileURL:%@ forDownlad:%@",fileURL,download.identifier);
NSLog(@"BackgroundAssetsTest extension finishedWithManifestURLExist:%@",@([[NSFileManager defaultManager] fileExistsAtPath:fileURL.absoluteString]));
}
And then use tools to trigger events,
xcrun backgroundassets-debug --app-bundle-id com.luph.mytest --device-id 00008020-000A04xxF0002E --simulate --app-install
The following log is observed through the console:
BackgroundAssetsTest extension finishedWithFileURL:file:///private/var/mobile/Containers/Shared/AppGroup/1D051E06-E597-4670-969A-38ECA52C4F7A/Library/C aches/com.apple.BackgroundAssets/BAFile-5152AFB2.tmp forDownlad:YYBADAsset
BackgroundAssetsTest extension finishedWithManifestURLExist:0
What's the problem? Did I set the size of BAURLDownload to be different from the actual download size? Or the wrong way to determine the existence of the file?
Post not yet marked as solved
Hi, I used Background assets to download files during install/update events. The debug build works fine when I trigger the install event through terminal. The same code base (with different bundle ID ) is used in Test Flight build. But the file is not downloaded when I install the TestFlight build. I'm getting following error in Console while installing the TestFlight build.
sometimes, i'm getting Failed to notify extension about finished download: BAURLDownload (0x61a80ab98):
guard let url = URL(string:"https://devstreaming-cdn.apple.com/videos/wwdc/2021/10220/6/3866585A-3920-44B4-AB3F-03A446FCDE3A/downloads/wwdc2021-10220_hd.mp4") else{
return Set()
}
switch (request) {
case .install, .update:
let essentialDownload =
BAURLDownload(
identifier: "avtar345",
request: URLRequest(url: url),
essential: true,
fileSize: 155384552,
applicationGroupIdentifier: appGroupIdentifier,
priority: .default)
downloadsToSchedule.insert(essentialDownload)
break;
case .periodic: break;
}
Post not yet marked as solved
Hi team,
I tried to download an image using the background assets . In development it downloads the image when I trigger the xcrun backgroundassets-debug command with instal event. But the image is not downloading for Test flight build.
In console I observed the following errors while installing the app,
Why am I getting this error while installing the app and how to resolve this?
I want to watch it to check the improvements in background assets but that video link is missng. Is there any plan to re-post it?
Post not yet marked as solved
Hi , i tried to download image using background assets framework. I tried to use install and update events to test the extension. But the extension always delegate to backgroundDownload(_ :failedWithError :) function with following error
Error Domain=BAErrorDomain Code=202 "The requested URL is not permitted to be downloaded until the application is launched." UserInfo={NSLocalizedFailureReason=The requested URL is not permitted to be downloaded until the application is launched.}
I used the following url to download the image https://w0.peakpx.com/wallpaper/934/165/HD-wallpaper-avatar-aang-aang-airbender-aire-appa-avatar-legend-leyenda.jpg
Why am i getting this error and how to resolve this?
Post not yet marked as solved
I download the demo provided by WWDC 2023 Session 10108 "What’s new in Background Assets", and I configure all targets to my developer team for signing so I can run the application on my device. But I get an error when I use backgroundassets-debug command:
xcrun backgroundassets-debug --simulate --app-periodic-check --device-id 00008030-001631C036208*** --app-bundle-id com.example.apple-samplecode.WWDC-Sessions8QQGK9DXXX
Error Log:
backgroundassets.user Unable to use persistent identifier to update application info. Falling back to bundle identifier lookup. (bundle identifier: com.example.apple-samplecode.WWDC-Sessions8QQGK9DJB9)
......
backgroundassets.user Failed to get extension process: Error Domain=com.apple.extensionKit.errorDomain Code=4 "Failed to aquire assertion for pid: 3091" UserInfo={NSLocalizedDescription=Failed to aquire assertion for pid: 3091}
......
backgroundassets.user Failed to get extension process: Error Domain=com.apple.extensionKit.errorDomain Code=4 "Failed to aquire assertion for pid: 3092" UserInfo={NSLocalizedDescription=Failed to aquire assertion for pid: 3092}
backgroundassets.user -[BAAgentCore downloadQueue:manifest:finishedWithFileURL:]_block_invoke, Failed to access extension for com.example.apple-samplecode.WWDC-Sessions8QQGK9DXXX.
backgroundassets.user Removing manifest download as extension did not handle manifest. BAManifestDownload (0x75cd44aa0): [ID:com.example.apple-samplecode.WWDC-Sessions8QQGK9DXXX.Manifest-3BE0D398-734D-4E12-90DD-EE943D6DCXXX, AppID:com.example.apple-samplecode.WWDC-Sessions8QQGK9DXXX, Necessity:Essential]
Any help will be gratefully appreciated