iMessage App使用总结

关于具体用法,这几篇博客已经做了大致总结:
http://www.jianshu.com/p/be79b8729bf8
http://www.cocoachina.com/ios/20160919/17593.html
其中iMessage App的用法大体上分两种: Stickers与Interactive Messages。其中Stickers类似于表情包,非常的简单,也没什么坑。

Interactive Messages虽然内容也不多,但目前为止能找到的资料还是太少,所以我用这篇博客来记录一下自己在开发过程中遇到的一些坑。

  1. 当Container App未上架:在接收方没有安装Container App的情况下,无论我把MSMessage对象的URL属性设置成什么,对方都会在iMessage内部打开App Store首页。发送方在发送message后如果删除Container App之后也会遇到相同情况。

  2. 当Container App已上架:接收方没有安装Container App的情况下,接收方点击message之后会在iMessage内部打开App Store并跳转到下载Container App的下载页。

  3. Interactive Messages是不支持Universal Links的,所以上面谋篇博客中说可以使用Universal Links进行跳转,应该是想当然了。

4.iMessage只能通过URL Scheme的方式打开自己的Containing App,无法打开其他App,且url的shceme没有时,无法打开任何app。哪怕Containing App没有配置URL Scheme,iMessage依旧可以打开,url的scheme只要不为空,则只能打开Containing App。
这里是苹果对

- (void)openURL:(NSURL *)URL completionHandler:(void (^)(BOOL success))completionHandler;

这个方法的解释:
Each extension point determines whether to support this method, or under which conditions to support this method. In iOS 8, only the Today extension point (used for creating widgets) supports this method.
Important

Apple allows a widget to use the openURL:completionHandler: method to open the widget’s own containing app.

If you employ this method to open other apps from your widget, your App Store submission might entail additional review to ensure compliance with the intent of widgets.

To learn more, read App Store Review Guidelines and iOS Human Interface Guidelines, linked to from Apple’s App Review Support page
看样子,在iOS8的时候,today可以通过这个方法调起其他的App,但是苹果觉得不妥,就通过审核的方式禁止,在后来的某个版本中,苹果直接不管你的URL,只要scheme不为空,就只能打开Containing App

  1. 假设接收方装了Container App,那么我们最希望的场景应该是对方点击message之后跳转到自己的App。于是非常自然的会想到在这两个方法中做一些处理:
-(void)willSelectMessage:(MSMessage *)message conversation:(MSConversation *)conversation;
-(void)didSelectMessage:(MSMessage *)message conversation:(MSConversation *)conversation;

然后就会惊喜的发现:第一次点击是OK的,顺利的跳转到了Container App,然后回来再点击却发现没卵用了,不是打开Container App,而是打开iMessage App。而且通过打断点发现毫无反应。这是因为当调转到Container App之后iMessage App就已经退出了,可以试试在这两个方法中打Log试试:

-(void)willResignActiveWithConversation:(MSConversation *)conversation;
-(void)didResignActiveWithConversation:(MSConversation *)conversation;

既然点击message后会唤起iMessage App,那么不妨在这两个方法中加入一些逻辑:

-(void)willBecomeActiveWithConversation:(MSConversation *)conversation;
-(void)didBecomeActiveWithConversation:(MSConversation *)conversation;

为了选择能够尽早进入Container App,我是这么写的:

-(void)willBecomeActiveWithConversation:(MSConversation *)conversation {
    if (conversation.selectedMessage) {
        [self.extensionContext openURL:[NSURL URLWithString:@"containerAppDemo://"] completionHandler:nil];
    }
}
  1. 对于试图利用AppDelegate对象在Extension中试图使用URL Schemers跳转到自家Container App的同学,不妨这么写:
    if (conversation.selectedMessage) {
        [self.extensionContext openURL:[NSURL URLWithString:@"containerAppDemo://"] completionHandler:nil];

绝大部分Extension的UIViewController都有这个属性

@interface UIViewController(NSExtensionAdditions) 

// Returns the extension context. Also acts as a convenience method for a view controller to check if it participating in an extension request.
@property (nullable, nonatomic,readonly,strong) NSExtensionContext *extensionContext NS_AVAILABLE_IOS(8_0);

@end

本人还是小菜鸡一枚,还望各位大神不吝赐教。

你可能感兴趣的:(iMessage App使用总结)