Xamarin.iOS无法在推送通知中显示照片

时间:2019-01-29 00:37:58

标签: xamarin.ios apple-push-notifications ios-app-extension ios-app-group

我有一个Notification Service Extension和一个AppGroup。我将相机中的照片保存在PCL项目中,并将其复制到“应用程序组容器”(共享文件夹)中。

在Notification Service Extension中,我尝试从App Group容器下载照片并将其附加到通知中,但它不会显示在通知中。

我也无法调试服务扩展以查看运行情况。据我所知,除非有人可以对此进行纠正,否则Xamarin目前仍无法实现。

代码如下:

1。在我的PCL中,当按下保存按钮时,我将照片保存到AppGroup中:

 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<IPhotoService>().CopiedFileToAppGroupContainer(photoFilePath);

                        if (copiedSuccessfully)
                        {
                            var customPhotoDestPath = DependencyService.Get<IPhotoService>().GetAppContainerCustomPhotoFilePath();

                            // save the path of the custom photo in the AppGroup container to pass to Notif Extension Service
                            DependencyService.Get<IGroupUserPrefs>().SetStringValueForKey("imageAbsoluteString", customPhotoDestPath);

                            // condition whether to use custom photo in push notification
                            DependencyService.Get<IGroupUserPrefs>().SetBoolValueForKey("isCustomPhotoSet", true);
                        }
                    }

                    buttonSavePhoto.IsEnabled = false;
                }         
            }

2。在我的iOS项目中,按“保存”按钮时,依赖项注入会调用此方法:

    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;
            }

现在,“应用程序组”容器中的照片路径为:

  

/private/var/mobile/Containers/Shared/AppGroup/12F209B9-05E9-470C-9C9F-AA959D940302/Pictures/customphoto.jpg

3。最后,在Notification Service Extension中,我尝试将照片附加到推送通知中:

public override void DidReceiveNotificationRequest(UNNotificationRequest request, Action<UNNotificationContent> 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) =>
                        {
                            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);
        }

1 个答案:

答案 0 :(得分:1)

  

/private/var/mobile/Containers/Shared/AppGroup/12F209B9-05E9-470C-9C9F-AA959D940302/Pictures/customphoto.jpg

从共享代码中获取来自AppGroup的图像时,可以检查文件路径在此项目中是否可用。

imgPath = groupUserDefaults.StringForKey("imageAbsoluteString"); 

如果未从此路径获取文件。您可以直接从Url获得AppGroup。以下是示例:

var FileManager = new NSFileManager();
var appGroupContainer = FileManager.GetContainerUrl("group.com.company.appName");
NSUrl fileURL = appGroupContainer.Append("customphoto.jpg", false);

如果不能直接使用fileURL,还可以转换为NSData并保存到本地文件系统。这也可以尝试。

以下是从本地文件系统获取的示例:

public static void Sendlocalnotification()
{       
    var localURL = "...";
    NSUrl url = NSUrl.FromString(localURL) ;

    var attachmentID = "image";
    var options = new UNNotificationAttachmentOptions();
    NSError error;
    var attachment = UNNotificationAttachment.FromIdentifier(attachmentID, url, options,out error);


    var content = new UNMutableNotificationContent();
    content.Attachments = new UNNotificationAttachment[] { attachment };
    content.Title = "Good Morning ~";
    content.Subtitle = "Pull this notification ";
    content.Body = "reply some message-BY Ann";
    content.CategoryIdentifier = "message";

    var trigger1 = UNTimeIntervalNotificationTrigger.CreateTrigger(0.1, false);

    var requestID = "messageRequest";
    var request = UNNotificationRequest.FromIdentifier(requestID, content, trigger1);

    UNUserNotificationCenter.Current.AddNotificationRequest(request, (err) =>
     {
         if (err != null)
         {
             Console.Write("Notification Error");
         }
     });

}