我正在尝试使用新的iOS 8应用扩展程序创建共享扩展程序.我试图获取Safari网站的当前URL以在UILabel中显示它.很简单.
我正在通过Apple的官方扩展指南工作https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/Share.html#//apple_ref/doc/uid/TP40014214-CH12-SW1但有些事情没有按预期运作.我知道它只是在测试中,但也许我只是做错了.
这是我在扩展ViewController中从safari获取URL的代码:
-(void)viewDidAppear:(BOOL)animated{
NSExtensionContext *myExtensionContext = [self extensionContext];
NSArray *inputItems = [myExtensionContext inputItems];
NSMutableString* mutableString = [[NSMutableString alloc]init];
for(NSExtensionItem* item in inputItems){
NSMutableString* temp = [NSMutableString stringWithFormat:@"%@, %@, %lu,
%lu - ",item.attributedTitle,[item.attributedContentText string],
(unsigned long)[item.userInfo count],[item.attachments count]];
for(NSString* key in [item.userInfo allKeys]){
NSArray* array = [item.userInfo objectForKey:@"NSExtensionItemAttachmentsKey"];
[temp appendString:[NSString stringWithFormat:@" in array:%lu@",[array count]]];
}
[mutableString appendString:temp];
}
self.myLabel.text = mutableString;
}
Run Code Online (Sandbox Code Playgroud)
这是我的扩展的Info.plist文件的内容:
<dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>200</integer>
</dict>
</dict>
Run Code Online (Sandbox Code Playgroud)
当我在Safari中访问苹果iPod支持页面并尝试将其共享到我的扩展程序时,我得到以下值但没有URL:
item.attributedTitle = …Run Code Online (Sandbox Code Playgroud) iOS 8引入了一项功能,允许在应用程序沙箱中使用共享框架.在主应用程序旁边使用扩展时,这尤其有用.
在主应用程序和扩展中静态链接Cocoapods似乎是一个非最佳解决方案.如何将Cocoapods链接为我的Extension(s)和使用Xcode的主应用程序使用的共享框架?
我现在正在使用iOS 8自定义键盘扩展,使用UITextInputDelegate方法时存在一些问题.
这是否正确:selectionWillChange:和selectionDidChange:当用户长按输入区域时应该调用方法?并且textWillChange:和textDidChange:方法应该在文本字面改变时调用?
实际上,我观察到的是,当我在文本输入区域中更改选择时,会调用textWillChange:和textDidChange:,并且我无法得到其他两个方法在什么条件下被调用的线索.如果有人知道这些委托方法的用法,请告诉我.
我UINavigationController在iOS应用扩展程序中呈现模态:
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
nav.modalPresentationStyle = UIModalPresentationFormSheet;
nav.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:nav animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
当导航控制器出现时,其根视图控制器的UIBarButtonItems跳转位置:

我正在创建和添加按钮viewDidLoad.它们只是标准的条形按钮项:
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done)];
Run Code Online (Sandbox Code Playgroud)
我没有压倒viewDidAppear(这似乎是按钮跳跃的点).
从我的应用程序中呈现相同的导航控制器/根视图控制器,而不是应用程序扩展,不会给我同样的问题.有任何想法吗?
uinavigationbar uikit uinavigationcontroller ios8 ios-app-extension
我有一个默认的Hello World今天小部件附加到我的一个应用程序,但是我无法弄清楚如何更改应用程序图标旁边显示的标题,或者看似影响视图控制器的内容.我已经尝试添加一个按钮,其中包含一个更改标签文本的操作 - 这些操作没有出现,在IB中我尝试更改"Hello World"的文本颜色,但没有看似有影响.
没有真正的代码显示它只是一个按钮动作和连接到故事板的几个出口的例子.
有任何想法吗?
有没有人知道如何从应用扩展程序的视图控制器启动父应用程序?
我只想从其应用扩展程序启动主应用程序.
在应用程序扩展中检测设备方向的最佳方法是什么?我在这里发现的解决方案的结果好坏参半:
我查看了大小类,UITraitCollection并发现设备不准确地报告它是纵向的,实际上是在横向(不确定这是OS错误,还是我没有正确查询正确的API).
完成的最佳方法是什么:
谢谢,
我已成功通过userDefaults在我的应用程序和今日扩展程序之间共享数据,但是我遇到位于应用程序的Documents文件夹中的实际文件时遇到了问题.
当我在我的应用程序中使用此代码时:
var documentsDir:NSString = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
Run Code Online (Sandbox Code Playgroud)
它返回:
/var/mobile/Containers/Data/Application/296494AA-946C-40E0-8646-F0895E131DCB/Documents/
Run Code Online (Sandbox Code Playgroud)
但在扩展中它返回:
/var/mobile/Containers/Data/PluginKitPlugin/AB484342-537A-4CE7-9EF3-F2CAE352C8A3/Documents/
Run Code Online (Sandbox Code Playgroud)
显然,文件不在那里.
我读到了我应该使用的地方:
let containerURL = manager.containerURLForSecurityApplicationGroupIdentifier("group.com.company.app")
let filePath = containerURL.path
Run Code Online (Sandbox Code Playgroud)
但它返回:
/private/var/mobile/Containers/Shared/AppGroup/CD7CF610-EB5F-4246-8D30-D7F8BFA6A219
Run Code Online (Sandbox Code Playgroud)
这也没用.
如何让我的iOS 8 Today Extension读取位于Documents中的容器应用程序文件?
谢谢!
我有一个框架,其中包含一个故事板和一组默认图像.该框架可以包含在多个应用程序中,目的是如果需要,应用程序可以使用自己的变体覆盖无,部分或全部默认图像.
我面临的问题是我没有找到适用于所有场景的解决方案,例如:如果框架包含一个名为Person的图像,那么框架由app A使用,它提供了自己的Person版本,以及框架由应用程序B使用,它不提供自己的Person版本然后:
如果框架使用以下代码设置图像:
let image = UIImage.init(named: "Person")
someImageView.image = image
Run Code Online (Sandbox Code Playgroud)
然后,当app A运行时,会找到并正确显示Person图像的变体.(App A在其资产目录中有Person的变体)但是,当app B运行时,不会显示任何内容.
另一方面,如果我没有使用代码设置图像(即它在故事板图像视图的Xcode属性检查器中设置),那么当运行应用程序B时,现在正确显示默认框架图像,但现在应用程序A的自定义人员图像不显示.
有没有办法可以成功地涵盖这三种情况:
一个默认图像在框架中,应用程序A和应用程序B都不希望用它们的自定义图像覆盖它,默认图像在框架中,而应用程序A想要覆盖它,但应用程序B却没有.框架中有一个默认图像,app A和app B都希望用自己的变体覆盖它.(我有一个大型的故事板,框架中有几十个图像,理想情况下我希望有一个完全不涉及代码的解决方案 - 即默认图像名称是通过Xcode的属性检查器为图像视图设置的,如果是应用程序在其资产目录中提供自己的图像版本,自动显示图像)
相反,只出现一个空白视图.
以下是我加载广告请求的方式:
GADMobileAds.configure(withApplicationID: "ca-app-pub-9213331484438711~8534798836") // actual app id
bannerView.delegate = self
bannerView.rootViewController = self
bannerView.adSize = kGADAdSizeLargeBanner
// unit id taken from guide: https://firebase.google.com/docs/admob/ios/quick-start
// Actual unit id doesn't work either.
bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716"
let request = GADRequest()
request.testDevices = [kDFPSimulatorID]
bannerView.layoutIfNeeded()
bannerView.load(request)
Run Code Online (Sandbox Code Playgroud)
我已经开始Allow Arbitrary Loads了YES,但这并没有帮助.委托方法甚至不被调用.我错过了什么吗?有没有人能够让Admob在iMessage扩展中工作?
可在此处找到示例项目.