UIDocumentInteractionController 日历访问

2024-02-15

我有一个 ics(日历)文件,我用UIDocumentInteractionController, using presentOptionsMenuFromRect:。运行时,“打开方式”菜单看起来像this https://i.stack.imgur.com/uvU4Z.png.

如您所见,没有“添加到日历”选项。这就是让我困惑的地方:我对 .vcf(联系人卡片)文件使用相同的代码,并且它按预期工作 https://i.stack.imgur.com/yxgJh.png可以使用“在联系人中打开”选项。

我是否缺少某种许可Info.plist用于日历访问?为什么不能UIDocumentInteractionController处理.ics文件类型正确,但是.vcf工作得很好吗?这两种文件类型非常相似。从选项菜单中,如果我将 ics 文件邮寄给自己并从邮件应用程序打开它,它会很好地读取它,并且我可以将事件添加到我的日历中,因此我知道数据是有效的。我到处寻找解决方案,但似乎没有人知道为什么日历访问不起作用。我遇到的一些问题仍未得到解答:

无法将 ics 文件添加到日历 https://stackoverflow.com/questions/20992426/uidocumentinteractioncontroller-unable-to-add-ics-file-to-calendar

如何让 UIDocumentInteractionController 将日历显示为打开 .ics 文件的选项? https://stackoverflow.com/questions/18830805/how-can-i-have-uidocumentinteractioncontroller-show-calendar-as-an-option-for-op

如果苹果是故意这样做的,我能想到的唯一原因是他们宁愿开发人员使用 EventKit 将事件添加到日历中。如果属实,那么该解决方案将相当令人沮丧。任何对此问题的见解将不胜感激。


我最终通过 (https://github.com/KiranPanesar/MXLCalendarManager https://github.com/KiranPanesar/MXLCalendarManager)。然后,我可以使用 EventKit 将下载的 .ics 文件解析为 EKEvent 并通过 EKEventEditViewController 打开它(https://developer.apple.com/library/prerelease/ios/samplecode/SimpleEKDemo/Listings/Classes_RootViewController_m.html https://developer.apple.com/library/prerelease/ios/samplecode/SimpleEKDemo/Listings/Classes_RootViewController_m.html)。有点绕,但似乎有效。以下是我如何设置实现此功能的 webview 控制器类:

@interface WebViewController : UIViewController <UIWebViewDelegate, EKEventEditViewDelegate> {

// EKEventStore instance associated with the current Calendar application
@property (nonatomic, strong) EKEventStore *eventStore;

// Default calendar associated with the above event store
@property (nonatomic, strong) EKCalendar *defaultCalendar;

@end


@implementation WebViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    ...
    // Initialize the event store
    self.eventStore = [[EKEventStore alloc] init];
}


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSURL *url = [request URL];
    NSString *path = [url absoluteString];

    NSRange range = [path rangeOfString:@".ics" options:NSCaseInsensitiveSearch];
    if (range.length > 0) {
        [self checkCalendarAndAddEvent:url];
        return NO;
    }
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    return YES;
}

-(void)checkCalendarAndAddEvent:(NSURL*)url
{
     EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
     if(status == EKAuthorizationStatusAuthorized)
     {
         [self addEventToCalendar:url];
     } else
     {
         [self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
         {
             if (granted)
             {
                  // Let's ensure that our code will be executed from the main queue
                  dispatch_async(dispatch_get_main_queue(), ^{
                     // The user has granted access to their Calendar; add to calendar
                     [self addEventToCalendar:url];
                  });
             }else
             {
                 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Privacy Warning" message:@"Permission was not granted for Calendar"
                                                            delegate:nil
                                                   cancelButtonTitle:@"OK"
                                                   otherButtonTitles:nil];
                 [alert show];
             }
         }];
    }
}

