标签: ios-extensions

今天的小工具中的"无法加载"消息

我正处于我的小部件开发之间.我们已经将我们的应用程序与小部件集成放在一起 但在现在的某些日子里,我面临着iOS今天的小部件问题.我写了两个案例的代码.第一次在小部件最初首次加载应用程序时,它会调用Web服务并通过Internet获取数据,然后我们将它们存储到用户默认值以供以后使用.

现在,当下次用户下拉通知菜单时,我们首先向用户显示旧的存储内容,然后我们从web-service获取它并以user-default存储,然后再次重新加载表.

对于上述操作,我在某些情况下面临表格内容大小问题,闪烁问题和"无法加载"消息.

现在看一下下面的代码,我在下面的方法中进行网络调用,在web-service的响应之后,我只处理完成处理程序.

- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
    // Perform any setup necessary in order to update the view.
    // If an error is encountered, use NCUpdateResultFailed
    // If there's no update required, use NCUpdateResultNoData
    // If there's an update, use NCUpdateResultNewData
    [self getBookedAppointmentsNew:completionHandler];
}
Run Code Online (Sandbox Code Playgroud)

所以,请与我分享您的经验和想法.

ios ios-app-extension ios8-extension ios8-today-widget ios-extensions

6
推荐指数
2
解决办法
8433
查看次数

使用带有iOS操作扩展的google firebase analytics

我想通过google firebase analytics收集使用我的iOS应用的操作扩展程序的用户的一些信息.它适用于主应用程序.但是如何使它与扩展一起工作?有没有办法做到这一点?我试图在google firebase控制台上创建2个应用程序(因为主应用程序和动作扩展程序有不同的捆绑ID),似乎不起作用.

ios firebase ios-extensions firebase-analytics

6
推荐指数
1
解决办法
1110
查看次数

IONIC:DocumentProvider扩展的共享容器文件夹,如Swift

我想为Document Provider extension最初在IONIC开发的应用程序做一个.
我知道我可以使用.xcodeproj文件在XCode中打开项目,然后为预期添加新目标extension.
但是,我对AppGroup(应用程序和扩展程序)之间的共享存储感到困惑.
根据NSFileManager(现在的FileManager),您需要将文件存储在具有组标识符的共享容器中.
实现此目的的方法如下: -

func containerURL(forSecurityApplicationGroupIdentifier groupIdentifier: String) -> URL?
Run Code Online (Sandbox Code Playgroud)

但是根据IONIC指南,文件可以保存在以下位置之一: - 在此输入图像描述

根据IONIC Developer的说法,这些文件当前位于App的文档目录中,我们需要将这些文件放在共享容器中,如上所述.

我们怎样才能做到这一点?

仅供参考:我在IONIC论坛上找不到任何有关此问题的帮助,我正在按照教程进行扩展开发.

ios cordova ionic-framework swift ios-extensions

6
推荐指数
0
解决办法
248
查看次数

如何使用3d touch从主屏幕的多个小部件中选择一个?

当我只使用一个今天的小部件时,它非常简单,就像这样:

在此输入图像描述

现在我在我的应用程序中添加了第二个今天的小部件,它是这样的:

在此输入图像描述

为什么它消失了?怎么了?不应该有两个今天的小部件?我可以决定哪个小部件应该首选吗?

Apple说:

为快速操作列表选择一个小部件.如果您的应用有多个小部件,请选择一个以显示在有人使用3D Touch对主屏幕上的应用图标施加压力时出现的快速操作菜单中.

但是在哪里这样做?是用户还是开发者网站?

ios today-extension ios-extensions

6
推荐指数
1
解决办法
479
查看次数

有没有办法为“UIApplication.shared”添加“if (iOSApplicationExtension)”条件

我试图找到一种方法来添加检查条件 框架中的扩展目标(不是主应用程序)。是否可以依靠 #available(iOSApplicationExtension, *)一些参数调整?

