title: Xamarin.iOS Cannot display photo in Push Notification
body: <p>I have a Notification Service Extension and an AppGroup. I save a photo from camera in the PCL project and copy it to the App Group Container (shared folder). </p>
  
  <p>In the Notification Service Extension I try to download the photo from the App Group container and attach it to the notification but it just does not display in the notification.</p>
  
  <p>I also cannot debug the Service Extension to see what is going. As far as I know that is not possible currently still in Xamarin unless someone can correct me on that please.</p>
  
  <p>Here is the code:</p>
  
  <p><strong>1.in my PCL I save the photo to the AppGroup when a save button is pressed:</strong></p>
  
  <pre><code> private void ButtonSavePhoto_Clicked(object sender, EventArgs e)
              {
                  if (!string.IsNullOrEmpty(photoFilePath))
                  {
                      Preferences.Set(AppConstants.CUSTOM_PICTURE_FILE_PATH, photoFilePath);
                      Preferences.Set(AppConstants.CUSTOM_PHOTO_SET_KEY, true);
  
                      if (Device.RuntimePlatform == Device.iOS)
                      {
  
                          bool copiedSuccessfully = DependencyService.Get&lt;IPhotoService&gt;().CopiedFileToAppGroupContainer(photoFilePath);
  
                          if (copiedSuccessfully)
                          {
                              var customPhotoDestPath = DependencyService.Get&lt;IPhotoService&gt;().GetAppContainerCustomPhotoFilePath();
  
                              // save the path of the custom photo in the AppGroup container to pass to Notif Extension Service
                              DependencyService.Get&lt;IGroupUserPrefs&gt;().SetStringValueForKey("imageAbsoluteString", customPhotoDestPath);
  
                              // condition whether to use custom photo in push notification
                              DependencyService.Get&lt;IGroupUserPrefs&gt;().SetBoolValueForKey("isCustomPhotoSet", true);
                          }
                      }
  
                      buttonSavePhoto.IsEnabled = false;
                  }         
              }
  </code></pre>
  
  <p><strong>2.in my iOS project, Dependency injection calls this method when pressing save button:</strong></p>
  
  <pre><code>    public bool CopiedFileToAppGroupContainer(string filePath)
      {
                  bool success = false;
  
                  string suiteName = "group.com.company.appName";
                  var appGroupContainerUrl = NSFileManager.DefaultManager.GetContainerUrl(suiteName);
  
                  var appGroupContainerPath = appGroupContainerUrl.Path;
  
                  var directoryNameInAppGroupContainer = Path.Combine(appGroupContainerPath, "Pictures");
  
                  var filenameDestPath = Path.Combine(directoryNameInAppGroupContainer, AppConstants.CUSTOM_PHOTO_FILENAME);
  
                  try
                  {
                      Directory.CreateDirectory(directoryNameInAppGroupContainer);
  
                      if (File.Exists(filenameDestPath))
                      {
                          File.Delete(filenameDestPath);
                      }
  
                      File.Copy(filePath, filenameDestPath);
                      success = true;
                  }
                  catch (Exception ex)
                  {
                      Console.WriteLine(ex.Message);
                  }
  
                  return success;
              }
  </code></pre>
  
  <p>Now the path for the photo in the App Group container is:</p>
  
  <blockquote>
    <p>/private/var/mobile/Containers/Shared/AppGroup/12F209B9-05E9-470C-9C9F-AA959D940302/Pictures/customphoto.jpg</p>
  </blockquote>
  
  <p><strong>3.Finally in the Notification Service Extension I try to attach the photo to the push notification:</strong></p>
  
  <pre><code>public override void DidReceiveNotificationRequest(UNNotificationRequest request, Action&lt;UNNotificationContent&gt; contentHandler)
          {
              ContentHandler = contentHandler;
              BestAttemptContent = (UNMutableNotificationContent)request.Content.MutableCopy();
  
              string imgPath;
              NSUrl imgUrl;
  
              string notificationBody = BestAttemptContent.Body;
              string notifBodyInfo = "unknown";
  
              string suiteName = "group.com.company.appname";  
  
              NSUserDefaults groupUserDefaults = new NSUserDefaults(suiteName, NSUserDefaultsType.SuiteName);           
  
              string pref1_value = groupUserDefaults.StringForKey("user_preference1");
  
              string[] notificationBodySplitAtDelimiterArray = notificationBody.Split(',');
              userPrefRegion = notificationBodySplitAtDelimiterArray[0];
  
              bool isCustomAlertSet = groupUserDefaults.BoolForKey("isCustomAlert");
              bool isCustomPhotoSet = groupUserDefaults.BoolForKey("isCustomPhotoSet");
  
              string alarmPath = isCustomAlertSet == true ? "customalert.wav" : "default_alert.m4a";
  
              if (isCustomPhotoSet)
              {
                   // this is the App Group url of the custom photo saved in PCL
                   imgPath = groupUserDefaults.StringForKey("imageAbsoluteString");             
              }
              else
              {
                  imgPath = null;
              }
  
              if (imgPath != null )
              {                
                  imgUrl = NSUrl.FromString(imgPath);
              }
              else
              {
                  imgUrl = null;
              }
  
              if (!string.IsNullOrEmpty(pref1_value))
              {
                  if (BestAttemptContent.Body.Contains(pref1_value))
                  {
  
                     if (imgUrl != null)
                     {
  
                          // download the image from the AppGroup Container
                          var task = NSUrlSession.SharedSession.CreateDownloadTask(imgUrl, (tempFile, response, error) =&gt;
                          {
                              if (error != null)
                              {                             
                                  ContentHandler(BestAttemptContent);
                                  return;
                              }
                              if (tempFile == null)
                              {
                                  ContentHandler(BestAttemptContent);
                                  return;
                              }
  
                              var cache = NSSearchPath.GetDirectories(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomain.User, true);
                              var cachesFolder = cache[0];
                              var guid = NSProcessInfo.ProcessInfo.GloballyUniqueString;
                              var fileName = guid + "customphoto.jpg";
                              var cacheFile = cachesFolder + fileName;
                              var attachmentUrl = NSUrl.CreateFileUrl(cacheFile, false, null);
  
                              NSError err = null;
                              NSFileManager.DefaultManager.Copy(tempFile, attachmentUrl, out err);
  
                              if (err != null)
                              {
                                  ContentHandler(BestAttemptContent);
                                  return;
                              }
  
                              UNNotificationAttachmentOptions options = null;
                              var attachment = UNNotificationAttachment.FromIdentifier("image", attachmentUrl, options, out err);
  
                              if (attachment != null)
                              {
                                  BestAttemptContent.Attachments = new UNNotificationAttachment[] { attachment };
                              }    
                          });
                          task.Resume();
                     }                                        
                      BestAttemptContent.Title = "My Custom Title";
                      BestAttemptContent.Subtitle = "My Custom Subtitle";
                      BestAttemptContent.Body = "Notification Body";
                      BestAttemptContent.Sound = UNNotificationSound.GetSound(alarmPath);        
                  }                 
              }
              else
              {
                 pref1_value = "error getting extracting user pref";
              }        
  
              // finally display customized notification                 
              ContentHandler(BestAttemptContent);
          }
  </code></pre>