-(void) addEventToCalendar: (NSURL *)url
{
    MXLCalendarManager* calendarManager = [[MXLCalendarManager alloc] init];
    self.defaultCalendar = self.eventStore.defaultCalendarForNewEvents;
    [calendarManager scanICSFileAtRemoteURL:url withCompletionHandler:^(MXLCalendar *calendar, NSError *error) {

        MXLCalendarEvent *mxlEvent = calendar.events.firstObject;

        EKEventEditViewController *addController = [[EKEventEditViewController alloc] init];
        EKEvent * event = [EKEvent eventWithEventStore:self.eventStore];
        event.location = mxlEvent.eventLocation;
        event.startDate = mxlEvent.eventStartDate;
        event.endDate = mxlEvent.eventEndDate;
        event.title = mxlEvent.eventSummary;
        event.notes = mxlEvent.eventDescription;

        addController.event = event;
        // Set addController's event store to the current event store
        addController.eventStore = self.eventStore;
        addController.editViewDelegate = self;
        [self presentViewController:addController animated:YES completion:nil];
   }];
}
@end

我还必须稍微修改 MXLCalendarManager.m 的部分内容,以便为我的特定类型的 .ics 格式做好准备。例如,我的 .ics 文件的摘要部分如下所示:

DESCRIPTION;LANGUAGE=en-us:The following details your appointment:\n\n\n

其中 MXLCalendarManager 仅寻找:

DESCRIPTION: (Something). 