@objc public extension UIView {
    var isAccessibilityCategory: Bool {
        if #available(iOSApplicationExtension, *) {
            return self.traitCollection.preferredContentSizeCategory.isAccessibilityCategory
        } else {
            return UIApplication.shared.preferredContentSizeCategory.isAccessibilityCategory
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何检测代码是否在主应用程序或应用程序扩展目标中运行?- 不起作用,因为框架不知道扩展目标

ios swift ios-extensions

6
推荐指数
1
解决办法
750
查看次数

如何在iOS共享扩展中处理Javascript的异步完成?

我正在制作一个可在网页上运行的简单iOS共享扩展程序.它与Pinterest没有什么不同,因为它从页面中获取某些信息.但它与Pinterest的不同之处在于,用于执行抓取的JS有时会自定义为网页域.

所以在ExtensionPreprocessingJS run()函数中,我执行以下操作来加载和执行自定义JS:

var Action = function() {};

Action.prototype = {

  run: function(arguments) {
    var e = document.createElement('script');
    e.setAttribute('type','application/javascript');
    e.setAttribute('id','my-unique-id');
    e.setAttribute('src','//mydomain.com/bookmarklet?d='+document.domain);
    document.body.appendChild(e);

    <some code to extract results and generate JSON>

    arguments.completionFunction({ <my JSON here> });
  }
};

var ExtensionPreprocessingJS = new Action
Run Code Online (Sandbox Code Playgroud)

我的bookmarklet端点提供了一些JS,它从页面中找到"pinning"的相关信息.

我的问题是,这是异步发生的,而不是在我使用运行方法结束时传回结果之前

arguments.completionFunction( <my JSON here> );
Run Code Online (Sandbox Code Playgroud)

我已经尝试在调用completionFunction()之前等待结果设置,但扩展似乎将其视为未完全调用的completionFunction().也就是说,共享扩展框架的设计似乎不适应异步JS.它假设在run()函数返回后,JS的结果可用.

我是否误解了共享扩展设计,或者我是否需要寻找不同的方法来实现这一目标?我注意到Instapaper创建了一个没有原生UI的共享扩展,我想知道这是否是他们这样做的原因.

javascript ios ios-extensions

5
推荐指数
0
解决办法
133
查看次数

iOS 共享扩展流程

我在创建共享扩展(如 Pinterest 应用程序的共享扩展)时遇到问题。当用户没有登录到包含应用程序的份额扩展只呈现一个选项,以警示log incancel

在代码中的哪个位置决定在我的共享扩展中显示哪个视图控制器。我看到这就像我需要检查共享容器的授权状态,如果这个状态是not logged我需要呈现警报控制器。如果状态是logged我需要显示我的主视图控制器ShareViewController,它是SLComposeServiceViewController

我的问题与 UI 无关,而是将此检查代码放在哪里。我没有找到任何应​​用程序扩展启动的方法,因此我可以根据某些状态为扩展选择一些初始视图控制器。

在 Pinterest 扩展中,当用户从其包含的应用程序注销时,我看不到他们的主视图控制器。我只看到带有选项的警报。

第二个问题:如何以编程方式从共享扩展程序切换到包含应用程序。当用户需要进行身份验证时,这个 Pinterest 共享扩展是如何做到这一点的?

我正在开发最新的 iOS SDK 10.2

ios ios-extensions share-extension swift3

5
推荐指数
1
解决办法
969
查看次数

iOS - Swift 3 共享扩展预览图像

我目前正在构建一个接受 URL 的共享扩展。作为其中的一部分,我按照上一个问题的概述自定义了我的共享屏幕,以创建一个全屏视图控制器。这一切正常。然而,在默认的共享编辑器视图中,我注意到有一个网页的预览图像。我试图在我的扩展程序中访问它,但我似乎无法掌握它。

具体来说,我一直在尝试使用该方法

loadPreviewImage

https://developer.apple.com/reference/foundation/nsitemprovider/1403925-loadpreviewimage

您会在文档中注意到,对于完成处理程序,这说明了以下内容

completion?Handler 一个完成处理程序块,用于执行结果。此块的第一个参数必须是 NSData、NSURL、UIImage(在 iOS 中)或 NSImage(在 macOS 中)类型的参数,用于接收图像数据。有关实现块的更多信息,请参阅 Completion?Handler。

但是,如果我尝试在完成块中将其设置为 UIImage,则会出现错误

无法将 '(UIImage, _) -> ()' 类型的值转换为预期的参数类型 'NSItemProvider.CompletionHandler!'

通过保护语句确认 itemProvider 是 NSItemProvider 实例的示例代码

itemProvider.loadPreviewImage(options: nil) { (image: UIImage, error) in    
        }
Run Code Online (Sandbox Code Playgroud)

完成处理程序的文档说将其设置为您想要的类型,它会尝试将数据强制为您指定的类型。有没有人见过这个?我不知道在这里做什么,因为我看不到我做错了什么。

https://developer.apple.com/reference/foundation/nsitemprovider/completionhandler

如果所有其他方法都失败了,我会考虑使用一些 Javascript 从 dom 中获取图像,但我会喜欢 Apple 似乎提供的预览图像

ios swift ios-extensions

5
推荐指数
1
解决办法
2277
查看次数

向 flutter 应用程序添加今天扩展的问题

我在 Flutter 中编写了一个应用程序,我希望为它添加一个原生的 iOS today 扩展。我添加了小部件目标,但是当我尝试构建构建失败时,因为应用程序扩展目标找不到特定的颤振库(这没有意义,因为它无论如何都不会使用它们)。

据我所知,xCode 项目试图将 Flutter 库包含在所有目标中?

这是错误:

ld: warning: directory not found for option '-F/Users/nickmowen/Library/Developer/Xcode/DerivedData/Runner-egikkgpuyfdkbcconodjborapzme/Build/Products/Debug-iphoneos/share'
ld: warning: directory not found for option '-F/Users/nickmowen/Library/Developer/Xcode/DerivedData/Runner-egikkgpuyfdkbcconodjborapzme/Build/Products/Debug-iphoneos/shared_preferences'
ld: warning: directory not found for option '-F/Users/nickmowen/Library/Developer/Xcode/DerivedData/Runner-egikkgpuyfdkbcconodjborapzme/Build/Products/Debug-iphoneos/sqflite'
ld: warning: directory not found for option '-F/Users/nickmowen/Library/Developer/Xcode/DerivedData/Runner-egikkgpuyfdkbcconodjborapzme/Build/Products/Debug-iphoneos/url_launcher'
ld: framework not found FMDB
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

任何想法来解决这个问题?谢谢!

编辑:

进入 Pods 并为那里的每个颤振库启用位码消除了一堆错误,但随后我收到了这个错误:

ld: '/Users/nickmowen/Library/Android/flutter/bin/cache/artifacts/engine/ios/Flutter.framework/Flutter' does not contain bitcode. You must rebuild it with bitcode enabled …
Run Code Online (Sandbox Code Playgroud)

xcode ios swift ios-extensions flutter

5
推荐指数
1
解决办法
1671
查看次数

NSExtension - 运行时警告 - [NSXPCDecoder validateAllowedClass:forKey:]

我正在使用共享扩展,并且收到以下运行时警告:

注意:即使在新项目上添加共享扩展并运行也会引发相同的运行时警告

[Foundation] *** -[NSXPCDecoder validateAllowedClass:forKey:]: NSSecureCoding allowed classes list contains [NSObject class], which bypasses security by allowing any Objective-C class to be implicitly decoded. Consider reducing the scope of allowed classes during decoding by listing only the classes you expect to decode, or a more specific base class than NSObject. This will become an error in the future. Allowed class list: {(
    "'NSObject' (0x7fff862bc6e8) [/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib]"
)}
Run Code Online (Sandbox Code Playgroud)

下面给出的是扩展的 info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist …
Run Code Online (Sandbox Code Playgroud)

ios ios-extensions

5
推荐指数
1
解决办法
4418
查看次数