我修改了代码以考虑 ;ln.这也删除了所有人为换行符,但允许我在摘要描述中添加自己的换行符:

    // Extract event description
    [eventScanner scanUpToString:@"DESCRIPTION" intoString:nil];
    [eventScanner scanUpToString:@":" intoString:nil];
    [eventScanner scanUpToString:@"\nSEQUENCE" intoString:&descriptionString];
    if(descriptionString.length > 1)
    {
        descriptionString = [descriptionString substringFromIndex:1];
        descriptionString = [[[descriptionString stringByReplacingOccurrencesOfString:@"\nSEQUENCE" withString:@""] stringByReplacingOccurrencesOfString:@"\r\n " withString:@""] stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UIDocumentInteractionController 日历访问 的相关文章

随机推荐

  • KQL 正则表达式行提取

    我有一个名为 AdditionalExtensions 的专栏 其中包含以下内容 start Aug 13 2022 20 42 17 logver700060366 ad 我想添加正则表达式搜索以仅提取并显示日期和时间 如下所示 2022
  • Jar 文件名形成 java 代码

    我想从我的 java 代码中确定 jar 文件名 我在谷歌中找到了很多解决方案 但没有任何效果 只是为了看看我在这里尝试了什么 这是一个 stackoverflow 论坛 其中发布了一堆解决方案 堆栈溢出 https stackoverfl
  • UINavigationBar:拦截后退按钮和后退滑动手势

    我有一个 UINavigationBar 可以拦截后退按钮点击 如果有未保存的更改 则会提醒用户 这是基于中提出的解决方案UINavigationController 和 UINavigationBarDelegate ShouldPopI
  • 条目 '' 已添加错误

    我在 ASP net 中有一个 web config 给我配置错误
  • 如何使用 Promise.all 并以对象作为输入

    我一直在开发一个供自己使用的小型 2D 游戏库 但遇到了一些问题 库中有一个名为 loadGame 的特定函数 它将依赖项信息作为输入 资源文件和要执行的脚本列表 这是一个例子 loadGame root source folder for
  • 使用SyncAdapters时登录两次

    我正在使用创建一个新的 Android 应用程序SyncAdapter处理数据库同步 我已准备就绪 应用程序工作正常 但我注意到我登录了两次 首次登录发生在AuthenticatorActivity类 它扩展了AccountAuthenti
  • Android 无法在设备上安装 HelloWorld.apk (null) 错误

    我是安卓新手 当我在 Eclipse 中运行 Android 应用程序时 我在控制台中收到以下消息 2011 03 08 12 57 35 HelloWorld 2011 03 08 12 57 35 HelloWorld Android
  • WIX - 如何使用删除文件

    我们有多个配置文件 根据所选的环境 将复制正确的文件 并删除其余文件 我在用RemoveFile但这不会删除任何内容 或者可能是我没有正确使用它 有人可以举个删除的例子吗 config from INSTALLDIR 在安装过程中 复制所有
  • 避免 p:treeTable 的节点在更新后崩溃

    我有一个p treeTable以一种形式和一种p dialog以另一种形式从哪里p dialog我将数据添加到p treeTable 提交时h commandButton我添加更新的对话框p treeTable为了看到添加的节点 问题是用户
  • 从视频中获取多个缩略图

    我在用着MediaMetadataRetriever检索视频中特定时间的缩略图 这就是我实现这一目标的方法 MediaMetadataRetriever metadataRetriever new MediaMetadataRetrieve
  • 为什么我的所有位图都上采样 200%?

    我的应用程序 1 遇到严重的内存问题 为了调查这一点 我在不同状态下对我的应用程序进行了堆转储 我发现一些位图占用了大量内存 我编写了一个小工具 2 将字节数组解码为 Windows 位图文件 bmp 这样我就可以see位图并将它们与我的文
  • Android Studio 显示警告:此处不允许元素合并

    我基于 LinearLayout 创建自定义视图 类扩展了 LinearLayout 类 在布局中我有
  • 如何获取与 Linux 桌面中的文件关联的图标、MIME 类型和应用程序?

    在 Linux 桌面上使用 C 获取与任意文件 文件路径 关联 的图标 文档描述和应用程序的最佳方法是什么 我想使用最 规范 的方式在 KDE 和 gnome 上查找图标 mime 类型 文件类型描述和相关应用程序 并且我想避免任何 炮击
  • 自动从 Woocommerce 谢谢重定向到传递变量的外部链接

    在 Woocommerce 中 下订单后 我想在 5 秒后自动将客户从感谢页面重定向到外部链接 并传递一些变量作为order id 以及order ammount 那么 如何在 5 秒后自动将客户从 Woocommerce 谢谢重定向到传递
  • 用于 ASP.NET 的自定义 Javascript Ajax

    我已经编写了一些基本的 Javascript 函数 并且想了解如何使用此 JS 代码在 C 4 0 ASP net 项目中启用异步回发 例如 我有一个脚本 单击时会增加数字 再次单击时 数字会减少 我基本上从数据库加载号码 然后隐藏一个 s
  • 如何从另一个类访问共享首选项布尔值

    我创建了一个包含两个按钮的单选组 我可以选择一个并保存它 它工作正常 关闭应用程序后仍然存储 我想做的是使用另一个类中单选按钮的值 这是我的设置类 其中包含共享首选项代码 public class Settings extends Acti
  • C# - 读取字节,它们是什么以及发生了什么。我期望二进制值,而不是十进制数

    我已经成为一名程序员几年了 但我从来没有had了解涉及字节的低级操作 然而它让我感兴趣 并且我想了解更多有关使用字节的信息 在下面的代码中 我正在读取一个仅包含 嗨 那里 一词的文本文件 FileStream fileStream new
  • ASP .net 当前物理位置

    您好 我正在开发 ASP net Web 应用程序 我需要找到网站的当前位置 物理位置 或包含程序集的 bin 目录 我尝试使用 Directory GetCurrentDirectory 并返回 ASP net 临时目录 我真的不喜欢在我
  • 将 JSON 数据发布到 .asmx Web 服务

    我正在尝试将一些简单的参数发布到 asmx Web 服务 我收到以下错误 请求格式无效 application json 字符集 utf 8 我真正需要的是能够传递一个复杂的对象 但我无法通过使用 json 内容类型发出 POST 请求 这
  • UIDocumentInteractionController 日历访问

    我有一个 ics 日历 文件 我用UIDocumentInteractionController using presentOptionsMenuFromRect 运行时 打开方式 菜单看起来像this https i stack imgu